diff --git a/DEPS b/DEPS
index 948d24c..3c294e4 100644
--- a/DEPS
+++ b/DEPS
@@ -32,7 +32,7 @@
       "https://chromium.googlesource.com/external/github.com/dart-lang/%s.git",
 
   "gyp_rev": "@6ee91ad8659871916f9aa840d42e1513befdf638",
-  "co19_rev": "@f95f109fea67127a220958794ef5200a63cb454c",
+  "co19_rev": "@fad777939a2b891c0a79b69a4d79c914049c69b0",
   "chromium_url": "http://src.chromium.org/svn",
   "chromium_git": "https://chromium.googlesource.com",
 
@@ -41,7 +41,7 @@
   "analyzer_cli_rev" : "@0b89a16c0566f36676fa8f2016eb2c332178f616",
   "args_tag": "@0.13.0",
   "async_tag": "@1.2.0",
-  "barback_tag" : "@0.15.2+6",
+  "barback_tag" : "@0.15.2+7",
   "boringssl_rev" : "@daeafc22c66ad48f6b32fc8d3362eb9ba31b774e",
   "charcode_tag": "@1.1.0",
   "chrome_rev" : "@19997",
@@ -51,10 +51,10 @@
   "crypto_rev" : "@2df57a1e26dd88e8d0614207d4b062c73209917d",
   "csslib_tag" : "@0.12.0",
   "dart2js_info_rev" : "@bad01369f1f605ab688d505c135db54de927318f",
-  "dartdoc_rev" : "@ae12ca7aa2ea15535fac9e262cab65e3c2b66a04",
+  "dartdoc_rev" : "@786426c4bbea96729d5eab2add744def41a5a690",
   "dart_services_rev" : "@7aea2574e6f3924bf409a80afb8ad52aa2be4f97",
   "dart_style_tag": "@0.2.0",
-  "dev_compiler_rev": "@0.1.7",
+  "dev_compiler_rev": "@0.1.8",
   "fake_async_rev" : "@38614",
   "firefox_jsshell_rev" : "@45554",
   "glob_rev": "@704cf75e4f26b417505c5c611bdaacd8808467dd",
@@ -68,9 +68,9 @@
   "intl_rev": "@32047558bd220a53c1f4d93a26d54b83533b1475",
   "jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "@1.1.1",
-  "linter_rev": "@140ee2d1d7a255cf1265e990e528c6575ab2d5bb",
+  "linter_rev": "@1df9178fbb475c77658531b3d702ac9e615f9714",
   "logging_rev": "@85d83e002670545e9039ad3985f0018ab640e597",
-  "markdown_rev": "@9a1071a859df9c9edd4f556e948f898f70bf1e5e",
+  "markdown_rev": "@4aaadf3d940bb172e1f6285af4d2b1710d309982",
   "matcher_tag": "@0.12.0",
   "metatest_rev": "@e5aa8e4e19fc4188ac2f6d38368a47d8f07c3df1",
   "mime_rev": "@75890811d4af5af080351ba8a2853ad4c8df98dd",
diff --git a/README.dart-sdk b/README.dart-sdk
index 1a59eb2..47e3040 100644
--- a/README.dart-sdk
+++ b/README.dart-sdk
@@ -8,7 +8,7 @@
   dart           Dart virtual machine
   dart2js        Dart-to-JavaScript compiler
   dartanalyzer   Dart static analyzer
-  docgen         Dart documentation generator
+  dartdoc        Dart documentation generator
   pub            Pub, the Dart package manager
   dartfmt        Dart code formatter
 
diff --git a/dart.gyp b/dart.gyp
index fb973e1..81a8f05 100644
--- a/dart.gyp
+++ b/dart.gyp
@@ -94,13 +94,6 @@
       ],
     },
     {
-      'target_name': 'api_docs',
-      'type': 'none',
-      'dependencies': [
-        'utils/apidoc/docgen.gyp:dartdocgen',
-      ],
-    },
-    {
       'target_name': 'samples',
       'type': 'none',
       'dependencies': [],
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index feaa424..8fcb597 100644
--- a/pkg/analysis_server/doc/api.html
+++ b/pkg/analysis_server/doc/api.html
@@ -1,4 +1,4 @@
-<html><head>
+<!DOCTYPE html><html><head>
     <meta charset="UTF-8">
     <title>Analysis Server API Specification</title>
   <style>body {
@@ -4135,4 +4135,7 @@
       TBD
     </p>
     <h2 class="domain"><a name="index">Index</a></h2>
-    <h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div></body></html>
\ No newline at end of file
+    <h3>Domains</h3><h4>server (<a href="#domain_server">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_server.getVersion">getVersion</a></li><li><a href="#request_server.shutdown">shutdown</a></li><li><a href="#request_server.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_server.connected">connected</a></li><li><a href="#notification_server.error">error</a></li><li><a href="#notification_server.status">status</a></li></ul></div></div><h4>analysis (<a href="#domain_analysis">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_analysis.getErrors">getErrors</a></li><li><a href="#request_analysis.getHover">getHover</a></li><li><a href="#request_analysis.getLibraryDependencies">getLibraryDependencies</a></li><li><a href="#request_analysis.getNavigation">getNavigation</a></li><li><a href="#request_analysis.reanalyze">reanalyze</a></li><li><a href="#request_analysis.setAnalysisRoots">setAnalysisRoots</a></li><li><a href="#request_analysis.setGeneralSubscriptions">setGeneralSubscriptions</a></li><li><a href="#request_analysis.setPriorityFiles">setPriorityFiles</a></li><li><a href="#request_analysis.setSubscriptions">setSubscriptions</a></li><li><a href="#request_analysis.updateContent">updateContent</a></li><li><a href="#request_analysis.updateOptions">updateOptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_analysis.analyzedFiles">analyzedFiles</a></li><li><a href="#notification_analysis.errors">errors</a></li><li><a href="#notification_analysis.flushResults">flushResults</a></li><li><a href="#notification_analysis.folding">folding</a></li><li><a href="#notification_analysis.highlights">highlights</a></li><li><a href="#notification_analysis.invalidate">invalidate</a></li><li><a href="#notification_analysis.navigation">navigation</a></li><li><a href="#notification_analysis.occurrences">occurrences</a></li><li><a href="#notification_analysis.outline">outline</a></li><li><a href="#notification_analysis.overrides">overrides</a></li></ul></div></div><h4>completion (<a href="#domain_completion">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_completion.getSuggestions">getSuggestions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_completion.results">results</a></li></ul></div></div><h4>search (<a href="#domain_search">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_search.findElementReferences">findElementReferences</a></li><li><a href="#request_search.findMemberDeclarations">findMemberDeclarations</a></li><li><a href="#request_search.findMemberReferences">findMemberReferences</a></li><li><a href="#request_search.findTopLevelDeclarations">findTopLevelDeclarations</a></li><li><a href="#request_search.getTypeHierarchy">getTypeHierarchy</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_search.results">results</a></li></ul></div></div><h4>edit (<a href="#domain_edit">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_edit.format">format</a></li><li><a href="#request_edit.getAssists">getAssists</a></li><li><a href="#request_edit.getAvailableRefactorings">getAvailableRefactorings</a></li><li><a href="#request_edit.getFixes">getFixes</a></li><li><a href="#request_edit.getRefactoring">getRefactoring</a></li><li><a href="#request_edit.sortMembers">sortMembers</a></li><li><a href="#request_edit.organizeDirectives">organizeDirectives</a></li></ul></div><h4>execution (<a href="#domain_execution">↑</a>)</h4><div class="subindex"><h5>Requests</h5><ul><li><a href="#request_execution.createContext">createContext</a></li><li><a href="#request_execution.deleteContext">deleteContext</a></li><li><a href="#request_execution.mapUri">mapUri</a></li><li><a href="#request_execution.setSubscriptions">setSubscriptions</a></li></ul><h5>Notifications</h5><div class="subindex"><ul><li><a href="#notification_execution.launchData">launchData</a></li></ul></div></div><h3>Types (<a href="#types">↑</a>)</h3><div class="subindex"><ul><li><a href="#type_AddContentOverlay">AddContentOverlay</a></li><li><a href="#type_AnalysisError">AnalysisError</a></li><li><a href="#type_AnalysisErrorFixes">AnalysisErrorFixes</a></li><li><a href="#type_AnalysisErrorSeverity">AnalysisErrorSeverity</a></li><li><a href="#type_AnalysisErrorType">AnalysisErrorType</a></li><li><a href="#type_AnalysisOptions">AnalysisOptions</a></li><li><a href="#type_AnalysisService">AnalysisService</a></li><li><a href="#type_AnalysisStatus">AnalysisStatus</a></li><li><a href="#type_ChangeContentOverlay">ChangeContentOverlay</a></li><li><a href="#type_CompletionId">CompletionId</a></li><li><a href="#type_CompletionSuggestion">CompletionSuggestion</a></li><li><a href="#type_CompletionSuggestionKind">CompletionSuggestionKind</a></li><li><a href="#type_Element">Element</a></li><li><a href="#type_ElementKind">ElementKind</a></li><li><a href="#type_ExecutableFile">ExecutableFile</a></li><li><a href="#type_ExecutableKind">ExecutableKind</a></li><li><a href="#type_ExecutionContextId">ExecutionContextId</a></li><li><a href="#type_ExecutionService">ExecutionService</a></li><li><a href="#type_FilePath">FilePath</a></li><li><a href="#type_FoldingKind">FoldingKind</a></li><li><a href="#type_FoldingRegion">FoldingRegion</a></li><li><a href="#type_GeneralAnalysisService">GeneralAnalysisService</a></li><li><a href="#type_HighlightRegion">HighlightRegion</a></li><li><a href="#type_HighlightRegionType">HighlightRegionType</a></li><li><a href="#type_HoverInformation">HoverInformation</a></li><li><a href="#type_LinkedEditGroup">LinkedEditGroup</a></li><li><a href="#type_LinkedEditSuggestion">LinkedEditSuggestion</a></li><li><a href="#type_LinkedEditSuggestionKind">LinkedEditSuggestionKind</a></li><li><a href="#type_Location">Location</a></li><li><a href="#type_NavigationRegion">NavigationRegion</a></li><li><a href="#type_NavigationTarget">NavigationTarget</a></li><li><a href="#type_Occurrences">Occurrences</a></li><li><a href="#type_Outline">Outline</a></li><li><a href="#type_Override">Override</a></li><li><a href="#type_OverriddenMember">OverriddenMember</a></li><li><a href="#type_Position">Position</a></li><li><a href="#type_PubStatus">PubStatus</a></li><li><a href="#type_RefactoringKind">RefactoringKind</a></li><li><a href="#type_RefactoringMethodParameter">RefactoringMethodParameter</a></li><li><a href="#type_RefactoringFeedback">RefactoringFeedback</a></li><li><a href="#type_RefactoringOptions">RefactoringOptions</a></li><li><a href="#type_RefactoringMethodParameterKind">RefactoringMethodParameterKind</a></li><li><a href="#type_RefactoringProblem">RefactoringProblem</a></li><li><a href="#type_RefactoringProblemSeverity">RefactoringProblemSeverity</a></li><li><a href="#type_RemoveContentOverlay">RemoveContentOverlay</a></li><li><a href="#type_RequestError">RequestError</a></li><li><a href="#type_RequestErrorCode">RequestErrorCode</a></li><li><a href="#type_SearchId">SearchId</a></li><li><a href="#type_SearchResult">SearchResult</a></li><li><a href="#type_SearchResultKind">SearchResultKind</a></li><li><a href="#type_ServerService">ServerService</a></li><li><a href="#type_SourceChange">SourceChange</a></li><li><a href="#type_SourceEdit">SourceEdit</a></li><li><a href="#type_SourceFileEdit">SourceFileEdit</a></li><li><a href="#type_TypeHierarchyItem">TypeHierarchyItem</a></li></ul></div><h3>Refactorings (<a href="#refactorings">↑</a>)</h3><div class="subindex"><ul><li><a href="#refactoring_CONVERT_GETTER_TO_METHOD">CONVERT_GETTER_TO_METHOD</a></li><li><a href="#refactoring_CONVERT_METHOD_TO_GETTER">CONVERT_METHOD_TO_GETTER</a></li><li><a href="#refactoring_EXTRACT_LOCAL_VARIABLE">EXTRACT_LOCAL_VARIABLE</a></li><li><a href="#refactoring_EXTRACT_METHOD">EXTRACT_METHOD</a></li><li><a href="#refactoring_INLINE_LOCAL_VARIABLE">INLINE_LOCAL_VARIABLE</a></li><li><a href="#refactoring_INLINE_METHOD">INLINE_METHOD</a></li><li><a href="#refactoring_MOVE_FILE">MOVE_FILE</a></li><li><a href="#refactoring_RENAME">RENAME</a></li></ul></div>
+  
+
+</body></html>
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/completion/completion_dart.dart b/pkg/analysis_server/lib/completion/completion_dart.dart
index 669b2ef..1ddd5a0 100644
--- a/pkg/analysis_server/lib/completion/completion_dart.dart
+++ b/pkg/analysis_server/lib/completion/completion_dart.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 
 /**
  * An object used to produce completions for a specific error within a Dart
@@ -78,7 +79,7 @@
    * Return the completion target.  This determines what part of the parse tree
    * will receive the newly inserted text.
    */
-  //CompletionTarget get target;
+  CompletionTarget get target;
 
   /**
    * Information about the types of suggestions that should be included.
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_target.dart b/pkg/analysis_server/lib/completion/dart/completion_target.dart
similarity index 100%
rename from pkg/analysis_server/lib/src/services/completion/completion_target.dart
rename to pkg/analysis_server/lib/completion/dart/completion_target.dart
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 1df76ad..c8108b8 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -951,9 +951,23 @@
         if (context == null) {
           continue;
         }
+        Source source = contextSource.source;
+        // Ensure that if the AST is flushed / not ready, it will be
+        // computed eventually.
+        if (AnalysisEngine.isDartFileName(file)) {
+          (context as InternalAnalysisContext).ensureResolvedDartUnits(source);
+        }
+        // Send notifications that don't directly take an AST.
+        switch (service) {
+          case AnalysisService.NAVIGATION:
+            sendAnalysisNotificationNavigation(this, context, source);
+            continue;
+          case AnalysisService.OCCURRENCES:
+            sendAnalysisNotificationOccurrences(this, context, source);
+            continue;
+        }
         // Dart unit notifications.
         if (AnalysisEngine.isDartFileName(file)) {
-          Source source = contextSource.source;
           // TODO(scheglov) This way to get resolved information is very Dart
           // specific. OTOH as it is planned now Angular results are not
           // flushable.
@@ -964,12 +978,6 @@
               case AnalysisService.HIGHLIGHTS:
                 sendAnalysisNotificationHighlights(this, file, dartUnit);
                 break;
-              case AnalysisService.NAVIGATION:
-                sendAnalysisNotificationNavigation(this, context, source);
-                break;
-              case AnalysisService.OCCURRENCES:
-                sendAnalysisNotificationOccurrences(this, context, source);
-                break;
               case AnalysisService.OUTLINE:
                 AnalysisContext context = dartUnit.element.context;
                 LineInfo lineInfo = context.getLineInfo(source);
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index f89d278..c847670 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -63,15 +63,15 @@
     if (_addIdentifierRegion_constructor(node)) {
       return;
     }
-    if (_addIdentifierRegion_dynamicLocal(node)) {
-      return;
-    }
     if (_addIdentifierRegion_getterSetterDeclaration(node)) {
       return;
     }
     if (_addIdentifierRegion_field(node)) {
       return;
     }
+    if (_addIdentifierRegion_dynamicLocal(node)) {
+      return;
+    }
     if (_addIdentifierRegion_function(node)) {
       return;
     }
@@ -96,6 +96,9 @@
     if (_addIdentifierRegion_typeParameter(node)) {
       return;
     }
+    if (_addIdentifierRegion_unresolvedInstanceMemberReference(node)) {
+      return;
+    }
     _addRegion_node(node, HighlightRegionType.IDENTIFIER_DEFAULT);
   }
 
@@ -352,6 +355,38 @@
     return _addRegion_node(node, HighlightRegionType.TYPE_PARAMETER);
   }
 
+  bool _addIdentifierRegion_unresolvedInstanceMemberReference(
+      SimpleIdentifier node) {
+    // unresolved
+    Element element = node.bestElement;
+    if (element != null) {
+      return false;
+    }
+    // invoke / get / set
+    bool decorate = false;
+    AstNode parent = node.parent;
+    if (parent is MethodInvocation) {
+      Expression target = parent.realTarget;
+      if (parent.methodName == node &&
+          target != null &&
+          _isDynamicExpression(target)) {
+        decorate = true;
+      }
+    } else if (node.inGetterContext() || node.inSetterContext()) {
+      if (parent is PrefixedIdentifier) {
+        decorate = parent.identifier == node;
+      } else if (parent is PropertyAccess) {
+        decorate = parent.propertyName == node;
+      }
+    }
+    if (decorate) {
+      _addRegion_node(
+          node, HighlightRegionType.UNRESOLVED_INSTANCE_MEMBER_REFERENCE);
+      return true;
+    }
+    return false;
+  }
+
   void _addRegion(int offset, int length, HighlightRegionType type) {
     _regions.add(new HighlightRegion(type, offset, length));
   }
@@ -384,6 +419,13 @@
     int end = b.end;
     _addRegion(offset, end - offset, type);
   }
+
+  static bool _isDynamicExpression(Expression e) {
+    if (e is SimpleIdentifier && e.staticElement is PrefixElement) {
+      return false;
+    }
+    return e.bestType.isDynamic;
+  }
 }
 
 /**
@@ -598,6 +640,12 @@
   }
 
   @override
+  Object visitLibraryIdentifier(LibraryIdentifier node) {
+    computer._addRegion_node(node, HighlightRegionType.LIBRARY_NAME);
+    return null;
+  }
+
+  @override
   Object visitListLiteral(ListLiteral node) {
     computer._addRegion_node(node, HighlightRegionType.LITERAL_LIST);
     computer._addRegion_token(node.constKeyword, HighlightRegionType.KEYWORD);
diff --git a/pkg/analysis_server/lib/src/server/http_server.dart b/pkg/analysis_server/lib/src/server/http_server.dart
index 3372933..c047d1f 100644
--- a/pkg/analysis_server/lib/src/server/http_server.dart
+++ b/pkg/analysis_server/lib/src/server/http_server.dart
@@ -76,8 +76,13 @@
    * Begin serving HTTP requests over the given port.
    */
   void serveHttp(int port) {
-    _server = HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port);
-    _server.then(_handleServer);
+    try {
+      _server = HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port);
+      _server.then(_handleServer);
+    } catch (exception) {
+      // We were unable to start the server, and there's nothing we can do about
+      // it.
+    }
   }
 
   /**
diff --git a/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart b/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart
index 11b4f1b..2b391ca 100644
--- a/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/common_usage_computer.dart
@@ -4,10 +4,13 @@
 
 library services.completion.computer.dart.relevance;
 
+import 'package:analysis_server/completion/completion_dart.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
 import 'package:analysis_server/src/protocol_server.dart'
     show CompletionSuggestion, CompletionSuggestionKind;
-import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/completion/contribution_sorter.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart'
+    show DART_RELEVANCE_COMMON_USAGE;
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 
@@ -15,9 +18,10 @@
 
 /**
  * A computer for adjusting the relevance of completions computed by others
- * based upon common Dart usage patterns.
+ * based upon common Dart usage patterns. This is a long-lived object
+ * that should not maintain state between calls to it's [sort] method.
  */
-class CommonUsageComputer {
+class CommonUsageComputer implements ContributionSorter {
   /**
    * A map of <library>.<classname> to an ordered list of method names,
    * field names, getter names, and named constructors.
@@ -28,23 +32,10 @@
 
   CommonUsageComputer([this.selectorRelevance = defaultSelectorRelevance]);
 
-  /**
-   * Adjusts the relevance based on the given completion context.
-   * The compilation unit and completion node
-   * in the given completion context may not be resolved.
-   * This method should execute quickly and not block waiting for any analysis.
-   */
-  void computeFast(DartCompletionRequest request) {
-    _update(request);
-  }
-
-  /**
-   * Adjusts the relevance based on the given completion context.
-   * The compilation unit and completion node
-   * in the given completion context are resolved.
-   */
-  void computeFull(DartCompletionRequest request) {
-    _update(request);
+  @override
+  void sort(DartCompletionRequest request,
+      Iterable<CompletionSuggestion> suggestions) {
+    _update(request, suggestions);
   }
 
   /**
@@ -52,7 +43,8 @@
    * The compilation unit and completion node
    * in the given completion context may not be resolved.
    */
-  void _update(DartCompletionRequest request) {
+  void _update(DartCompletionRequest request,
+      Iterable<CompletionSuggestion> suggestions) {
     var visitor = new _BestTypeVisitor(request.target.entity);
     DartType type = request.target.containingNode.accept(visitor);
     if (type != null) {
@@ -60,7 +52,7 @@
       if (typeElem != null) {
         LibraryElement libElem = typeElem.library;
         if (libElem != null) {
-          _updateInvocationRelevance(request, type, libElem);
+          _updateInvocationRelevance(request, type, libElem, suggestions);
         }
       }
     }
@@ -70,12 +62,12 @@
    * Adjusts the relevance of all method suggestions based upon the given
    * target type and library.
    */
-  void _updateInvocationRelevance(
-      DartCompletionRequest request, DartType type, LibraryElement libElem) {
+  void _updateInvocationRelevance(DartCompletionRequest request, DartType type,
+      LibraryElement libElem, Iterable<CompletionSuggestion> suggestions) {
     String typeName = type.name;
     List<String> selectors = selectorRelevance['${libElem.name}.${typeName}'];
     if (selectors != null) {
-      for (CompletionSuggestion suggestion in request.suggestions) {
+      for (CompletionSuggestion suggestion in suggestions) {
         protocol.Element element = suggestion.element;
         if (element != null &&
             (element.kind == protocol.ElementKind.CONSTRUCTOR ||
diff --git a/pkg/analysis_server/lib/src/services/completion/completion_dart.dart b/pkg/analysis_server/lib/src/services/completion/completion_dart.dart
index 526d69d..4304295 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_dart.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_dart.dart
@@ -6,6 +6,7 @@
 
 import 'package:analysis_server/completion/completion_core.dart';
 import 'package:analysis_server/completion/completion_dart.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analysis_server/src/services/completion/completion_core.dart';
 import 'package:analyzer/src/generated/ast.dart';
 
@@ -25,10 +26,16 @@
   final bool isResolved;
 
   /**
+   * The completion target.  This determines what part of the parse tree
+   * will receive the newly inserted text.
+   */
+  final CompletionTarget target;
+
+  /**
    * Initialize a newly created completion request based on the given arguments.
    */
   DartCompletionRequestImpl(
-      CompletionRequest request, this.unit, this.isResolved)
+      CompletionRequest request, this.unit, this.isResolved, this.target)
       : super(request.context, request.resourceProvider, request.source,
             request.offset);
 }
diff --git a/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart b/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart
new file mode 100644
index 0000000..737a837
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/contribution_sorter.dart
@@ -0,0 +1,26 @@
+// 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 services.completion.sorter;
+
+import 'package:analysis_server/completion/completion_dart.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * The abstract class `ContributionSorter` defines the behavior of objects
+ * that are used to adjust the relevance of an existing list of suggestions.
+ * This is a long-lived object that should not maintain state between
+ * calls to it's [sort] method.
+ */
+abstract class ContributionSorter {
+  /**
+   * After [CompletionSuggestion]s have been computed,
+   * this method is called to adjust the relevance of those suggestions.
+   * The compilation unit and completion node
+   * in the given completion context may not be resolved.
+   * This method should execute quickly and not block.
+   */
+  void sort(DartCompletionRequest request,
+      Iterable<CompletionSuggestion> suggestions);
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
index 06c3c6a..ae177f2 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart_completion_manager.dart
@@ -8,21 +8,24 @@
 
 import 'package:analysis_server/completion/completion_core.dart'
     show CompletionRequest;
+import 'package:analysis_server/completion/completion_dart.dart' as newApi;
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/combinator_contributor.dart';
 import 'package:analysis_server/src/services/completion/common_usage_computer.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/completion_target.dart';
+import 'package:analysis_server/src/services/completion/contribution_sorter.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
-import 'package:analysis_server/src/services/completion/uri_contributor.dart';
 import 'package:analysis_server/src/services/completion/imported_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/keyword_contributor.dart';
 import 'package:analysis_server/src/services/completion/local_reference_contributor.dart';
 import 'package:analysis_server/src/services/completion/optype.dart';
 import 'package:analysis_server/src/services/completion/prefixed_element_contributor.dart';
+import 'package:analysis_server/src/services/completion/uri_contributor.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -72,14 +75,21 @@
  * Manages code completion for a given Dart file completion request.
  */
 class DartCompletionManager extends CompletionManager {
+  /**
+   * The [defaultContributionSorter] is a long-lived object that isn't allowed
+   * to maintain state between calls to [ContributionSorter#sort(...)].
+   */
+  static ContributionSorter defaultContributionSorter =
+      new CommonUsageComputer();
+
   final SearchEngine searchEngine;
   final DartCompletionCache cache;
   List<DartCompletionContributor> contributors;
-  CommonUsageComputer commonUsageComputer;
+  ContributionSorter contributionSorter;
 
   DartCompletionManager(
       AnalysisContext context, this.searchEngine, Source source, this.cache,
-      [this.contributors, this.commonUsageComputer])
+      [this.contributors, this.contributionSorter])
       : super(context, source) {
     if (contributors == null) {
       contributors = [
@@ -93,10 +103,13 @@
         new CombinatorContributor(),
         new PrefixedElementContributor(),
         new UriContributor(),
+        // TODO(brianwilkerson) Use the completion contributor extension point
+        // to add the contributor below (and eventually, all the contributors).
+//        new NewCompletionWrapper(new InheritedContributor())
       ];
     }
-    if (commonUsageComputer == null) {
-      commonUsageComputer = new CommonUsageComputer();
+    if (contributionSorter == null) {
+      contributionSorter = defaultContributionSorter;
     }
   }
 
@@ -167,7 +180,8 @@
           return c.computeFast(request);
         });
       });
-      commonUsageComputer.computeFast(request);
+      contributionSorter.sort(
+          new OldRequestWrapper(request), request.suggestions);
       sendResults(request, todo.isEmpty);
       return todo;
     });
@@ -205,7 +219,8 @@
               performance.logElapseTime(completeTag);
               bool last = --count == 0;
               if (changed || last) {
-                commonUsageComputer.computeFull(request);
+                contributionSorter.sort(
+                    new OldRequestWrapper(request), request.suggestions);
                 sendResults(request, last);
               }
             });
@@ -399,3 +414,82 @@
     }
   }
 }
+
+/**
+ * A wrapper around a new dart completion contributor that makes it usable where
+ * an old dart completion contributor is expected.
+ */
+class NewCompletionWrapper implements DartCompletionContributor {
+  /**
+   * The new-style contributor that is being wrapped.
+   */
+  final newApi.DartCompletionContributor contributor;
+
+  /**
+   * Initialize a newly created wrapper for the given [contributor].
+   */
+  NewCompletionWrapper(this.contributor);
+
+  @override
+  bool computeFast(DartCompletionRequest request) {
+    List<CompletionSuggestion> suggestions =
+        contributor.computeSuggestions(new OldRequestWrapper(request));
+    if (suggestions == null) {
+      return false;
+    }
+    for (CompletionSuggestion suggestion in suggestions) {
+      request.addSuggestion(suggestion);
+    }
+    return true;
+  }
+
+  @override
+  Future<bool> computeFull(DartCompletionRequest request) async {
+    List<CompletionSuggestion> suggestions =
+        contributor.computeSuggestions(new OldRequestWrapper(request));
+    if (suggestions != null) {
+      for (CompletionSuggestion suggestion in suggestions) {
+        request.addSuggestion(suggestion);
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  String toString() => 'wrapped $contributor';
+}
+
+/**
+ * A wrapper around an old dart completion request that makes it usable where a
+ * new dart completion request is expected.
+ */
+class OldRequestWrapper implements newApi.DartCompletionRequest {
+  final DartCompletionRequest request;
+
+  OldRequestWrapper(this.request);
+
+  @override
+  AnalysisContext get context => request.context;
+
+  @override
+  bool get isResolved => request.unit.element != null;
+
+  @override
+  int get offset => request.offset;
+
+  @override
+  ResourceProvider get resourceProvider => request.resourceProvider;
+
+  @override
+  Source get source => request.source;
+
+  @override
+  CompletionTarget get target => request.target;
+
+  @override
+  CompilationUnit get unit => request.unit;
+
+  @override
+  String toString() => 'wrapped $request';
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/inherited_contributor.dart b/pkg/analysis_server/lib/src/services/completion/inherited_contributor.dart
new file mode 100644
index 0000000..11d0631
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/inherited_contributor.dart
@@ -0,0 +1,160 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library services.completion.computer.dart.invocation;
+
+import 'package:analysis_server/completion/completion_dart.dart';
+import 'package:analysis_server/src/protocol_server.dart'
+    show CompletionSuggestion, CompletionSuggestionKind, SourceChange;
+import 'package:analysis_server/src/protocol_server.dart' as protocol
+    hide CompletionSuggestion, CompletionSuggestionKind;
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart'
+    show DART_RELEVANCE_HIGH;
+import 'package:analysis_server/utilities/change_builder_dart.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+/**
+ * A completion contributor used to suggest replacing partial identifiers inside
+ * a class declaration with templates for inherited members.
+ */
+class InheritedContributor extends DartCompletionContributor {
+  @override
+  List<CompletionSuggestion> internalComputeSuggestions(
+      DartCompletionRequest request) {
+    if (!request.isResolved) {
+      return null;
+    }
+    AstNode node = new NodeLocator(request.offset).searchWithin(request.unit);
+    if (node == null || !_isMemberLevelIdentifier(node)) {
+      return null;
+    }
+    ClassDeclaration classDeclaration =
+        node.getAncestor((AstNode node) => node is ClassDeclaration);
+    if (classDeclaration != null) {
+      ClassElement element = classDeclaration.element;
+      if (element == null) {
+        return null;
+      }
+      return _suggestInheritedMembers(request, node, element);
+    }
+    return null;
+  }
+
+  /**
+   * Return a template for an override of the given [element] in the given
+   * [source]. If selected, the template will replace the given [identifier].
+   */
+  String _buildRepacementText(
+      Source source, SimpleIdentifier identifier, Element element) {
+    AnalysisContext context = element.context;
+    DartChangeBuilder builder = new DartChangeBuilder(context);
+    builder.addFileEdit(source, context.getModificationStamp(source),
+        (DartFileEditBuilder builder) {
+      builder.addReplacement(identifier.offset, identifier.length,
+          (DartEditBuilder builder) {
+        builder.writeOverrideOfInheritedMember(element);
+      });
+    });
+    return builder.sourceChange.edits[0].edits[0].replacement.trim();
+  }
+
+  /**
+   * Build a suggestion to replace the partial [identifier] in the given
+   * [source] with an override of the given [element].
+   */
+  CompletionSuggestion _buildSuggestion(
+      Source source, SimpleIdentifier identifier, Element element) {
+    String completion = _buildRepacementText(source, identifier, element);
+    CompletionSuggestion suggestion = new CompletionSuggestion(
+        CompletionSuggestionKind.IDENTIFIER,
+        DART_RELEVANCE_HIGH,
+        completion,
+        identifier.offset,
+        0,
+        element.isDeprecated,
+        false);
+    suggestion.element = protocol.newElement_fromEngine(element);
+    return suggestion;
+  }
+
+  /**
+   * Return a list containing the names of all of the inherited by not
+   * implemented members of the class represented by the given [element] that
+   * start with the given [prefix]. The [map] is used to find all of the members
+   * that are inherited.
+   */
+  List<String> _computeMemberNames(
+      MemberMap map, ClassElement element, String prefix) {
+    List<String> memberNames = <String>[];
+    int count = map.size;
+    for (int i = 0; i < count; i++) {
+      String memberName = map.getKey(i);
+      if (memberName.startsWith(prefix) && !_hasMember(element, memberName)) {
+        memberNames.add(memberName);
+      }
+    }
+    return memberNames;
+  }
+
+  /**
+   * Return `true` if the given [classElement] directly declares a member with
+   * the given [memberName].
+   */
+  bool _hasMember(ClassElement classElement, String memberName) {
+    return classElement.getField(memberName) != null ||
+        classElement.getGetter(memberName) != null ||
+        classElement.getMethod(memberName) != null ||
+        classElement.getSetter(memberName) != null;
+  }
+
+  /**
+   * Return `true` if the given [node] looks like a partial identifier inside a
+   * class declaration.
+   */
+  bool _isMemberLevelIdentifier(AstNode node) {
+    if (node is SimpleIdentifier) {
+      AstNode parent1 = node.parent;
+      if (parent1 is TypeName) {
+        AstNode parent2 = parent1.parent;
+        if (parent2 is VariableDeclarationList) {
+          AstNode parent3 = parent2.parent;
+          if (parent3 is FieldDeclaration) {
+            NodeList<VariableDeclaration> variables = parent2.variables;
+            return variables.length == 1 && variables[0].name.name.isEmpty;
+          }
+        }
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Add any suggestions that are appropriate to the given [request], using the
+   * given [element] to find inherited members whose name has the given
+   * [identifier] as a prefix.
+   */
+  List<CompletionSuggestion> _suggestInheritedMembers(
+      DartCompletionRequest request,
+      SimpleIdentifier identifier,
+      ClassElement element) {
+    String name = identifier.name;
+    InheritanceManager manager = new InheritanceManager(element.library);
+    MemberMap map = manager.getMapOfMembersInheritedFromInterfaces(element);
+    List<String> memberNames = _computeMemberNames(map, element, name);
+    memberNames.sort();
+    List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
+    for (String memberName in memberNames) {
+      CompletionSuggestion suggestion =
+          _buildSuggestion(request.source, identifier, map.get(memberName));
+      if (suggestion != null) {
+        suggestions.add(suggestion);
+      }
+    }
+    return suggestions;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/optype.dart b/pkg/analysis_server/lib/src/services/completion/optype.dart
index 02c89bf..5a04322 100644
--- a/pkg/analysis_server/lib/src/services/completion/optype.dart
+++ b/pkg/analysis_server/lib/src/services/completion/optype.dart
@@ -4,7 +4,7 @@
 
 library services.completion.dart.optype;
 
-import 'package:analysis_server/src/services/completion/completion_target.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 
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 eca515b..a2dd729 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -35,7 +35,6 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:path/path.dart';
-import 'package:path/path.dart' as ppp;
 
 /**
  * A predicate is a one-argument function that returns a boolean value.
diff --git a/pkg/analysis_server/lib/src/services/generated/completion.dart.unused b/pkg/analysis_server/lib/src/services/generated/completion.dart.unused
deleted file mode 100644
index fad936f..0000000
--- a/pkg/analysis_server/lib/src/services/generated/completion.dart.unused
+++ /dev/null
@@ -1,3700 +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.
-
-// 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 services.completion;
-
-import 'dart:collection';
-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';
-import 'package:analyzer/src/generated/ast.dart';
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/scanner.dart';
-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;
-
-  DartType result = null;
-
-  AstNodeClassifier_CompletionEngine_typeOf(this.CompletionEngine_this);
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) => visitSimpleIdentifier(node.identifier);
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element elem = node.bestElement;
-    if (elem != null && elem.kind == ElementKind.GETTER) {
-      PropertyAccessorElement accessor = elem as PropertyAccessorElement;
-      if (accessor.isSynthetic) {
-        PropertyInducingElement var2 = accessor.variable;
-        result = CompletionEngine_this._typeSearch(var2);
-      }
-    }
-    return null;
-  }
-}
-
-/**
- * The analysis engine for code completion.
- *
- * Note: During development package-private methods are used to group element-specific completion
- * utilities.
- *
- * TODO: Recognize when completion is requested in the middle of a multi-character operator.
- * Re-write the AST as it would be if an identifier were present at the completion point then
- * restart the analysis.
- */
-class CompletionEngine {
-  static String _C_DYNAMIC = "dynamic";
-
-  static String _C_FALSE = "false";
-
-  static String _C_NULL = "null";
-
-  static String _C_PARAMNAME = "arg";
-
-  static String _C_TRUE = "true";
-
-  static String _C_VAR = "var";
-
-  static String _C_VOID = "void";
-
-  static bool _isPrivate(Element element) {
-    String name = element.displayName;
-    return Identifier.isPrivateName(name);
-  }
-
-  static bool _isSyntheticIdentifier(Expression expression) => expression is SimpleIdentifier && expression.isSynthetic;
-
-  CompletionRequestor _requestor;
-
-  final CompletionFactory _factory;
-
-  AssistContext _context;
-
-  Filter _filter;
-
-  CompletionState _state;
-
-  List<LibraryElement> _libraries;
-
-  CompletionEngine(CompletionRequestor requestor, this._factory) {
-    this._requestor = requestor;
-    this._state = new CompletionState();
-  }
-
-  /**
-   * Analyze the source unit in the given context to determine completion proposals at the selection
-   * offset of the context.
-   *
-   * @throws Exception
-   */
-  void complete(AssistContext context) {
-    this._context = context;
-    _requestor.beginReporting();
-    AstNode completionNode = context.coveredNode;
-    if (completionNode != null) {
-      _state.context = completionNode;
-      CompletionEngine_TerminalNodeCompleter visitor = new CompletionEngine_TerminalNodeCompleter(this);
-      completionNode.accept(visitor);
-    }
-    _requestor.endReporting();
-  }
-
-  void _analyzeAnnotationName(SimpleIdentifier identifier) {
-    _filter = _createFilter(identifier);
-    CompletionEngine_NameCollector names = _collectTopLevelElementVisibleAt(identifier);
-    for (Element element in names.uniqueElements) {
-      if (element is PropertyAccessorElement) {
-        element = (element as PropertyAccessorElement).variable;
-      }
-      if (element is TopLevelVariableElement) {
-        TopLevelVariableElement variable = element as TopLevelVariableElement;
-        if (_state._isCompileTimeConstantRequired && !variable.isConst) {
-          continue;
-        }
-        _proposeName(element, identifier, names);
-      }
-      if (element is ClassElement) {
-        ClassElement classElement = element as ClassElement;
-        for (ConstructorElement constructor in classElement.constructors) {
-          _pNamedConstructor(classElement, constructor, identifier);
-        }
-      }
-    }
-  }
-
-  void _analyzeConstructorTypeName(SimpleIdentifier identifier) {
-    _filter = _createFilter(identifier);
-    List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
-    for (Element type in types) {
-      if (type is ClassElement) {
-        _namedConstructorReference(type, identifier);
-      }
-    }
-    List<Element> prefixes = _findAllPrefixes();
-    for (Element prefix in prefixes) {
-      _pName(prefix, identifier);
-    }
-  }
-
-  void _analyzeDeclarationName(VariableDeclaration varDecl) {
-    // We might want to propose multiple names for a declaration based on types someday.
-    // For now, just use whatever is already there.
-    SimpleIdentifier identifier = varDecl.name;
-    _filter = _createFilter(identifier);
-    VariableDeclarationList varList = varDecl.parent as VariableDeclarationList;
-    TypeName type = varList.type;
-    if (identifier.length > 0) {
-      _pName3(identifier.name, CompletionSuggestionKind.LOCAL_VARIABLE);
-    }
-    if (type == null) {
-      if (varList.keyword == null) {
-        // Interpret as the type name of a typed variable declaration { DivE!; }
-        _analyzeLocalName(identifier);
-      }
-    } else {
-      _pParamName(type.name.name.toLowerCase());
-    }
-  }
-
-  void _analyzeDirectAccess(DartType receiverType, SimpleIdentifier completionNode) {
-    if (receiverType != null) {
-      // Complete this.!y where this is absent
-      Element rcvrTypeElem = receiverType.element;
-      if (receiverType.isDynamic) {
-        rcvrTypeElem = objectClassElement;
-      }
-      if (rcvrTypeElem is ClassElement) {
-        _directAccess(rcvrTypeElem as ClassElement, completionNode);
-      }
-    }
-  }
-
-  void _analyzeImmediateField(SimpleIdentifier fieldName) {
-    _filter = _createFilter(fieldName);
-    ClassDeclaration classDecl = fieldName.getAncestor((node) => node is ClassDeclaration);
-    ClassElement classElement = classDecl.element;
-    for (FieldElement field in classElement.fields) {
-      _pName3(field.displayName, CompletionSuggestionKind.FIELD);
-    }
-  }
-
-  void _analyzeLiteralReference(BooleanLiteral literal) {
-    //    state.setContext(literal);
-    Ident ident = _createIdent(literal.parent);
-    ident.token = literal.literal;
-    _filter = _createFilter(ident);
-    _analyzeLocalName(ident);
-  }
-
-  void _analyzeLocalName(SimpleIdentifier identifier) {
-    // Completion x!
-    _filter = _createFilter(identifier);
-    // TODO Filter out types that have no static members.
-    CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
-    for (Element element in names.uniqueElements) {
-      if (_state._isSourceDeclarationStatic) {
-        if (element is FieldElement) {
-          if (!element.isStatic) {
-            continue;
-          }
-        } else if (element is PropertyAccessorElement) {
-          if (!element.isStatic) {
-            continue;
-          }
-        }
-      }
-      if (_state._isOptionalArgumentRequired) {
-        if (element is! ParameterElement) {
-          continue;
-        }
-        ParameterElement param = element as ParameterElement;
-        if (!param.parameterKind.isOptional) {
-          continue;
-        }
-      }
-      _proposeName(element, identifier, names);
-    }
-    if (_state._areLiteralsAllowed) {
-      _pNull();
-      _pTrue();
-      _pFalse();
-    }
-  }
-
-  void _analyzeNamedParameter(ArgumentList args, SimpleIdentifier identifier) {
-    // Completion x!
-    _filter = _createFilter(identifier);
-    // prepare parameters
-    List<ParameterElement> parameters = _getParameterElements(args);
-    if (parameters == null) {
-      return;
-    }
-    // remember already used names
-    Set<String> usedNames = new Set();
-    for (Expression arg in args.arguments) {
-      if (arg is NamedExpression) {
-        NamedExpression namedExpr = arg;
-        String name = namedExpr.name.label.name;
-        usedNames.add(name);
-      }
-    }
-    // propose named parameters
-    for (ParameterElement parameterElement in parameters) {
-      // should be named
-      if (parameterElement.parameterKind != ParameterKind.NAMED) {
-        continue;
-      }
-      // filter by name
-      if (_filterDisallows(parameterElement)) {
-        continue;
-      }
-      // may be already used
-      String parameterName = parameterElement.name;
-      if (usedNames.contains(parameterName)) {
-        continue;
-      }
-      // OK, add proposal
-      CompletionProposal prop = _createProposal4(CompletionSuggestionKind.NAMED_ARGUMENT);
-      prop.setCompletion(parameterName);
-      prop.setParameterName(parameterName);
-      prop.setParameterType(parameterElement.type.displayName);
-      prop.setLocation(identifier.offset);
-      prop.setReplacementLength(identifier.length);
-      prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
-      _requestor.accept(prop);
-    }
-  }
-
-  void _analyzeNewParameterName(List<FormalParameter> params, SimpleIdentifier typeIdent, String identifierName) {
-    String typeName = typeIdent.name;
-    _filter = _createFilter(_createIdent(typeIdent));
-    List<String> names = new List<String>();
-    for (FormalParameter node in params) {
-      names.add(node.identifier.name);
-    }
-    // Find name similar to typeName not in names, ditto for identifierName.
-    if (identifierName == null || identifierName.isEmpty) {
-      String candidate = typeName == null || typeName.isEmpty ? _C_PARAMNAME : typeName.toLowerCase();
-      _pParamName(_makeNonconflictingName(candidate, names));
-    } else {
-      _pParamName(_makeNonconflictingName(identifierName, names));
-      if (typeName != null && !typeName.isEmpty) {
-        _pParamName(_makeNonconflictingName(typeName.toLowerCase(), names));
-      }
-    }
-  }
-
-  void _analyzePositionalArgument(ArgumentList args, SimpleIdentifier identifier) {
-    // Show parameter name only if there is nothing to complete, so that if there is only
-    // one match, we won't to force user to choose.
-    if (!StringUtils.isEmpty(identifier.name)) {
-      return;
-    }
-    // prepare parameters
-    List<ParameterElement> parameters = _getParameterElements(args);
-    if (parameters == null) {
-      return;
-    }
-    // show current parameter
-    int argIndex = args.arguments.indexOf(identifier);
-    if (argIndex == -1) {
-      argIndex = 0;
-    }
-    if (argIndex >= 0 && argIndex < parameters.length) {
-      ParameterElement parameter = parameters[argIndex];
-      if (parameter.parameterKind != ParameterKind.NAMED) {
-        String parameterName = parameter.displayName;
-        CompletionProposal prop = _createProposal4(CompletionSuggestionKind.OPTIONAL_ARGUMENT);
-        prop.setCompletion(parameterName);
-        prop.setParameterName(parameterName);
-        prop.setParameterType(parameter.type.displayName);
-        prop.setLocation(identifier.offset);
-        prop.setReplacementLength(identifier.length);
-        prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
-        _requestor.accept(prop);
-      }
-    }
-  }
-
-  void _analyzePrefixedAccess(Expression receiver, SimpleIdentifier completionNode) {
-    if (receiver is ThisExpression && !_state._isThisAllowed) {
-      return;
-    }
-    DartType receiverType = _typeOf2(receiver);
-    bool forSuper = receiver is SuperExpression;
-    _analyzePrefixedAccess2(receiverType, forSuper, completionNode);
-  }
-
-  void _analyzePrefixedAccess2(DartType receiverType, bool forSuper, SimpleIdentifier completionNode) {
-    if (receiverType != null) {
-      // Complete x.!y
-      Element rcvrTypeElem = receiverType.element;
-      if (receiverType.isBottom) {
-        receiverType = objectType;
-      }
-      if (receiverType.isDynamic) {
-        receiverType = objectType;
-      }
-      if (receiverType is InterfaceType) {
-        _prefixedAccess(receiverType, forSuper, completionNode);
-      } else if (rcvrTypeElem is TypeParameterElement) {
-        TypeParameterElement typeParamElem = rcvrTypeElem;
-        _analyzePrefixedAccess2(typeParamElem.bound, false, completionNode);
-      }
-    }
-  }
-
-  void _analyzeReceiver(SimpleIdentifier identifier) {
-    // Completion x!.y
-    _filter = _createFilter(identifier);
-    CompletionEngine_NameCollector names = _collectIdentifiersVisibleAt(identifier);
-    for (Element element in names.uniqueElements) {
-      _proposeName(element, identifier, names);
-    }
-  }
-
-  void _analyzeSuperConstructorInvocation(SuperConstructorInvocation node) {
-    ClassDeclaration enclosingClassNode = node.getAncestor((node) => node is ClassDeclaration);
-    if (enclosingClassNode != null) {
-      ClassElement enclosingClassElement = enclosingClassNode.element;
-      if (enclosingClassElement != null) {
-        ClassElement superClassElement = enclosingClassElement.supertype.element;
-        _constructorReference(superClassElement, node.constructorName);
-      }
-    }
-  }
-
-  void _analyzeTypeName(SimpleIdentifier identifier, SimpleIdentifier nameIdent) {
-    _filter = _createFilter(identifier);
-    String name = nameIdent == null ? "" : nameIdent.name;
-    List<Element> types = _findAllTypes(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
-    for (Element type in types) {
-      if (_state._isForMixin) {
-        if (type is! ClassElement) {
-          continue;
-        }
-        ClassElement classElement = type as ClassElement;
-        if (!classElement.isValidMixin) {
-          continue;
-        }
-      }
-      if (type.displayName == name) {
-        continue;
-      }
-      _pName(type, nameIdent);
-    }
-    if (!_state._isForMixin) {
-      ClassDeclaration classDecl = identifier.getAncestor((node) => node is ClassDeclaration);
-      if (classDecl != null) {
-        ClassElement classElement = classDecl.element;
-        for (TypeParameterElement param in classElement.typeParameters) {
-          _pName(param, nameIdent);
-        }
-      }
-    }
-    List<Element> prefixes = _findAllPrefixes();
-    for (Element prefix in prefixes) {
-      _pName(prefix, nameIdent);
-    }
-    if (_state._isDynamicAllowed) {
-      _pDynamic();
-    }
-    if (_state._isVarAllowed) {
-      _pVar();
-    }
-    if (_state._isVoidAllowed) {
-      _pVoid();
-    }
-  }
-
-  void _constructorReference(ClassElement classElement, SimpleIdentifier identifier) {
-    // Complete identifier when it refers to a constructor defined in classElement.
-    _filter = _createFilter(identifier);
-    for (ConstructorElement cons in classElement.constructors) {
-      if (_state._isCompileTimeConstantRequired == cons.isConst && _filterAllows(cons)) {
-        _pExecutable2(cons, identifier, false);
-      }
-    }
-  }
-
-  void _directAccess(ClassElement classElement, SimpleIdentifier identifier) {
-    _filter = _createFilter(identifier);
-    CompletionEngine_NameCollector names = _createNameCollector();
-    names.addLocalNames(identifier);
-    names._addNamesDefinedByHierarchy(classElement, false);
-    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
-    _proposeNames(names, identifier);
-  }
-
-  void _dispatchPrefixAnalysis(InstanceCreationExpression node) {
-    // prepare ClassElement
-    ClassElement classElement;
-    {
-      Element typeElement = _typeOf2(node).element;
-      if (typeElement is! ClassElement) {
-        return;
-      }
-      classElement = typeElement as ClassElement;
-    }
-    // prepare constructor name
-    Identifier typeName = node.constructorName.type.name;
-    SimpleIdentifier identifier = null;
-    if (typeName is SimpleIdentifier) {
-      identifier = typeName;
-    } else if (typeName is PrefixedIdentifier) {
-      identifier = typeName.identifier;
-    }
-    if (identifier == null) {
-      identifier = _createIdent(node);
-    }
-    // analyze constructor name
-    _analyzeConstructorTypeName(identifier);
-    _constructorReference(classElement, identifier);
-  }
-
-  void _dispatchPrefixAnalysis2(MethodInvocation node) {
-    // This might be a library prefix on a top-level function
-    Expression expr = node.realTarget;
-    if (expr is SimpleIdentifier) {
-      SimpleIdentifier ident = expr;
-      if (ident.bestElement is PrefixElement) {
-        _prefixedAccess2(ident, node.methodName);
-        return;
-      } else if (ident.bestElement is ClassElement) {
-        _state._areInstanceReferencesProhibited = true;
-        _state._areStaticReferencesProhibited = false;
-      } else {
-        _state._areInstanceReferencesProhibited = false;
-        _state._areStaticReferencesProhibited = true;
-      }
-    }
-    if (expr == null) {
-      _analyzeLocalName(_createIdent(node));
-    } else {
-      _analyzePrefixedAccess(expr, node.methodName);
-    }
-  }
-
-  void _dispatchPrefixAnalysis3(PrefixedIdentifier node, SimpleIdentifier identifier) {
-    SimpleIdentifier receiverName = node.prefix;
-    Element receiver = receiverName.bestElement;
-    if (receiver == null) {
-      _prefixedAccess2(receiverName, identifier);
-      return;
-    }
-    while (true) {
-      if (receiver.kind == ElementKind.PREFIX || receiver.kind == ElementKind.IMPORT) {
-        // Complete lib_prefix.name
-        _prefixedAccess2(receiverName, identifier);
-      } else {
-        {
-          DartType receiverType;
-          DartType propType = _typeOf2(receiverName);
-          if (propType == null || propType.isDynamic) {
-            receiverType = _typeOf(receiver);
-          } else {
-            DartType declType = _typeOf(receiver);
-            if (propType.isMoreSpecificThan(declType)) {
-              receiverType = propType;
-            } else {
-              receiverType = declType;
-            }
-          }
-          _analyzePrefixedAccess2(receiverType, false, identifier);
-          break;
-        }
-      }
-      break;
-    }
-  }
-
-  void _fieldReference(ClassElement classElement, SimpleIdentifier identifier) {
-    // Complete identifier when it refers to a constructor defined in classElement.
-    _filter = _createFilter(identifier);
-    for (FieldElement cons in classElement.fields) {
-      if (_filterAllows(cons)) {
-        _pField(cons, identifier, classElement);
-      }
-    }
-  }
-
-  void _namedConstructorReference(ClassElement classElement, SimpleIdentifier identifier) {
-    // Complete identifier when it refers to a named constructor defined in classElement.
-    if (_filter == null) {
-      _filter = _createFilter(identifier);
-    }
-    for (ConstructorElement cons in classElement.constructors) {
-      if (!_isVisible(cons)) {
-        continue;
-      }
-      if (_state._isCompileTimeConstantRequired && !cons.isConst) {
-        continue;
-      }
-      _pNamedConstructor(classElement, cons, identifier);
-    }
-  }
-
-  void _namespacePubReference(NamespaceDirective node, Set<String> packageUris) {
-    // no import URI or package:
-    String prefix = _filter._prefix;
-    List<String> prefixStrings = prefix.split(":");
-    if (!prefix.isEmpty && !"package:".startsWith(prefixStrings[0])) {
-      return;
-    }
-    // if no URI yet, propose package:
-    if (prefix.isEmpty) {
-      _pImportUriWithScheme(node, "package:");
-      return;
-    }
-    // check "packages" folder for package libraries that are not added to AnalysisContext
-    {
-      Source contextSource = _context.source;
-      if (contextSource is FileBasedSource) {
-        FileBasedSource contextFileSource = contextSource;
-        String contextFilePath = contextFileSource.fullName;
-        JavaFile contextFile = new JavaFile(contextFilePath);
-        JavaFile contextFolder = contextFile.getParentFile();
-        JavaFile contextPackages = new JavaFile.relative(contextFolder, "packages");
-        if (contextPackages.isDirectory()) {
-          for (JavaFile packageFolder in contextPackages.listFiles()) {
-            String packageName = packageFolder.getName();
-            String packageLibName = "${packageName}.dart";
-            JavaFile packageFile = new JavaFile.relative(packageFolder, packageLibName);
-            if (packageFile.exists() && packageFile.isFile()) {
-              packageUris.add("package:${packageName}/${packageLibName}");
-            }
-          }
-        }
-      }
-    }
-    // add known package: URIs
-    for (String uri in packageUris) {
-      if (_filterDisallows2(uri)) {
-        continue;
-      }
-      CompletionProposal prop = _createProposal4(CompletionSuggestionKind.IMPORT);
-      prop.setCompletion(uri);
-      // put "lib" before "lib/src"
-      if (!uri.contains("/src/")) {
-        prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
-      }
-      // done
-      _requestor.accept(prop);
-    }
-  }
-
-  void _namespaceReference(NamespaceDirective node, SimpleStringLiteral literal) {
-    String lit = literal.literal.lexeme;
-    if (!lit.isEmpty) {
-      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();
-    List<LibraryElement> libraries = new List<LibraryElement>();
-    List<LibraryElement> librariesInLib = new List<LibraryElement>();
-    String currentLibraryName = currentLibrary.source.fullName;
-    AnalysisContext ac = analysisContext;
-    List<Source> sources = ac.librarySources;
-    for (Source s in sources) {
-      String sName = s.fullName;
-      // skip current library
-      if (currentLibraryName == sName) {
-        continue;
-      }
-      // ".pub-cache/..../unittest-0.8.8/lib/unittest.dart" -> "package:unittest/unittest.dart"
-      {
-        Uri uri = ac.sourceFactory.restoreUri(s);
-        if (uri != null) {
-          String uriString = uri.toString();
-          if (uriString.startsWith("package:")) {
-            packageUris.add(uriString);
-          }
-        }
-      }
-      LibraryElement lib = ac.getLibraryElement(s);
-      if (lib == null) {
-        continue;
-      } else if (_isUnitInLibFolder(lib.definingCompilationUnit)) {
-        librariesInLib.add(lib);
-      } else {
-        libraries.add(lib);
-      }
-    }
-    _namespaceSdkReference(node);
-    _namespacePubReference(node, packageUris);
-  }
-
-  void _namespaceSdkReference(NamespaceDirective node) {
-    String prefix = _filter._prefix;
-    List<String> prefixStrings = prefix.split(":");
-    if (!prefix.isEmpty && !"dart:".startsWith(prefixStrings[0])) {
-      return;
-    }
-    if (prefix.isEmpty) {
-      _pImportUriWithScheme(node, "dart:");
-      return;
-    }
-    // add DartSdk libraries
-    DartSdk dartSdk = analysisContext.sourceFactory.dartSdk;
-    for (SdkLibrary library in dartSdk.sdkLibraries) {
-      String name = library.shortName;
-      // ignore internal
-      if (library.isInternal) {
-        continue;
-      }
-      // ignore implementation
-      if (library.isImplementation) {
-        continue;
-      }
-      // standard libraries name name starting with "dart:"
-      name = StringUtils.removeStart(name, "dart:");
-      // ignore private libraries
-      if (Identifier.isPrivateName(name)) {
-        continue;
-      }
-      // add with "dart:" prefix
-      _pName3("dart:${name}", CompletionSuggestionKind.IMPORT);
-    }
-  }
-
-  void _operatorAccess(Expression expr, SimpleIdentifier identifier) {
-    _state._requiresOperators();
-    _analyzePrefixedAccess(expr, identifier);
-  }
-
-  void _prefixedAccess(InterfaceType type, bool forSuper, SimpleIdentifier identifier) {
-    // Complete identifier when it refers to field or method in classElement.
-    _filter = _createFilter(identifier);
-    CompletionEngine_NameCollector names = _createNameCollector();
-    if (_state._areInstanceReferencesProhibited) {
-      names._addNamesDefinedByType2(type);
-    } else {
-      names._addNamesDefinedByHierarchy2(type, forSuper);
-    }
-    _proposeNames(names, identifier);
-  }
-
-  void _prefixedAccess2(SimpleIdentifier prefixName, SimpleIdentifier identifier) {
-    if (_filter == null) {
-      _filter = _createFilter(identifier);
-    }
-    CompletionEngine_NameCollector names = _createNameCollector();
-    List<ImportElement> prefixImports = _importsWithName(prefixName);
-    // Library prefixes do not have a unique AST representation so we need to fudge state vars.
-    bool litsAllowed = _state._areLiteralsAllowed;
-    _state._areLiteralsAllowed = false;
-    names._addTopLevelNames(prefixImports, TopLevelNamesKind.DECLARED_AND_EXPORTS);
-    _state._areLiteralsAllowed = litsAllowed;
-    _proposeNames(names, identifier);
-  }
-
-  List<InterfaceType> _allSubtypes(ClassElement classElement) {
-    // TODO(scheglov) translate it
-    return [];
-  }
-
-  CompletionEngine_NameCollector _collectIdentifiersVisibleAt(AstNode ident) {
-    CompletionEngine_NameCollector names = _createNameCollector();
-    ScopedNameFinder finder = new ScopedNameFinder(_completionLocation());
-    ident.accept(finder);
-    names.addAll(finder.locals.values);
-    Declaration decl = finder.declaration;
-    if (decl != null && decl.parent is ClassDeclaration) {
-      ClassElement classElement = (decl.parent as ClassDeclaration).element;
-      names._addNamesDefinedByHierarchy(classElement, false);
-    }
-    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
-    return names;
-  }
-
-  CompletionEngine_NameCollector _collectTopLevelElementVisibleAt(AstNode ident) {
-    CompletionEngine_NameCollector names = _createNameCollector();
-    names._addTopLevelNames2(currentLibrary, TopLevelNamesKind.DECLARED_AND_IMPORTS);
-    return names;
-  }
-
-  int _completionLocation() => _context.selectionOffset;
-
-  int _completionTokenOffset() => _completionLocation() - _filter._prefix.length;
-
-  List<FormalParameter> _copyWithout(NodeList oldList, AstNode deletion) {
-    List<FormalParameter> newList = new List<FormalParameter>();
-    oldList.accept(new GeneralizingAstVisitor_CompletionEngine_copyWithout(deletion, newList));
-    return newList;
-  }
-
-  Filter _createFilter(SimpleIdentifier ident) => new Filter.con1(ident, _context.selectionOffset);
-
-  Ident _createIdent(AstNode node) => new Ident.con1(node, _completionLocation());
-
-  CompletionEngine_NameCollector _createNameCollector() => new CompletionEngine_NameCollector(this);
-
-  CompletionProposal _createProposal(Element element) {
-    String completion = element.displayName;
-    return _createProposal3(element, completion);
-  }
-
-  CompletionProposal _createProposal2(Element element, SimpleIdentifier identifier) {
-    // Create a completion proposal for the element: variable, field, class, function.
-    if (_filterDisallows(element)) {
-      return null;
-    }
-    CompletionProposal prop = _createProposal(element);
-    Element container = element.enclosingElement;
-    if (container != null) {
-      prop.setDeclaringType(container.displayName);
-    }
-    DartType type = _typeOf(element);
-    if (type != null) {
-      prop.setReturnType(type.name);
-    }
-    if (identifier != null) {
-      prop.setReplacementLengthIdentifier(identifier.length);
-    }
-    return prop;
-  }
-
-  CompletionProposal _createProposal3(Element element, String completion) {
-    CompletionSuggestionKind kind = _proposalKindOf(element);
-    CompletionProposal prop = _createProposal4(kind);
-    prop.setElement(element);
-    prop.setCompletion(completion);
-    prop.setDeprecated(_isDeprecated(element));
-    if (_isPrivate(element)) {
-      prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
-    }
-    if (_filter._isSameCasePrefix(element.name)) {
-      prop.incRelevance();
-    }
-    return prop;
-  }
-
-  CompletionProposal _createProposal4(CompletionSuggestionKind kind) => _factory.createCompletionProposal(kind, _completionTokenOffset());
-
-  List<LibraryElement> _currentLibraryList() {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
-    LibraryElement curLib = currentLibrary;
-    libraries.add(curLib);
-    Queue<LibraryElement> queue = new Queue<LibraryElement>();
-    queue.addAll(curLib.importedLibraries);
-    _currentLibraryLister(queue, libraries);
-    return new List.from(libraries);
-  }
-
-  void _currentLibraryLister(Queue<LibraryElement> queue, Set<LibraryElement> libraries) {
-    while (!queue.isEmpty) {
-      LibraryElement sourceLib = queue.removeFirst();
-      libraries.add(sourceLib);
-      List<LibraryElement> expLibs = sourceLib.exportedLibraries;
-      for (LibraryElement lib in expLibs) {
-        if (!libraries.contains(lib)) {
-          queue.add(lib);
-        }
-      }
-    }
-  }
-
-  bool _filterAllows(Element element) => _filter._match(element);
-
-  bool _filterDisallows(Element element) => !_filter._match(element);
-
-  bool _filterDisallows2(String name) => !_filter._match2(name);
-
-  List<Element> _findAllNotTypes(List<Element> elements) {
-    return elements.where((Element element) {
-      ElementKind kind = element.kind;
-      return kind == ElementKind.FUNCTION
-          || kind == ElementKind.TOP_LEVEL_VARIABLE
-          || kind == ElementKind.GETTER
-          || kind == ElementKind.SETTER;
-      }).toList();
-  }
-
-  List<Element> _findAllPrefixes() {
-    LibraryElement lib = _context.compilationUnitElement.enclosingElement;
-    return lib.prefixes;
-  }
-
-  List<Element> _findAllTypes(LibraryElement library, TopLevelNamesKind topKind) {
-    List<Element> elements = _findTopLevelElements(library, topKind);
-    return _findAllTypes2(elements);
-  }
-
-  List<Element> _findAllTypes2(List<Element> elements) {
-    return elements.where((Element element) {
-      ElementKind kind = element.kind;
-      return kind == ElementKind.CLASS
-          || kind == ElementKind.FUNCTION_TYPE_ALIAS;
-      }).toList();
-  }
-
-  List<Element> _findTopLevelElements(LibraryElement library, TopLevelNamesKind topKind) {
-    List<Element> elements = [];
-    if (topKind == TopLevelNamesKind.DECLARED_AND_IMPORTS) {
-      elements.addAll(CorrectionUtils.getTopLevelElements(library));
-      for (ImportElement imp in library.imports) {
-        elements.addAll(CorrectionUtils.getImportNamespace(imp).values);
-      }
-      _removeNotMatchingFilter(elements);
-    }
-    if (topKind == TopLevelNamesKind.DECLARED_AND_EXPORTS) {
-      elements.addAll(CorrectionUtils.getExportNamespace2(library).values);
-      _removeNotMatchingFilter(elements);
-    }
-    return elements;
-  }
-
-  AnalysisContext get analysisContext => _context.compilationUnitElement.context;
-
-  LibraryElement get currentLibrary => _context.compilationUnitElement.enclosingElement;
-
-  FunctionType _getFunctionType(Element element) {
-    if (element is ExecutableElement) {
-      ExecutableElement executableElement = element;
-      return executableElement.type;
-    }
-    if (element is VariableElement) {
-      VariableElement variableElement = element;
-      DartType type = variableElement.type;
-      if (type is FunctionType) {
-        return type;
-      }
-    }
-    return null;
-  }
-
-  ClassElement get objectClassElement => typeProvider.objectType.element;
-
-  InterfaceType get objectType => typeProvider.objectType;
-
-  List<ParameterElement> _getParameterElements(ArgumentList args) {
-    List<ParameterElement> parameters = null;
-    AstNode argsParent = args.parent;
-    if (argsParent is MethodInvocation) {
-      MethodInvocation invocation = argsParent;
-      Element nameElement = invocation.methodName.staticElement;
-      FunctionType functionType = _getFunctionType(nameElement);
-      if (functionType != null) {
-        parameters = functionType.parameters;
-      }
-    }
-    if (argsParent is InstanceCreationExpression) {
-      InstanceCreationExpression creation = argsParent;
-      ConstructorElement element = creation.staticElement;
-      if (element != null) {
-        parameters = element.parameters;
-      }
-    }
-    if (argsParent is Annotation) {
-      Annotation annotation = argsParent;
-      Element element = annotation.element;
-      if (element is ConstructorElement) {
-        parameters = element.parameters;
-      }
-    }
-    return parameters;
-  }
-
-  TypeProvider get typeProvider {
-    AnalysisContext analysisContext = _context.compilationUnitElement.context;
-    try {
-      return (analysisContext as InternalAnalysisContext).typeProvider;
-    } on AnalysisException catch (exception) {
-      // TODO(brianwilkerson) Figure out the right thing to do if the core cannot be resolved.
-      return null;
-    }
-  }
-
-  bool get hasErrorBeforeCompletionLocation {
-    List<AnalysisError> errors = _context.errors;
-    if (errors == null || errors.length == 0) {
-      return false;
-    }
-    return errors[0].offset <= _completionLocation();
-  }
-
-  List<ImportElement> _importsWithName(SimpleIdentifier libName) {
-    String name = libName.name;
-    List<ImportElement> imports = <ImportElement>[];
-    for (ImportElement imp in currentLibrary.imports) {
-      PrefixElement prefix = imp.prefix;
-      if (prefix != null) {
-        String impName = prefix.displayName;
-        if (name == impName) {
-          imports.add(imp);
-        }
-      }
-    }
-    return imports;
-  }
-
-  bool _isCompletingKeyword(Token keyword) {
-    if (keyword == null) {
-      return false;
-    }
-    int completionLoc = _context.selectionOffset;
-    if (completionLoc >= keyword.offset && completionLoc <= keyword.end) {
-      return true;
-    }
-    return false;
-  }
-
-  bool _isCompletionAfter(int loc) => loc <= _completionLocation();
-
-  bool _isCompletionBefore(int loc) => _completionLocation() <= loc;
-
-  bool _isCompletionBetween(int firstLoc, int secondLoc) => _isCompletionAfter(firstLoc) && _isCompletionBefore(secondLoc);
-
-  bool _isDeprecated(Element element) => element != null && element.isDeprecated;
-
-  bool _isInCurrentLibrary(Element element) {
-    LibraryElement libElement = currentLibrary;
-    return identical(element.library, libElement);
-  }
-
-  bool _isUnitInLibFolder(CompilationUnitElement cu) {
-    String pathString = cu.source.fullName;
-    if (pathString.indexOf("/lib/") == -1) {
-      return false;
-    }
-    return true;
-  }
-
-  bool _isVisible(Element element) => !_isPrivate(element) || _isInCurrentLibrary(element);
-
-  String _makeNonconflictingName(String candidate, List<String> names) {
-    String possibility = candidate;
-    int count = 0;
-    loop: while (true) {
-      String name = count == 0 ? possibility : "${possibility}${count}";
-      for (String conflict in names) {
-        if (name == conflict) {
-          count += 1;
-          continue loop;
-        }
-      }
-      return name;
-    }
-  }
-
-  void _pArgumentList(CompletionProposal proposal, int offset, int len) {
-    // prepare parameters
-    List<String> parameterNames = proposal.parameterNames;
-    if (parameterNames.length == 0) {
-      return;
-    }
-    // fill arguments proposal
-    CompletionProposal prop = _createProposal4(CompletionSuggestionKind.ARGUMENT_LIST);
-    prop.setElement(proposal.element);
-    prop.setCompletion(proposal.completion).setReturnType(proposal.returnType);
-    prop.setParameterNames(parameterNames);
-    prop.setParameterTypes(proposal.parameterTypes);
-    prop.setParameterStyle(proposal.positionalParameterCount, proposal.hasNamed, proposal.hasPositional);
-    prop.setReplacementLength(0).setLocation(_completionLocation());
-    prop.setRelevance(CompletionProposal.RELEVANCE_HIGH);
-    _requestor.accept(prop);
-  }
-
-  void _pDynamic() {
-    _pWord(_C_DYNAMIC, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pExecutable(Element element, FunctionType functionType, SimpleIdentifier identifier, bool isPotentialMatch) {
-    // Create a completion proposal for the element: function, method, getter, setter, constructor.
-    String name = element.displayName;
-    if (name.isEmpty) {
-      return;
-    }
-    if (_filterDisallows(element)) {
-      return;
-    }
-    if (!_isVisible(element)) {
-      return;
-    }
-    // May be we are in argument of function type parameter, propose function reference.
-    if (_state._targetParameter != null) {
-      DartType parameterType = _state._targetParameter.type;
-      if (parameterType is FunctionType) {
-        if (functionType.isAssignableTo(parameterType)) {
-          _pName2(name, element, CompletionProposal.RELEVANCE_HIGH, CompletionSuggestionKind.METHOD_NAME);
-        }
-      }
-    }
-    CompletionProposal prop = _createProposal(element);
-    prop.setPotentialMatch(isPotentialMatch);
-    if (isPotentialMatch) {
-      prop.setRelevance(CompletionProposal.RELEVANCE_LOW);
-    }
-    _setParameterInfo(functionType, prop);
-    prop.setCompletion(name).setReturnType(functionType.returnType.displayName);
-    // If there is already argument list, then update only method name.
-    if (identifier.parent is MethodInvocation && (identifier.parent as MethodInvocation).argumentList != null) {
-      prop.setKind(CompletionSuggestionKind.METHOD_NAME);
-    }
-    Element container = element.enclosingElement;
-    if (container != null) {
-      prop.setDeclaringType(container.displayName);
-    }
-    _requestor.accept(prop);
-  }
-
-  void _pExecutable2(ExecutableElement element, SimpleIdentifier identifier, bool isPotentialMatch) {
-    _pExecutable(element, element.type, identifier, isPotentialMatch);
-  }
-
-  void _pExecutable3(VariableElement element, SimpleIdentifier identifier) {
-    // Create a completion proposal for the element: top-level variable.
-    String name = element.displayName;
-    if (name.isEmpty || _filterDisallows(element)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal(element);
-    if (element.type != null) {
-      prop.setReturnType(element.type.name);
-    }
-    Element container = element.enclosingElement;
-    if (container != null) {
-      prop.setDeclaringType(container.displayName);
-    }
-    if (identifier != null) {
-      prop.setReplacementLengthIdentifier(identifier.length);
-    }
-    _requestor.accept(prop);
-  }
-
-  void _pFalse() {
-    _pWord(_C_FALSE, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pField(FieldElement element, SimpleIdentifier identifier, ClassElement classElement) {
-    // Create a completion proposal for the element: field only.
-    if (_filterDisallows(element)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal(element);
-    Element container = element.enclosingElement;
-    prop.setDeclaringType(container.displayName);
-    _requestor.accept(prop);
-  }
-
-  /**
-   * Proposes URI with the given scheme for the given [NamespaceDirective].
-   */
-  void _pImportUriWithScheme(NamespaceDirective node, String uriScheme) {
-    String newUri = "${uriScheme}${new String.fromCharCode(CompletionProposal.CURSOR_MARKER)}";
-    if (node.uri.isSynthetic) {
-      newUri = "'${newUri}'";
-      if (node.semicolon == null || node.semicolon.isSynthetic) {
-        newUri += ";";
-      }
-    }
-    if (_context.selectionOffset == node.keyword.end) {
-      newUri = " ${newUri}";
-    }
-    _pName3(newUri, CompletionSuggestionKind.IMPORT);
-  }
-
-  void _pKeyword(Token keyword) {
-    _filter = new Filter.con2(keyword.lexeme, keyword.offset, _completionLocation());
-    // This isn't as useful as it might seem. It only works in the case that completion
-    // is requested on an existing recognizable keyword.
-    // TODO: Add keyword proposal kind
-    CompletionProposal prop = _createProposal4(CompletionSuggestionKind.LIBRARY_PREFIX);
-    prop.setCompletion(keyword.lexeme);
-    _requestor.accept(prop);
-  }
-
-  void _pName(Element element, SimpleIdentifier identifier) {
-    CompletionProposal prop = _createProposal2(element, identifier);
-    if (prop != null) {
-      _requestor.accept(prop);
-    }
-  }
-
-  void _pName2(String name, Element element, int relevance, CompletionSuggestionKind kind) {
-    if (_filterDisallows2(name)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal4(kind);
-    prop.setRelevance(relevance);
-    prop.setCompletion(name);
-    prop.setElement(element);
-    _requestor.accept(prop);
-  }
-
-  void _pName3(String name, CompletionSuggestionKind kind) {
-    if (_filterDisallows2(name)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal4(kind);
-    prop.setCompletion(name);
-    _requestor.accept(prop);
-  }
-
-  void _pNamedConstructor(ClassElement classElement, ConstructorElement element, SimpleIdentifier identifier) {
-    // Create a completion proposal for the named constructor.
-    String name = classElement.displayName;
-    if (!element.displayName.isEmpty) {
-      name += ".${element.displayName}";
-    }
-    if (_filterDisallows2(name)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal3(element, name);
-    _setParameterInfo(element.type, prop);
-    prop.setReturnType(element.type.returnType.name);
-    Element container = element.enclosingElement;
-    prop.setDeclaringType(container.displayName);
-    if (identifier != null) {
-      prop.setReplacementLengthIdentifier(identifier.length);
-    }
-    _requestor.accept(prop);
-  }
-
-  void _pNull() {
-    _pWord(_C_NULL, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pParamName(String name) {
-    if (_filterDisallows2(name)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal4(CompletionSuggestionKind.PARAMETER);
-    prop.setCompletion(name);
-    _requestor.accept(prop);
-  }
-
-  CompletionSuggestionKind _proposalKindOf(Element element) {
-    CompletionSuggestionKind kind;
-    while (true) {
-      if (element.kind == ElementKind.CONSTRUCTOR) {
-        kind = CompletionSuggestionKind.CONSTRUCTOR;
-      } else if (element.kind == ElementKind.FUNCTION) {
-        kind = CompletionSuggestionKind.FUNCTION;
-      } else if (element.kind == ElementKind.METHOD) {
-        kind = CompletionSuggestionKind.METHOD;
-      } else if (element.kind == ElementKind.GETTER) {
-        kind = CompletionSuggestionKind.GETTER;
-      } else if (element.kind == ElementKind.SETTER) {
-        kind = CompletionSuggestionKind.SETTER;
-      } else if (element.kind == ElementKind.CLASS) {
-        kind = CompletionSuggestionKind.CLASS;
-      } else if (element.kind == ElementKind.FIELD) {
-        kind = CompletionSuggestionKind.FIELD;
-      } else if (element.kind == ElementKind.IMPORT) {
-        kind = CompletionSuggestionKind.IMPORT;
-      } else if (element.kind == ElementKind.PARAMETER) {
-        kind = CompletionSuggestionKind.PARAMETER;
-      } else if (element.kind == ElementKind.PREFIX) {
-        kind = CompletionSuggestionKind.LIBRARY_PREFIX;
-      } else if (element.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
-        kind = CompletionSuggestionKind.CLASS_ALIAS;
-      } else if (element.kind == ElementKind.TYPE_PARAMETER) {
-        kind = CompletionSuggestionKind.TYPE_PARAMETER;
-      } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
-        kind = CompletionSuggestionKind.LOCAL_VARIABLE;
-      } else {
-        throw new IllegalArgumentException();
-      }
-      break;
-    }
-    return kind;
-  }
-
-  void _proposeCombinator(Combinator node, SimpleIdentifier identifier) {
-    _filter = _createFilter(identifier);
-    NamespaceDirective directive = node.parent as NamespaceDirective;
-    LibraryElement libraryElement = directive.uriElement;
-    if (libraryElement != null) {
-      // prepare Elements with unique names
-      CompletionEngine_NameCollector nameCollector = _createNameCollector();
-      Iterable<Element> elements = CorrectionUtils.getExportNamespace2(libraryElement).values;
-      for (Element element in elements) {
-        if (_filterDisallows(element)) {
-          continue;
-        }
-        nameCollector._mergeName(element);
-      }
-      // propose each Element
-      for (Element element in nameCollector.uniqueElements) {
-        CompletionProposal proposal = _createProposal(element);
-        if (proposal.kind == CompletionSuggestionKind.FUNCTION) {
-          proposal.setKind(CompletionSuggestionKind.METHOD_NAME);
-        }
-        _requestor.accept(proposal);
-      }
-    }
-  }
-
-  void _proposeName(Element element, SimpleIdentifier identifier, CompletionEngine_NameCollector names) {
-    while (true) {
-      if (element.kind == ElementKind.FUNCTION || element.kind == ElementKind.GETTER || element.kind == ElementKind.METHOD || element.kind == ElementKind.SETTER) {
-        ExecutableElement candidate = element as ExecutableElement;
-        _pExecutable2(candidate, identifier, names._isPotentialMatch(candidate));
-      } else if (element.kind == ElementKind.LOCAL_VARIABLE || element.kind == ElementKind.PARAMETER || element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
-        FunctionType functionType = _getFunctionType(element);
-        if (functionType != null) {
-          _pExecutable(element, functionType, identifier, names._isPotentialMatch(element));
-        } else {
-          VariableElement var2 = element as VariableElement;
-          _pExecutable3(var2, identifier);
-        }
-      } else if (element.kind == ElementKind.CLASS) {
-        _pName(element, identifier);
-      } else {
-      }
-      break;
-    }
-  }
-
-  void _proposeNames(CompletionEngine_NameCollector names, SimpleIdentifier identifier) {
-    for (Element element in names.uniqueElements) {
-      _proposeName(element, identifier, names);
-    }
-  }
-
-  void _pTrue() {
-    _pWord(_C_TRUE, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pVar() {
-    _pWord(_C_VAR, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pVoid() {
-    _pWord(_C_VOID, CompletionSuggestionKind.LOCAL_VARIABLE);
-  }
-
-  void _pWord(String word, CompletionSuggestionKind kind) {
-    if (_filterDisallows2(word)) {
-      return;
-    }
-    CompletionProposal prop = _createProposal4(kind);
-    prop.setCompletion(word);
-    _requestor.accept(prop);
-  }
-
-  void _removeNotMatchingFilter(List<Element> elements) {
-    if (_filter == null) {
-      return;
-    }
-    _filter._makePattern();
-    _filter._removeNotMatching(elements);
-  }
-
-  void _setParameterInfo(FunctionType functionType, CompletionProposal prop) {
-    List<String> params = new List<String>();
-    List<String> types = new List<String>();
-    bool named = false, positional = false;
-    int posCount = 0;
-    for (ParameterElement param in functionType.parameters) {
-      if (!param.isSynthetic) {
-        while (true) {
-          if (param.parameterKind == ParameterKind.REQUIRED) {
-            posCount += 1;
-          } else if (param.parameterKind == ParameterKind.NAMED) {
-            named = true;
-          } else if (param.parameterKind == ParameterKind.POSITIONAL) {
-            positional = true;
-          }
-          break;
-        }
-        params.add(param.displayName);
-        types.add(param.type.toString());
-      }
-    }
-    prop.setParameterNames(params);
-    prop.setParameterTypes(types);
-    prop.setParameterStyle(posCount, named, positional);
-  }
-
-  SimpleIdentifier _typeDeclarationName(AstNode node) {
-    AstNode parent = node;
-    while (parent != null) {
-      if (parent is ClassDeclaration) {
-        return (parent as ClassDeclaration).name;
-      }
-      if (parent is ClassTypeAlias) {
-        return (parent as ClassTypeAlias).name;
-      }
-      if (parent is FunctionTypeAlias) {
-        return (parent as FunctionTypeAlias).name;
-      }
-      parent = parent.parent;
-    }
-    return null;
-  }
-
-  DartType _typeOf(Element receiver) {
-    DartType receiverType;
-    while (true) {
-      if (receiver.kind == ElementKind.FIELD || receiver.kind == ElementKind.PARAMETER || receiver.kind == ElementKind.LOCAL_VARIABLE || receiver.kind == ElementKind.TOP_LEVEL_VARIABLE) {
-        {
-          VariableElement receiverElement = receiver as VariableElement;
-          receiverType = receiverElement.type;
-          break;
-        }
-      } else if (receiver.kind == ElementKind.GETTER) {
-        PropertyAccessorElement accessor = receiver as PropertyAccessorElement;
-        if (accessor.isSynthetic) {
-          PropertyInducingElement inducer = accessor.variable;
-          DartType inducerType = inducer.type;
-          if (inducerType == null || inducerType.isDynamic) {
-            receiverType = _typeSearch(inducer);
-            if (receiverType != null) {
-              break;
-            }
-          }
-        }
-        FunctionType accType = accessor.type;
-        receiverType = accType == null ? null : accType.returnType;
-      } else if (receiver.kind == ElementKind.CONSTRUCTOR || receiver.kind == ElementKind.FUNCTION || receiver.kind == ElementKind.METHOD || receiver.kind == ElementKind.SETTER) {
-        {
-          ExecutableElement receiverElement = receiver as ExecutableElement;
-          FunctionType funType = receiverElement.type;
-          receiverType = funType == null ? null : funType.returnType;
-          break;
-        }
-      } else if (receiver.kind == ElementKind.CLASS) {
-        {
-          ClassElement receiverElement = receiver as ClassElement;
-          receiverType = receiverElement.type;
-          break;
-        }
-      } else if (receiver.kind == ElementKind.DYNAMIC) {
-        {
-          receiverType = DynamicTypeImpl.instance;
-          break;
-        }
-      } else if (receiver.kind == ElementKind.FUNCTION_TYPE_ALIAS) {
-        {
-          FunctionTypeAliasElement receiverElement = receiver as FunctionTypeAliasElement;
-          FunctionType funType = receiverElement.type;
-          receiverType = funType == null ? null : funType.returnType;
-          break;
-        }
-      } else {
-        {
-          receiverType = null;
-          break;
-        }
-      }
-      break;
-    }
-    return receiverType;
-  }
-
-  DartType _typeOf2(Expression expr) {
-    DartType type = expr.bestType;
-    if (type.isDynamic) {
-      AstNodeClassifier_CompletionEngine_typeOf visitor
-          = new AstNodeClassifier_CompletionEngine_typeOf(this);
-      expr.accept(visitor);
-      DartType result = visitor.result;
-      if (result != null) {
-        return result;
-      }
-    }
-    return type;
-  }
-
-  DartType _typeOfContainingClass(AstNode node) {
-    AstNode parent = node;
-    while (parent != null) {
-      if (parent is ClassDeclaration) {
-        return (parent as ClassDeclaration).element.type;
-      }
-      parent = parent.parent;
-    }
-    return DynamicTypeImpl.instance;
-  }
-
-  DartType _typeSearch(PropertyInducingElement varElement) {
-    // TODO(scheglov) translate it
-    return null;
-  }
-}
-
-abstract class CompletionEngine_AstNodeClassifier extends GeneralizingAstVisitor<Object> {
-  @override
-  Object visitNode(AstNode node) => null;
-}
-
-class CompletionEngine_CommentReferenceCompleter extends CompletionEngine_AstNodeClassifier {
-  final CompletionEngine CompletionEngine_this;
-
-  final SimpleIdentifier _identifier;
-
-  CompletionEngine_NameCollector _names;
-
-  Set<Element> _enclosingElements = new Set();
-
-  CompletionEngine_CommentReferenceCompleter(this.CompletionEngine_this, this._identifier) {
-    CompletionEngine_this._filter = CompletionEngine_this._createFilter(_identifier);
-    _names = CompletionEngine_this._collectTopLevelElementVisibleAt(_identifier);
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    ClassElement classElement = node.element;
-    _names._addNamesDefinedByHierarchy(classElement, false);
-    _enclosingElements.add(classElement);
-    return null;
-  }
-
-  @override
-  Object visitComment(Comment node) {
-    node.parent.accept(this);
-    // propose names
-    for (Element element in _names.uniqueElements) {
-      CompletionProposal proposal = CompletionEngine_this._createProposal2(element, _identifier);
-      if (proposal != null) {
-        // we don't want to add arguments, just names
-        if (element is MethodElement || element is FunctionElement) {
-          proposal.setKind(CompletionSuggestionKind.METHOD_NAME);
-        }
-        // elevate priority for local elements
-        if (_enclosingElements.contains(element.enclosingElement)) {
-          proposal.setRelevance(CompletionProposal.RELEVANCE_HIGH);
-        }
-        // propose
-        CompletionEngine_this._requestor.accept(proposal);
-      }
-    }
-    // done
-    return null;
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    _visitExecutableDeclaration(node);
-    // pass through
-    return node.parent.accept(this);
-  }
-
-  @override
-  Object visitFunctionDeclaration(FunctionDeclaration node) {
-    _visitExecutableDeclaration(node);
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    FunctionTypeAliasElement element = node.element;
-    _names._mergeNames(element.parameters);
-    _enclosingElements.add(element);
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    _visitExecutableDeclaration(node);
-    // pass through
-    return node.parent.accept(this);
-  }
-
-  void _visitExecutableDeclaration(Declaration node) {
-    ExecutableElement element = node.element as ExecutableElement;
-    _names._mergeNames(element.parameters);
-    _enclosingElements.add(element);
-  }
-}
-
-/**
- * An IdentifierCompleter is used to classify the parent of the completion node when it has
- * previously been determined that the completion node is a SimpleIdentifier.
- */
-class CompletionEngine_IdentifierCompleter extends CompletionEngine_AstNodeClassifier {
-  final CompletionEngine CompletionEngine_this;
-
-  SimpleIdentifier _completionNode;
-
-  CompletionEngine_IdentifierCompleter(this.CompletionEngine_this, SimpleIdentifier node) {
-    _completionNode = node;
-  }
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    if (_completionNode is SimpleIdentifier) {
-      CompletionEngine_this._analyzeAnnotationName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitArgumentList(ArgumentList node) {
-    if (_completionNode is SimpleIdentifier) {
-      if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
-        CompletionEngine_this._analyzeLocalName(_completionNode);
-        CompletionEngine_this._analyzePositionalArgument(node, _completionNode);
-        CompletionEngine_this._analyzeNamedParameter(node, _completionNode);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitAssignmentExpression(AssignmentExpression node) {
-    if (_completionNode is SimpleIdentifier) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitBinaryExpression(BinaryExpression node) {
-    if (identical(node.leftOperand, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    } else if (identical(node.rightOperand, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitCombinator(Combinator node) {
-    CompletionEngine_this._proposeCombinator(node, _completionNode);
-    return null;
-  }
-
-  @override
-  Object visitCommentReference(CommentReference node) {
-    AstNode comment = node.parent;
-    CompletionEngine_CommentReferenceCompleter visitor = new CompletionEngine_CommentReferenceCompleter(CompletionEngine_this, _completionNode);
-    return comment.accept(visitor);
-  }
-
-  @override
-  Object visitConstructorDeclaration(ConstructorDeclaration node) {
-    if (identical(node.returnType, _completionNode)) {
-      CompletionEngine_this._filter = CompletionEngine_this._createFilter(_completionNode);
-      CompletionEngine_this._pName3(_completionNode.name, CompletionSuggestionKind.CONSTRUCTOR);
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
-    // { A() : this.!x = 1; }
-    if (identical(node.fieldName, _completionNode)) {
-      ClassElement classElement = (node.parent as ConstructorDeclaration).element.enclosingElement;
-      CompletionEngine_this._fieldReference(classElement, node.fieldName);
-    }
-    return null;
-  }
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    if (identical(node.name, _completionNode)) {
-      // { new A.!c(); }
-      TypeName typeName = node.type;
-      if (typeName != null) {
-        DartType type = typeName.type;
-        Element typeElement = type.element;
-        if (typeElement is ClassElement) {
-          ClassElement classElement = typeElement;
-          CompletionEngine_this._constructorReference(classElement, node.name);
-        }
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    if (identical(node.condition, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitExpression(Expression node) {
-    SimpleIdentifier ident;
-    if (_completionNode is SimpleIdentifier) {
-      ident = _completionNode;
-    } else {
-      ident = CompletionEngine_this._createIdent(node);
-    }
-    CompletionEngine_this._analyzeLocalName(ident);
-    return null;
-  }
-
-  @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    if (identical(_completionNode, node.expression)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitExpressionStatement(ExpressionStatement node) {
-    SimpleIdentifier ident;
-    if (_completionNode is SimpleIdentifier) {
-      ident = _completionNode;
-    } else {
-      ident = CompletionEngine_this._createIdent(node);
-    }
-    CompletionEngine_this._analyzeLocalName(ident);
-    return null;
-  }
-
-  @override
-  Object visitFieldFormalParameter(FieldFormalParameter node) {
-    if (identical(_completionNode, node.identifier)) {
-      CompletionEngine_this._analyzeImmediateField(node.identifier);
-    }
-    return null;
-  }
-
-  @override
-  Object visitForEachStatement(ForEachStatement node) {
-    if (identical(node.iterator, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    if (identical(node.name, _completionNode)) {
-      if (node.returnType == null) {
-        // This may be an incomplete class type alias
-        CompletionEngine_this._state._includesUndefinedTypes();
-        CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitIfStatement(IfStatement node) {
-    if (identical(node.condition, _completionNode)) {
-      // { if (!) }
-      CompletionEngine_this._analyzeLocalName(new Ident.con3(node, _completionNode.token));
-    }
-    return null;
-  }
-
-  @override
-  Object visitInterpolationExpression(InterpolationExpression node) {
-    if (node.expression is SimpleIdentifier) {
-      SimpleIdentifier ident = node.expression as SimpleIdentifier;
-      CompletionEngine_this._analyzeLocalName(ident);
-    }
-    return null;
-  }
-
-  @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    if (identical(_completionNode, node.name)) {
-      if (node.returnType == null) {
-        // class Foo {const F!(); }
-        CompletionEngine_this._analyzeLocalName(_completionNode);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    if (identical(node.methodName, _completionNode)) {
-      // { x.!y() }
-      Expression expr = node.realTarget;
-      DartType receiverType;
-      if (expr == null) {
-        receiverType = CompletionEngine_this._typeOfContainingClass(node);
-        CompletionEngine_this._analyzeDirectAccess(receiverType, node.methodName);
-      } else {
-        CompletionEngine_this._dispatchPrefixAnalysis2(node);
-      }
-    } else if (identical(node.target, _completionNode)) {
-      // { x!.y() } -- only reached when node.getTarget() is a simple identifier.
-      if (_completionNode is SimpleIdentifier) {
-        SimpleIdentifier ident = _completionNode;
-        CompletionEngine_this._analyzeReceiver(ident);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitParenthesizedExpression(ParenthesizedExpression node) {
-    // Incomplete closure: foo((Str!)); We check if "()" is argument for function typed parameter.
-    if (node.parent is ArgumentList) {
-      ParameterElement parameterElement = node.bestParameterElement;
-      if (parameterElement != null && parameterElement.type is FunctionType) {
-        Ident ident = CompletionEngine_this._createIdent(_completionNode);
-        CompletionEngine_this._analyzeTypeName(_completionNode, ident);
-      }
-    }
-    return super.visitParenthesizedExpression(node);
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (identical(node.prefix, _completionNode)) {
-      // { x!.y }
-      CompletionEngine_this._analyzeLocalName(node.prefix);
-    } else {
-      // { v.! }
-      CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
-    }
-    return null;
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    if (node.target != null && node.target.length == 0) {
-      return null;
-    }
-    // { o.!hashCode }
-    if (identical(node.propertyName, _completionNode)) {
-      CompletionEngine_this._analyzePrefixedAccess(node.realTarget, node.propertyName);
-    }
-    return null;
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
-    // { A.Fac() : this.!b(); }
-    if (identical(node.constructorName, _completionNode)) {
-      ClassElement classElement = node.staticElement.enclosingElement;
-      CompletionEngine_this._constructorReference(classElement, node.constructorName);
-    }
-    return null;
-  }
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    if (_completionNode is SimpleIdentifier) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    if (identical(node.identifier, _completionNode)) {
-      if (node.keyword == null && node.type == null) {
-        Ident ident = CompletionEngine_this._createIdent(node);
-        CompletionEngine_this._analyzeTypeName(node.identifier, ident);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    CompletionEngine_this._analyzeSuperConstructorInvocation(node);
-    return null;
-  }
-
-  @override
-  Object visitSwitchCase(SwitchCase node) {
-    if (identical(_completionNode, node.expression)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    if (identical(node.expression, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTypeName(TypeName node) {
-    AstNode parent = node.parent;
-    if (parent != null) {
-      CompletionEngine_TypeNameCompleter visitor = new CompletionEngine_TypeNameCompleter(CompletionEngine_this, _completionNode, node);
-      return parent.accept(visitor);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    // { X<!Y> }
-    if (CompletionEngine_this._isCompletionBetween(node.offset, node.end)) {
-      CompletionEngine_this._analyzeTypeName(_completionNode, CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    if (identical(node.name, _completionNode)) {
-      CompletionEngine_this._analyzeDeclarationName(node);
-    } else if (identical(node.initializer, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(node.initializer as SimpleIdentifier);
-    }
-    return null;
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    if (identical(node.condition, _completionNode)) {
-      CompletionEngine_this._analyzeLocalName(_completionNode);
-    }
-    return null;
-  }
-}
-
-class CompletionEngine_NameCollector {
-  final CompletionEngine CompletionEngine_this;
-
-  Map<String, List<Element>> _uniqueNames = new Map<String, List<Element>>();
-
-  Set<Element> _potentialMatches;
-
-  CompletionEngine_NameCollector(this.CompletionEngine_this);
-
-  void addAll(Iterable<SimpleIdentifier> values) {
-    for (SimpleIdentifier id in values) {
-      _mergeName(id.bestElement);
-    }
-  }
-
-  void addLocalNames(SimpleIdentifier identifier) {
-    AstNode node = identifier;
-    Declaration decl;
-    while ((decl = node.getAncestor((node) => node is Declaration)) != null) {
-      Element declElement = decl.element;
-      if (declElement is ExecutableElement) {
-        _addNamesDefinedByExecutable(declElement);
-      } else {
-        return;
-      }
-      node = decl.parent;
-    }
-  }
-
-  void _addNamesDefinedByExecutable(ExecutableElement execElement) {
-    _mergeNames(execElement.parameters);
-    _mergeNames(execElement.localVariables);
-    _mergeNames(execElement.functions);
-  }
-
-  void _addNamesDefinedByHierarchy(ClassElement classElement, bool forSuper) {
-    _addNamesDefinedByHierarchy2(classElement.type, forSuper);
-  }
-
-  void _addNamesDefinedByHierarchy2(InterfaceType type, bool forSuper) {
-    List<InterfaceType> superTypes = type.element.allSupertypes;
-    if (!forSuper) {
-      superTypes.insert(0, type);
-    }
-    _addNamesDefinedByTypes(superTypes);
-    // Collect names defined by subtypes separately so they can be identified later.
-    CompletionEngine_NameCollector potentialMatchCollector = CompletionEngine_this._createNameCollector();
-    if (!type.isObject) {
-      potentialMatchCollector._addNamesDefinedByTypes(CompletionEngine_this._allSubtypes(type.element));
-    }
-    _potentialMatches = new Set<Element>();
-    for (List<Element> matches in potentialMatchCollector._uniqueNames.values) {
-      for (Element match in matches) {
-        _mergeName(match);
-        _potentialMatches.add(match);
-      }
-    }
-  }
-
-  void _addNamesDefinedByType(ClassElement classElement) {
-    _addNamesDefinedByType2(classElement.type);
-  }
-
-  void _addNamesDefinedByType2(InterfaceType type) {
-    if (_inPrivateLibrary(type)) {
-      return;
-    }
-    List<PropertyAccessorElement> accessors = type.accessors;
-    _mergeNames(accessors);
-    List<MethodElement> methods = type.methods;
-    _mergeNames(methods);
-    _mergeNames(type.element.typeParameters);
-    _filterStaticRefs(accessors);
-    _filterStaticRefs(methods);
-  }
-
-  void _addNamesDefinedByTypes(List<InterfaceType> types) {
-    for (InterfaceType type in types) {
-      _addNamesDefinedByType2(type);
-    }
-  }
-
-  void _addTopLevelNames(List<ImportElement> imports, TopLevelNamesKind topKind) {
-    for (ImportElement imp in imports) {
-      Iterable<Element> elementsCollection = CorrectionUtils.getImportNamespace(imp).values;
-      List<Element> elements = [];
-      _addTopLevelNames4(elements);
-    }
-  }
-
-  void _addTopLevelNames2(LibraryElement library, TopLevelNamesKind topKind) {
-    List<Element> elements = CompletionEngine_this._findTopLevelElements(library, topKind);
-    _addTopLevelNames4(elements);
-  }
-
-  void _addTopLevelNames3(List<LibraryElement> libraries, TopLevelNamesKind topKind) {
-    for (LibraryElement library in libraries) {
-      _addTopLevelNames2(library, topKind);
-    }
-  }
-
-  Iterable<List<Element>> get names => _uniqueNames.values;
-
-  Iterable<Element> get uniqueElements {
-    List<Element> uniqueElements = [];
-    for (List<Element> uniques in _uniqueNames.values) {
-      Element element = uniques[0];
-      uniqueElements.add(element);
-    }
-    return uniqueElements;
-  }
-
-  bool _isPotentialMatch(Element element) => _potentialMatches != null && _potentialMatches.contains(element);
-
-  void _remove(Element element) {
-    String name = element.displayName;
-    List<Element> list = _uniqueNames[name];
-    if (list == null) {
-      return;
-    }
-    list.remove(element);
-    if (list.isEmpty) {
-      _uniqueNames.remove(name);
-    }
-  }
-
-  void _addTopLevelNames4(List<Element> elements) {
-    _mergeNames(CompletionEngine_this._findAllTypes2(elements));
-    if (!CompletionEngine_this._state._areClassesRequired) {
-      _mergeNames(CompletionEngine_this._findAllNotTypes(elements));
-      _mergeNames(CompletionEngine_this._findAllPrefixes());
-    }
-  }
-
-  void _filterStaticRefs(List<ExecutableElement> elements) {
-    for (ExecutableElement execElem in elements) {
-      if (CompletionEngine_this._state._areInstanceReferencesProhibited && !execElem.isStatic) {
-        _remove(execElem);
-      } else if (CompletionEngine_this._state._areStaticReferencesProhibited && execElem.isStatic) {
-        _remove(execElem);
-      } else if (!CompletionEngine_this._state._areOperatorsAllowed && execElem.isOperator) {
-        _remove(execElem);
-      } else if (CompletionEngine_this._state._areMethodsProhibited && !execElem.isOperator) {
-        _remove(execElem);
-      }
-    }
-  }
-
-  bool _inPrivateLibrary(InterfaceType type) {
-    LibraryElement lib = type.element.library;
-    if (!lib.name.startsWith("_")) {
-      return false;
-    }
-    // allow completion in the same library
-    if (identical(lib, CompletionEngine_this.currentLibrary)) {
-      return false;
-    }
-    // eliminate types defined in private libraries
-    return true;
-  }
-
-  void _mergeName(Element element) {
-    if (element == null) {
-      return;
-    }
-    // ignore private
-    String name = element.displayName;
-    if (Identifier.isPrivateName(name)) {
-      if (!CompletionEngine_this._isInCurrentLibrary(element)) {
-        return;
-      }
-    }
-    // add to other Element(s) with such name
-    List<Element> dups = _uniqueNames[name];
-    if (dups == null) {
-      dups = new List<Element>();
-      _uniqueNames[name] = dups;
-    }
-    dups.add(element);
-  }
-
-  void _mergeNames(List<Element> elements) {
-    for (Element element in elements) {
-      _mergeName(element);
-    }
-  }
-}
-
-/**
- * An StringCompleter is used to classify the parent of the completion node when it has previously
- * been determined that the completion node is a SimpleStringLiteral.
- */
-class CompletionEngine_StringCompleter extends CompletionEngine_AstNodeClassifier {
-  final CompletionEngine CompletionEngine_this;
-
-  SimpleStringLiteral _completionNode;
-
-  CompletionEngine_StringCompleter(this.CompletionEngine_this, SimpleStringLiteral node) {
-    _completionNode = node;
-  }
-
-  @override
-  Object visitNamespaceDirective(NamespaceDirective node) {
-    if (identical(_completionNode, node.uri)) {
-      CompletionEngine_this._namespaceReference(node, _completionNode);
-    }
-    return null;
-  }
-}
-
-/**
- * A TerminalNodeCompleter is used to classify the completion node when nothing else is known
- * about it.
- */
-class CompletionEngine_TerminalNodeCompleter extends CompletionEngine_AstNodeClassifier {
-  final CompletionEngine CompletionEngine_this;
-
-  CompletionEngine_TerminalNodeCompleter(this.CompletionEngine_this);
-
-  @override
-  Object visitArgumentList(ArgumentList node) {
-    if (node.arguments.isEmpty && CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
-      if (node.parent is MethodInvocation) {
-        // or node.getParent().accept(this); ?
-        MethodInvocation invokeNode = node.parent as MethodInvocation;
-        SimpleIdentifier methodName = invokeNode.methodName;
-        ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
-        try {
-          CompletionEngine_this._requestor = proposalRequestor;
-          CompletionEngine_this._dispatchPrefixAnalysis2(invokeNode);
-        } finally {
-          CompletionEngine_this._requestor = proposalRequestor.requestor;
-        }
-        int offset = methodName.offset;
-        int len = node.rightParenthesis.end - offset;
-        String name = methodName.name;
-        for (CompletionProposal proposal in proposalRequestor.proposals) {
-          if (proposal.completion == name) {
-            CompletionEngine_this._pArgumentList(proposal, offset, len);
-          }
-        }
-      } else if (node.parent is InstanceCreationExpression) {
-        InstanceCreationExpression invokeNode = node.parent as InstanceCreationExpression;
-        ConstructorName methodName = invokeNode.constructorName;
-        ProposalCollector proposalRequestor = new ProposalCollector(CompletionEngine_this._requestor);
-        try {
-          CompletionEngine_this._requestor = proposalRequestor;
-          CompletionEngine_this._dispatchPrefixAnalysis(invokeNode);
-        } finally {
-          CompletionEngine_this._requestor = proposalRequestor.requestor;
-        }
-        int offset = methodName.offset;
-        int len = node.rightParenthesis.end - offset;
-        for (CompletionProposal proposal in proposalRequestor.proposals) {
-          if (proposal.element == invokeNode.staticElement) {
-            CompletionEngine_this._pArgumentList(proposal, offset, len);
-          }
-        }
-      } else if (node.parent is Annotation) {
-        Annotation annotation = node.parent as Annotation;
-        Element annotationElement = annotation.element;
-        if (annotationElement is ConstructorElement) {
-          ConstructorElement constructorElement = annotationElement;
-          // we don't need any filter
-          CompletionEngine_this._filter = new Filter.con2("", -1, 0);
-          // fill parameters for "pArgumentList"
-          CompletionProposal prop = CompletionEngine_this._createProposal(constructorElement);
-          CompletionEngine_this._setParameterInfo(constructorElement.type, prop);
-          prop.setCompletion(constructorElement.enclosingElement.name);
-          // propose the whole parameters list
-          CompletionEngine_this._pArgumentList(prop, 0, 0);
-        }
-      }
-    }
-    if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
-      Ident ident = CompletionEngine_this._createIdent(node);
-      CompletionEngine_this._analyzeLocalName(ident);
-      CompletionEngine_this._analyzePositionalArgument(node, ident);
-      CompletionEngine_this._analyzeNamedParameter(node, ident);
-    }
-    return null;
-  }
-
-  @override
-  Object visitAsExpression(AsExpression node) {
-    if (CompletionEngine_this._isCompletionAfter(node.asOperator.end)) {
-      CompletionEngine_this._state._isDynamicAllowed = false;
-      CompletionEngine_this._state._isVoidAllowed = false;
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitAssertStatement(AssertStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitBlock(Block node) {
-    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
-      // { {! stmt; !} }
-      CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitBooleanLiteral(BooleanLiteral node) {
-    CompletionEngine_this._analyzeLiteralReference(node);
-    return null;
-  }
-
-  @override
-  Object visitBreakStatement(BreakStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.onKeyword)) {
-      CompletionEngine_this._pKeyword(node.onKeyword);
-    } else if (CompletionEngine_this._isCompletingKeyword(node.catchKeyword)) {
-      CompletionEngine_this._pKeyword(node.catchKeyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitClassDeclaration(ClassDeclaration node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.classKeyword)) {
-      CompletionEngine_this._pKeyword(node.classKeyword);
-    } else if (CompletionEngine_this._isCompletingKeyword(node.abstractKeyword)) {
-      CompletionEngine_this._pKeyword(node.abstractKeyword);
-    } else if (!node.leftBracket.isSynthetic) {
-      if (CompletionEngine_this._isCompletionAfter(node.leftBracket.end)) {
-        if (node.rightBracket.isSynthetic || CompletionEngine_this._isCompletionBefore(node.rightBracket.offset)) {
-          if (!CompletionEngine_this.hasErrorBeforeCompletionLocation) {
-            CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
-          }
-        }
-      }
-    }
-    // TODO { abstract ! class ! A ! extends B implements C, D ! {}}
-    return null;
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    // TODO { typedef ! A ! = ! B ! with C, D !; }
-    return null;
-  }
-
-  @override
-  Object visitCombinator(Combinator node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitCompilationUnit(CompilationUnit node) => null;
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    // { new A.!c(); }
-    TypeName typeName = node.type;
-    if (typeName != null) {
-      DartType type = typeName.type;
-      Element typeElement = type.element;
-      if (typeElement is ClassElement) {
-        ClassElement classElement = typeElement;
-        CompletionEngine_this._constructorReference(classElement, node.name);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitContinueStatement(ContinueStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitDirective(Directive node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.doKeyword)) {
-      CompletionEngine_this._pKeyword(node.doKeyword);
-    } else if (CompletionEngine_this._isCompletingKeyword(node.whileKeyword)) {
-      CompletionEngine_this._pKeyword(node.whileKeyword);
-    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
-      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitDoubleLiteral(DoubleLiteral node) => null;
-
-  @override
-  Object visitExportDirective(ExportDirective node) {
-    visitNamespaceDirective(node);
-    return null;
-  }
-
-  @override
-  Object visitExpression(Expression node) {
-    CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
-    return null;
-  }
-
-  @override
-  Object visitExpressionFunctionBody(ExpressionFunctionBody node) {
-    if (node.expression != null && node.semicolon != null) {
-      if (CompletionEngine_this._isCompletionBetween(node.expression.end, node.semicolon.offset)) {
-        CompletionEngine_this._operatorAccess(node.expression, CompletionEngine_this._createIdent(node));
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitExpressionStatement(ExpressionStatement node) {
-    CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
-    return null;
-  }
-
-  @override
-  Object visitExtendsClause(ExtendsClause node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    } else if (node.superclass == null) {
-      // { X extends ! }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    } else {
-      // { X extends ! Y }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitForEachStatement(ForEachStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
-      CompletionEngine_this._pKeyword(node.forKeyword);
-    } else if (CompletionEngine_this._isCompletingKeyword(node.inKeyword)) {
-      CompletionEngine_this._pKeyword(node.inKeyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitFormalParameterList(FormalParameterList node) {
-    if (CompletionEngine_this._isCompletionBetween(node.leftParenthesis.end, node.rightParenthesis.offset)) {
-      NodeList<FormalParameter> params = node.parameters;
-      if (!params.isEmpty) {
-        FormalParameter last = params[params.length - 1];
-        if (CompletionEngine_this._isCompletionBetween(last.end, node.rightParenthesis.offset)) {
-          List<FormalParameter> newParams = CompletionEngine_this._copyWithout(params, last);
-          CompletionEngine_this._analyzeNewParameterName(newParams, last.identifier, null);
-        } else {
-          Ident ident = CompletionEngine_this._createIdent(node);
-          CompletionEngine_this._analyzeTypeName(ident, ident);
-        }
-      } else {
-        Ident ident = CompletionEngine_this._createIdent(node);
-        CompletionEngine_this._analyzeTypeName(ident, ident);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitForStatement(ForStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.forKeyword)) {
-      CompletionEngine_this._pKeyword(node.forKeyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitIfStatement(IfStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.ifKeyword)) {
-      CompletionEngine_this._pKeyword(node.ifKeyword);
-    } else if (CompletionEngine_this._isCompletingKeyword(node.elseKeyword)) {
-      CompletionEngine_this._pKeyword(node.elseKeyword);
-    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
-      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitImplementsClause(ImplementsClause node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    } else if (node.interfaces.isEmpty) {
-      // { X implements ! }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    } else {
-      // { X implements ! Y }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitImportDirective(ImportDirective node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.asToken)) {
-      CompletionEngine_this._pKeyword(node.asToken);
-    } else {
-      visitNamespaceDirective(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-      Ident ident = new Ident.con3(node, node.keyword);
-      CompletionEngine_this._analyzeLocalName(ident);
-    } else {
-      Ident ident = CompletionEngine_this._createIdent(node);
-      CompletionEngine_this._analyzeConstructorTypeName(ident);
-    }
-    return null;
-  }
-
-  @override
-  Object visitIsExpression(IsExpression node) {
-    Ident ident;
-    Token isToken = node.isOperator;
-    int isTokenEnd = isToken.end;
-    if (isTokenEnd == CompletionEngine_this._completionLocation()) {
-      Expression expression = node.expression;
-      int offset = isToken.offset;
-      // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
-      if (expression is PrefixedIdentifier) {
-        PrefixedIdentifier prefIdent = expression;
-        if (prefIdent.identifier.isSynthetic) {
-          CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
-        } else {
-          CompletionEngine_this._pKeyword(isToken);
-        }
-        return null;
-      }
-      // { expr is! }
-      if (!CompletionEngine._isSyntheticIdentifier(expression)) {
-        CompletionEngine_this._pKeyword(node.isOperator);
-        return null;
-      }
-      // { is! } possible name completion
-      ident = new Ident.con2(node, "is", offset);
-    } else if (CompletionEngine_this._isCompletionAfter(isTokenEnd)) {
-      CompletionEngine_this._state._isDynamicAllowed = false;
-      CompletionEngine_this._state._isVoidAllowed = false;
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
-      return null;
-    } else {
-      ident = CompletionEngine_this._createIdent(node);
-    }
-    CompletionEngine_this._analyzeLocalName(ident);
-    return null;
-  }
-
-  @override
-  Object visitLibraryIdentifier(LibraryIdentifier node) => null;
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    Token period = node.period;
-    if (period != null && CompletionEngine_this._isCompletionAfter(period.end)) {
-      // { x.!y() }
-      CompletionEngine_this._dispatchPrefixAnalysis2(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitNamespaceDirective(NamespaceDirective node) {
-    StringLiteral uri = node.uri;
-    if (uri != null && uri.isSynthetic && node.keyword.end <= CompletionEngine_this._context.selectionOffset) {
-      uri.accept(this);
-    }
-    return super.visitNamespaceDirective(node);
-  }
-
-  @override
-  Object visitPartOfDirective(PartOfDirective node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.ofToken)) {
-      CompletionEngine_this._pKeyword(node.ofToken);
-    } else {
-      visitDirective(node);
-    }
-    return null;
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
-      if (CompletionEngine_this._isCompletionBefore(node.identifier.offset)) {
-        // { x.! } or { x.!  y } Note missing/implied semicolon before y; this looks like an
-        // obscure case but it occurs frequently when editing existing code.
-        CompletionEngine_this._dispatchPrefixAnalysis3(node, node.identifier);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    if (node.target != null && node.target.length == 0) {
-      return null;
-    }
-    Expression target = node.realTarget;
-    // The "1 + str.!.length" is parsed as "(1 + str).!.length",
-    // but actually user wants "1 + (str.!).length".
-    // So, if completion inside of period-period ".!." then it is not really a cascade completion.
-    Token operator = node.operator;
-    if (operator.type == TokenType.PERIOD_PERIOD) {
-      int completionLocation = CompletionEngine_this._completionLocation();
-      if (completionLocation > operator.offset && completionLocation < operator.end) {
-        while (target is BinaryExpression) {
-          target = (target as BinaryExpression).rightOperand;
-        }
-      }
-    }
-    // do prefixed completion
-    CompletionEngine_this._analyzePrefixedAccess(target, node.propertyName);
-    return null;
-  }
-
-  @override
-  Object visitReturnStatement(ReturnStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-      return null;
-    }
-    Expression expression = node.expression;
-    // return !
-    if (expression is SimpleIdentifier) {
-      SimpleIdentifier identifier = expression;
-      CompletionEngine_this._analyzeLocalName(identifier);
-      return null;
-    }
-    // return expression ! ;
-    Token semicolon = node.semicolon;
-    if (expression != null && semicolon != null && CompletionEngine_this._isCompletionBetween(expression.end, semicolon.offset)) {
-      CompletionEngine_this._operatorAccess(expression, CompletionEngine_this._createIdent(node));
-      return null;
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    if (node.keyword != null && CompletionEngine_this._isCompletionBefore(node.keyword.end)) {
-      // f() { g(var! z) }
-      Token token = node.keyword;
-      Ident ident = new Ident.con3(node, token);
-      CompletionEngine_this._analyzeTypeName(ident, ident);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent != null) {
-      CompletionEngine_IdentifierCompleter visitor = new CompletionEngine_IdentifierCompleter(CompletionEngine_this, node);
-      return parent.accept(visitor);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleStringLiteral(SimpleStringLiteral node) {
-    AstNode parent = node.parent;
-    if (parent is Directive) {
-      CompletionEngine_StringCompleter visitor = new CompletionEngine_StringCompleter(CompletionEngine_this, node);
-      return parent.accept(visitor);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    CompletionEngine_this._analyzeSuperConstructorInvocation(node);
-    return null;
-  }
-
-  @override
-  Object visitSwitchMember(SwitchMember node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTryStatement(TryStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.tryKeyword)) {
-      CompletionEngine_this._pKeyword(node.tryKeyword);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
-    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    } else if (node.name.name.isEmpty && CompletionEngine_this._isCompletionBefore(node.keyword.offset)) {
-      // { < ! extends X> }
-      CompletionEngine_this._analyzeTypeName(node.name, CompletionEngine_this._typeDeclarationName(node));
-    }
-    // { <! X ! extends ! Y !> }
-    return null;
-  }
-
-  @override
-  Object visitTypeParameterList(TypeParameterList node) {
-    // { <X extends A,! B,! > }
-    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    if (CompletionEngine_this._isCompletionAfter(node.equals.end)) {
-      // { var x =! ...}
-      CompletionEngine_this._analyzeLocalName(CompletionEngine_this._createIdent(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-      CompletionEngine_this._analyzeTypeName(new Ident.con3(node, node.keyword), null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.keyword)) {
-      CompletionEngine_this._pKeyword(node.keyword);
-    } else if (CompletionEngine_this._isCompletionBetween(node.condition.end, node.rightParenthesis.offset)) {
-      CompletionEngine_this._operatorAccess(node.condition, CompletionEngine_this._createIdent(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitWithClause(WithClause node) {
-    if (CompletionEngine_this._isCompletingKeyword(node.withKeyword)) {
-      CompletionEngine_this._pKeyword(node.withKeyword);
-    } else if (node.mixinTypes.isEmpty) {
-      // { X with ! }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    } else {
-      // { X with ! Y }
-      CompletionEngine_this._analyzeTypeName(CompletionEngine_this._createIdent(node), CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-}
-
-/**
- * A TypeNameCompleter is used to classify the parent of a SimpleIdentifier after it has been
- * identified as a TypeName by the IdentifierCompleter.
- */
-class CompletionEngine_TypeNameCompleter extends CompletionEngine_AstNodeClassifier {
-  final CompletionEngine CompletionEngine_this;
-
-  final SimpleIdentifier _identifier;
-
-  final TypeName _typeName;
-
-  CompletionEngine_TypeNameCompleter(this.CompletionEngine_this, this._identifier, this._typeName);
-
-  @override
-  Object visitAsExpression(AsExpression node) {
-    if (identical(node.type, _typeName)) {
-      CompletionEngine_this._state._isDynamicAllowed = false;
-      CompletionEngine_this._state._isVoidAllowed = false;
-      CompletionEngine_this._analyzeTypeName(_identifier, null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    if (identical(node.exceptionType, _typeName)) {
-      CompletionEngine_this._analyzeTypeName(_identifier, null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitClassTypeAlias(ClassTypeAlias node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    return null;
-  }
-
-  @override
-  Object visitConstructorName(ConstructorName node) {
-    if (identical(_typeName, node.type)) {
-      if (node.period != null) {
-        if (CompletionEngine_this._isCompletionAfter(node.period.end)) {
-          // Is this branch reachable? Probably only in IdentifierCompleter.
-          "".toString();
-        } else {
-          // { new Cla!ss.cons() }
-          Element element = _identifier.bestElement;
-          if (element is ClassElement) {
-            CompletionEngine_this._namedConstructorReference(element, _identifier);
-          }
-        }
-      } else {
-        // { new ! } { new Na!me(); } { new js!on. }
-        CompletionEngine_this._analyzeConstructorTypeName(_identifier);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitExtendsClause(ExtendsClause node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    return null;
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    return null;
-  }
-
-  @override
-  Object visitImplementsClause(ImplementsClause node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    return null;
-  }
-
-  @override
-  Object visitIsExpression(IsExpression node) {
-    if (identical(_typeName, node.type)) {
-      Token isToken = node.isOperator;
-      if (CompletionEngine_this._completionLocation() == isToken.end) {
-        Expression expression = node.expression;
-        int offset = isToken.offset;
-        // { target.is! } possible name completion, parsed as "target.{synthetic} is!"
-        if (expression is PrefixedIdentifier) {
-          PrefixedIdentifier prefIdent = expression;
-          if (prefIdent.identifier.isSynthetic) {
-            CompletionEngine_this._analyzePrefixedAccess(prefIdent.prefix, new Ident.con2(node, "is", offset));
-          } else {
-            CompletionEngine_this._pKeyword(node.isOperator);
-          }
-          return null;
-        }
-        // { expr is! }
-        if (!CompletionEngine._isSyntheticIdentifier(expression)) {
-          CompletionEngine_this._pKeyword(node.isOperator);
-          return null;
-        }
-        // { is! } possible name completion
-        CompletionEngine_this._analyzeLocalName(new Ident.con2(node, "is", offset));
-      } else {
-        CompletionEngine_this._analyzeTypeName(node.type.name as SimpleIdentifier, null);
-      }
-    }
-    return null;
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    if (identical(node.returnType, _typeName)) {
-      CompletionEngine_this._analyzeTypeName(_identifier, null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, null);
-    return null;
-  }
-
-  @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
-    if (CompletionEngine_this._isCompletionBetween(node.leftBracket.end, node.rightBracket.offset)) {
-      CompletionEngine_this._analyzeTypeName(_identifier, null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitTypeParameter(TypeParameter node) {
-    if (identical(node.bound, _typeName)) {
-      // { X<A extends !Y> }
-      CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    }
-    return null;
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    if (node.parent is Statement) {
-      CompletionEngine_this._analyzeLocalName(_identifier);
-    } else {
-      CompletionEngine_this._analyzeTypeName(_identifier, null);
-    }
-    return null;
-  }
-
-  @override
-  Object visitWithClause(WithClause node) {
-    CompletionEngine_this._analyzeTypeName(_identifier, CompletionEngine_this._typeDeclarationName(node));
-    return null;
-  }
-}
-
-/**
- * The factory class used to create completion proposals.
- */
-class CompletionFactory {
-  /**
-   * Create a completion proposal of the given kind.
-   */
-  CompletionProposal createCompletionProposal(CompletionSuggestionKind kind, int insertionPoint) {
-    CompletionProposalImpl prop = new CompletionProposalImpl();
-    prop.setKind(kind);
-    prop.setLocation(insertionPoint);
-    return prop;
-  }
-}
-
-abstract class CompletionProposal {
-  static final int RELEVANCE_LOW = 0;
-
-  static final int RELEVANCE_DEFAULT = 10;
-
-  static final int RELEVANCE_HIGH = 20;
-
-  /**
-   * This character is used to specify location of the cursor after completion.
-   */
-  static final int CURSOR_MARKER = 0x2758;
-
-  void applyPartitionOffset(int partitionOffset);
-
-  String get completion;
-
-  String get declaringType;
-
-  Element get element;
-
-  CompletionSuggestionKind get kind;
-
-  int get location;
-
-  String get parameterName;
-
-  List<String> get parameterNames;
-
-  String get parameterType;
-
-  List<String> get parameterTypes;
-
-  int get positionalParameterCount;
-
-  int get relevance;
-
-  int get replacementLength;
-
-  int get replacementLengthIdentifier;
-
-  String get returnType;
-
-  bool get hasNamed;
-
-  bool get hasPositional;
-
-  CompletionProposal incRelevance();
-
-  bool get isDeprecated;
-
-  bool get isPotentialMatch;
-
-  CompletionProposal setCompletion(String x);
-
-  CompletionProposal setDeclaringType(String name);
-
-  CompletionProposal setDeprecated(bool deprecated);
-
-  CompletionProposal setElement(Element element);
-
-  CompletionProposal setKind(CompletionSuggestionKind x);
-
-  CompletionProposal setLocation(int x);
-
-  CompletionProposal setParameterName(String paramName);
-
-  CompletionProposal setParameterNames(List<String> paramNames);
-
-  CompletionProposal setParameterStyle(int count, bool named, bool positional);
-
-  CompletionProposal setParameterType(String paramType);
-
-  CompletionProposal setParameterTypes(List<String> paramTypes);
-
-  CompletionProposal setPotentialMatch(bool isPotentialMatch);
-
-  CompletionProposal setRelevance(int n);
-
-  CompletionProposal setReplacementLength(int x);
-
-  CompletionProposal setReplacementLengthIdentifier(int x);
-
-  CompletionProposal setReturnType(String name);
-}
-
-class CompletionProposalImpl implements CompletionProposal {
-  Element _element;
-
-  String _completion = "";
-
-  String _returnType = "";
-
-  String _declaringType = "";
-
-  List<String> _parameterNames = StringUtilities.EMPTY_ARRAY;
-
-  List<String> _parameterTypes = StringUtilities.EMPTY_ARRAY;
-
-  String _parameterName;
-
-  String _parameterType;
-
-  CompletionSuggestionKind _kind = null;
-
-  int _location = 0;
-
-  int _replacementLength = 0;
-
-  int _replacementLength2 = 0;
-
-  int _positionalParameterCount = 0;
-
-  bool _named = false;
-
-  bool _positional = false;
-
-  bool _deprecated = false;
-
-  bool _potential = false;
-
-  int _relevance = CompletionProposal.RELEVANCE_DEFAULT;
-
-  @override
-  void applyPartitionOffset(int partitionOffset) {
-    _location += partitionOffset;
-  }
-
-  @override
-  String get completion => _completion;
-
-  @override
-  String get declaringType => _declaringType;
-
-  @override
-  Element get element => _element;
-
-  @override
-  CompletionSuggestionKind get kind => _kind;
-
-  @override
-  int get location => _location;
-
-  @override
-  String get parameterName => _parameterName;
-
-  @override
-  List<String> get parameterNames => _parameterNames;
-
-  @override
-  String get parameterType => _parameterType;
-
-  @override
-  List<String> get parameterTypes => _parameterTypes;
-
-  @override
-  int get positionalParameterCount => _positionalParameterCount;
-
-  @override
-  int get relevance => _relevance;
-
-  @override
-  int get replacementLength => _replacementLength;
-
-  @override
-  int get replacementLengthIdentifier => _replacementLength2;
-
-  @override
-  String get returnType => _returnType;
-
-  @override
-  bool get hasNamed => _named;
-
-  @override
-  bool get hasPositional => _positional;
-
-  @override
-  CompletionProposal incRelevance() {
-    _relevance++;
-    return this;
-  }
-
-  @override
-  bool get isDeprecated => _deprecated;
-
-  @override
-  bool get isPotentialMatch => _potential;
-
-  @override
-  CompletionProposal setCompletion(String x) {
-    _completion = x;
-    if (_replacementLength == 0) {
-      setReplacementLength(x.length);
-    }
-    return this;
-  }
-
-  @override
-  CompletionProposal setDeclaringType(String name) {
-    _declaringType = name;
-    return this;
-  }
-
-  @override
-  CompletionProposal setDeprecated(bool deprecated) {
-    this._deprecated = deprecated;
-    return this;
-  }
-
-  @override
-  CompletionProposal setElement(Element element) {
-    this._element = element;
-    return this;
-  }
-
-  @override
-  CompletionProposal setKind(CompletionSuggestionKind x) {
-    _kind = x;
-    return this;
-  }
-
-  @override
-  CompletionProposal setLocation(int x) {
-    _location = x;
-    return this;
-  }
-
-  @override
-  CompletionProposal setParameterName(String parameterName) {
-    this._parameterName = parameterName;
-    return this;
-  }
-
-  @override
-  CompletionProposal setParameterNames(List<String> paramNames) {
-    _parameterNames = paramNames;
-    return this;
-  }
-
-  @override
-  CompletionProposal setParameterStyle(int count, bool named, bool positional) {
-    this._named = named;
-    this._positional = positional;
-    this._positionalParameterCount = count;
-    return this;
-  }
-
-  @override
-  CompletionProposal setParameterType(String parameterType) {
-    this._parameterType = parameterType;
-    return this;
-  }
-
-  @override
-  CompletionProposal setParameterTypes(List<String> paramTypes) {
-    _parameterTypes = paramTypes;
-    return this;
-  }
-
-  @override
-  CompletionProposal setPotentialMatch(bool isPotentialMatch) {
-    _potential = isPotentialMatch;
-    return this;
-  }
-
-  @override
-  CompletionProposal setRelevance(int n) {
-    _relevance = n;
-    return this;
-  }
-
-  @override
-  CompletionProposal setReplacementLength(int x) {
-    _replacementLength = x;
-    return this;
-  }
-
-  @override
-  CompletionProposal setReplacementLengthIdentifier(int x) {
-    _replacementLength2 = x;
-    return this;
-  }
-
-  @override
-  CompletionProposal setReturnType(String name) {
-    _returnType = name;
-    return this;
-  }
-}
-
-/**
- * A pathway for reporting completion proposals back to the client.
- */
-abstract class CompletionRequestor {
-  /**
-   * Record the given completion proposal for eventual presentation to the user.
-   */
-  accept(CompletionProposal proposal);
-
-  void beginReporting();
-
-  void endReporting();
-}
-
-/**
- */
-class CompletionState {
-  bool _isForMixin = false;
-
-  bool _isVoidAllowed = false;
-
-  bool _isDynamicAllowed = false;
-
-  bool _isSourceDeclarationStatic = false;
-
-  bool _isThisAllowed = true;
-
-  bool _isVarAllowed = false;
-
-  bool _areLiteralsAllowed = false;
-
-  bool _areLiteralsProhibited = false;
-
-  bool _areOperatorsAllowed = false;
-
-  bool _areStaticReferencesProhibited = false;
-
-  bool _areInstanceReferencesProhibited = false;
-
-  bool _areUndefinedTypesProhibited = false;
-
-  bool _isCompileTimeConstantRequired = false;
-
-  bool _isOptionalArgumentRequired = false;
-
-  bool _areMethodsProhibited = false;
-
-  bool _areClassesRequired = false;
-
-  ParameterElement _targetParameter;
-
-  void mustBeInstantiableType() {
-    _areClassesRequired = true;
-    _prohibitsLiterals();
-  }
-
-  void _includesLiterals() {
-    if (!_areLiteralsProhibited) {
-      _areLiteralsAllowed = true;
-    }
-  }
-
-  void _includesOperators() {
-    _areOperatorsAllowed = true;
-  }
-
-  void _includesUndefinedDeclarationTypes() {
-    if (!_areUndefinedTypesProhibited) {
-      _isVoidAllowed = true;
-      _isDynamicAllowed = true;
-    }
-  }
-
-  void _includesUndefinedTypes() {
-    _isVarAllowed = true;
-    _isDynamicAllowed = true;
-  }
-
-  void _mustBeMixin() {
-    _isForMixin = true;
-  }
-
-  void _prohibitsInstanceReferences() {
-    _areInstanceReferencesProhibited = true;
-  }
-
-  void _prohibitsLiterals() {
-    _areLiteralsAllowed = false;
-    _areLiteralsProhibited = true;
-  }
-
-  void _prohibitsStaticReferences() {
-    _areStaticReferencesProhibited = true;
-  }
-
-  void _prohibitThis() {
-    _isThisAllowed = false;
-  }
-
-  void _prohibitsUndefinedTypes() {
-    _areUndefinedTypesProhibited = true;
-  }
-
-  void _requiresConst(bool isConst) {
-    _isCompileTimeConstantRequired = isConst;
-  }
-
-  void _requiresOperators() {
-    _includesOperators();
-    _areMethodsProhibited = true;
-  }
-
-  void _requiresOptionalArgument() {
-    _isOptionalArgumentRequired = true;
-    _prohibitsLiterals();
-  }
-
-  void set context(AstNode base) {
-    base.accept(new ContextAnalyzer(this, base));
-  }
-
-  void _sourceDeclarationIsStatic(bool state) {
-    _isSourceDeclarationStatic = state;
-    if (state) {
-      if (!_areStaticReferencesProhibited) {
-        _prohibitsInstanceReferences();
-      }
-    }
-  }
-}
-
-/**
- */
-class ContextAnalyzer extends GeneralizingAstVisitor<Object> {
-  final CompletionState _state;
-
-  final AstNode _completionNode;
-
-  AstNode _child;
-
-  bool _inExpression = false;
-
-  bool _inIdentifier = false;
-
-  bool _inTypeName = false;
-
-  bool _maybeInvocationArgument = true;
-
-  ContextAnalyzer(this._state, this._completionNode);
-
-  @override
-  Object visitAnnotation(Annotation node) {
-    _state._requiresConst(true);
-    return super.visitAnnotation(node);
-  }
-
-  @override
-  Object visitCatchClause(CatchClause node) {
-    if (identical(node.exceptionType, _child)) {
-      _state._prohibitsLiterals();
-    }
-    return null;
-  }
-
-  @override
-  Object visitCompilationUnitMember(CompilationUnitMember node) {
-    if (node is! ClassDeclaration) {
-      _state._prohibitThis();
-    }
-    return super.visitCompilationUnitMember(node);
-  }
-
-  @override
-  Object visitConstructorInitializer(ConstructorInitializer node) {
-    _state._prohibitThis();
-    return super.visitConstructorInitializer(node);
-  }
-
-  @override
-  Object visitDirective(Directive node) {
-    _state._prohibitsLiterals();
-    return super.visitDirective(node);
-  }
-
-  @override
-  Object visitDoStatement(DoStatement node) {
-    if (identical(_child, node.condition)) {
-      _state._includesLiterals();
-    }
-    return super.visitDoStatement(node);
-  }
-
-  @override
-  Object visitExpression(Expression node) {
-    _inExpression = true;
-    _state._includesLiterals();
-    _mayBeSetParameterElement(node);
-    return super.visitExpression(node);
-  }
-
-  @override
-  Object visitFieldDeclaration(FieldDeclaration node) {
-    _state._prohibitThis();
-    return super.visitFieldDeclaration(node);
-  }
-
-  @override
-  Object visitForEachStatement(ForEachStatement node) {
-    if (identical(_child, node.iterator)) {
-      _state._includesLiterals();
-    }
-    return super.visitForEachStatement(node);
-  }
-
-  @override
-  Object visitFunctionExpression(FunctionExpression node) {
-    if (node.parent is Declaration) {
-      // Function expressions that are part of a declaration are not to be treated as expressions.
-      return visitNode(node);
-    } else {
-      return visitExpression(node);
-    }
-  }
-
-  @override
-  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
-    if (_inTypeName || node.returnType == null) {
-      // This may be an incomplete class type alias
-      _state._includesUndefinedDeclarationTypes();
-    }
-    return super.visitFunctionTypeAlias(node);
-  }
-
-  @override
-  Object visitIdentifier(Identifier node) {
-    _mayBeSetParameterElement(node);
-    // Identifiers cannot safely be generalized to expressions, so just walk up one level.
-    // LibraryIdentifier is never an expression. PrefixedIdentifier may be an expression, but
-    // not in a catch-clause or a declaration. SimpleIdentifier may be an expression, but not
-    // in a constructor name, label, or where PrefixedIdentifier is not.
-    return visitNode(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    _state._requiresConst(node.isConst);
-    if (identical(_completionNode.parent.parent, _child)) {
-      _state.mustBeInstantiableType();
-    }
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitMethodDeclaration(MethodDeclaration node) {
-    _state._sourceDeclarationIsStatic(node.isStatic);
-    if (identical(_child, node.returnType)) {
-      _state._includesUndefinedDeclarationTypes();
-    }
-    if (node.isStatic) {
-      _state._prohibitThis();
-    }
-    return super.visitMethodDeclaration(node);
-  }
-
-  @override
-  Object visitNode(AstNode node) {
-    // Walk UP the tree, not down.
-    AstNode parent = node.parent;
-    _updateIfShouldGetTargetParameter(node, parent);
-    if (parent != null) {
-      _child = node;
-      parent.accept(this);
-    }
-    return null;
-  }
-
-  @override
-  Object visitPrefixedIdentifier(PrefixedIdentifier node) {
-    if (identical(node, _completionNode) || identical(node.identifier, _completionNode)) {
-      SimpleIdentifier prefix = node.prefix;
-      if (_isClassLiteral(prefix)) {
-        _state._prohibitsInstanceReferences();
-      } else {
-        _state._prohibitsStaticReferences();
-      }
-    }
-    return super.visitPrefixedIdentifier(node);
-  }
-
-  @override
-  Object visitPropertyAccess(PropertyAccess node) {
-    if (identical(node, _completionNode) || identical(node.propertyName, _completionNode)) {
-      Expression target = node.realTarget;
-      if (_isClassLiteral(target)) {
-        _state._prohibitsInstanceReferences();
-      } else {
-        _state._prohibitsStaticReferences();
-      }
-    }
-    return super.visitPropertyAccess(node);
-  }
-
-  @override
-  Object visitSimpleFormalParameter(SimpleFormalParameter node) {
-    _state._includesUndefinedTypes();
-    return super.visitSimpleFormalParameter(node);
-  }
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    _inIdentifier = true;
-    return super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  Object visitSwitchStatement(SwitchStatement node) {
-    if (identical(_child, node.expression)) {
-      _state._includesLiterals();
-    }
-    return super.visitSwitchStatement(node);
-  }
-
-  @override
-  Object visitTypeArgumentList(TypeArgumentList node) {
-    _state._prohibitsUndefinedTypes();
-    return super.visitTypeArgumentList(node);
-  }
-
-  @override
-  Object visitTypeName(TypeName node) {
-    _inTypeName = true;
-    return super.visitTypeName(node);
-  }
-
-  @override
-  Object visitVariableDeclaration(VariableDeclaration node) {
-    if (identical(node.name, _completionNode)) {
-      _state._prohibitsLiterals();
-    }
-    return super.visitVariableDeclaration(node);
-  }
-
-  @override
-  Object visitVariableDeclarationList(VariableDeclarationList node) {
-    _state._includesUndefinedDeclarationTypes();
-    return super.visitVariableDeclarationList(node);
-  }
-
-  @override
-  Object visitWhileStatement(WhileStatement node) {
-    if (identical(_child, node.condition)) {
-      _state._includesLiterals();
-    }
-    return super.visitWhileStatement(node);
-  }
-
-  @override
-  Object visitWithClause(WithClause node) {
-    _state._mustBeMixin();
-    return super.visitWithClause(node);
-  }
-
-  bool _isClassLiteral(Expression expression) => expression is Identifier && expression.staticElement is ClassElement;
-
-  void _mayBeSetParameterElement(Expression node) {
-    if (!_maybeInvocationArgument) {
-      return;
-    }
-    if (node.parent is ArgumentList) {
-      if (_state._targetParameter == null) {
-        _state._targetParameter = node.bestParameterElement;
-      }
-    }
-  }
-
-  void _updateIfShouldGetTargetParameter(AstNode node, AstNode parent) {
-    if (!_maybeInvocationArgument) {
-      return;
-    }
-    // prefix.node
-    if (parent is PrefixedIdentifier) {
-      if (identical(parent.identifier, node)) {
-        return;
-      }
-    }
-    // something unknown
-    _maybeInvocationArgument = false;
-  }
-}
-
-class Filter {
-  String _prefix;
-
-  String _originalPrefix;
-
-  RegExp _pattern;
-
-  Filter.con1(SimpleIdentifier ident, int loc) : this.con2(ident.name, ident.offset, loc);
-
-  Filter.con2(String name, int pos, int loc) {
-    int len = loc - pos;
-    if (len > 0) {
-      if (len <= name.length) {
-        _prefix = name.substring(0, len);
-      } else {
-        _prefix = name;
-      }
-    } else {
-      _prefix = "";
-    }
-    _originalPrefix = _prefix;
-    _prefix = _prefix.toLowerCase();
-  }
-
-  /**
-   * @return `true` if the given name starts with the same prefix as used for filter.
-   */
-  bool _isSameCasePrefix(String name) => name.startsWith(_originalPrefix);
-
-  String _makePattern() {
-    // TODO(scheglov) translate it
-    return null;
-  }
-
-  bool _match(Element elem) => _match2(elem.displayName);
-
-  bool _match2(String name) {
-    // Return true if the filter passes.
-    if (name.toLowerCase().startsWith(_prefix)) {
-      return true;
-    }
-    return _matchPattern(name);
-  }
-
-  void _removeNotMatching(List<Element> elements) {
-    for (int i = elements.length - 1; i >= 0; i--) {
-      if (!_match(elements[i])) {
-        elements.removeAt(i);
-      }
-    }
-  }
-
-  bool _matchPattern(String name) {
-    // TODO(scheglov) translate it
-    return false;
-  }
-}
-
-class GeneralizingAstVisitor_CompletionEngine_copyWithout extends GeneralizingAstVisitor<Object> {
-  AstNode deletion;
-
-  List<FormalParameter> newList;
-
-  GeneralizingAstVisitor_CompletionEngine_copyWithout(this.deletion, this.newList) : super();
-
-  @override
-  Object visitNode(AstNode node) {
-    if (!identical(node, deletion)) {
-      newList.add(node as FormalParameter);
-    }
-    return null;
-  }
-}
-
-/**
- * An [Ident] is a wrapper for a String that provides type equivalence with SimpleIdentifier.
- */
-class Ident extends EphemeralIdentifier {
-  String _name;
-
-  Ident.con1(AstNode parent, int offset) : super(parent, offset);
-
-  Ident.con2(AstNode parent, String name, int offset) : super(parent, offset) {
-    this._name = name;
-  }
-
-  Ident.con3(AstNode parent, Token name) : super(parent, name.offset) {
-    this._name = name.lexeme;
-  }
-
-  @override
-  String get name {
-    if (_name != null) {
-      return _name;
-    }
-    String n = super.name;
-    if (n != null) {
-      return n;
-    }
-    return "";
-  }
-}
-
-class ProposalCollector implements CompletionRequestor {
-  final CompletionRequestor requestor;
-
-  List<CompletionProposal> _proposals;
-
-  ProposalCollector(this.requestor) {
-    this._proposals = new List<CompletionProposal>();
-  }
-
-  @override
-  accept(CompletionProposal proposal) {
-    _proposals.add(proposal);
-  }
-
-  @override
-  void beginReporting() {
-    requestor.beginReporting();
-  }
-
-  @override
-  void endReporting() {
-    requestor.endReporting();
-  }
-
-  List<CompletionProposal> get proposals => _proposals;
-}
-
-class SearchFilter_CompletionEngine_allSubtypes implements SearchFilter {
-  ClassElement classElement;
-
-  SearchFilter_CompletionEngine_allSubtypes(this.classElement);
-
-  @override
-  bool passes(SearchMatch match) {
-    Element element = match.element;
-    if (element is ClassElement) {
-      ClassElement clElem = element;
-      while (clElem != null) {
-        InterfaceType ifType = clElem.supertype;
-        if (ifType == null) {
-          return false;
-        }
-        clElem = ifType.element;
-        if (identical(clElem, classElement)) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-}
-
-class TopLevelNamesKind extends Enum<TopLevelNamesKind> {
-  static const TopLevelNamesKind DECLARED_AND_IMPORTS = const TopLevelNamesKind('DECLARED_AND_IMPORTS', 0);
-
-  static const TopLevelNamesKind DECLARED_AND_EXPORTS = const TopLevelNamesKind('DECLARED_AND_EXPORTS', 1);
-
-  static const List<TopLevelNamesKind> values = const [DECLARED_AND_IMPORTS, DECLARED_AND_EXPORTS];
-
-  const TopLevelNamesKind(String name, int ordinal) : super(name, ordinal);
-}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/services/generated/stubs.dart b/pkg/analysis_server/lib/src/services/generated/stubs.dart
deleted file mode 100644
index 8d0982c..0000000
--- a/pkg/analysis_server/lib/src/services/generated/stubs.dart
+++ /dev/null
@@ -1,148 +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.
-
-// 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 service.correction.stubs;
-
-import 'package:analyzer/src/generated/ast.dart' show AstNode;
-import 'package:analyzer/src/generated/element.dart';
-import 'package:analyzer/src/generated/scanner.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-abstract class SearchFilter {
-  bool passes(SearchMatch match);
-}
-
-class SearchMatch {
-  final Element element = null;
-  final SourceRange sourceRange = null;
-}
-
-class SearchEngine {}
-
-class SourceRangeFactory {
-  static SourceRange rangeElementName(Element element) {
-    return new SourceRange(element.nameOffset, element.name.length);
-  }
-
-  static SourceRange rangeEndEnd(a, b) {
-    int offset = a.end;
-    var length = b.end - offset;
-    return new SourceRange(offset, length);
-  }
-
-  static SourceRange rangeEndLength(a, int length) {
-    return new SourceRange(a.nameOffset, length);
-  }
-
-  static SourceRange rangeEndStart(a, b) {
-    int offset = a.end;
-    var length = b.offset - offset;
-    return new SourceRange(offset, length);
-  }
-
-  static SourceRange rangeNode(AstNode node) {
-    return new SourceRange(node.offset, node.length);
-  }
-
-  static SourceRange rangeNodes(List<AstNode> nodes) {
-    if (nodes.isEmpty) {
-      return new SourceRange(0, 0);
-    }
-    AstNode first = nodes.first;
-    AstNode last = nodes.last;
-    return rangeStartEnd(first, last);
-  }
-
-  static SourceRange rangeStartEnd(a, b) {
-    int offset = a.offset;
-    var length = b.end - offset;
-    return new SourceRange(offset, length);
-  }
-
-  static SourceRange rangeStartLength(a, int length) {
-    int offset = a.offset;
-    return new SourceRange(offset, length);
-  }
-
-  static SourceRange rangeStartStart(a, b) {
-    int offset = a.offset;
-    var length = b.offset - offset;
-    return new SourceRange(offset, length);
-  }
-
-  static SourceRange rangeToken(Token node) {
-    return new SourceRange(node.offset, node.length);
-  }
-}
-
-class StringUtils {
-  static String capitalize(String str) {
-    if (isEmpty(str)) {
-      return str;
-    }
-    return str.substring(0, 1).toUpperCase() + str.substring(1);
-  }
-
-  static bool equals(String cs1, String cs2) {
-    if (cs1 == cs2) {
-      return true;
-    }
-    if (cs1 == null || cs2 == null) {
-      return false;
-    }
-    return cs1 == cs2;
-  }
-
-  static bool isEmpty(String str) {
-    return str == null || str.isEmpty;
-  }
-
-  static String join(Iterable iter,
-      [String separator = ' ', int start = 0, int end = -1]) {
-    if (start != 0) {
-      iter = iter.skip(start);
-    }
-    if (end != -1) {
-      iter = iter.take(end - start);
-    }
-    return iter.join(separator);
-  }
-
-  static String remove(String str, String remove) {
-    if (isEmpty(str) || isEmpty(remove)) {
-      return str;
-    }
-    return str.replaceAll(remove, '');
-  }
-
-  static String removeStart(String str, String remove) {
-    if (isEmpty(str) || isEmpty(remove)) {
-      return str;
-    }
-    if (str.startsWith(remove)) {
-      return str.substring(remove.length);
-    }
-    return str;
-  }
-
-  static String repeat(String s, int n) {
-    StringBuffer sb = new StringBuffer();
-    for (int i = 0; i < n; i++) {
-      sb.write(s);
-    }
-    return sb.toString();
-  }
-
-  static List<String> split(String s, [String pattern = '']) {
-    return s.split(pattern);
-  }
-
-  static List<String> splitByWholeSeparatorPreserveAllTokens(
-      String s, String pattern) {
-    return s.split(pattern);
-  }
-}
diff --git a/pkg/analysis_server/lib/src/services/generated/util.dart b/pkg/analysis_server/lib/src/services/generated/util.dart
deleted file mode 100644
index 31a15c3..0000000
--- a/pkg/analysis_server/lib/src/services/generated/util.dart
+++ /dev/null
@@ -1,1833 +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.
-
-// 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 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';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error.dart';
-import 'package:analyzer/src/generated/resolver.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/generated/scanner.dart';
-
-import 'stubs.dart';
-
-/**
- * Context for which assistance should be provided.
- */
-class AssistContext {
-  final SearchEngine searchEngine;
-
-  final AnalysisContext analysisContext;
-
-  final String analysisContextId;
-
-  final Source source;
-
-  final CompilationUnit compilationUnit;
-
-  final int selectionOffset;
-
-  final int selectionLength;
-
-  AstNode _coveredNode;
-
-  AstNode _coveringNode;
-
-  Element _coveredElement;
-
-  bool _coveredElementFound = false;
-
-  AssistContext.con1(this.searchEngine, this.analysisContext,
-      this.analysisContextId, this.source, this.compilationUnit,
-      this.selectionOffset, this.selectionLength);
-
-  AssistContext.con2(SearchEngine searchEngine, AnalysisContext analysisContext,
-      String analysisContextId, Source source, CompilationUnit compilationUnit,
-      SourceRange selectionRange)
-      : this.con1(searchEngine, analysisContext, analysisContextId, source,
-          compilationUnit, selectionRange.offset, selectionRange.length);
-
-  /**
-   * @return the resolved [CompilationUnitElement] of the [Source].
-   */
-  CompilationUnitElement get compilationUnitElement => compilationUnit.element;
-
-  /**
-   * @return the [Element] of the [coveredNode], may be <code>null</code>.
-   */
-  Element get coveredElement {
-    if (!_coveredElementFound) {
-      _coveredElementFound = true;
-      AstNode coveredNode = this.coveredNode;
-      if (coveredNode == null) {
-        return null;
-      }
-      _coveredElement =
-          ElementLocator.locateWithOffset(coveredNode, selectionOffset);
-    }
-    return _coveredElement;
-  }
-
-  /**
-   * @return the [AstNode] that is covered by the selection.
-   */
-  AstNode get coveredNode {
-    if (_coveredNode == null) {
-      NodeLocator locator = new NodeLocator(selectionOffset, selectionOffset);
-      _coveredNode = locator.searchWithin(compilationUnit);
-    }
-    return _coveredNode;
-  }
-
-  /**
-   * @return the ASTNode that covers the selection.
-   */
-  AstNode get coveringNode {
-    if (_coveringNode == null) {
-      NodeLocator locator =
-          new NodeLocator(selectionOffset, selectionOffset + selectionLength);
-      _coveringNode = locator.searchWithin(compilationUnit);
-    }
-    return _coveringNode;
-  }
-
-  /**
-   * @return the errors associated with the [Source].
-   */
-  List<AnalysisError> get errors {
-    Source source = this.source;
-    if (analysisContext == null || source == null) {
-      return AnalysisError.NO_ERRORS;
-    }
-    return analysisContext.getErrors(source).errors;
-  }
-
-  /**
-   * @return the [SourceRange] of the selection.
-   */
-  SourceRange get selectionRange =>
-      new SourceRange(selectionOffset, selectionLength);
-}
-
-/**
- * Utilities for analyzing [CompilationUnit], its parts and source.
- */
-class CorrectionUtils {
-  static List<String> _KNOWN_METHOD_NAME_PREFIXES = ["get", "is", "to"];
-
-  /**
-   * @return <code>true</code> if given [List]s are equals at given position.
-   */
-  static bool allListsEqual(List<List> lists, int position) {
-    Object element = lists[0][position];
-    for (List list in lists) {
-      if (!identical(list[position], element)) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /**
-   * @return <code>true</code> if given [SourceRange] covers given [AstNode].
-   */
-  static bool covers(SourceRange r, AstNode node) {
-    SourceRange nodeRange = SourceRangeFactory.rangeNode(node);
-    return r.covers(nodeRange);
-  }
-
-  /**
-   * @return all direct children of the given [Element].
-   */
-  static List<Element> getChildren(Element parent) =>
-      getChildren2(parent, null);
-
-  /**
-   * @param name the required name of children; may be <code>null</code> to get children with any
-   *          name.
-   * @return all direct children of the given [Element], with given name.
-   */
-  static List<Element> getChildren2(Element parent, String name) {
-    List<Element> children = [];
-    parent.accept(new GeneralizingElementVisitor_CorrectionUtils_getChildren(
-        parent, name, children));
-    return children;
-  }
-
-  static String getDefaultValueCode(DartType type) {
-    if (type != null) {
-      String typeName = type.displayName;
-      if (typeName == "bool") {
-        return "false";
-      }
-      if (typeName == "int") {
-        return "0";
-      }
-      if (typeName == "double") {
-        return "0.0";
-      }
-      if (typeName == "String") {
-        return "''";
-      }
-    }
-    // no better guess
-    return "null";
-  }
-
-  /**
-   * @return the name of the [Element] kind.
-   */
-  static String getElementKindName(Element element) {
-    ElementKind kind = element.kind;
-    return getElementKindName2(kind);
-  }
-
-  /**
-   * @return the display name of the [ElementKind].
-   */
-  static String getElementKindName2(ElementKind kind) => kind.displayName;
-
-  /**
-   * @return the human name of the [Element].
-   */
-  static String getElementQualifiedName(Element element) {
-    ElementKind kind = element.kind;
-    while (true) {
-      if (kind == ElementKind.FIELD || kind == ElementKind.METHOD) {
-        return "${element.enclosingElement.displayName}.${element.displayName}";
-      } else {
-        return element.displayName;
-      }
-      break;
-    }
-  }
-
-  /**
-   * @return the [ExecutableElement] of the enclosing executable [AstNode].
-   */
-  static ExecutableElement getEnclosingExecutableElement(AstNode node) {
-    while (node != null) {
-      if (node is FunctionDeclaration) {
-        return node.element;
-      }
-      if (node is ConstructorDeclaration) {
-        return node.element;
-      }
-      if (node is MethodDeclaration) {
-        return node.element;
-      }
-      node = node.parent;
-    }
-    return null;
-  }
-
-  /**
-   * @return the enclosing executable [AstNode].
-   */
-  static AstNode getEnclosingExecutableNode(AstNode node) {
-    while (node != null) {
-      if (node is FunctionDeclaration) {
-        return node;
-      }
-      if (node is ConstructorDeclaration) {
-        return node;
-      }
-      if (node is MethodDeclaration) {
-        return node;
-      }
-      node = node.parent;
-    }
-    return null;
-  }
-
-  /**
-   * @return [Element] exported from the given [LibraryElement].
-   */
-  static Element getExportedElement(LibraryElement library, String name) {
-    if (library == null) {
-      return null;
-    }
-    return getExportNamespace2(library)[name];
-  }
-
-  /**
-   * TODO(scheglov) may be replace with some API for this
-   *
-   * @return the namespace of the given [ExportElement].
-   */
-  static Map<String, Element> getExportNamespace(ExportElement exp) {
-    Namespace namespace =
-        new NamespaceBuilder().createExportNamespaceForDirective(exp);
-    return namespace.definedNames;
-  }
-
-  /**
-   * TODO(scheglov) may be replace with some API for this
-   *
-   * @return the export namespace of the given [LibraryElement].
-   */
-  static Map<String, Element> getExportNamespace2(LibraryElement library) {
-    Namespace namespace =
-        new NamespaceBuilder().createExportNamespaceForLibrary(library);
-    return namespace.definedNames;
-  }
-
-  /**
-   * @return [getExpressionPrecedence] for parent node, or `0` if parent node
-   *         is [ParenthesizedExpression]. The reason is that `(expr)` is always
-   *         executed after `expr`.
-   */
-  static int getExpressionParentPrecedence(AstNode node) {
-    AstNode parent = node.parent;
-    if (parent is ParenthesizedExpression) {
-      return 0;
-    }
-    return getExpressionPrecedence(parent);
-  }
-
-  /**
-   * Return the precedence of the given [node]: the result of invoking
-   * [Expression.precedence] if the node is an [Expression], or a negative value
-   * otherwise.
-   */
-  static int getExpressionPrecedence(AstNode node) {
-    if (node is Expression) {
-      return node.precedence;
-    }
-    return -1000;
-  }
-
-  /**
-   * TODO(scheglov) may be replace with some API for this
-   *
-   * @return the namespace of the given [ImportElement].
-   */
-  static Map<String, Element> getImportNamespace(ImportElement imp) {
-    Namespace namespace =
-        new NamespaceBuilder().createImportNamespaceForDirective(imp);
-    return namespace.definedNames;
-  }
-
-  /**
-   * @return all [CompilationUnitElement] the given [LibraryElement] consists of.
-   */
-  static List<CompilationUnitElement> getLibraryUnits(LibraryElement library) {
-    List<CompilationUnitElement> units = [];
-    units.add(library.definingCompilationUnit);
-    units.addAll(library.parts);
-    return units;
-  }
-
-  /**
-   * @return the line prefix from the given source, i.e. basically just whitespace prefix of the
-   *         given [String].
-   */
-  static String getLinesPrefix(String lines) {
-    int index = 0;
-    while (index < lines.length) {
-      int c = lines.codeUnitAt(index);
-      if (!Character.isWhitespace(c)) {
-        break;
-      }
-      index++;
-    }
-    return lines.substring(0, index);
-  }
-
-  /**
-   * @return the [LocalVariableElement] or [ParameterElement] if given
-   *         [SimpleIdentifier] is the reference to local variable or parameter, or
-   *         <code>null</code> in the other case.
-   */
-  static VariableElement getLocalOrParameterVariableElement(
-      SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is LocalVariableElement) {
-      return element;
-    }
-    if (element is ParameterElement) {
-      return element;
-    }
-    return null;
-  }
-
-  /**
-   * @return the [LocalVariableElement] if given [SimpleIdentifier] is the reference to
-   *         local variable, or <code>null</code> in the other case.
-   */
-  static LocalVariableElement getLocalVariableElement(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is LocalVariableElement) {
-      return element;
-    }
-    return null;
-  }
-
-  /**
-   * @return the nearest common ancestor [AstNode] of the given [AstNode]s.
-   */
-  static AstNode getNearestCommonAncestor(List<AstNode> nodes) {
-    // may be no nodes
-    if (nodes.isEmpty) {
-      return null;
-    }
-    // prepare parents
-    List<List<AstNode>> parents = [];
-    for (AstNode node in nodes) {
-      parents.add(getParents(node));
-    }
-    // find min length
-    int minLength = 2147483647;
-    for (List<AstNode> parentList in parents) {
-      minLength = math.min(minLength, parentList.length);
-    }
-    // find deepest parent
-    int i = 0;
-    for (; i < minLength; i++) {
-      if (!allListsEqual(parents, i)) {
-        break;
-      }
-    }
-    return parents[0][i - 1];
-  }
-
-  /**
-   * @return the [Expression] qualified if given node is name part of a [PropertyAccess]
-   *         or [PrefixedIdentifier]. May be <code>null</code>.
-   */
-  static Expression getNodeQualifier(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent is PropertyAccess) {
-      PropertyAccess propertyAccess = parent;
-      if (identical(propertyAccess.propertyName, node)) {
-        return propertyAccess.target;
-      }
-    }
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (identical(prefixed.identifier, node)) {
-        return prefixed.prefix;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the [ParameterElement] if given [SimpleIdentifier] is the reference to
-   *         parameter, or <code>null</code> in the other case.
-   */
-  static ParameterElement getParameterElement(SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is ParameterElement) {
-      return element;
-    }
-    return null;
-  }
-
-  /**
-   * Return the precedence of the given [expression]'s parent. May be `-1` no
-   * operator.
-   *
-   * See [getPrecedence].
-   */
-  static int getParentPrecedence(Expression expression) {
-    AstNode parent = expression.parent;
-    if (parent is Expression) {
-      return getPrecedence(parent);
-    }
-    return -1;
-  }
-
-  /**
-   * @return parent [AstNode]s from [CompilationUnit] (at index "0") to the given one.
-   */
-  static List<AstNode> getParents(AstNode node) {
-    // prepare number of parents
-    int numParents = 0;
-    {
-      AstNode current = node.parent;
-      while (current != null) {
-        numParents++;
-        current = current.parent;
-      }
-    }
-    // fill array of parents
-    List<AstNode> parents = new List<AstNode>(numParents);
-    AstNode current = node.parent;
-    int index = numParents;
-    while (current != null) {
-      parents[--index] = current;
-      current = current.parent;
-    }
-    return parents;
-  }
-
-  /**
-   * @return the precedence of the given [Expression] operator. May be
-   *         `Integer#MAX_VALUE` if not an operator.
-   */
-  static int getPrecedence(Expression expression) {
-    if (expression is BinaryExpression) {
-      BinaryExpression binaryExpression = expression;
-      return binaryExpression.operator.type.precedence;
-    }
-    if (expression is PrefixExpression) {
-      PrefixExpression prefixExpression = expression;
-      return prefixExpression.operator.type.precedence;
-    }
-    if (expression is PostfixExpression) {
-      PostfixExpression postfixExpression = expression;
-      return postfixExpression.operator.type.precedence;
-    }
-    return 2147483647;
-  }
-
-  /**
-   * @return the [PropertyAccessorElement] if given [SimpleIdentifier] is the reference
-   *         to property, or <code>null</code> in the other case.
-   */
-  static PropertyAccessorElement getPropertyAccessorElement(
-      SimpleIdentifier node) {
-    Element element = node.staticElement;
-    if (element is PropertyAccessorElement) {
-      return element;
-    }
-    return null;
-  }
-
-  /**
-   * If given [AstNode] is name of qualified property extraction, returns target from which
-   * this property is extracted. Otherwise `null`.
-   */
-  static Expression getQualifiedPropertyTarget(AstNode node) {
-    AstNode parent = node.parent;
-    if (parent is PrefixedIdentifier) {
-      PrefixedIdentifier prefixed = parent;
-      if (identical(prefixed.identifier, node)) {
-        return parent.prefix;
-      }
-    }
-    if (parent is PropertyAccess) {
-      PropertyAccess access = parent;
-      if (identical(access.propertyName, node)) {
-        return access.realTarget;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Returns the name of the file which corresponds to the name of the class according to the style
-   * guide. However class does not have to be in this file.
-   */
-  static String getRecommentedFileNameForClass(String className) {
-    int len = className.length;
-    StringBuffer buffer = new StringBuffer();
-    bool prevWasUpper = false;
-    for (int i = 0; i < len; i++) {
-      int c = className.codeUnitAt(i);
-      if (Character.isUpperCase(c)) {
-        bool nextIsUpper =
-            i < len - 1 && Character.isUpperCase(className.codeUnitAt(i + 1));
-        if (i == 0) {} else if (prevWasUpper) {
-          // HTTPServer
-          //     ^
-          if (!nextIsUpper) {
-            buffer.writeCharCode(0x5F);
-          }
-        } else {
-          // HttpServer
-          //     ^
-          buffer.writeCharCode(0x5F);
-        }
-        prevWasUpper = true;
-        c = Character.toLowerCase(c);
-      } else {
-        prevWasUpper = false;
-      }
-      buffer.writeCharCode(c);
-    }
-    buffer.write(".dart");
-    String fileName = buffer.toString();
-    return fileName;
-  }
-
-  /**
-   * @return given [Statement] if not [Block], first child [Statement] if
-   *         [Block], or <code>null</code> if more than one child.
-   */
-  static Statement getSingleStatement(Statement statement) {
-    if (statement is Block) {
-      List<Statement> blockStatements = statement.statements;
-      if (blockStatements.length != 1) {
-        return null;
-      }
-      return blockStatements[0];
-    }
-    return statement;
-  }
-
-  /**
-   * @return the [String] content of the given [Source].
-   */
-  static String getSourceContent(AnalysisContext context, Source source) =>
-      context.getContents(source).data.toString();
-
-  /**
-   * @return given [Statement] if not [Block], all children [Statement]s if
-   *         [Block].
-   */
-  static List<Statement> getStatements(Statement statement) {
-    if (statement is Block) {
-      return statement.statements;
-    }
-    return [];
-  }
-
-  /**
-   * @return all top-level elements declared in the given [LibraryElement].
-   */
-  static List<Element> getTopLevelElements(LibraryElement library) {
-    List<Element> elements = [];
-    List<CompilationUnitElement> units = getLibraryUnits(library);
-    for (CompilationUnitElement unit in units) {
-      elements.addAll(unit.functions);
-      elements.addAll(unit.functionTypeAliases);
-      elements.addAll(unit.types);
-      elements.addAll(unit.topLevelVariables);
-    }
-    return elements;
-  }
-
-  /**
-   * @return the possible names for variable with initializer of the given [StringLiteral].
-   */
-  static List<String> getVariableNameSuggestions(
-      String text, Set<String> excluded) {
-    // filter out everything except of letters and white spaces
-    {
-      StringBuffer buffer = new StringBuffer();
-      for (int i = 0; i < text.length; i++) {
-        int c = text.codeUnitAt(i);
-        if (Character.isLetter(c) || Character.isWhitespace(c)) {
-          buffer.writeCharCode(c);
-        }
-      }
-      text = buffer.toString();
-    }
-    // make single camel-case text
-    {
-      List<String> words = StringUtils.split(text);
-      StringBuffer buffer = new StringBuffer();
-      for (int i = 0; i < words.length; i++) {
-        String word = words[i];
-        if (i > 0) {
-          word = StringUtils.capitalize(word);
-        }
-        buffer.write(word);
-      }
-      text = buffer.toString();
-    }
-    // split camel-case into separate suggested names
-    Set<String> res = new LinkedHashSet();
-    _addAll(excluded, res, _getVariableNameSuggestions(text));
-    return new List.from(res);
-  }
-
-  /**
-   * @return the possible names for variable with given expected type and expression.
-   */
-  static List<String> getVariableNameSuggestions2(DartType expectedType,
-      Expression assignedExpression, Set<String> excluded) {
-    Set<String> res = new LinkedHashSet();
-    // use expression
-    if (assignedExpression != null) {
-      String nameFromExpression =
-          _getBaseNameFromExpression(assignedExpression);
-      if (nameFromExpression != null) {
-        nameFromExpression = StringUtils.removeStart(nameFromExpression, "_");
-        _addAll(excluded, res, _getVariableNameSuggestions(nameFromExpression));
-      }
-      String nameFromParent =
-          _getBaseNameFromLocationInParent(assignedExpression);
-      if (nameFromParent != null) {
-        _addAll(excluded, res, _getVariableNameSuggestions(nameFromParent));
-      }
-    }
-    // use type
-    if (expectedType != null && !expectedType.isDynamic) {
-      String typeName = expectedType.name;
-      if ("int" == typeName) {
-        _addSingleCharacterName(excluded, res, 0x69);
-      } else if ("double" == typeName) {
-        _addSingleCharacterName(excluded, res, 0x64);
-      } else if ("String" == typeName) {
-        _addSingleCharacterName(excluded, res, 0x73);
-      } else {
-        _addAll(excluded, res, _getVariableNameSuggestions(typeName));
-      }
-      res.remove(typeName);
-    }
-    // done
-    return new List.from(res);
-  }
-
-  /**
-   * Return `true` if the given [element]'s display name ([Element.displayName])
-   * is equal to the given [name].
-   */
-  static bool hasDisplayName(Element element, String name) {
-    if (element == null) {
-      return false;
-    }
-    String elementDisplayName = element.displayName;
-    return StringUtils.equals(elementDisplayName, name);
-  }
-
-  /**
-   * Return `true` if the given [element]'s name ([Element.name]) is equal to
-   * the given [name].
-   */
-  static bool hasName(Element element, String name) {
-    if (element == null) {
-      return false;
-    }
-    String elementName = element.name;
-    return StringUtils.equals(elementName, name);
-  }
-
-  /**
-   * @return `true` if the given [SimpleIdentifier] is the name of the
-   *         [NamedExpression].
-   */
-  static bool isNamedExpressionName(SimpleIdentifier node) {
-    AstNode parent = node.parent;
-    if (parent is Label) {
-      Label label = parent;
-      if (identical(label.label, node)) {
-        AstNode parent2 = label.parent;
-        if (parent2 is NamedExpression) {
-          return identical(parent2.name, label);
-        }
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Adds "toAdd" items which are not excluded.
-   */
-  static void _addAll(
-      Set<String> excluded, Set<String> result, Iterable<String> toAdd) {
-    for (String item in toAdd) {
-      // add name based on "item", but not "excluded"
-      for (int suffix = 1;; suffix++) {
-        // prepare name, just "item" or "item2", "item3", etc
-        String name = item;
-        if (suffix > 1) {
-          name += suffix.toString();
-        }
-        // add once found not excluded
-        if (!excluded.contains(name)) {
-          result.add(name);
-          break;
-        }
-      }
-    }
-  }
-
-  /**
-   * Add to "result" then given "c" or the first ASCII character after it.
-   */
-  static void _addSingleCharacterName(
-      Set<String> excluded, Set<String> result, int c) {
-    while (c < 0x7A) {
-      String name = new String.fromCharCode(c);
-      // may be done
-      if (!excluded.contains(name)) {
-        result.add(name);
-        break;
-      }
-      // next character
-      c = (c + 1);
-    }
-  }
-
-  static String _getBaseNameFromExpression(Expression expression) {
-    String name = null;
-    // e as Type
-    if (expression is AsExpression) {
-      AsExpression asExpression = expression as AsExpression;
-      expression = asExpression.expression;
-    }
-    // analyze expressions
-    if (expression is SimpleIdentifier) {
-      SimpleIdentifier node = expression;
-      return node.name;
-    } else if (expression is PrefixedIdentifier) {
-      PrefixedIdentifier node = expression;
-      return node.identifier.name;
-    } else if (expression is MethodInvocation) {
-      name = expression.methodName.name;
-    } else if (expression is InstanceCreationExpression) {
-      InstanceCreationExpression creation = expression;
-      ConstructorName constructorName = creation.constructorName;
-      TypeName typeName = constructorName.type;
-      if (typeName != null) {
-        Identifier typeNameIdentifier = typeName.name;
-        // new ClassName()
-        if (typeNameIdentifier is SimpleIdentifier) {
-          return typeNameIdentifier.name;
-        }
-        // new prefix.name();
-        if (typeNameIdentifier is PrefixedIdentifier) {
-          PrefixedIdentifier prefixed = typeNameIdentifier;
-          // new prefix.ClassName()
-          if (prefixed.prefix.staticElement is PrefixElement) {
-            return prefixed.identifier.name;
-          }
-          // new ClassName.constructorName()
-          return prefixed.prefix.name;
-        }
-      }
-    }
-    // strip known prefixes
-    if (name != null) {
-      for (int i = 0; i < _KNOWN_METHOD_NAME_PREFIXES.length; i++) {
-        String curr = _KNOWN_METHOD_NAME_PREFIXES[i];
-        if (name.startsWith(curr)) {
-          if (name == curr) {
-            return null;
-          } else if (Character.isUpperCase(name.codeUnitAt(curr.length))) {
-            return name.substring(curr.length);
-          }
-        }
-      }
-    }
-    // done
-    return name;
-  }
-
-  static String _getBaseNameFromLocationInParent(Expression expression) {
-    // value in named expression
-    if (expression.parent is NamedExpression) {
-      NamedExpression namedExpression = expression.parent as NamedExpression;
-      if (identical(namedExpression.expression, expression)) {
-        return namedExpression.name.label.name;
-      }
-    }
-    // positional argument
-    {
-      ParameterElement parameter = expression.propagatedParameterElement;
-      if (parameter == null) {
-        parameter = expression.staticParameterElement;
-      }
-      if (parameter != null) {
-        return parameter.displayName;
-      }
-    }
-    // unknown
-    return null;
-  }
-
-  /**
-   * @return [Expression]s from <code>operands</code> which are completely covered by given
-   *         [SourceRange]. Range should start and end between given [Expression]s.
-   */
-  static List<Expression> _getOperandsForSourceRange(
-      List<Expression> operands, SourceRange range) {
-    assert(!operands.isEmpty);
-    List<Expression> subOperands = [];
-    // track range enter/exit
-    bool entered = false;
-    bool exited = false;
-    // may be range starts before or on first operand
-    if (range.offset <= operands[0].offset) {
-      entered = true;
-    }
-    // iterate over gaps between operands
-    for (int i = 0; i < operands.length - 1; i++) {
-      Expression operand = operands[i];
-      Expression nextOperand = operands[i + 1];
-      SourceRange inclusiveGap =
-          SourceRangeFactory.rangeEndStart(operand, nextOperand).getMoveEnd(1);
-      // add operand, if already entered range
-      if (entered) {
-        subOperands.add(operand);
-        // may be last operand in range
-        if (range.endsIn(inclusiveGap)) {
-          exited = true;
-        }
-      } else {
-        // may be first operand in range
-        if (range.startsIn(inclusiveGap)) {
-          entered = true;
-        }
-      }
-    }
-    // check if last operand is in range
-    Expression lastGroupMember = operands[operands.length - 1];
-    if (range.end == lastGroupMember.end) {
-      subOperands.add(lastGroupMember);
-      exited = true;
-    }
-    // we expect that range covers only given operands
-    if (!exited) {
-      return [];
-    }
-    // done
-    return subOperands;
-  }
-
-  /**
-   * @return all operands of the given [BinaryExpression] and its children with the same
-   *         operator.
-   */
-  static List<Expression> _getOperandsInOrderFor(BinaryExpression groupRoot) {
-    List<Expression> operands = [];
-    TokenType groupOperatorType = groupRoot.operator.type;
-    groupRoot.accept(
-        new GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor(
-            groupOperatorType, operands));
-    return operands;
-  }
-
-  /**
-   * @return all variants of names by removing leading words by one.
-   */
-  static List<String> _getVariableNameSuggestions(String name) {
-    List<String> result = [];
-    List<String> parts =
-        name.split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])");
-    for (int i = 0; i < parts.length; i++) {
-      String suggestion =
-          "${parts[i].toLowerCase()}${StringUtils.join(parts, "", i + 1, parts.length)}";
-      result.add(suggestion);
-    }
-    return result;
-  }
-
-  final CompilationUnit unit;
-
-  LibraryElement _library;
-
-  String _buffer;
-
-  String _endOfLine;
-
-  CorrectionUtils(this.unit) {
-    CompilationUnitElement element = unit.element;
-    this._library = element.library;
-    this._buffer = getSourceContent(element.context, element.source);
-  }
-
-  /**
-   * @return the [AstNode] that encloses the given offset.
-   */
-  AstNode findNode(int offset) => new NodeLocator(offset).searchWithin(unit);
-
-  /**
-   * TODO(scheglov) replace with nodes once there will be [CompilationUnit.comments].
-   *
-   * @return the [SourceRange]s of all comments in [CompilationUnit].
-   */
-  List<SourceRange> get commentRanges {
-    List<SourceRange> ranges = [];
-    Token token = unit.beginToken;
-    while (token != null && token.type != TokenType.EOF) {
-      Token commentToken = token.precedingComments;
-      while (commentToken != null) {
-        ranges.add(SourceRangeFactory.rangeToken(commentToken));
-        commentToken = commentToken.next;
-      }
-      token = token.next;
-    }
-    return ranges;
-  }
-
-  /**
-   * @return the EOL to use for this [CompilationUnit].
-   */
-  String get endOfLine {
-    if (_endOfLine == null) {
-      if (_buffer.contains("\r\n")) {
-        _endOfLine = "\r\n";
-      } else {
-        _endOfLine = "\n";
-      }
-    }
-    return _endOfLine;
-  }
-
-  /**
-   * @return the default indentation with given level.
-   */
-  String getIndent(int level) => StringUtils.repeat("  ", level);
-
-  /**
-   * @return the source of the given [SourceRange] with indentation changed from "oldIndent"
-   *         to "newIndent", keeping indentation of the lines relative to each other.
-   */
-  String getIndentSource(
-      SourceRange range, String oldIndent, String newIndent) {
-    String oldSource = getText3(range);
-    return getIndentSource3(oldSource, oldIndent, newIndent);
-  }
-
-  /**
-   * Indents given source left or right.
-   *
-   * @return the source with changed indentation.
-   */
-  String getIndentSource2(String source, bool right) {
-    StringBuffer buffer = new StringBuffer();
-    String indent = getIndent(1);
-    String eol = endOfLine;
-    List<String> lines =
-        StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
-    for (int i = 0; i < lines.length; i++) {
-      String line = lines[i];
-      // last line, stop if empty
-      if (i == lines.length - 1 && StringUtils.isEmpty(line)) {
-        break;
-      }
-      // update line
-      if (right) {
-        line = "${indent}${line}";
-      } else {
-        line = StringUtils.removeStart(line, indent);
-      }
-      // append line
-      buffer.write(line);
-      buffer.write(eol);
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * @return the source with indentation changed from "oldIndent" to "newIndent", keeping
-   *         indentation of the lines relative to each other.
-   */
-  String getIndentSource3(String source, String oldIndent, String newIndent) {
-    // prepare STRING token ranges
-    List<SourceRange> lineRanges = [];
-    for (Token token in TokenUtils.getTokens(source)) {
-      if (token.type == TokenType.STRING) {
-        lineRanges.add(SourceRangeFactory.rangeToken(token));
-      }
-    }
-    // re-indent lines
-    StringBuffer buffer = new StringBuffer();
-    String eol = endOfLine;
-    List<String> lines =
-        StringUtils.splitByWholeSeparatorPreserveAllTokens(source, eol);
-    int lineOffset = 0;
-    for (int i = 0; i < lines.length; i++) {
-      String line = lines[i];
-      // last line, stop if empty
-      if (i == lines.length - 1 && StringUtils.isEmpty(line)) {
-        break;
-      }
-      // check if "offset" is in one of the String ranges
-      bool inString = false;
-      for (SourceRange lineRange in lineRanges) {
-        if (lineOffset > lineRange.offset && lineOffset < lineRange.end) {
-          inString = true;
-        }
-        if (lineOffset > lineRange.end) {
-          break;
-        }
-      }
-      lineOffset += line.length + eol.length;
-      // update line indent
-      if (!inString) {
-        line = "${newIndent}${StringUtils.removeStart(line, oldIndent)}";
-      }
-      // append line
-      buffer.write(line);
-      buffer.write(eol);
-    }
-    return buffer.toString();
-  }
-
-  /**
-   * @return [InsertDesc], description where to insert new library-related directive.
-   */
-  CorrectionUtils_InsertDesc get insertDescImport {
-    // analyze directives
-    Directive prevDirective = null;
-    for (Directive directive in unit.directives) {
-      if (directive is LibraryDirective ||
-          directive is ImportDirective ||
-          directive is ExportDirective) {
-        prevDirective = directive;
-      }
-    }
-    // insert after last library-related directive
-    if (prevDirective != null) {
-      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
-      result.offset = prevDirective.end;
-      String eol = endOfLine;
-      if (prevDirective is LibraryDirective) {
-        result.prefix = "${eol}${eol}";
-      } else {
-        result.prefix = eol;
-      }
-      return result;
-    }
-    // no directives, use "top" location
-    return insertDescTop;
-  }
-
-  /**
-   * @return [InsertDesc], description where to insert new 'part 'directive.
-   */
-  CorrectionUtils_InsertDesc get insertDescPart {
-    // analyze directives
-    Directive prevDirective = null;
-    for (Directive directive in unit.directives) {
-      prevDirective = directive;
-    }
-    // insert after last directive
-    if (prevDirective != null) {
-      CorrectionUtils_InsertDesc result = new CorrectionUtils_InsertDesc();
-      result.offset = prevDirective.end;
-      String eol = endOfLine;
-      if (prevDirective is PartDirective) {
-        result.prefix = eol;
-      } else {
-        result.prefix = "${eol}${eol}";
-      }
-      return result;
-    }
-    // no directives, use "top" location
-    return insertDescTop;
-  }
-
-  /**
-   * @return [InsertDesc], description where to insert new directive or top-level declaration
-   *         at the top of file.
-   */
-  CorrectionUtils_InsertDesc get insertDescTop {
-    // skip leading line comments
-    int offset = 0;
-    bool insertEmptyLineBefore = false;
-    bool insertEmptyLineAfter = false;
-    String source = text;
-    // skip hash-bang
-    if (offset < source.length - 2) {
-      String linePrefix = getText2(offset, 2);
-      if (linePrefix == "#!") {
-        insertEmptyLineBefore = true;
-        offset = getLineNext(offset);
-        // skip empty lines to first line comment
-        int emptyOffset = offset;
-        while (emptyOffset < source.length - 2) {
-          int nextLineOffset = getLineNext(emptyOffset);
-          String line = source.substring(emptyOffset, nextLineOffset);
-          if (line.trim().isEmpty) {
-            emptyOffset = nextLineOffset;
-            continue;
-          } else if (line.startsWith("//")) {
-            offset = emptyOffset;
-            break;
-          } else {
-            break;
-          }
-        }
-      }
-    }
-    // skip line comments
-    while (offset < source.length - 2) {
-      String linePrefix = getText2(offset, 2);
-      if (linePrefix == "//") {
-        insertEmptyLineBefore = true;
-        offset = getLineNext(offset);
-      } else {
-        break;
-      }
-    }
-    // determine if empty line is required after
-    int nextLineOffset = getLineNext(offset);
-    String insertLine = source.substring(offset, nextLineOffset);
-    if (!insertLine.trim().isEmpty) {
-      insertEmptyLineAfter = true;
-    }
-    // fill InsertDesc
-    CorrectionUtils_InsertDesc desc = new CorrectionUtils_InsertDesc();
-    desc.offset = offset;
-    if (insertEmptyLineBefore) {
-      desc.prefix = endOfLine;
-    }
-    if (insertEmptyLineAfter) {
-      desc.suffix = endOfLine;
-    }
-    return desc;
-  }
-
-  /**
-   * Skips whitespace characters and single EOL on the right from the given position. If from
-   * statement or method end, then this is in the most cases start of the next line.
-   */
-  int getLineContentEnd(int index) {
-    int length = _buffer.length;
-    // skip whitespace characters
-    while (index < length) {
-      int c = _buffer.codeUnitAt(index);
-      if (!Character.isWhitespace(c) || c == 0xD || c == 0xA) {
-        break;
-      }
-      index++;
-    }
-    // skip single \r
-    if (index < length && _buffer.codeUnitAt(index) == 0xD) {
-      index++;
-    }
-    // skip single \n
-    if (index < length && _buffer.codeUnitAt(index) == 0xA) {
-      index++;
-    }
-    // done
-    return index;
-  }
-
-  /**
-   * @return the index of the last space or tab on the left from the given one, if from statement or
-   *         method start, then this is in most cases start of the line.
-   */
-  int getLineContentStart(int index) {
-    while (index > 0) {
-      int c = _buffer.codeUnitAt(index - 1);
-      if (c != 0x20 && c != 0x9) {
-        break;
-      }
-      index--;
-    }
-    return index;
-  }
-
-  /**
-   * @return the start index of the next line after the line which contains given index.
-   */
-  int getLineNext(int index) {
-    int length = _buffer.length;
-    // skip to the end of the line
-    while (index < length) {
-      int c = _buffer.codeUnitAt(index);
-      if (c == 0xD || c == 0xA) {
-        break;
-      }
-      index++;
-    }
-    // skip single \r
-    if (index < length && _buffer.codeUnitAt(index) == 0xD) {
-      index++;
-    }
-    // skip single \n
-    if (index < length && _buffer.codeUnitAt(index) == 0xA) {
-      index++;
-    }
-    // done
-    return index;
-  }
-
-  /**
-   * @return the whitespace prefix of the line which contains given offset.
-   */
-  String getLinePrefix(int index) {
-    int lineStart = getLineThis(index);
-    int length = _buffer.length;
-    int lineNonWhitespace = lineStart;
-    while (lineNonWhitespace < length) {
-      int c = _buffer.codeUnitAt(lineNonWhitespace);
-      if (c == 0xD || c == 0xA) {
-        break;
-      }
-      if (!Character.isWhitespace(c)) {
-        break;
-      }
-      lineNonWhitespace++;
-    }
-    return getText2(lineStart, lineNonWhitespace - lineStart);
-  }
-
-  /**
-   * @return the [getLinesRange] for given [Statement]s.
-   */
-  SourceRange getLinesRange(List<Statement> statements) {
-    SourceRange range = SourceRangeFactory.rangeNodes(statements);
-    return getLinesRange2(range);
-  }
-
-  /**
-   * @return the [SourceRange] which starts at the start of the line of "offset" and ends at
-   *         the start of the next line after "end" of the given [SourceRange], i.e. basically
-   *         complete lines of the source for given [SourceRange].
-   */
-  SourceRange getLinesRange2(SourceRange range) {
-    // start
-    int startOffset = range.offset;
-    int startLineOffset = getLineContentStart(startOffset);
-    // end
-    int endOffset = range.end;
-    int afterEndLineOffset = getLineContentEnd(endOffset);
-    // range
-    return SourceRangeFactory.rangeStartEnd(
-        startLineOffset, afterEndLineOffset);
-  }
-
-  /**
-   * @return the [getLinesRange] for given [Statement]s.
-   */
-  SourceRange getLinesRange3(List<Statement> statements) => getLinesRange([]);
-
-  /**
-   * @return 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;
-  }
-
-  /**
-   * @return the line prefix consisting of spaces and tabs on the left from the given
-   *         [AstNode].
-   */
-  String getNodePrefix(AstNode node) {
-    int offset = node.offset;
-    // function literal is special, it uses offset of enclosing line
-    if (node is FunctionExpression) {
-      return getLinePrefix(offset);
-    }
-    // use just prefix directly before node
-    return getPrefix(offset);
-  }
-
-  /**
-   * @return the index of the first non-whitespace character after given index.
-   */
-  int getNonWhitespaceForward(int index) {
-    int length = _buffer.length;
-    // skip whitespace characters
-    while (index < length) {
-      int c = _buffer.codeUnitAt(index);
-      if (!Character.isWhitespace(c)) {
-        break;
-      }
-      index++;
-    }
-    // done
-    return index;
-  }
-
-  /**
-   * @return the source for the parameter with the given type and name.
-   */
-  String getParameterSource(DartType type, String name) {
-    // no type
-    if (type == null || type.isDynamic) {
-      return name;
-    }
-    // function type
-    if (type is FunctionType) {
-      FunctionType functionType = type;
-      StringBuffer buffer = new StringBuffer();
-      // return type
-      DartType returnType = functionType.returnType;
-      if (returnType != null && !returnType.isDynamic) {
-        buffer.write(getTypeSource2(returnType));
-        buffer.writeCharCode(0x20);
-      }
-      // parameter name
-      buffer.write(name);
-      // parameters
-      buffer.writeCharCode(0x28);
-      List<ParameterElement> fParameters = functionType.parameters;
-      for (int i = 0; i < fParameters.length; i++) {
-        ParameterElement fParameter = fParameters[i];
-        if (i != 0) {
-          buffer.write(", ");
-        }
-        buffer.write(getParameterSource(fParameter.type, fParameter.name));
-      }
-      buffer.writeCharCode(0x29);
-      // done
-      return buffer.toString();
-    }
-    // simple type
-    return "${getTypeSource2(type)} ${name}";
-  }
-
-  /**
-   * @return the line prefix consisting of spaces and tabs on the left from the given offset.
-   */
-  String getPrefix(int endIndex) {
-    int startIndex = getLineContentStart(endIndex);
-    return _buffer.substring(startIndex, endIndex);
-  }
-
-  /**
-   * @return the full text of unit.
-   */
-  String get text => _buffer;
-
-  /**
-   * @return the given range of text from unit.
-   */
-  String getText(AstNode node) => getText2(node.offset, node.length);
-
-  /**
-   * @return the given range of text from unit.
-   */
-  String getText2(int offset, int length) =>
-      _buffer.substring(offset, offset + length);
-
-  /**
-   * @return the given range of text from unit.
-   */
-  String getText3(SourceRange range) => getText2(range.offset, range.length);
-
-  /**
-   * @return the actual type source of the given [Expression], may be `null` if can not
-   *         be resolved, should be treated as <code>Dynamic</code>.
-   */
-  String getTypeSource(Expression expression) {
-    if (expression == null) {
-      return null;
-    }
-    DartType type = expression.bestType;
-    String typeSource = getTypeSource2(type);
-    if ("dynamic" == typeSource) {
-      return null;
-    }
-    return typeSource;
-  }
-
-  /**
-   * @return the source to reference the given [Type] in this [CompilationUnit].
-   */
-  String getTypeSource2(DartType type) {
-    StringBuffer buffer = new StringBuffer();
-    // prepare element
-    Element element = type.element;
-    if (element == null) {
-      String source = type.toString();
-      source = StringUtils.remove(source, "<dynamic>");
-      source = StringUtils.remove(source, "<dynamic, dynamic>");
-      return source;
-    }
-    // append prefix
-    {
-      ImportElement imp = _getImportElement(element);
-      if (imp != null && imp.prefix != null) {
-        buffer.write(imp.prefix.displayName);
-        buffer.write(".");
-      }
-    }
-    // append simple name
-    String name = element.displayName;
-    buffer.write(name);
-    // may be type arguments
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      List<DartType> arguments = interfaceType.typeArguments;
-      // check if has arguments
-      bool hasArguments = false;
-      for (DartType argument in arguments) {
-        if (!argument.isDynamic) {
-          hasArguments = true;
-          break;
-        }
-      }
-      // append type arguments
-      if (hasArguments) {
-        buffer.write("<");
-        for (int i = 0; i < arguments.length; i++) {
-          DartType argument = arguments[i];
-          if (i != 0) {
-            buffer.write(", ");
-          }
-          buffer.write(getTypeSource2(argument));
-        }
-        buffer.write(">");
-      }
-    }
-    // done
-    return buffer.toString();
-  }
-
-  /**
-   * @return <code>true</code> if selection range contains only whitespace.
-   */
-  bool isJustWhitespace(SourceRange range) =>
-      getText3(range).trim().length == 0;
-
-  /**
-   * @return <code>true</code> if selection range contains only whitespace or comments
-   */
-  bool isJustWhitespaceOrComment(SourceRange range) {
-    String trimmedText = getText3(range).trim();
-    // may be whitespace
-    if (trimmedText.isEmpty) {
-      return true;
-    }
-    // may be comment
-    return TokenUtils.getTokens(trimmedText).isEmpty;
-  }
-
-  /**
-   * @return <code>true</code> if "selection" covers "node" and there are any non-whitespace tokens
-   *         between "selection" and "node" start/end.
-   */
-  bool selectionIncludesNonWhitespaceOutsideNode(
-          SourceRange selection, AstNode node) =>
-      _selectionIncludesNonWhitespaceOutsideRange(
-          selection, SourceRangeFactory.rangeNode(node));
-
-  /**
-   * @return <code>true</code> if given range of [BinaryExpression] can be extracted.
-   */
-  bool validateBinaryExpressionRange(
-      BinaryExpression binaryExpression, SourceRange range) {
-    // only parts of associative expression are safe to extract
-    if (!binaryExpression.operator.type.isAssociativeOperator) {
-      return false;
-    }
-    // prepare selected operands
-    List<Expression> operands = _getOperandsInOrderFor(binaryExpression);
-    List<Expression> subOperands = _getOperandsForSourceRange(operands, range);
-    // if empty, then something wrong with selection
-    if (subOperands.isEmpty) {
-      return false;
-    }
-    // may be some punctuation included into selection - operators, braces, etc
-    if (_selectionIncludesNonWhitespaceOutsideOperands(range, subOperands)) {
-      return false;
-    }
-    // OK
-    return true;
-  }
-
-  /**
-   * @return the [ImportElement] used to import given [Element] into [library].
-   *         May be `null` if was not imported, i.e. declared in the same library.
-   */
-  ImportElement _getImportElement(Element element) {
-    for (ImportElement imp in _library.imports) {
-      Map<String, Element> definedNames = getImportNamespace(imp);
-      if (definedNames.containsValue(element)) {
-        return imp;
-      }
-    }
-    return null;
-  }
-
-  bool _selectionIncludesNonWhitespaceOutsideOperands(
-          SourceRange selection, List<Expression> operands) =>
-      _selectionIncludesNonWhitespaceOutsideRange(
-          selection, SourceRangeFactory.rangeNodes(operands));
-
-  /**
-   * @return <code>true</code> if "selection" covers "range" and there are any non-whitespace tokens
-   *         between "selection" and "range" start/end.
-   */
-  bool _selectionIncludesNonWhitespaceOutsideRange(
-      SourceRange selection, SourceRange range) {
-    // selection should cover range
-    if (!selection.covers(range)) {
-      return false;
-    }
-    // non-whitespace between selection start and range start
-    if (!isJustWhitespaceOrComment(
-        SourceRangeFactory.rangeStartStart(selection, range))) {
-      return true;
-    }
-    // non-whitespace after range
-    if (!isJustWhitespaceOrComment(
-        SourceRangeFactory.rangeEndEnd(range, selection))) {
-      return true;
-    }
-    // only whitespace in selection around range
-    return false;
-  }
-}
-
-/**
- * Describes where to insert new directive or top-level declaration.
- */
-class CorrectionUtils_InsertDesc {
-  int offset = 0;
-
-  String prefix = "";
-
-  String suffix = "";
-}
-
-class GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor
-    extends GeneralizingAstVisitor<Object> {
-  TokenType groupOperatorType;
-
-  List<Expression> operands;
-
-  GeneralizingAstVisitor_CorrectionUtils_getOperandsInOrderFor(
-      this.groupOperatorType, this.operands)
-      : super();
-
-  @override
-  Object visitExpression(Expression node) {
-    if (node is BinaryExpression && node.operator.type == groupOperatorType) {
-      return super.visitNode(node);
-    }
-    operands.add(node);
-    return null;
-  }
-}
-
-class GeneralizingElementVisitor_CorrectionUtils_getChildren
-    extends GeneralizingElementVisitor<Object> {
-  Element parent;
-
-  String name;
-
-  List<Element> children;
-
-  GeneralizingElementVisitor_CorrectionUtils_getChildren(
-      this.parent, this.name, this.children)
-      : super();
-
-  @override
-  Object visitElement(Element element) {
-    if (identical(element, parent)) {
-      super.visitElement(element);
-    } else if (name == null || CorrectionUtils.hasDisplayName(element, name)) {
-      children.add(element);
-    }
-    return null;
-  }
-}
-
-class GeneralizingElementVisitor_HierarchyUtils_getDirectMembers
-    extends GeneralizingElementVisitor<Object> {
-  ClassElement clazz;
-
-  bool includeSynthetic = false;
-
-  List<Element> members;
-
-  GeneralizingElementVisitor_HierarchyUtils_getDirectMembers(
-      this.clazz, this.includeSynthetic, this.members)
-      : super();
-
-  @override
-  Object visitElement(Element element) {
-    if (identical(element, clazz)) {
-      return super.visitElement(element);
-    }
-    if (!includeSynthetic && element.isSynthetic) {
-      return null;
-    }
-    if (element is ConstructorElement) {
-      return null;
-    }
-    if (element is ExecutableElement) {
-      members.add(element);
-    }
-    if (element is FieldElement) {
-      members.add(element);
-    }
-    return null;
-  }
-}
-
-class NameOccurrencesFinder extends RecursiveAstVisitor<Object> {
-  static Iterable<AstNode> findIn(SimpleIdentifier ident, AstNode root) {
-    if (ident == null || ident.bestElement == null) {
-      return new Set<AstNode>();
-    }
-    NameOccurrencesFinder finder = new NameOccurrencesFinder(ident.bestElement);
-    root.accept(finder);
-    return finder.matches;
-  }
-
-  Element _target;
-
-  Element _target2;
-
-  Element _target3;
-
-  Element _target4;
-
-  Set<AstNode> _matches;
-
-  NameOccurrencesFinder(Element source) {
-    this._target = source;
-    while (true) {
-      if (source.kind == ElementKind.GETTER ||
-          source.kind == ElementKind.SETTER) {
-        PropertyAccessorElement accessorElem =
-            source as PropertyAccessorElement;
-        this._target2 = accessorElem.variable;
-        if (source is Member) {
-          Member member = source;
-          this._target4 = member.baseElement;
-        }
-        if (this._target2 is Member) {
-          Member member = source as Member;
-          this._target3 = member.baseElement;
-        }
-      } else if (source.kind == ElementKind.FIELD ||
-          source.kind == ElementKind.TOP_LEVEL_VARIABLE) {
-        PropertyInducingElement propertyElem =
-            source as PropertyInducingElement;
-        this._target2 = propertyElem.getter;
-        this._target3 = propertyElem.setter;
-      } else if (source.kind == ElementKind.METHOD) {
-        if (source is Member) {
-          Member member = source;
-          this._target4 = member.baseElement;
-        }
-      } else if (source.kind == ElementKind.PARAMETER) {
-        ParameterElement param = source as ParameterElement;
-        if (param.isInitializingFormal) {
-          FieldFormalParameterElement fieldInit =
-              param as FieldFormalParameterElement;
-          this._target2 = fieldInit.field;
-        }
-      } else {}
-      break;
-    }
-    if (_target2 == null) {
-      _target2 = _target;
-    }
-    if (_target3 == null) {
-      _target3 = _target;
-    }
-    if (_target4 == null) {
-      _target4 = _target;
-    }
-    this._matches = new Set<AstNode>();
-  }
-
-  Iterable<AstNode> get matches => _matches;
-
-  @override
-  Object visitSimpleIdentifier(SimpleIdentifier node) {
-    Element element = node.bestElement;
-    if (element == null) {
-      return null;
-    }
-    _match(element, node);
-    if (element is Member) {
-      Member member = element;
-      _match(member.baseElement, node);
-    }
-    while (true) {
-      if (element.kind == ElementKind.GETTER ||
-          element.kind == ElementKind.SETTER) {
-        PropertyAccessorElement accessorElem =
-            element as PropertyAccessorElement;
-        _match(accessorElem.variable, node);
-      } else if (element.kind == ElementKind.FIELD ||
-          element.kind == ElementKind.TOP_LEVEL_VARIABLE) {
-        PropertyInducingElement propertyElem =
-            element as PropertyInducingElement;
-        _match(propertyElem.getter, node);
-        _match(propertyElem.setter, node);
-      } else if (element.kind == ElementKind.PARAMETER) {
-        ParameterElement param = element as ParameterElement;
-        if (param.isInitializingFormal) {
-          FieldFormalParameterElement fieldInit =
-              param as FieldFormalParameterElement;
-          _match(fieldInit.field, node);
-        }
-      } else {}
-      break;
-    }
-    return null;
-  }
-
-  void _match(Element element, AstNode node) {
-    if (identical(_target, element) ||
-        identical(_target2, element) ||
-        identical(_target3, element) ||
-        identical(_target4, element)) {
-      _matches.add(node);
-    }
-  }
-}
-
-/**
- * Utilities to work with [Token]s.
- */
-class TokenUtils {
-  /**
-   * @return the first [KeywordToken] with given [Keyword], may be <code>null</code> if
-   *         not found.
-   */
-  static KeywordToken findKeywordToken(List<Token> tokens, Keyword keyword) {
-    for (Token token in tokens) {
-      if (token is KeywordToken) {
-        KeywordToken keywordToken = token;
-        if (keywordToken.keyword == keyword) {
-          return keywordToken;
-        }
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return the first [Token] with given [TokenType], may be <code>null</code> if not
-   *         found.
-   */
-  static Token findToken(List<Token> tokens, TokenType type) {
-    for (Token token in tokens) {
-      if (token.type == type) {
-        return token;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * @return [Token]s of the given Dart source, not <code>null</code>, may be empty if no
-   *         tokens or some exception happens.
-   */
-  static List<Token> getTokens(String s) {
-    try {
-      List<Token> tokens = [];
-      Scanner scanner = new Scanner(null, new CharSequenceReader(s), null);
-      Token token = scanner.tokenize();
-      while (token.type != TokenType.EOF) {
-        tokens.add(token);
-        token = token.next;
-      }
-      return tokens;
-    } catch (e) {
-      return [];
-    }
-  }
-
-  /**
-   * @return <code>true</code> if given [Token]s contain only single [Token] with given
-   *         [TokenType].
-   */
-  static bool hasOnly(List<Token> tokens, TokenType type) =>
-      tokens.length == 1 && tokens[0].type == type;
-}
diff --git a/pkg/analysis_server/lib/src/services/index/index.dart b/pkg/analysis_server/lib/src/services/index/index.dart
index 374ccaf..41b5a0a 100644
--- a/pkg/analysis_server/lib/src/services/index/index.dart
+++ b/pkg/analysis_server/lib/src/services/index/index.dart
@@ -78,8 +78,6 @@
  * a concrete kind of this name - field, method or something else.
  */
 class IndexableName implements IndexableObject {
-  // TODO(brianwilkerson) Replace NameElement with this class. This will require
-  // generalizing the search engine to use IndexableObject rather than Element.
   /**
    * The name to be indexed.
    */
@@ -105,6 +103,10 @@
   Source get source => null;
 
   @override
+  bool operator ==(Object object) =>
+      object is IndexableName && object.name == name;
+
+  @override
   String toString() => name;
 }
 
@@ -320,20 +322,6 @@
 }
 
 /**
- * An [Element] which is used to index references to the name without specifying
- * a concrete kind of this name - field, method or something else.
- */
-class NameElement extends ElementImpl {
-  NameElement(String name) : super(name, -1);
-
-  @override
-  ElementKind get kind => ElementKind.NAME;
-
-  @override
-  accept(ElementVisitor visitor) => null;
-}
-
-/**
  * Relationship between an element and a location. Relationships are identified
  * by a globally unique identifier.
  */
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 53ef464..26397fb 100644
--- a/pkg/analysis_server/lib/src/services/index/index_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_contributor.dart
@@ -35,7 +35,7 @@
     return;
   }
   // about to index
-  bool mayIndex = store.aboutToIndexDart(context, unitElement);
+  bool mayIndex = store.aboutToIndex(context, unitElement);
   if (!mayIndex) {
     return;
   }
@@ -44,7 +44,7 @@
     unit.accept(new _IndexContributor(store));
     store.doneIndex();
   } catch (e) {
-    store.cancelIndexDart();
+    store.cancelIndex();
     rethrow;
   }
 }
@@ -54,22 +54,23 @@
  */
 void indexHtmlUnit(
     InternalIndexStore store, AnalysisContext context, ht.HtmlUnit unit) {
-  // check unit
-  if (unit == null) {
-    return;
-  }
-  // prepare unit element
-  HtmlElement unitElement = unit.element;
-  if (unitElement == null) {
-    return;
-  }
-  // about to index
-  bool mayIndex = store.aboutToIndexHtml(context, unitElement);
-  if (!mayIndex) {
-    return;
-  }
-  // do index
-  store.doneIndex();
+  // TODO(scheglov) remove or implement
+//  // check unit
+//  if (unit == null) {
+//    return;
+//  }
+//  // prepare unit element
+//  HtmlElement unitElement = unit.element;
+//  if (unitElement == null) {
+//    return;
+//  }
+//  // about to index
+//  bool mayIndex = store.aboutToIndexHtml(context, unitElement);
+//  if (!mayIndex) {
+//    return;
+//  }
+//  // do index
+//  store.doneIndex();
 }
 
 /**
@@ -127,7 +128,7 @@
    * Record the given relationship between the given [Element] and
    * [LocationImpl].
    */
-  void recordRelationship(
+  void recordRelationshipElement(
       Element element, RelationshipImpl relationship, LocationImpl location) {
     if (element != null && location != null) {
       _store.recordRelationship(
@@ -135,6 +136,17 @@
     }
   }
 
+  /**
+   * Record the given relationship between the given [IndexableObject] and
+   * [LocationImpl].
+   */
+  void recordRelationshipIndexable(IndexableObject indexable,
+      RelationshipImpl relationship, LocationImpl location) {
+    if (indexable != null && location != null) {
+      _store.recordRelationship(indexable, relationship, location);
+    }
+  }
+
   @override
   visitAssignmentExpression(AssignmentExpression node) {
     _recordOperatorReference(node.operator, node.bestElement);
@@ -162,7 +174,9 @@
           InterfaceType superType = element.supertype;
           if (superType != null) {
             ClassElement objectElement = superType.element;
-            recordRelationship(objectElement, IndexConstants.IS_EXTENDED_BY,
+            recordRelationshipElement(
+                objectElement,
+                IndexConstants.IS_EXTENDED_BY,
                 _createLocationForOffset(node.name.offset, 0));
           }
         }
@@ -254,7 +268,8 @@
     if (fieldName != null) {
       Element element = fieldName.staticElement;
       LocationImpl location = _createLocationForNode(fieldName);
-      recordRelationship(element, IndexConstants.IS_WRITTEN_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_WRITTEN_BY, location);
     }
     // index expression
     if (expression != null) {
@@ -282,7 +297,8 @@
       location = _createLocationForOffset(start, 0);
     }
     // record relationship
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    recordRelationshipElement(
+        element, IndexConstants.IS_REFERENCED_BY, location);
     super.visitConstructorName(node);
   }
 
@@ -366,7 +382,8 @@
       Token operator = node.leftBracket;
       LocationImpl location =
           _createLocationForToken(operator, element != null);
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_INVOKED_BY, location);
     }
     super.visitIndexExpression(node);
   }
@@ -386,18 +403,17 @@
   visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
     LocationImpl location = _createLocationForNode(name);
+    // name invocation
+    recordRelationshipIndexable(
+        new IndexableName(name.name), IndexConstants.IS_INVOKED_BY, location);
     // element invocation
     Element element = name.bestElement;
     if (element is MethodElement ||
         element is PropertyAccessorElement ||
         element is FunctionElement ||
         element is VariableElement) {
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
-    }
-    // name invocation
-    {
-      recordRelationship(
-          new NameElement(name.name), IndexConstants.IS_INVOKED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_INVOKED_BY, location);
     }
     _recordImportElementReferenceWithoutPrefix(name);
     super.visitMethodInvocation(node);
@@ -407,14 +423,16 @@
   visitPartDirective(PartDirective node) {
     Element element = node.element;
     LocationImpl location = _createLocationForNode(node.uri);
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    recordRelationshipElement(
+        element, IndexConstants.IS_REFERENCED_BY, location);
     super.visitPartDirective(node);
   }
 
   @override
   visitPartOfDirective(PartOfDirective node) {
     LocationImpl location = _createLocationForNode(node.libraryName);
-    recordRelationship(node.element, IndexConstants.IS_REFERENCED_BY, location);
+    recordRelationshipElement(
+        node.element, IndexConstants.IS_REFERENCED_BY, location);
   }
 
   @override
@@ -441,21 +459,22 @@
       int start = node.thisKeyword.end;
       location = _createLocationForOffset(start, 0);
     }
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    recordRelationshipElement(
+        element, IndexConstants.IS_REFERENCED_BY, location);
     super.visitRedirectingConstructorInvocation(node);
   }
 
   @override
   visitSimpleIdentifier(SimpleIdentifier node) {
-    NameElement nameElement = new NameElement(node.name);
+    IndexableName indexableName = new IndexableName(node.name);
     LocationImpl location = _createLocationForNode(node);
     if (location == null) {
       return;
     }
     // name in declaration
     if (node.inDeclarationContext()) {
-      recordRelationship(
-          nameElement, IndexConstants.NAME_IS_DEFINED_BY, location);
+      recordRelationshipIndexable(
+          indexableName, IndexConstants.NAME_IS_DEFINED_BY, location);
       return;
     }
     // prepare information
@@ -470,12 +489,14 @@
       bool inGetterContext = node.inGetterContext();
       bool inSetterContext = node.inSetterContext();
       if (inGetterContext && inSetterContext) {
-        recordRelationship(
-            nameElement, IndexConstants.IS_READ_WRITTEN_BY, location);
+        recordRelationshipIndexable(
+            indexableName, IndexConstants.IS_READ_WRITTEN_BY, location);
       } else if (inGetterContext) {
-        recordRelationship(nameElement, IndexConstants.IS_READ_BY, location);
+        recordRelationshipIndexable(
+            indexableName, IndexConstants.IS_READ_BY, location);
       } else if (inSetterContext) {
-        recordRelationship(nameElement, IndexConstants.IS_WRITTEN_BY, location);
+        recordRelationshipIndexable(
+            indexableName, IndexConstants.IS_WRITTEN_BY, location);
       }
     }
     // this.field parameter
@@ -483,7 +504,7 @@
       RelationshipImpl relationship = peekElement().element == element
           ? IndexConstants.IS_WRITTEN_BY
           : IndexConstants.IS_REFERENCED_BY;
-      recordRelationship(element.field, relationship, location);
+      recordRelationshipElement(element.field, relationship, location);
       return;
     }
     // record specific relations
@@ -495,22 +516,26 @@
         element is PropertyAccessorElement ||
         element is PropertyInducingElement ||
         element is TypeParameterElement) {
-      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_REFERENCED_BY, location);
     } else if (element is PrefixElement) {
-      recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_REFERENCED_BY, location);
       _recordImportElementReferenceWithPrefix(node);
     } else if (element is ParameterElement || element is LocalVariableElement) {
       bool inGetterContext = node.inGetterContext();
       bool inSetterContext = node.inSetterContext();
       if (inGetterContext && inSetterContext) {
-        recordRelationship(
+        recordRelationshipElement(
             element, IndexConstants.IS_READ_WRITTEN_BY, location);
       } else if (inGetterContext) {
-        recordRelationship(element, IndexConstants.IS_READ_BY, location);
+        recordRelationshipElement(element, IndexConstants.IS_READ_BY, location);
       } else if (inSetterContext) {
-        recordRelationship(element, IndexConstants.IS_WRITTEN_BY, location);
+        recordRelationshipElement(
+            element, IndexConstants.IS_WRITTEN_BY, location);
       } else {
-        recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+        recordRelationshipElement(
+            element, IndexConstants.IS_REFERENCED_BY, location);
       }
     }
     _recordImportElementReferenceWithoutPrefix(node);
@@ -529,7 +554,8 @@
       int start = node.superKeyword.end;
       location = _createLocationForOffset(start, 0);
     }
-    recordRelationship(element, IndexConstants.IS_REFERENCED_BY, location);
+    recordRelationshipElement(
+        element, IndexConstants.IS_REFERENCED_BY, location);
     super.visitSuperConstructorInvocation(node);
   }
 
@@ -562,7 +588,8 @@
       SimpleIdentifier name = node.name;
       LocationImpl location = _createLocationForNode(name);
       location = _getLocationWithExpressionType(location, node.initializer);
-      recordRelationship(element, IndexConstants.NAME_IS_DEFINED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.NAME_IS_DEFINED_BY, location);
     }
     // visit
     enterScope(element);
@@ -689,7 +716,7 @@
         _libraryElement, null, element, _importElementsMap);
     if (importElement != null) {
       LocationImpl location = _createLocationForOffset(node.offset, 0);
-      recordRelationship(
+      recordRelationshipElement(
           importElement, IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -704,7 +731,7 @@
       int offset = prefixNode.offset;
       int length = info.periodEnd - offset;
       LocationImpl location = _createLocationForOffset(offset, length);
-      recordRelationship(
+      recordRelationshipElement(
           info.element, IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -716,7 +743,7 @@
   void _recordLibraryReference(UriBasedDirective node, LibraryElement library) {
     if (library != null) {
       LocationImpl location = _createLocationForNode(node.uri);
-      recordRelationship(library.definingCompilationUnit,
+      recordRelationshipElement(library.definingCompilationUnit,
           IndexConstants.IS_REFERENCED_BY, location);
     }
   }
@@ -739,12 +766,14 @@
       if (StringUtilities.endsWithChar(name, 0x3D) && name != "==") {
         name = name.substring(0, name.length - 1);
       }
-      Element nameElement = new NameElement(name);
-      recordRelationship(nameElement, IndexConstants.IS_INVOKED_BY, location);
+      IndexableName indexableName = new IndexableName(name);
+      recordRelationshipIndexable(
+          indexableName, IndexConstants.IS_INVOKED_BY, location);
     }
     // record element reference
     if (element != null) {
-      recordRelationship(element, IndexConstants.IS_INVOKED_BY, location);
+      recordRelationshipElement(
+          element, IndexConstants.IS_INVOKED_BY, location);
     }
   }
 
@@ -756,7 +785,7 @@
       Identifier superName = superNode.name;
       if (superName != null) {
         Element superElement = superName.staticElement;
-        recordRelationship(
+        recordRelationshipElement(
             superElement, relationship, _createLocationForNode(superNode));
       }
     }
@@ -771,7 +800,8 @@
       int offset = indexable.offset;
       int length = indexable.length;
       LocationImpl location = new LocationImpl(indexable, offset, length);
-      recordRelationship(_libraryElement, IndexConstants.DEFINES, location);
+      recordRelationshipElement(
+          _libraryElement, IndexConstants.DEFINES, location);
       _store.recordTopLevelDeclaration(element);
     }
   }
diff --git a/pkg/analysis_server/lib/src/services/index/index_store.dart b/pkg/analysis_server/lib/src/services/index/index_store.dart
index 858d0ac..2b8dc22 100644
--- a/pkg/analysis_server/lib/src/services/index/index_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/index_store.dart
@@ -20,48 +20,27 @@
   String get statistics;
 
   /**
-   * Notifies the index store that we are going to index an unit with the given
-   * [unitElement].
-   *
-   * If the unit is a part of a library, then all its locations are removed.
-   *
-   * If it is a defining compilation unit of a library, then index store also
-   * checks if some previously indexed parts of the library are not parts of the
-   * library anymore, and clears their information.
+   * Notifies the index store that we are going to index the given [object].
    *
    * [context] - the [AnalysisContext] in which unit being indexed.
-   * [unitElement] - the element of the unit being indexed.
+   * [object] - the object being indexed.
    *
-   * Returns `true` if the given [unitElement] may be indexed, or `false` if
+   * Returns `true` if the given [object] may be indexed, or `false` if
    * belongs to a disposed [AnalysisContext], is not resolved completely, etc.
    */
-  bool aboutToIndexDart(
-      AnalysisContext context, CompilationUnitElement unitElement);
+  bool aboutToIndex(AnalysisContext context, Object object);
 
   /**
-   * Notifies the index store that we are going to index an unit with the given
-   * [htmlElement].
-   *
-   * [context] - the [AnalysisContext] in which unit being indexed.
-   * [htmlElement] - the [HtmlElement] being indexed.
-   *
-   * Returns `true` if the given [htmlElement] may be indexed, or `false` if
-   * belongs to a disposed [AnalysisContext], is not resolved completely, etc.
-   */
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
-
-  /**
-   * Notifies the index store that there was an error during the current Dart
+   * Notifies the index store that there was an error during the current
    * indexing, and all the information recorded after the last
-   * [aboutToIndexDart] invocation must be discarded.
+   * [aboutToIndex] invocation must be discarded.
    */
-  void cancelIndexDart();
+  void cancelIndex();
 
   /**
-   * Notifies the index store that the current Dart or HTML unit indexing is
-   * done.
+   * Notifies the index store that the current object indexing is done.
    *
-   * If this method is not invoked after corresponding "aboutToIndex*"
+   * If this method is not invoked after corresponding [aboutToIndex]
    * invocation, all recorded information may be lost.
    */
   void doneIndex();
diff --git a/pkg/analysis_server/lib/src/services/index/local_index.dart b/pkg/analysis_server/lib/src/services/index/local_index.dart
index 887a003..80f3b18 100644
--- a/pkg/analysis_server/lib/src/services/index/local_index.dart
+++ b/pkg/analysis_server/lib/src/services/index/local_index.dart
@@ -29,7 +29,9 @@
   SplitIndexStore _store;
 
   LocalIndex(NodeManager nodeManager) {
-    _store = new SplitIndexStore(nodeManager);
+    // TODO(scheglov) get IndexObjectManager(s) as a parameter
+    _store = new SplitIndexStore(nodeManager,
+        <IndexObjectManager>[new DartUnitIndexObjectManager()]);
   }
 
   @override
diff --git a/pkg/analysis_server/lib/src/services/index/store/codec.dart b/pkg/analysis_server/lib/src/services/index/store/codec.dart
index 062eae6..36220aa 100644
--- a/pkg/analysis_server/lib/src/services/index/store/codec.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/codec.dart
@@ -84,15 +84,16 @@
     if (kind == null) {
       return null;
     } else if (kind is IndexableNameKind) {
-      return new IndexableElement(new NameElement(_stringCodec.decode(offset)));
+      String name = _stringCodec.decode(offset);
+      return new IndexableName(name);
     }
     return kind.decode(context, filePath, offset);
   }
 
   /**
-   * Returns the first component of the [element] id.
-   * In the most cases it is an encoding of the [element]'s file path.
-   * If the given [element] is not defined in a file, returns `-1`.
+   * Returns the first component of the [indexable] id.
+   * In the most cases it is an encoding of the [indexable]'s file path.
+   * If the given [indexable] is not defined in a file, returns `-1`.
    */
   int encode1(IndexableObject indexable) {
     Source source = indexable.source;
@@ -104,8 +105,8 @@
   }
 
   /**
-   * Returns the second component of the [element] id.
-   * In the most cases it is the [element]'s name offset.
+   * Returns the second component of the [indexable] id.
+   * In the most cases it is the [indexable]'s name offset.
    */
   int encode2(IndexableObject indexable) {
     if (indexable is IndexableName) {
@@ -120,15 +121,15 @@
   }
 
   /**
-   * Returns the third component of the [element] id.
-   * In the most cases it is the [element]'s kind.
+   * Returns the third component of the [indexable] id.
+   * In the most cases it is the [indexable]'s kind.
    */
   int encode3(IndexableObject indexable) {
     return indexable.kind.index;
   }
 
   /**
-   * Returns an integer that corresponds to the name of [element].
+   * Returns an integer that corresponds to the name of [indexable].
    */
   int encodeHash(IndexableObject indexable) {
     // TODO(brianwilkerson) Consider moving this to IndexableObjectKind so that
diff --git a/pkg/analysis_server/lib/src/services/index/store/split_store.dart b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
index 8d94d74..6e3956c 100644
--- a/pkg/analysis_server/lib/src/services/index/store/split_store.dart
+++ b/pkg/analysis_server/lib/src/services/index/store/split_store.dart
@@ -22,6 +22,185 @@
 import 'package:analyzer/src/generated/utilities_general.dart';
 
 /**
+ * The implementation of [IndexObjectManager] for indexing
+ * [CompilationUnitElement]s.
+ */
+class DartUnitIndexObjectManager extends IndexObjectManager {
+  /**
+   * The mapping of library [Source] to the [Source]s of part units.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  /**
+   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  @override
+  String aboutToIndex(AnalysisContext context, Object object) {
+    if (object is! CompilationUnitElement) {
+      return null;
+    }
+    CompilationUnitElement unitElement = object;
+    // validate unit
+    if (unitElement == null) {
+      return null;
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      return null;
+    }
+    CompilationUnitElement definingUnitElement =
+        libraryElement.definingCompilationUnit;
+    if (definingUnitElement == null) {
+      return null;
+    }
+    // prepare sources
+    Source library = definingUnitElement.source;
+    Source unit = unitElement.source;
+    // special handling for the defining library unit
+    if (unit == library) {
+      // prepare new parts
+      HashSet<Source> newParts = new HashSet<Source>();
+      for (CompilationUnitElement part in libraryElement.parts) {
+        newParts.add(part.source);
+      }
+      // prepare old parts
+      Map<Source, Set<Source>> libraryToUnits =
+          _contextToLibraryToUnits[context];
+      if (libraryToUnits == null) {
+        libraryToUnits = new HashMap<Source, Set<Source>>();
+        _contextToLibraryToUnits[context] = libraryToUnits;
+      }
+      Set<Source> oldParts = libraryToUnits[library];
+      // check if some parts are not in the library now
+      if (oldParts != null) {
+        Set<Source> noParts = oldParts.difference(newParts);
+        for (Source noPart in noParts) {
+          String nodeName = _getNodeName(library, noPart);
+          site.removeNodeByName(context, nodeName);
+          site.removeSource(library);
+          site.removeSource(noPart);
+        }
+      }
+      // remember new parts
+      libraryToUnits[library] = newParts;
+    }
+    // remember library/unit relations
+    _recordUnitInLibrary(context, library, unit);
+    _recordLibraryWithUnit(context, library, unit);
+    site.addSource(library);
+    site.addSource(unit);
+    // prepare node
+    String nodeName = _getNodeName(library, unit);
+    return nodeName;
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    _contextToLibraryToUnits.remove(context);
+    _contextToUnitToLibraries.remove(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      Set<Source> libraries = unitToLibraries.remove(source);
+      if (libraries != null) {
+        for (Source library in libraries) {
+          String nodeName = _getNodeName(library, source);
+          site.removeNodeByName(context, nodeName);
+          site.removeSource(library);
+          site.removeSource(source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      Set<Source> units = libraryToUnits.remove(source);
+      if (units != null) {
+        for (Source unit in units) {
+          String nodeName = _getNodeName(source, unit);
+          site.removeNodeByName(context, nodeName);
+          site.removeSource(source);
+          site.removeSource(unit);
+        }
+      }
+    }
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      List<Source> units = unitToLibraries.keys.toList();
+      for (Source source in units) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      List<Source> libraries = libraryToUnits.keys.toList();
+      for (Source source in libraries) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+  }
+
+  String _getNodeName(Source library, Source unit) {
+    String libraryName = library != null ? library.fullName : null;
+    String unitName = unit.fullName;
+    int libraryNameIndex = site.encodeString(libraryName);
+    int unitNameIndex = site.encodeString(unitName);
+    return 'DartUnitElement_${libraryNameIndex}_${unitNameIndex}.index';
+  }
+
+  void _recordLibraryWithUnit(
+      AnalysisContext context, Source library, Source unit) {
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits == null) {
+      libraryToUnits = new HashMap<Source, Set<Source>>();
+      _contextToLibraryToUnits[context] = libraryToUnits;
+    }
+    Set<Source> units = libraryToUnits[library];
+    if (units == null) {
+      units = new HashSet<Source>();
+      libraryToUnits[library] = units;
+    }
+    units.add(unit);
+  }
+
+  void _recordUnitInLibrary(
+      AnalysisContext context, Source library, Source unit) {
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries == null) {
+      unitToLibraries = new HashMap<Source, Set<Source>>();
+      _contextToUnitToLibraries[context] = unitToLibraries;
+    }
+    Set<Source> libraries = unitToLibraries[unit];
+    if (libraries == null) {
+      libraries = new HashSet<Source>();
+      unitToLibraries[unit] = libraries;
+    }
+    libraries.add(library);
+  }
+}
+
+/**
  * A manager for files content.
  */
 abstract class FileManager {
@@ -341,6 +520,36 @@
   }
 }
 
+/**
+ * [SplitIndexStore] uses instances of this class to manager index nodes.
+ */
+abstract class IndexObjectManager {
+  SplitIndexStoreSite site;
+
+  /**
+   * Notifies the manager that the given [object] is to be indexed.
+   * Returns the name of the index node to put information into.
+   */
+  String aboutToIndex(AnalysisContext context, Object object);
+
+  /**
+   * Notifies the manager that the given [context] is disposed.
+   */
+  void removeContext(AnalysisContext context);
+
+  /**
+   * Notifies the manager that the given [source] is no longer part of
+   * the given [context].
+   */
+  void removeSource(AnalysisContext context, Source source);
+
+  /**
+   * Notifies the manager that the sources described by the given [container]
+   * are no longer part of the given [context].
+   */
+  void removeSources(AnalysisContext context, SourceContainer container);
+}
+
 class InspectLocation {
   final String nodeName;
   final RelationshipImpl relationship;
@@ -526,9 +735,26 @@
  */
 class SplitIndexStore implements InternalIndexStore {
   /**
+   * The [NodeManager] to get/put [IndexNode]s.
+   */
+  final NodeManager _nodeManager;
+
+  final List<IndexObjectManager> _objectManagers;
+
+  /**
    * The [ContextCodec] to encode/decode [AnalysisContext]s.
    */
-  ContextCodec _contextCodec;
+  final ContextCodec _contextCodec;
+
+  /**
+   * The [ElementCodec] to encode/decode [Element]s.
+   */
+  final ElementCodec _elementCodec;
+
+  /**
+   * The [StringCodec] to encode/decode [String]s.
+   */
+  final StringCodec _stringCodec;
 
   /**
    * Information about top-level elements.
@@ -536,60 +762,35 @@
    *
    * Order of keys: contextId, nodeId.
    */
-  Map<int, Map<int, List<_TopElementData>>> _topDeclarations =
+  final Map<int, Map<int, List<_TopElementData>>> _topDeclarations =
       new Map<int, Map<int, List<_TopElementData>>>();
 
-  /**
-   * The mapping of library [Source] to the [Source]s of part units.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits =
-      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
-
-  /**
-   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
-   */
-  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries =
-      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
-
-  int _currentContextId = 0;
-
-  IndexNode _currentNode;
-
+  int _currentContextId;
   String _currentNodeName;
-
-  int _currentNodeNameId = 0;
-
-  /**
-   * The [ElementCodec] to encode/decode [Element]s.
-   */
-  ElementCodec _elementCodec;
+  int _currentNodeNameId;
+  IndexNode _currentNode;
 
   /**
    * A table mapping element names to the node names that may have relations with elements with
    * these names.
    */
-  Map<RelationshipImpl, IntToIntSetMap> _relToNameMap =
+  final Map<RelationshipImpl, IntToIntSetMap> _relToNameMap =
       new HashMap<RelationshipImpl, IntToIntSetMap>();
 
   /**
-   * The [NodeManager] to get/put [IndexNode]s.
-   */
-  final NodeManager _nodeManager;
-
-  /**
    * The set of known [Source]s.
    */
-  Set<Source> _sources = new HashSet<Source>();
+  final Set<Source> _sources = new HashSet<Source>();
 
-  /**
-   * The [StringCodec] to encode/decode [String]s.
-   */
-  StringCodec _stringCodec;
-
-  SplitIndexStore(this._nodeManager) {
-    this._contextCodec = _nodeManager.contextCodec;
-    this._elementCodec = _nodeManager.elementCodec;
-    this._stringCodec = _nodeManager.stringCodec;
+  SplitIndexStore(NodeManager _nodeManager, this._objectManagers)
+      : _nodeManager = _nodeManager,
+        _contextCodec = _nodeManager.contextCodec,
+        _elementCodec = _nodeManager.elementCodec,
+        _stringCodec = _nodeManager.stringCodec {
+    SplitIndexStoreSiteImpl site = new SplitIndexStoreSiteImpl(this);
+    for (IndexObjectManager manager in _objectManagers) {
+      manager.site = site;
+    }
   }
 
   @override
@@ -608,64 +809,22 @@
   }
 
   @override
-  bool aboutToIndexDart(
-      AnalysisContext context, CompilationUnitElement unitElement) {
-    // may be already disposed in other thread
+  bool aboutToIndex(AnalysisContext context, Object object) {
     if (context.isDisposed) {
       return false;
     }
-    // validate unit
-    if (unitElement == null) {
+    // try to find a node name
+    _currentNodeName = null;
+    for (IndexObjectManager manager in _objectManagers) {
+      _currentNodeName = manager.aboutToIndex(context, object);
+      if (_currentNodeName != null) {
+        break;
+      }
+    }
+    if (_currentNodeName == null) {
       return false;
     }
-    LibraryElement libraryElement = unitElement.library;
-    if (libraryElement == null) {
-      return false;
-    }
-    CompilationUnitElement definingUnitElement =
-        libraryElement.definingCompilationUnit;
-    if (definingUnitElement == null) {
-      return false;
-    }
-    // prepare sources
-    Source library = definingUnitElement.source;
-    Source unit = unitElement.source;
-    // special handling for the defining library unit
-    if (unit == library) {
-      // prepare new parts
-      HashSet<Source> newParts = new HashSet<Source>();
-      for (CompilationUnitElement part in libraryElement.parts) {
-        newParts.add(part.source);
-      }
-      // prepare old parts
-      Map<Source, Set<Source>> libraryToUnits =
-          _contextToLibraryToUnits[context];
-      if (libraryToUnits == null) {
-        libraryToUnits = new HashMap<Source, Set<Source>>();
-        _contextToLibraryToUnits[context] = libraryToUnits;
-      }
-      Set<Source> oldParts = libraryToUnits[library];
-      // check if some parts are not in the library now
-      if (oldParts != null) {
-        Set<Source> noParts = oldParts.difference(newParts);
-        for (Source noPart in noParts) {
-          _removeLocations(context, library, noPart);
-        }
-      }
-      // remember new parts
-      libraryToUnits[library] = newParts;
-    }
-    // remember library/unit relations
-    _recordUnitInLibrary(context, library, unit);
-    _recordLibraryWithUnit(context, library, unit);
-    _sources.add(library);
-    _sources.add(unit);
     // prepare node
-    String libraryName = library.fullName;
-    String unitName = unit.fullName;
-    int libraryNameIndex = _stringCodec.encode(libraryName);
-    int unitNameIndex = _stringCodec.encode(unitName);
-    _currentNodeName = '${libraryNameIndex}_${unitNameIndex}.index';
     _currentNodeNameId = _stringCodec.encode(_currentNodeName);
     _currentNode = _nodeManager.newNode(context);
     _currentContextId = _contextCodec.encode(context);
@@ -678,27 +837,7 @@
   }
 
   @override
-  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
-    // may be already disposed in other thread
-    if (context.isDisposed) {
-      return false;
-    }
-    // remove locations
-    Source source = htmlElement.source;
-    _removeLocations(context, null, source);
-    // remember library/unit relations
-    _recordUnitInLibrary(context, null, source);
-    // prepare node
-    String sourceName = source.fullName;
-    int sourceNameIndex = _stringCodec.encode(sourceName);
-    _currentNodeName = '${sourceNameIndex}.index';
-    _currentNodeNameId = _stringCodec.encode(_currentNodeName);
-    _currentNode = _nodeManager.newNode(context);
-    return true;
-  }
-
-  @override
-  void cancelIndexDart() {
+  void cancelIndex() {
     if (_currentNode != null) {
       // remove top-level information for the current node
       for (Map<int, dynamic> nodeRelations in _topDeclarations.values) {
@@ -875,8 +1014,9 @@
     // remove sources
     removeSources(context, null);
     // remove context information
-    _contextToLibraryToUnits.remove(context);
-    _contextToUnitToLibraries.remove(context);
+    for (IndexObjectManager manager in _objectManagers) {
+      manager.removeContext(context);
+    }
     _topDeclarations.remove(_contextCodec.encode(context));
     // remove context from codec
     _contextCodec.remove(context);
@@ -887,26 +1027,8 @@
     if (context == null) {
       return;
     }
-    // remove nodes for unit/library pairs
-    Map<Source, Set<Source>> unitToLibraries =
-        _contextToUnitToLibraries[context];
-    if (unitToLibraries != null) {
-      Set<Source> libraries = unitToLibraries.remove(source);
-      if (libraries != null) {
-        for (Source library in libraries) {
-          _removeLocations(context, library, source);
-        }
-      }
-    }
-    // remove nodes for library/unit pairs
-    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
-    if (libraryToUnits != null) {
-      Set<Source> units = libraryToUnits.remove(source);
-      if (units != null) {
-        for (Source unit in units) {
-          _removeLocations(context, source, unit);
-        }
-      }
+    for (IndexObjectManager manager in _objectManagers) {
+      manager.removeSource(context, source);
     }
   }
 
@@ -915,42 +1037,9 @@
     if (context == null) {
       return;
     }
-    // remove nodes for unit/library pairs
-    Map<Source, Set<Source>> unitToLibraries =
-        _contextToUnitToLibraries[context];
-    if (unitToLibraries != null) {
-      List<Source> units = new List<Source>.from(unitToLibraries.keys);
-      for (Source source in units) {
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
+    for (IndexObjectManager manager in _objectManagers) {
+      manager.removeSources(context, container);
     }
-    // remove nodes for library/unit pairs
-    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
-    if (libraryToUnits != null) {
-      List<Source> libraries = new List<Source>.from(libraryToUnits.keys);
-      for (Source source in libraries) {
-        if (container == null || container.contains(source)) {
-          removeSource(context, source);
-        }
-      }
-    }
-  }
-
-  void _recordLibraryWithUnit(
-      AnalysisContext context, Source library, Source unit) {
-    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
-    if (libraryToUnits == null) {
-      libraryToUnits = new HashMap<Source, Set<Source>>();
-      _contextToLibraryToUnits[context] = libraryToUnits;
-    }
-    Set<Source> units = libraryToUnits[library];
-    if (units == null) {
-      units = new HashSet<Source>();
-      libraryToUnits[library] = units;
-    }
-    units.add(unit);
   }
 
   void _recordNodeNameForElement(
@@ -964,37 +1053,9 @@
     nameToNodeNames.add(nameId, _currentNodeNameId);
   }
 
-  void _recordUnitInLibrary(
-      AnalysisContext context, Source library, Source unit) {
-    Map<Source, Set<Source>> unitToLibraries =
-        _contextToUnitToLibraries[context];
-    if (unitToLibraries == null) {
-      unitToLibraries = new HashMap<Source, Set<Source>>();
-      _contextToUnitToLibraries[context] = unitToLibraries;
-    }
-    Set<Source> libraries = unitToLibraries[unit];
-    if (libraries == null) {
-      libraries = new HashSet<Source>();
-      unitToLibraries[unit] = libraries;
-    }
-    libraries.add(library);
-  }
-
-  /**
-   * Removes locations recorded in the given library/unit pair.
-   */
-  void _removeLocations(AnalysisContext context, Source library, Source unit) {
-    // remove node
-    String libraryName = library != null ? library.fullName : null;
-    String unitName = unit.fullName;
-    int libraryNameIndex = _stringCodec.encode(libraryName);
-    int unitNameIndex = _stringCodec.encode(unitName);
-    String nodeName = '${libraryNameIndex}_${unitNameIndex}.index';
+  void _removeNodeByName(AnalysisContext context, String nodeName) {
     int nodeNameId = _stringCodec.encode(nodeName);
     _nodeManager.removeNode(nodeName);
-    // remove source
-    _sources.remove(library);
-    _sources.remove(unit);
     // remove top-level relations
     {
       int contextId = _contextCodec.encode(context);
@@ -1006,6 +1067,45 @@
   }
 }
 
+/**
+ * Interface to [SplitIndexStore] for [IndexObjectManager] implementations.
+ */
+abstract class SplitIndexStoreSite {
+  void addSource(Source source);
+  int encodeString(String str);
+  void removeNodeByName(AnalysisContext context, String nodeName);
+  void removeSource(Source source);
+}
+
+/**
+ * The implementaiton of [SplitIndexStoreSite].
+ */
+class SplitIndexStoreSiteImpl implements SplitIndexStoreSite {
+  final SplitIndexStore store;
+
+  SplitIndexStoreSiteImpl(this.store);
+
+  @override
+  void addSource(Source source) {
+    store._sources.add(source);
+  }
+
+  @override
+  int encodeString(String str) {
+    return store._stringCodec.encode(str);
+  }
+
+  @override
+  void removeNodeByName(AnalysisContext context, String nodeName) {
+    store._removeNodeByName(context, nodeName);
+  }
+
+  @override
+  void removeSource(Source source) {
+    store._sources.remove(source);
+  }
+}
+
 class _DataInputStream {
   ByteData _byteData;
   int _byteOffset = 0;
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine.dart b/pkg/analysis_server/lib/src/services/search/search_engine.dart
index e754d9f..60391ff 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine.dart
@@ -99,7 +99,7 @@
   /**
    * Returns subtypes of the given [type].
    *
-   * [type] - the [ClassElemnet] being subtyped by the found matches.
+   * [type] - the [ClassElement] being subtyped by the found matches.
    */
   Future<List<SearchMatch>> searchSubtypes(ClassElement type);
 
diff --git a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
index 6126e14..6efd7d0 100644
--- a/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
+++ b/pkg/analysis_server/lib/src/services/search/search_engine_internal.dart
@@ -24,10 +24,10 @@
 
   @override
   Future<List<SearchMatch>> searchElementDeclarations(String name) {
-    NameElement element = new NameElement(name);
+    IndexableName indexableName = new IndexableName(name);
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
-        element, IndexConstants.NAME_IS_DEFINED_BY, MatchKind.DECLARATION);
+    requestor.add(indexableName, IndexConstants.NAME_IS_DEFINED_BY,
+        MatchKind.DECLARATION);
     return requestor.merge();
   }
 
@@ -42,13 +42,14 @@
 
   @override
   Future<List<SearchMatch>> searchMemberReferences(String name) {
-    NameElement element = new NameElement(name);
+    IndexableName indexableName = new IndexableName(name);
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(element, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
-    requestor.add(element, IndexConstants.IS_READ_BY, MatchKind.READ);
     requestor.add(
-        element, IndexConstants.IS_READ_WRITTEN_BY, MatchKind.READ_WRITE);
-    requestor.add(element, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
+        indexableName, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
+    requestor.add(indexableName, IndexConstants.IS_READ_BY, MatchKind.READ);
+    requestor.add(
+        indexableName, IndexConstants.IS_READ_WRITTEN_BY, MatchKind.READ_WRITE);
+    requestor.add(indexableName, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
     return requestor.merge();
   }
 
@@ -93,9 +94,12 @@
   @override
   Future<List<SearchMatch>> searchSubtypes(ClassElement type) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(type, IndexConstants.IS_EXTENDED_BY, MatchKind.REFERENCE);
-    requestor.add(type, IndexConstants.IS_MIXED_IN_BY, MatchKind.REFERENCE);
-    requestor.add(type, IndexConstants.IS_IMPLEMENTED_BY, MatchKind.REFERENCE);
+    requestor.addElement(
+        type, IndexConstants.IS_EXTENDED_BY, MatchKind.REFERENCE);
+    requestor.addElement(
+        type, IndexConstants.IS_MIXED_IN_BY, MatchKind.REFERENCE);
+    requestor.addElement(
+        type, IndexConstants.IS_IMPLEMENTED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
 
@@ -114,7 +118,7 @@
 
   Future<List<SearchMatch>> _searchReferences(Element element) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
+    requestor.addElement(
         element, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
@@ -122,7 +126,7 @@
   Future<List<SearchMatch>> _searchReferences_Constructor(
       ConstructorElement constructor) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
+    requestor.addElement(
         constructor, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
     return requestor.merge();
   }
@@ -133,16 +137,20 @@
     PropertyAccessorElement setter = field.setter;
     _Requestor requestor = new _Requestor(_index);
     // field itself
-    requestor.add(field, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    requestor.add(field, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
+    requestor.addElement(
+        field, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
+    requestor.addElement(field, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
     // getter
     if (getter != null) {
-      requestor.add(getter, IndexConstants.IS_REFERENCED_BY, MatchKind.READ);
-      requestor.add(getter, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
+      requestor.addElement(
+          getter, IndexConstants.IS_REFERENCED_BY, MatchKind.READ);
+      requestor.addElement(
+          getter, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     }
     // setter
     if (setter != null) {
-      requestor.add(setter, IndexConstants.IS_REFERENCED_BY, MatchKind.WRITE);
+      requestor.addElement(
+          setter, IndexConstants.IS_REFERENCED_BY, MatchKind.WRITE);
     }
     // done
     return requestor.merge();
@@ -151,20 +159,23 @@
   Future<List<SearchMatch>> _searchReferences_Function(
       FunctionElement function) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(
+    requestor.addElement(
         function, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    requestor.add(function, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
+    requestor.addElement(
+        function, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>> _searchReferences_LocalVariable(
       LocalVariableElement variable) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(variable, IndexConstants.IS_READ_BY, MatchKind.READ);
-    requestor.add(
+    requestor.addElement(variable, IndexConstants.IS_READ_BY, MatchKind.READ);
+    requestor.addElement(
         variable, IndexConstants.IS_READ_WRITTEN_BY, MatchKind.READ_WRITE);
-    requestor.add(variable, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
-    requestor.add(variable, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
+    requestor.addElement(
+        variable, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
+    requestor.addElement(
+        variable, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
@@ -173,21 +184,24 @@
     if (method is MethodMember) {
       method = (method as MethodMember).baseElement;
     }
-    requestor.add(method, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    requestor.add(method, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
+    requestor.addElement(
+        method, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
+    requestor.addElement(
+        method, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
 
   Future<List<SearchMatch>> _searchReferences_Parameter(
       ParameterElement parameter) {
     _Requestor requestor = new _Requestor(_index);
-    requestor.add(parameter, IndexConstants.IS_READ_BY, MatchKind.READ);
-    requestor.add(
+    requestor.addElement(parameter, IndexConstants.IS_READ_BY, MatchKind.READ);
+    requestor.addElement(
         parameter, IndexConstants.IS_READ_WRITTEN_BY, MatchKind.READ_WRITE);
-    requestor.add(parameter, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
-    requestor.add(
+    requestor.addElement(
+        parameter, IndexConstants.IS_WRITTEN_BY, MatchKind.WRITE);
+    requestor.addElement(
         parameter, IndexConstants.IS_REFERENCED_BY, MatchKind.REFERENCE);
-    requestor.add(
+    requestor.addElement(
         parameter, IndexConstants.IS_INVOKED_BY, MatchKind.INVOCATION);
     return requestor.merge();
   }
@@ -199,9 +213,9 @@
 
   _Requestor(this.index);
 
-  void add(Element element, RelationshipImpl relationship, MatchKind kind) {
-    Future relationsFuture =
-        index.getRelationships(new IndexableElement(element), relationship);
+  void add(IndexableObject indexable, RelationshipImpl relationship,
+      MatchKind kind) {
+    Future relationsFuture = index.getRelationships(indexable, relationship);
     Future matchesFuture = relationsFuture.then((List<LocationImpl> locations) {
       List<SearchMatch> matches = <SearchMatch>[];
       for (LocationImpl location in locations) {
@@ -220,6 +234,12 @@
     futures.add(matchesFuture);
   }
 
+  void addElement(
+      Element element, RelationshipImpl relationship, MatchKind kind) {
+    IndexableElement indexable = new IndexableElement(element);
+    add(indexable, relationship, kind);
+  }
+
   Future<List<SearchMatch>> merge() {
     return Future.wait(futures).then((List<List<SearchMatch>> matchesList) {
       return matchesList.expand((matches) => matches).toList();
diff --git a/pkg/analysis_server/lib/src/status/get_handler.dart b/pkg/analysis_server/lib/src/status/get_handler.dart
index 6a49946..9f9dda4 100644
--- a/pkg/analysis_server/lib/src/status/get_handler.dart
+++ b/pkg/analysis_server/lib/src/status/get_handler.dart
@@ -495,6 +495,7 @@
     _writeResponse(request, (StringBuffer buffer) {
       _writePage(buffer, 'Analysis Server - Cache Entry',
           ['Context: $contextFilter', 'File: $sourceUri'], (HttpResponse) {
+        List<CacheEntry> entries = entryMap[folder];
         buffer.write('<h3>Analyzing Contexts</h3><p>');
         bool first = true;
         allContexts.forEach((Folder folder) {
@@ -516,7 +517,11 @@
                 },
                 HTML_ESCAPE.convert(folder.path)));
           }
-          if (entryMap[folder][0].explicitlyAdded) {
+          CacheEntry sourceEntry =
+              entries.firstWhere((CacheEntry entry) => entry.target is Source);
+          if (sourceEntry == null) {
+            buffer.write(' (missing source entry)');
+          } else if (sourceEntry.explicitlyAdded) {
             buffer.write(' (explicit)');
           } else {
             buffer.write(' (implicit)');
@@ -524,7 +529,6 @@
         });
         buffer.write('</p>');
 
-        List<CacheEntry> entries = entryMap[folder];
         if (entries == null) {
           buffer.write('<p>Not being analyzed in this context.</p>');
           return;
@@ -544,7 +548,7 @@
           buffer.write('<dl>');
           buffer.write('<dt>time</dt><dd>');
           buffer.write(entry.modificationTime);
-          buffer.write('</dd></dl>');
+          buffer.write('</dd>');
           for (ResultDescriptor result in results) {
             ResultData data = entry.getResultData(result);
             String descriptorName = HTML_ESCAPE.convert(result.toString());
@@ -560,7 +564,7 @@
           if (entry.exception != null) {
             buffer.write('<dt>exception</dt><dd>');
             _writeException(buffer, entry.exception);
-            buffer.write('</dd></dl>');
+            buffer.write('</dd>');
           }
           buffer.write('</dl>');
         }
@@ -757,12 +761,12 @@
         .map((Source source) => source.fullName)
         .toList();
     MapIterator<AnalysisTarget, CacheEntry> iterator =
-        context.analysisCache.iterator();
+        context.analysisCache.iterator(context: context);
     while (iterator.moveNext()) {
-      Source source = iterator.key.source;
-      if (source != null) {
+      AnalysisTarget target = iterator.key;
+      if (target is Source) {
         CacheEntry entry = iterator.value;
-        String sourceName = source.fullName;
+        String sourceName = target.fullName;
         if (!links.containsKey(sourceName)) {
           CaughtException exception = entry.exception;
           if (exception != null) {
@@ -772,7 +776,7 @@
               CACHE_ENTRY_PATH,
               {
                 CONTEXT_QUERY_PARAM: folder.path,
-                SOURCE_QUERY_PARAM: source.uri.toString()
+                SOURCE_QUERY_PARAM: target.uri.toString()
               },
               sourceName,
               exception != null);
@@ -799,7 +803,7 @@
       if (fileNames == null || fileNames.isEmpty) {
         buffer.write('<p>None</p>');
       } else {
-        buffer.write('<table style="width: 100%">');
+        buffer.write('<p><table style="width: 100%">');
         for (String fileName in fileNames) {
           buffer.write('<tr><td>');
           buffer.write(links[fileName]);
@@ -810,7 +814,7 @@
           }
           buffer.write('</td></tr>');
         }
-        buffer.write('</table>');
+        buffer.write('</table></p>');
       }
     }
 
@@ -818,27 +822,6 @@
       _writePage(
           buffer, 'Analysis Server - Context', ['Context: $contextFilter'],
           (StringBuffer buffer) {
-        List headerRowText = ['Context'];
-        headerRowText.addAll(CacheState.values);
-        buffer.write('<h3>Summary</h3>');
-        buffer.write('<table>');
-        _writeRow(buffer, headerRowText, header: true);
-        AnalysisContextStatistics statistics = context.statistics;
-        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
-          List rowText = [row.name];
-          for (CacheState state in CacheState.values) {
-            String text = row.getCount(state).toString();
-            Map<String, String> params = <String, String>{
-              STATE_QUERY_PARAM: state.toString(),
-              CONTEXT_QUERY_PARAM: folder.path,
-              DESCRIPTOR_QUERY_PARAM: row.name
-            };
-            rowText.add(makeLink(CACHE_STATE_PATH, params, text));
-          }
-          _writeRow(buffer, rowText, classes: [null, "right"]);
-        });
-        buffer.write('</table>');
-
         _writeFiles(buffer, 'Priority Files', priorityNames);
         _writeFiles(buffer, 'Explicitly Analyzed Files', explicitNames);
         _writeFiles(buffer, 'Implicitly Analyzed Files', implicitNames);
@@ -1101,6 +1084,7 @@
         buffer.write(makeLink(CONTEXT_PATH, {CONTEXT_QUERY_PARAM: folder.path},
             key, _hasException(folderMap[folder])));
       });
+      // TODO(brianwilkerson) Add items for the SDK contexts (currently only one).
       buffer.write('</p>');
 
       buffer.write('<p><b>Options</b></p>');
@@ -1394,9 +1378,9 @@
    */
   void _writePluginStatus(StringBuffer buffer) {
     void writePlugin(Plugin plugin) {
-      buffer.write(_server.serverPlugin.uniqueIdentifier);
+      buffer.write(plugin.uniqueIdentifier);
       buffer.write(' (');
-      buffer.write(_server.serverPlugin.runtimeType);
+      buffer.write(plugin.runtimeType);
       buffer.write(')<br>');
     }
     buffer.write('<h3>Plugin Status</h3><p>');
diff --git a/pkg/analysis_server/test/analysis/notification_highlights_test2.dart b/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
index 002bb1b..5f3b79b 100644
--- a/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
+++ b/pkg/analysis_server/test/analysis/notification_highlights_test2.dart
@@ -731,6 +731,19 @@
     });
   }
 
+  test_INSTANCE_FIELD_dynamic() {
+    addTestFile('''
+class A {
+  var f;
+  A(this.f);
+}
+''');
+    return prepareHighlights().then((_) {
+      assertHasRegion(HighlightRegionType.INSTANCE_FIELD_DECLARATION, 'f;');
+      assertHasRegion(HighlightRegionType.INSTANCE_FIELD_REFERENCE, 'f);');
+    });
+  }
+
   test_KEYWORD() {
     addTestFile('''
 main() {
@@ -821,6 +834,25 @@
     });
   }
 
+  test_LIBRARY_NAME_libraryDirective() {
+    addTestFile('''
+library my.lib.name;
+''');
+    return prepareHighlights().then((_) {
+      assertHasStringRegion(HighlightRegionType.LIBRARY_NAME, 'my.lib.name');
+    });
+  }
+
+  test_LIBRARY_NAME_partOfDirective() {
+    _addLibraryForTestPart();
+    addTestFile('''
+part of my.lib.name;
+''');
+    return prepareHighlights().then((_) {
+      assertHasStringRegion(HighlightRegionType.LIBRARY_NAME, 'my.lib.name');
+    });
+  }
+
   test_LITERAL_BOOLEAN() {
     addTestFile('var V = true;');
     return prepareHighlights().then((_) {
@@ -1062,6 +1094,58 @@
     });
   }
 
+  test_UNRESOLVED_INSTANCE_MEMBER_REFERENCE_dynamicVarTarget() {
+    addTestFile('''
+main(p) {
+  p.aaa;
+  p.aaa++;
+  p.aaa += 0;
+  ++p.aaa; // ++
+  p.aaa = 0;
+  p.bbb(0);
+  ''.length.ccc().ddd();
+}
+''');
+    return prepareHighlights().then((_) {
+      HighlightRegionType type =
+          HighlightRegionType.UNRESOLVED_INSTANCE_MEMBER_REFERENCE;
+      assertHasRegion(type, 'aaa');
+      assertHasRegion(type, 'aaa++');
+      assertHasRegion(type, 'aaa += 0');
+      assertHasRegion(type, 'aaa; // ++');
+      assertHasRegion(type, 'aaa =');
+      assertHasRegion(type, 'bbb(');
+      assertHasRegion(type, 'ddd()');
+    });
+  }
+
+  test_UNRESOLVED_INSTANCE_MEMBER_REFERENCE_nonDynamicTarget() {
+    addTestFile('''
+import 'dart:math' as math;
+main(String str) {
+  new Object().aaa();
+  math.bbb();
+  str.ccc();
+}
+class A {
+  m() {
+    unresolved(1);
+    this.unresolved(2);
+    super.unresolved(3);
+  }
+}
+''');
+    return prepareHighlights().then((_) {
+      HighlightRegionType type = HighlightRegionType.IDENTIFIER_DEFAULT;
+      assertHasRegion(type, 'aaa()');
+      assertHasRegion(type, 'bbb()');
+      assertHasRegion(type, 'ccc()');
+      assertHasRegion(type, 'unresolved(1)');
+      assertHasRegion(type, 'unresolved(2)');
+      assertHasRegion(type, 'unresolved(3)');
+    });
+  }
+
   void _addLibraryForTestPart() {
     addFile(
         '$testFolder/my_lib.dart',
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index 3c3306e..1202ef3 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -8,6 +8,7 @@
 
 import 'package:analysis_server/completion/completion_core.dart'
     show CompletionRequest, CompletionResult;
+import 'package:analysis_server/completion/completion_dart.dart' as newApi;
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel/channel.dart';
 import 'package:analysis_server/src/constants.dart';
@@ -17,6 +18,7 @@
 import 'package:analysis_server/src/plugin/server_plugin.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/contribution_sorter.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/index/index.dart' show Index;
 import 'package:analysis_server/src/services/index/local_memory_index.dart';
@@ -470,6 +472,29 @@
     });
   }
 
+  test_invocation_sdk_relevancy_off() {
+    var originalSorter = DartCompletionManager.defaultContributionSorter;
+    var mockSorter = new MockRelevancySorter();
+    DartCompletionManager.defaultContributionSorter = mockSorter;
+    addTestFile('main() {Map m; m.^}');
+    return getSuggestions().then((_) {
+      // Assert that the CommonUsageComputer has been replaced
+      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+          isFalse);
+      DartCompletionManager.defaultContributionSorter = originalSorter;
+      mockSorter.enabled = false;
+    });
+  }
+
+  test_invocation_sdk_relevancy_on() {
+    addTestFile('main() {Map m; m.^}');
+    return getSuggestions().then((_) {
+      // Assert that the CommonUsageComputer is working
+      expect(suggestions.any((s) => s.relevance == DART_RELEVANCE_COMMON_USAGE),
+          isTrue);
+    });
+  }
+
   test_invocation_withTrailingStmt() {
     addTestFile('class A {b() {}} main() {A a; a.^ int x = 7;}');
     return getSuggestions().then((_) {
@@ -690,6 +715,18 @@
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
+class MockRelevancySorter implements ContributionSorter {
+  bool enabled = true;
+
+  @override
+  void sort(newApi.DartCompletionRequest request,
+      List<CompletionSuggestion> suggestions) {
+    if (!enabled) {
+      throw 'unexpected sort';
+    }
+  }
+}
+
 /**
  * Mock stream for tracking calls to listen and subscription.cancel.
  */
diff --git a/pkg/analysis_server/test/mock_sdk.dart b/pkg/analysis_server/test/mock_sdk.dart
index 6d41c97..99be8fc 100644
--- a/pkg/analysis_server/test/mock_sdk.dart
+++ b/pkg/analysis_server/test/mock_sdk.dart
@@ -97,6 +97,7 @@
 }
 
 abstract class Map<K, V> extends Object {
+  bool containsKey(Object key);
   Iterable<K> get keys;
 }
 
diff --git a/pkg/analysis_server/test/services/completion/completion_target_test.dart b/pkg/analysis_server/test/services/completion/completion_target_test.dart
index 35bd5da..6d0e52f 100644
--- a/pkg/analysis_server/test/services/completion/completion_target_test.dart
+++ b/pkg/analysis_server/test/services/completion/completion_target_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.completion.target;
 
-import 'package:analysis_server/src/services/completion/completion_target.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
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 2e357d6..7cfdffd 100644
--- a/pkg/analysis_server/test/services/completion/completion_test_util.dart
+++ b/pkg/analysis_server/test/services/completion/completion_test_util.dart
@@ -12,7 +12,7 @@
 import 'package:analysis_server/src/protocol.dart' hide Element, ElementKind;
 import 'package:analysis_server/src/services/completion/common_usage_computer.dart';
 import 'package:analysis_server/src/services/completion/completion_manager.dart';
-import 'package:analysis_server/src/services/completion/completion_target.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_cache.dart';
 import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
 import 'package:analysis_server/src/services/completion/imported_reference_contributor.dart';
diff --git a/pkg/analysis_server/test/services/completion/inherited_computer_test.dart b/pkg/analysis_server/test/services/completion/inherited_computer_test.dart
new file mode 100644
index 0000000..530b88a
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/inherited_computer_test.dart
@@ -0,0 +1,75 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.services.completion.inherited_computer_test;
+
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/services/completion/dart_completion_manager.dart';
+import 'package:analysis_server/src/services/completion/inherited_contributor.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+import 'package:unittest/src/matcher/core_matchers.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../utils.dart';
+import 'completion_test_util.dart';
+
+main() {
+  initializeTestEnvironment();
+//  defineReflectiveTests(InheritedContributorTest);
+}
+
+@reflectiveTest
+class InheritedContributorTest extends AbstractCompletionTest {
+  @override
+  void setUpContributor() {
+    contributor = new NewCompletionWrapper(new InheritedContributor());
+  }
+
+  test_fromMultipleSuperclasses() {
+    addTestSource(r'''
+class A {
+  notSuggested() => null;
+  A suggested1(int x) => null;
+  B suggested2(String y) => null;
+}
+class B extends A {
+  B suggested2(String y) => null;
+  C suggested3([String z]) => null;
+}
+class C extends B {
+  sugg^
+}
+''');
+    computeFast();
+    return computeFull((bool result) {
+      _assertOverride(
+          '@override\n  A suggested1(int x) {\n    // TODO: implement suggested1\n    return null;\n  }');
+      _assertOverride(
+          '''@override\n  B suggested2(String y) {\n    // TODO: implement suggested2\n    return null;\n  }''');
+      _assertOverride(
+          '''@override\n  C suggested3([String z]) {\n    // TODO: implement suggested3\n    return null;\n  }''');
+      assertNotSuggested(
+          '''@override\n  notSuggested() {\n    // TODO: implement notSuggested\n    return null;\n  }''');
+    });
+  }
+
+  CompletionSuggestion _assertOverride(String completion) {
+    CompletionSuggestion cs = getSuggest(
+        completion: completion,
+        csKind: CompletionSuggestionKind.IDENTIFIER,
+        elemKind: null);
+    if (cs == null) {
+      failedCompletion('expected $completion', request.suggestions);
+    }
+    expect(cs.kind, equals(CompletionSuggestionKind.IDENTIFIER));
+    expect(cs.relevance, equals(DART_RELEVANCE_HIGH));
+    expect(cs.importUri, null);
+//    expect(cs.selectionOffset, equals(completion.length));
+    expect(cs.selectionLength, equals(0));
+    expect(cs.isDeprecated, isFalse);
+    expect(cs.isPotential, isFalse);
+    expect(cs.element, isNotNull);
+    return cs;
+  }
+}
diff --git a/pkg/analysis_server/test/services/completion/optype_test.dart b/pkg/analysis_server/test/services/completion/optype_test.dart
index efd355e..e2c654c 100644
--- a/pkg/analysis_server/test/services/completion/optype_test.dart
+++ b/pkg/analysis_server/test/services/completion/optype_test.dart
@@ -4,7 +4,7 @@
 
 library test.services.completion.contributor.dart.optype;
 
-import 'package:analysis_server/src/services/completion/completion_target.dart';
+import 'package:analysis_server/completion/dart/completion_target.dart';
 import 'package:analysis_server/src/services/completion/optype.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
diff --git a/pkg/analysis_server/test/services/completion/test_all.dart b/pkg/analysis_server/test/services/completion/test_all.dart
index 34d49c2..69735da 100644
--- a/pkg/analysis_server/test/services/completion/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/test_all.dart
@@ -14,6 +14,7 @@
 import 'completion_manager_test.dart' as completion_manager_test;
 import 'completion_target_test.dart' as completion_target_test;
 import 'imported_reference_contributor_test.dart' as imported_test;
+import 'inherited_computer_test.dart' as inherited_computer_test;
 import 'keyword_contributor_test.dart' as keyword_test;
 import 'local_declaration_visitor_test.dart' as local_declaration_visitor_test;
 import 'local_reference_contributor_test.dart'
@@ -33,6 +34,7 @@
     completion_manager_test.main();
     completion_target_test.main();
     imported_test.main();
+    inherited_computer_test.main();
     invocation_test.main();
     keyword_test.main();
     local_declaration_visitor_test.main();
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 da11c93..022a7c9 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
@@ -69,7 +69,7 @@
 
   void setUp() {
     super.setUp();
-    when(store.aboutToIndexDart(context, anyObject)).thenReturn(true);
+    when(store.aboutToIndex(context, anyObject)).thenReturn(true);
     when(store.recordRelationship(anyObject, anyObject, anyObject)).thenInvoke(
         (IndexableObject indexable, RelationshipImpl relationship,
             LocationImpl location) {
@@ -155,32 +155,185 @@
         IndexConstants.IS_READ_BY, _expectedLocation(mainElement, 'v in []'));
   }
 
-  void test_isDefinedBy_NameElement_method() {
+  void test_IndexableName_field() {
+    _indexTestUnit('''
+class A {
+  int field;
+}
+main(A a, p) {
+  print(a.field); // r
+  print(p.field); // ur
+  {
+    var field = 42;
+    print(field); // not a member
+  }
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    FieldElement fieldElement = findElement('field');
+    IndexableName indexable = new IndexableName('field');
+    // verify
+    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(fieldElement, 'field;'));
+    _assertRecordedRelation(indexable, IndexConstants.IS_READ_BY,
+        _expectedLocationQ(mainElement, 'field); // r'));
+    _assertRecordedRelation(indexable, IndexConstants.IS_READ_BY,
+        _expectedLocationQU(mainElement, 'field); // ur'));
+    _assertNoRecordedRelation(indexable, IndexConstants.IS_READ_BY,
+        _expectedLocation(mainElement, 'field); // not a member'));
+  }
+
+  void test_IndexableName_isDefinedBy_localVariable_inForEach() {
+    _indexTestUnit('''
+class A {
+  main() {
+    for (int test in []) {
+    }
+  }
+}
+''');
+    // prepare elements
+    LocalVariableElement testElement = findElement('test');
+    IndexableName indexable = new IndexableName('test');
+    // verify
+    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(testElement, 'test in []'));
+  }
+
+  void test_IndexableName_method() {
+    _indexTestUnit('''
+class A {
+  method() {}
+}
+main(A a, p) {
+  a.method(); // r
+  p.method(); // ur
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    MethodElement methodElement = findElement('method');
+    IndexableName indexable = new IndexableName('method');
+    // verify
+    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
+        _expectedLocation(methodElement, 'method() {}'));
+    _assertRecordedRelation(indexable, IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, 'method(); // r'));
+    _assertRecordedRelation(indexable, IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, 'method(); // ur'));
+  }
+
+  void test_IndexableName_operator_resolved() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(A a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    // binary
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+ 5', length: 1));
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '+= 5', length: 2));
+    _assertRecordedRelationForName('==', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '== 5', length: 2));
+    // prefix
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++a', length: 2));
+    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '--a', length: 2));
+    _assertRecordedRelationForName('~', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '~a', length: 1));
+    // postfix
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '++;', length: 2));
+    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQ(mainElement, '--;', length: 2));
+  }
+
+  void test_IndexableName_operator_unresolved() {
+    _indexTestUnit('''
+class A {
+  operator +(o) {}
+  operator -(o) {}
+  operator ~() {}
+  operator ==(o) {}
+}
+main(a) {
+  a + 5;
+  a += 5;
+  a == 5;
+  ++a;
+  --a;
+  ~a;
+  a++;
+  a--;
+}
+''');
+    // prepare elements
+    Element mainElement = findElement('main');
+    // binary
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '+ 5', length: 1));
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '+= 5', length: 2));
+    _assertRecordedRelationForName('==', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '== 5', length: 2));
+    // prefix
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '++a', length: 2));
+    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '--a', length: 2));
+    _assertRecordedRelationForName('~', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '~a', length: 1));
+    // postfix
+    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '++;', length: 2));
+    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
+        _expectedLocationQU(mainElement, '--;', length: 2));
+  }
+
+  void test_isDefinedBy_IndexableName_method() {
     _indexTestUnit('''
 class A {
   m() {}
 }''');
     // prepare elements
     Element methodElement = findElement("m");
-    Element nameElement = new NameElement("m");
+    IndexableName nameIndexable = new IndexableName("m");
     // verify
-    _assertRecordedRelationForElement(
-        nameElement,
+    _assertRecordedRelationForIndexable(
+        nameIndexable,
         IndexConstants.NAME_IS_DEFINED_BY,
         _expectedLocation(methodElement, 'm() {}'));
   }
 
-  void test_isDefinedBy_NameElement_operator() {
+  void test_isDefinedBy_IndexableName_operator() {
     _indexTestUnit('''
 class A {
   operator +(o) {}
 }''');
     // prepare elements
     Element methodElement = findElement("+");
-    Element nameElement = new NameElement("+");
+    IndexableName nameIndexable = new IndexableName("+");
     // verify
-    _assertRecordedRelationForElement(
-        nameElement,
+    _assertRecordedRelationForIndexable(
+        nameIndexable,
         IndexConstants.NAME_IS_DEFINED_BY,
         _expectedLocation(methodElement, '+(o) {}', length: 1));
   }
@@ -1254,160 +1407,6 @@
         _expectedLocation(mainElement, 'v = 1'));
   }
 
-  void test_NameElement_field() {
-    _indexTestUnit('''
-class A {
-  int field;
-}
-main(A a, p) {
-  print(a.field); // r
-  print(p.field); // ur
-  {
-    var field = 42;
-    print(field); // not a member
-  }
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    FieldElement fieldElement = findElement('field');
-    IndexableElement indexable = new IndexableElement(new NameElement('field'));
-    // verify
-    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
-        _expectedLocation(fieldElement, 'field;'));
-    _assertRecordedRelation(indexable, IndexConstants.IS_READ_BY,
-        _expectedLocationQ(mainElement, 'field); // r'));
-    _assertRecordedRelation(indexable, IndexConstants.IS_READ_BY,
-        _expectedLocationQU(mainElement, 'field); // ur'));
-    _assertNoRecordedRelation(indexable, IndexConstants.IS_READ_BY,
-        _expectedLocation(mainElement, 'field); // not a member'));
-  }
-
-  void test_NameElement_isDefinedBy_localVariable_inForEach() {
-    _indexTestUnit('''
-class A {
-  main() {
-    for (int test in []) {
-    }
-  }
-}
-''');
-    // prepare elements
-    LocalVariableElement testElement = findElement('test');
-    IndexableElement indexable = new IndexableElement(new NameElement('test'));
-    // verify
-    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
-        _expectedLocation(testElement, 'test in []'));
-  }
-
-  void test_NameElement_method() {
-    _indexTestUnit('''
-class A {
-  method() {}
-}
-main(A a, p) {
-  a.method(); // r
-  p.method(); // ur
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    MethodElement methodElement = findElement('method');
-    IndexableElement indexable =
-        new IndexableElement(new NameElement('method'));
-    // verify
-    _assertRecordedRelation(indexable, IndexConstants.NAME_IS_DEFINED_BY,
-        _expectedLocation(methodElement, 'method() {}'));
-    _assertRecordedRelation(indexable, IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, 'method(); // r'));
-    _assertRecordedRelation(indexable, IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, 'method(); // ur'));
-  }
-
-  void test_NameElement_operator_resolved() {
-    _indexTestUnit('''
-class A {
-  operator +(o) {}
-  operator -(o) {}
-  operator ~() {}
-  operator ==(o) {}
-}
-main(A a) {
-  a + 5;
-  a += 5;
-  a == 5;
-  ++a;
-  --a;
-  ~a;
-  a++;
-  a--;
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    // binary
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '+ 5', length: 1));
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '+= 5', length: 2));
-    _assertRecordedRelationForName('==', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '== 5', length: 2));
-    // prefix
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '++a', length: 2));
-    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '--a', length: 2));
-    _assertRecordedRelationForName('~', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '~a', length: 1));
-    // postfix
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '++;', length: 2));
-    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQ(mainElement, '--;', length: 2));
-  }
-
-  void test_NameElement_operator_unresolved() {
-    _indexTestUnit('''
-class A {
-  operator +(o) {}
-  operator -(o) {}
-  operator ~() {}
-  operator ==(o) {}
-}
-main(a) {
-  a + 5;
-  a += 5;
-  a == 5;
-  ++a;
-  --a;
-  ~a;
-  a++;
-  a--;
-}
-''');
-    // prepare elements
-    Element mainElement = findElement('main');
-    // binary
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '+ 5', length: 1));
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '+= 5', length: 2));
-    _assertRecordedRelationForName('==', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '== 5', length: 2));
-    // prefix
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '++a', length: 2));
-    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '--a', length: 2));
-    _assertRecordedRelationForName('~', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '~a', length: 1));
-    // postfix
-    _assertRecordedRelationForName('+', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '++;', length: 2));
-    _assertRecordedRelationForName('-', IndexConstants.IS_INVOKED_BY,
-        _expectedLocationQU(mainElement, '--;', length: 2));
-  }
-
   void test_nameIsInvokedBy() {
     _indexTestUnit('''
 class A {
@@ -1419,7 +1418,7 @@
 }''');
     // prepare elements
     Element mainElement = findElement("main");
-    IndexableElement indexable = new IndexableElement(new NameElement('test'));
+    IndexableName indexable = new IndexableName('test');
     // verify
     _assertRecordedRelation(indexable, IndexConstants.IS_INVOKED_BY,
         _expectedLocationQ(mainElement, 'test(1)'));
@@ -1440,7 +1439,7 @@
 }''');
     // prepare elements
     Element mainElement = findElement("main");
-    IndexableElement indexable = new IndexableElement(new NameElement('test'));
+    IndexableName indexable = new IndexableName('test');
     // verify
     _assertRecordedRelation(indexable, IndexConstants.IS_READ_BY,
         _expectedLocationQ(mainElement, 'test); // a'));
@@ -1459,7 +1458,7 @@
 }''');
     // prepare elements
     Element mainElement = findElement("main");
-    IndexableElement indexable = new IndexableElement(new NameElement('test'));
+    IndexableName indexable = new IndexableName('test');
     // verify
     _assertRecordedRelation(indexable, IndexConstants.IS_READ_WRITTEN_BY,
         _expectedLocationQ(mainElement, 'test += 1'));
@@ -1478,7 +1477,7 @@
 }''');
     // prepare elements
     Element mainElement = findElement("main");
-    IndexableElement indexable = new IndexableElement(new NameElement('test'));
+    IndexableName indexable = new IndexableName('test');
     // verify
     _assertRecordedRelation(indexable, IndexConstants.IS_WRITTEN_BY,
         _expectedLocationQ(mainElement, 'test = 1'));
@@ -1552,8 +1551,21 @@
       Element expectedElement,
       RelationshipImpl expectedRelationship,
       ExpectedLocation expectedLocation) {
-    return _assertRecordedRelation(new IndexableElement(expectedElement),
-        expectedRelationship, expectedLocation);
+    return _assertRecordedRelationForIndexable(
+        new IndexableElement(expectedElement),
+        expectedRelationship,
+        expectedLocation);
+  }
+
+  /**
+   * Asserts that [recordedRelations] has an item with the expected properties.
+   */
+  LocationImpl _assertRecordedRelationForIndexable(
+      IndexableObject expectedIndexable,
+      RelationshipImpl expectedRelationship,
+      ExpectedLocation expectedLocation) {
+    return _assertRecordedRelation(
+        expectedIndexable, expectedRelationship, expectedLocation);
   }
 
   /**
@@ -1563,8 +1575,8 @@
       String expectedName,
       RelationshipImpl expectedRelationship,
       ExpectedLocation expectedLocation) {
-    return _assertRecordedRelationForElement(
-        new NameElement(expectedName), expectedRelationship, expectedLocation);
+    return _assertRecordedRelationForIndexable(new IndexableName(expectedName),
+        expectedRelationship, expectedLocation);
   }
 
   ExpectedLocation _expectedLocation(Element element, String search,
diff --git a/pkg/analysis_server/test/services/index/store/codec_test.dart b/pkg/analysis_server/test/services/index/store/codec_test.dart
index 2d6a068..62e86d5 100644
--- a/pkg/analysis_server/test/services/index/store/codec_test.dart
+++ b/pkg/analysis_server/test/services/index/store/codec_test.dart
@@ -252,6 +252,16 @@
     validateDecode(id1, id2, id3, element);
   }
 
+  void test_encode_IndexableName() {
+    IndexableName indexable = new IndexableName('test');
+    int id1 = codec.encode1(indexable);
+    int id2 = codec.encode2(indexable);
+    int id3 = codec.encode3(indexable);
+    expect(id1, -1);
+    expect(id2, isNonNegative);
+    expect(id3, IndexableNameKind.INSTANCE.index);
+  }
+
   void test_encode_LibraryElement() {
     resolveTestUnit('''
 class A {
@@ -286,17 +296,6 @@
     validateDecode(id1, id2, id3, element);
   }
 
-  void test_encode_NameElement() {
-    Element element = new NameElement('test');
-    IndexableObject indexable = new IndexableElement(element);
-    int id1 = codec.encode1(indexable);
-    int id2 = codec.encode2(indexable);
-    int id3 = codec.encode3(indexable);
-    expect(id1, -1);
-    expect(id2, isNonNegative);
-    expect(id3, IndexableElementKind.forElement(element).index);
-  }
-
   void test_encode_nullLibraryElement() {
     resolveTestUnit('''
 test() {}
diff --git a/pkg/analysis_server/test/services/index/store/split_store_test.dart b/pkg/analysis_server/test/services/index/store/split_store_test.dart
index c663dc4..f52556c 100644
--- a/pkg/analysis_server/test/services/index/store/split_store_test.dart
+++ b/pkg/analysis_server/test/services/index/store/split_store_test.dart
@@ -492,11 +492,14 @@
   IndexableElement indexableC;
   IndexableElement indexableD;
 
-  HtmlElement htmlElementA = new MockHtmlElement();
-  HtmlElement htmlElementB = new MockHtmlElement();
-  LibraryElement libraryElement = new MockLibraryElement();
   Source librarySource = new MockSource('librarySource');
   CompilationUnitElement libraryUnitElement = new MockCompilationUnitElement();
+  LibraryElement libraryElement = new MockLibraryElement();
+
+  Source librarySourceB = new MockSource('librarySourceB');
+  LibraryElement libraryElementB = new MockLibraryElement();
+  CompilationUnitElement libraryUnitElementB = new MockCompilationUnitElement();
+
   ElementCodec elementCodec = new MockElementCodec();
   MemoryNodeManager nodeManager = new MemoryNodeManager();
   RelationshipImpl relationship =
@@ -518,7 +521,8 @@
     indexableD = new IndexableElement(elementD);
 
     nodeManager.elementCodec = elementCodec;
-    store = new SplitIndexStore(nodeManager);
+    store = new SplitIndexStore(nodeManager,
+        <IndexObjectManager>[new DartUnitIndexObjectManager()]);
     when(elementCodec.encode1(indexableA)).thenReturn(11);
     when(elementCodec.encode2(indexableA)).thenReturn(12);
     when(elementCodec.encode3(indexableA)).thenReturn(13);
@@ -538,7 +542,6 @@
     when(contextA.isDisposed).thenReturn(false);
     when(contextB.isDisposed).thenReturn(false);
     when(contextC.isDisposed).thenReturn(false);
-    when(librarySource.fullName).thenReturn('/home/user/librarySource.dart');
     when(sourceA.fullName).thenReturn('/home/user/sourceA.dart');
     when(sourceB.fullName).thenReturn('/home/user/sourceB.dart');
     when(sourceC.fullName).thenReturn('/home/user/sourceC.dart');
@@ -567,25 +570,31 @@
     when(unitElementB.library).thenReturn(libraryElement);
     when(unitElementC.library).thenReturn(libraryElement);
     when(unitElementD.library).thenReturn(libraryElement);
-    when(htmlElementA.source).thenReturn(sourceA);
-    when(htmlElementB.source).thenReturn(sourceB);
     // library
+    when(librarySource.fullName).thenReturn('/home/user/librarySource.dart');
     when(libraryUnitElement.library).thenReturn(libraryElement);
     when(libraryUnitElement.source).thenReturn(librarySource);
     when(libraryElement.source).thenReturn(librarySource);
     when(libraryElement.definingCompilationUnit).thenReturn(libraryUnitElement);
+    // library B
+    when(librarySourceB.fullName).thenReturn('/home/user/librarySource.dart');
+    when(libraryUnitElementB.library).thenReturn(libraryElementB);
+    when(libraryUnitElementB.source).thenReturn(librarySourceB);
+    when(libraryElementB.source).thenReturn(librarySourceB);
+    when(libraryElementB.definingCompilationUnit)
+        .thenReturn(libraryUnitElementB);
   }
 
   void test_aboutToIndexDart_disposedContext() {
     when(contextA.isDisposed).thenReturn(true);
-    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+    expect(store.aboutToIndex(contextA, unitElementA), isFalse);
   }
 
   Future test_aboutToIndexDart_library_first() {
     when(libraryElement.parts)
         .thenReturn(<CompilationUnitElement>[unitElementA, unitElementB]);
     {
-      store.aboutToIndexDart(contextA, libraryUnitElement);
+      store.aboutToIndex(contextA, libraryUnitElement);
       store.doneIndex();
     }
     return store
@@ -599,12 +608,12 @@
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
@@ -616,7 +625,7 @@
       // apply "libraryUnitElement", only with "B"
       when(libraryElement.parts).thenReturn([unitElementB]);
       {
-        store.aboutToIndexDart(contextA, libraryUnitElement);
+        store.aboutToIndex(contextA, libraryUnitElement);
         store.doneIndex();
       }
     }).then((_) {
@@ -630,52 +639,26 @@
 
   void test_aboutToIndexDart_nullLibraryElement() {
     when(unitElementA.library).thenReturn(null);
-    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+    expect(store.aboutToIndex(contextA, unitElementA), isFalse);
   }
 
   void test_aboutToIndexDart_nullLibraryUnitElement() {
     when(libraryElement.definingCompilationUnit).thenReturn(null);
-    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+    expect(store.aboutToIndex(contextA, unitElementA), isFalse);
   }
 
   void test_aboutToIndexDart_nullUnitElement() {
-    expect(store.aboutToIndexDart(contextA, null), isFalse);
-  }
-
-  test_aboutToIndexHtml_() {
-    LocationImpl locationA = mockLocation(indexableA);
-    LocationImpl locationB = mockLocation(indexableB);
-    {
-      store.aboutToIndexHtml(contextA, htmlElementA);
-      store.recordRelationship(indexableA, relationship, locationA);
-      store.doneIndex();
-    }
-    {
-      store.aboutToIndexHtml(contextA, htmlElementB);
-      store.recordRelationship(indexableA, relationship, locationB);
-      store.doneIndex();
-    }
-    // "A" and "B" locations
-    return store
-        .getRelationships(indexableA, relationship)
-        .then((List<LocationImpl> locations) {
-      assertLocations(locations, [locationA, locationB]);
-    });
-  }
-
-  void test_aboutToIndexHtml_disposedContext() {
-    when(contextA.isDisposed).thenReturn(true);
-    expect(store.aboutToIndexHtml(contextA, htmlElementA), isFalse);
+    expect(store.aboutToIndex(contextA, null), isFalse);
   }
 
   test_cancelIndexDart() {
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableA);
-    store.aboutToIndexDart(contextA, unitElementA);
+    store.aboutToIndex(contextA, unitElementA);
     store.recordRelationship(indexableA, relationship, locationA);
     store.recordRelationship(indexableA, relationship, locationB);
     store.recordTopLevelDeclaration(elementA);
-    store.cancelIndexDart();
+    store.cancelIndex();
     return store
         .getRelationships(indexableA, relationship)
         .then((List<LocationImpl> locations) {
@@ -686,7 +669,7 @@
 
   void test_clear() {
     LocationImpl locationA = mockLocation(indexableA);
-    store.aboutToIndexDart(contextA, unitElementA);
+    store.aboutToIndex(contextA, unitElementA);
     store.recordRelationship(indexableA, relationship, locationA);
     store.doneIndex();
     expect(nodeManager.isEmpty(), isFalse);
@@ -714,12 +697,12 @@
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
@@ -757,12 +740,12 @@
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
@@ -775,7 +758,7 @@
 
   test_recordRelationship_oneLocation() {
     LocationImpl locationA = mockLocation(indexableA);
-    store.aboutToIndexDart(contextA, unitElementA);
+    store.aboutToIndex(contextA, unitElementA);
     store.recordRelationship(indexableA, relationship, locationA);
     store.doneIndex();
     return store
@@ -788,7 +771,7 @@
   test_recordRelationship_twoLocations() {
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableA);
-    store.aboutToIndexDart(contextA, unitElementA);
+    store.aboutToIndex(contextA, unitElementA);
     store.recordRelationship(indexableA, relationship, locationA);
     store.recordRelationship(indexableA, relationship, locationB);
     store.doneIndex();
@@ -803,12 +786,12 @@
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
@@ -832,39 +815,39 @@
     store.removeContext(null);
   }
 
-  test_removeSource_library() {
+  test_removeSource_library() async {
+    when(elementB.library).thenReturn(libraryElementB);
+    when(unitElementB.library).thenReturn(libraryElementB);
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     LocationImpl locationC = mockLocation(indexableC);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
-      store.recordRelationship(indexableA, relationship, locationA);
+      store.aboutToIndex(contextA, unitElementA);
+      store.recordRelationship(indexableD, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
-      store.recordRelationship(indexableA, relationship, locationB);
+      store.aboutToIndex(contextA, unitElementB);
+      store.recordRelationship(indexableD, relationship, locationB);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementC);
-      store.recordRelationship(indexableA, relationship, locationC);
+      store.aboutToIndex(contextA, unitElementC);
+      store.recordRelationship(indexableD, relationship, locationC);
       store.doneIndex();
     }
     // "A", "B" and "C" locations
-    return store
-        .getRelationships(indexableA, relationship)
-        .then((List<LocationImpl> locations) {
+    {
+      var locations = await store.getRelationships(indexableD, relationship);
       assertLocations(locations, [locationA, locationB, locationC]);
-    }).then((_) {
-      // remove "librarySource"
-      store.removeSource(contextA, librarySource);
-      return store
-          .getRelationships(indexableA, relationship)
-          .then((List<LocationImpl> locations) {
-        assertLocations(locations, []);
-      });
-    });
+    }
+    // remove "librarySource"
+    store.removeSource(contextA, librarySource);
+    // only "B" location, which is in "librarySourceB"
+    {
+      var locations = await store.getRelationships(indexableD, relationship);
+      assertLocations(locations, [locationB]);
+    }
   }
 
   void test_removeSource_nullContext() {
@@ -876,17 +859,17 @@
     LocationImpl locationB = mockLocation(indexableB);
     LocationImpl locationC = mockLocation(indexableC);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementC);
+      store.aboutToIndex(contextA, unitElementC);
       store.recordRelationship(indexableA, relationship, locationC);
       store.doneIndex();
     }
@@ -910,12 +893,12 @@
     LocationImpl locationA = mockLocation(indexableA);
     LocationImpl locationB = mockLocation(indexableB);
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordRelationship(indexableA, relationship, locationA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordRelationship(indexableA, relationship, locationB);
       store.doneIndex();
     }
@@ -941,17 +924,17 @@
 
   void test_removeSources_unit() {
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordTopLevelDeclaration(elementA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementB);
+      store.aboutToIndex(contextA, unitElementB);
       store.recordTopLevelDeclaration(elementB);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextA, unitElementC);
+      store.aboutToIndex(contextA, unitElementC);
       store.recordTopLevelDeclaration(elementC);
       store.doneIndex();
     }
@@ -975,12 +958,12 @@
     when(elementCodec.decode(contextB, 21, 22, 23))
         .thenReturn(new IndexableElement(elementB));
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordTopLevelDeclaration(elementA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextB, unitElementB);
+      store.aboutToIndex(contextB, unitElementB);
       store.recordTopLevelDeclaration(elementB);
       store.doneIndex();
     }
@@ -991,7 +974,7 @@
     }
     // re-index "unitElementA"
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.doneIndex();
     }
     {
@@ -1006,12 +989,12 @@
     when(elementCodec.decode(contextB, 21, 22, 23))
         .thenReturn(new IndexableElement(elementB));
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordTopLevelDeclaration(elementA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextB, unitElementB);
+      store.aboutToIndex(contextB, unitElementB);
       store.recordTopLevelDeclaration(elementB);
       store.doneIndex();
     }
@@ -1034,12 +1017,12 @@
     when(elementCodec.decode(contextB, 21, 22, 23))
         .thenReturn(new IndexableElement(elementB));
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordTopLevelDeclaration(elementA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextB, unitElementB);
+      store.aboutToIndex(contextB, unitElementB);
       store.recordTopLevelDeclaration(elementB);
       store.doneIndex();
     }
@@ -1062,12 +1045,12 @@
     when(elementCodec.decode(contextB, 21, 22, 23))
         .thenReturn(new IndexableElement(elementB));
     {
-      store.aboutToIndexDart(contextA, unitElementA);
+      store.aboutToIndex(contextA, unitElementA);
       store.recordTopLevelDeclaration(elementA);
       store.doneIndex();
     }
     {
-      store.aboutToIndexDart(contextB, unitElementB);
+      store.aboutToIndex(contextB, unitElementB);
       store.recordTopLevelDeclaration(elementB);
       store.doneIndex();
     }
diff --git a/pkg/analysis_server/tool/spec/from_html.dart b/pkg/analysis_server/tool/spec/from_html.dart
index c3e3010..1ae9425 100644
--- a/pkg/analysis_server/tool/spec/from_html.dart
+++ b/pkg/analysis_server/tool/spec/from_html.dart
@@ -293,7 +293,9 @@
   File htmlFile = new File('spec_input.html');
   String htmlContents = htmlFile.readAsStringSync();
   dom.Document document = parser.parse(htmlContents);
-  return apiFromHtml(document.firstChild);
+  dom.Element htmlElement = document.children
+      .singleWhere((element) => element.localName.toLowerCase() == 'html');
+  return apiFromHtml(htmlElement);
 }
 
 void recurse(dom.Element parent, String context,
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 5b0a431..7795bdc 100644
--- a/pkg/analysis_server/tool/spec/spec_input.html
+++ b/pkg/analysis_server/tool/spec/spec_input.html
@@ -1,3 +1,4 @@
+<!doctype html>
 <html>
   <head>
     <meta charset="UTF-8"/>
@@ -4244,6 +4245,6 @@
       TBD
     </p>
     <h2 class="domain"><a name="index">Index</a></h2>
-    <index />
+    <index></index>
   </body>
 </html>
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index 3d35b01..2164c9f 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -84,6 +84,7 @@
 final GeneratedFile target = new GeneratedFile('../../doc/api.html', () {
   ToHtmlVisitor visitor = new ToHtmlVisitor(readApi());
   dom.Document document = new dom.Document();
+  document.append(new dom.DocumentType('html', null, null));
   for (dom.Node node in visitor.collectHtml(visitor.visitApi)) {
     document.append(node);
   }
diff --git a/pkg/analyzer/lib/plugin/task.dart b/pkg/analyzer/lib/plugin/task.dart
index fd4dd7c..d3eb4cd 100644
--- a/pkg/analyzer/lib/plugin/task.dart
+++ b/pkg/analyzer/lib/plugin/task.dart
@@ -43,6 +43,12 @@
  * The identifier of the extension point that allows plugins to register new
  * analysis tasks with the analysis engine. The object used as an extension must
  * be a [TaskDescriptor].
+ *
+ * Contributed tasks should never extract information from Dart elements or AST
+ * (e.g. offsets) of a source and put it into results for targets in other
+ * sources. Dart elements and ASTs are updated during incremental resolution,
+ * and invalidation of results is intentionally limited by the source bounds
+ * for performance reasons.
  */
 final String TASK_EXTENSION_POINT_ID = Plugin.join(
     EnginePlugin.UNIQUE_IDENTIFIER, EnginePlugin.TASK_EXTENSION_POINT);
diff --git a/pkg/analyzer/lib/src/context/cache.dart b/pkg/analyzer/lib/src/context/cache.dart
index 01ae4ea..4535ca4 100644
--- a/pkg/analyzer/lib/src/context/cache.dart
+++ b/pkg/analyzer/lib/src/context/cache.dart
@@ -166,14 +166,17 @@
 
   /**
    * Return an iterator returning all of the map entries mapping targets to
-   * cache entries.
+   * cache entries. If the [context] is not `null`, then only entries that are
+   * owned by the given context will be returned.
    */
-  MapIterator<AnalysisTarget, CacheEntry> iterator() {
-    int count = _partitions.length;
+  MapIterator<AnalysisTarget, CacheEntry> iterator(
+      {InternalAnalysisContext context: null}) {
     List<Map<AnalysisTarget, CacheEntry>> maps =
-        new List<Map<AnalysisTarget, CacheEntry>>(count);
-    for (int i = 0; i < count; i++) {
-      maps[i] = _partitions[i].map;
+        <Map<AnalysisTarget, CacheEntry>>[];
+    for (CachePartition partition in _partitions) {
+      if (context == null || partition.context == context) {
+        maps.add(partition.map);
+      }
     }
     return new MultipleMapIterator<AnalysisTarget, CacheEntry>(maps);
   }
@@ -252,6 +255,11 @@
   static int _EXPLICITLY_ADDED_FLAG = 0;
 
   /**
+   * The next invalidation process identifier.
+   */
+  static int nextInvalidateId = 0;
+
+  /**
    * The target this entry is about.
    */
   final AnalysisTarget target;
@@ -440,7 +448,7 @@
     if (state == CacheState.INVALID) {
       ResultData data = _resultMap[descriptor];
       if (data != null) {
-        _invalidate(descriptor, delta);
+        _invalidate(nextInvalidateId++, descriptor, delta, 0);
       }
     } else {
       ResultData data = getResultData(descriptor);
@@ -488,11 +496,14 @@
    * Set the value of the result represented by the given [descriptor] to the
    * given [value], keep its dependency, invalidate all the dependent result.
    */
-  void setValueIncremental(ResultDescriptor descriptor, dynamic value) {
+  void setValueIncremental(
+      ResultDescriptor descriptor, dynamic value, bool invalidateDependent) {
     ResultData data = getResultData(descriptor);
-    _invalidateDependentResults(data, null);
     data.state = CacheState.VALID;
     data.value = value;
+    if (invalidateDependent) {
+      _invalidateDependentResults(nextInvalidateId++, data, null, 0);
+    }
   }
 
   @override
@@ -511,25 +522,38 @@
    * Invalidate the result represented by the given [descriptor] and propagate
    * invalidation to other results that depend on it.
    */
-  void _invalidate(ResultDescriptor descriptor, Delta delta) {
+  void _invalidate(
+      int id, ResultDescriptor descriptor, Delta delta, int level) {
+    ResultData thisData = _resultMap[descriptor];
+    if (thisData == null) {
+      return;
+    }
+    // Stop if already validated.
+    if (delta != null) {
+      if (thisData.invalidateId == id) {
+        return;
+      }
+      thisData.invalidateId = id;
+    }
+    // Ask the delta to validate.
     DeltaResult deltaResult = null;
     if (delta != null) {
       deltaResult = delta.validate(_partition.context, target, descriptor);
       if (deltaResult == DeltaResult.STOP) {
-//        print('not-invalidate $descriptor for $target');
         return;
       }
     }
-//    print('invalidate $descriptor for $target');
-    ResultData thisData;
-    if (deltaResult == null || deltaResult == DeltaResult.INVALIDATE) {
-      thisData = _resultMap.remove(descriptor);
+    if (deltaResult == DeltaResult.INVALIDATE_NO_DELTA) {
+      delta = null;
     }
-    if (deltaResult == DeltaResult.KEEP_CONTINUE) {
-      thisData = _resultMap[descriptor];
-    }
-    if (thisData == null) {
-      return;
+    if (deltaResult == null ||
+        deltaResult == DeltaResult.INVALIDATE ||
+        deltaResult == DeltaResult.INVALIDATE_NO_DELTA) {
+      _resultMap.remove(descriptor);
+//      {
+//        String indent = '  ' * level;
+//        print('[$id]$indent invalidate $descriptor for $target');
+//      }
     }
     // Stop depending on other results.
     TargetedResult thisResult = new TargetedResult(target, descriptor);
@@ -540,7 +564,7 @@
       }
     }
     // Invalidate results that depend on this result.
-    _invalidateDependentResults(thisData, delta);
+    _invalidateDependentResults(id, thisData, delta, level + 1);
     // If empty, remove the entry altogether.
     if (_resultMap.isEmpty) {
       _partition._targetMap.remove(target);
@@ -557,19 +581,20 @@
   void _invalidateAll() {
     List<ResultDescriptor> results = _resultMap.keys.toList();
     for (ResultDescriptor result in results) {
-      _invalidate(result, null);
+      _invalidate(nextInvalidateId++, result, null, 0);
     }
   }
 
   /**
    * Invalidate results that depend on [thisData].
    */
-  void _invalidateDependentResults(ResultData thisData, Delta delta) {
+  void _invalidateDependentResults(
+      int id, ResultData thisData, Delta delta, int level) {
     List<TargetedResult> dependentResults = thisData.dependentResults.toList();
     for (TargetedResult dependentResult in dependentResults) {
       CacheEntry entry = _partition.get(dependentResult.target);
       if (entry != null) {
-        entry._invalidate(dependentResult.result, delta);
+        entry._invalidate(id, dependentResult.result, delta, level);
       }
     }
   }
@@ -950,10 +975,8 @@
   void _addIfSource(AnalysisTarget target) {
     if (target is Source) {
       _sources.add(target);
-      {
-        String fullName = target.fullName;
-        _pathToSources.putIfAbsent(fullName, () => <Source>[]).add(target);
-      }
+      String fullName = target.fullName;
+      _pathToSources.putIfAbsent(fullName, () => <Source>[]).add(target);
     }
   }
 
@@ -1021,7 +1044,30 @@
 /**
  * The possible results of validating analysis results againt a [Delta].
  */
-enum DeltaResult { INVALIDATE, KEEP_CONTINUE, STOP }
+enum DeltaResult {
+  /**
+   * Invalidate this result and continue visiting dependent results
+   * with this [Delta].
+   */
+  INVALIDATE,
+
+  /**
+   * Invalidate this result and stop using this [Delta], so unconditionally
+   * invalidate all the dependent results.
+   */
+  INVALIDATE_NO_DELTA,
+
+  /**
+   * Keep this result and continue validating dependent results
+   * with this [Delta].
+   */
+  KEEP_CONTINUE,
+
+  /**
+   * Keep this result and stop visiting results that depend on this one.
+   */
+  STOP
+}
 
 /**
  * [InvalidatedResult] describes an invalidated result.
@@ -1100,6 +1146,13 @@
   Object value;
 
   /**
+   * The identifier of the invalidation process that most recently checked
+   * this value. If it is the same as the current invalidation identifier,
+   * then there is no reason to check it (and its subtree again).
+   */
+  int invalidateId = -1;
+
+  /**
    * A list of the results on which this result depends.
    */
   List<TargetedResult> dependedOnResults = <TargetedResult>[];
diff --git a/pkg/analyzer/lib/src/context/context.dart b/pkg/analyzer/lib/src/context/context.dart
index c6a81da..9b8081e 100644
--- a/pkg/analyzer/lib/src/context/context.dart
+++ b/pkg/analyzer/lib/src/context/context.dart
@@ -161,6 +161,11 @@
   TypeProvider _typeProvider;
 
   /**
+   * The [TypeSystem] for this context, `null` if not yet created.
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * The controller for sending [SourcesChangedEvent]s.
    */
   StreamController<SourcesChangedEvent> _onSourcesChangedController;
@@ -298,6 +303,7 @@
     for (WorkManager workManager in workManagers) {
       workManager.applyPriorityTargets(_priorityOrder);
     }
+    driver.reset();
   }
 
   @override
@@ -481,6 +487,14 @@
   }
 
   @override
+  TypeSystem get typeSystem {
+    if (_typeSystem == null) {
+      _typeSystem = TypeSystem.create(this);
+    }
+    return _typeSystem;
+  }
+
+  @override
   void addListener(AnalysisListener listener) {
     if (!_listeners.contains(listener)) {
       _listeners.add(listener);
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 6d47cf7..0e879a8 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -18051,7 +18051,6 @@
   Object visitAwaitExpression(AwaitExpression node) {
     _writer.print("await ");
     _visitNode(node.expression);
-    _writer.print(";");
     return null;
   }
 
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index 93186c6..117b263 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -214,6 +214,11 @@
       "^(?:${ConstantValueComputer._OPERATOR_RE}\$|$_PUBLIC_IDENTIFIER_RE(?:=?\$|[.](?!\$)))+?\$");
 
   /**
+   * The type provider used to access the known types.
+   */
+  final TypeProvider typeProvider;
+
+  /**
    * The type system.  This is used to gues the types of constants when their
    * exact value is unknown.
    */
@@ -237,17 +242,12 @@
    * given, is used to verify correct dependency analysis when running unit
    * tests.
    */
-  ConstantEvaluationEngine(TypeProvider typeProvider, this._declaredVariables,
-      {ConstantEvaluationValidator validator})
+  ConstantEvaluationEngine(this.typeProvider, this._declaredVariables,
+      {ConstantEvaluationValidator validator, TypeSystem typeSystem})
       : validator = validator != null
             ? validator
             : new ConstantEvaluationValidator_ForProduction(),
-        typeSystem = new TypeSystemImpl(typeProvider);
-
-  /**
-   * The type provider used to access the known types.
-   */
-  TypeProvider get typeProvider => typeSystem.typeProvider;
+        typeSystem = typeSystem != null ? typeSystem : new TypeSystemImpl();
 
   /**
    * Check that the arguments to a call to fromEnvironment() are correct. The
@@ -1018,6 +1018,9 @@
       return false;
     }
   }
+
+  @override
+  String toString() => 'Constant: $annotation';
 }
 
 /**
@@ -1150,17 +1153,24 @@
   final TypeProvider _typeProvider;
 
   /**
+   * The type system primitives.
+   */
+  final TypeSystem _typeSystem;
+
+  /**
    * Initialize a newly created evaluator to evaluate expressions in the given
    * [source]. The [typeProvider] is the type provider used to access known
    * types.
    */
-  ConstantEvaluator(this._source, this._typeProvider);
+  ConstantEvaluator(this._source, this._typeProvider, {TypeSystem typeSystem})
+      : _typeSystem = typeSystem != null ? typeSystem : new TypeSystemImpl();
 
   EvaluationResult evaluate(Expression expression) {
     RecordingErrorListener errorListener = new RecordingErrorListener();
     ErrorReporter errorReporter = new ErrorReporter(errorListener, _source);
     DartObjectImpl result = expression.accept(new ConstantVisitor(
-        new ConstantEvaluationEngine(_typeProvider, new DeclaredVariables()),
+        new ConstantEvaluationEngine(_typeProvider, new DeclaredVariables(),
+            typeSystem: _typeSystem),
         errorReporter));
     if (result != null) {
       return EvaluationResult.forValue(result);
@@ -1304,10 +1314,10 @@
    */
   ConstantValueComputer(this._context, TypeProvider typeProvider,
       DeclaredVariables declaredVariables,
-      [ConstantEvaluationValidator validator])
+      [ConstantEvaluationValidator validator, TypeSystem typeSystem])
       : evaluationEngine = new ConstantEvaluationEngine(
             typeProvider, declaredVariables,
-            validator: validator);
+            validator: validator, typeSystem: typeSystem);
 
   /**
    * Add the constants in the given compilation [unit] to the list of constants
@@ -1577,7 +1587,8 @@
     ParameterizedType thenType = thenResult.type;
     ParameterizedType elseType = elseResult.type;
     return new DartObjectImpl.validWithUnknownValue(
-        _typeSystem.getLeastUpperBound(thenType, elseType) as InterfaceType);
+        _typeSystem.getLeastUpperBound(_typeProvider, thenType, elseType)
+        as InterfaceType);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c0e548c..a57cc05 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -429,6 +429,11 @@
   TypeProvider get typeProvider;
 
   /**
+   * Return a type system for this context.
+   */
+  TypeSystem get typeSystem;
+
+  /**
    * Add the given [listener] to the list of objects that are to be notified
    * when various analysis results are produced in this context.
    */
@@ -1040,6 +1045,11 @@
   TypeProvider _typeProvider;
 
   /**
+   * The [TypeSystem] for this context, `null` if not yet created.
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * The object used to manage the list of sources that need to be analyzed.
    */
   WorkManager _workManager = new WorkManager();
@@ -1550,6 +1560,14 @@
   }
 
   @override
+  TypeSystem get typeSystem {
+    if (_typeSystem == null) {
+      _typeSystem = TypeSystem.create(this);
+    }
+    return _typeSystem;
+  }
+
+  @override
   void addListener(AnalysisListener listener) {
     if (!_listeners.contains(listener)) {
       _listeners.add(listener);
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 4b47c67..912f364 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -70,6 +70,11 @@
   final TypeProvider _typeProvider;
 
   /**
+   * The type system primitives
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * The manager for the inheritance mappings.
    */
   final InheritanceManager _inheritanceManager;
@@ -277,6 +282,7 @@
     _boolType = _typeProvider.boolType;
     _intType = _typeProvider.intType;
     _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT = _typeProvider.nonSubtypableTypes;
+    _typeSystem = _currentLibrary.context.typeSystem;
   }
 
   @override
@@ -1360,7 +1366,8 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
     if (overriddenFTReturnType != VoidTypeImpl.instance &&
-        !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
+        !_typeSystem.isAssignableTo(
+            overridingFTReturnType, overriddenFTReturnType)) {
       _errorReporter.reportTypeErrorForNode(
           !isGetter
               ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE
@@ -1379,7 +1386,8 @@
     }
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
-      if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
+      if (!_typeSystem.isAssignableTo(
+          overridingNormalPT[i], overriddenNormalPT[i])) {
         _errorReporter.reportTypeErrorForNode(
             !isSetter
                 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
@@ -1396,8 +1404,8 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
     for (int i = 0; i < overriddenPositionalPT.length; i++) {
-      if (!overridingPositionalPT[i]
-          .isAssignableTo(overriddenPositionalPT[i])) {
+      if (!_typeSystem.isAssignableTo(
+          overridingPositionalPT[i], overriddenPositionalPT[i])) {
         _errorReporter.reportTypeErrorForNode(
             StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE,
             parameterLocations[parameterIndex], [
@@ -1419,7 +1427,7 @@
         continue;
       }
       DartType overriddenType = overriddenNamedPT[overriddenName];
-      if (!overriddenType.isAssignableTo(overridingType)) {
+      if (!_typeSystem.isAssignableTo(overriddenType, overridingType)) {
         // lookup the parameter for the error to select
         ParameterElement parameterToSelect = null;
         AstNode parameterLocationToSelect = null;
@@ -1746,7 +1754,8 @@
     //
     FunctionType constructorType = declaration.element.type;
     DartType constructorReturnType = constructorType.returnType;
-    if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
+    if (!_typeSystem.isAssignableTo(
+        redirectedReturnType, constructorReturnType)) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
           redirectedConstructor,
@@ -1756,7 +1765,7 @@
     //
     // Check parameters
     //
-    if (!redirectedType.isSubtypeOf(constructorType)) {
+    if (!_typeSystem.isSubtypeOf(redirectedType, constructorType)) {
       _errorReporter.reportErrorForNode(
           StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
           redirectedConstructor,
@@ -1803,8 +1812,8 @@
     // RETURN_WITHOUT_VALUE
     if (returnExpression == null) {
       if (_inGenerator ||
-          _computeReturnTypeForMethod(null)
-              .isAssignableTo(expectedReturnType)) {
+          _typeSystem.isAssignableTo(
+              _computeReturnTypeForMethod(null), expectedReturnType)) {
         return false;
       }
       _hasReturnWithoutValue = true;
@@ -1882,7 +1891,7 @@
     // Warning case: test static type information
     //
     if (actualStaticType != null && expectedStaticType != null) {
-      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+      if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
         _errorReporter.reportTypeErrorForNode(
             errorCode, expression, [actualStaticType, expectedStaticType]);
         return true;
@@ -1971,7 +1980,7 @@
     if (expressionType == null) {
       return false;
     }
-    if (expressionType.isAssignableTo(type)) {
+    if (_typeSystem.isAssignableTo(expressionType, type)) {
       return false;
     }
     _errorReporter.reportErrorForNode(errorCode, expression, arguments);
@@ -3191,6 +3200,11 @@
     if (typeName.isSynthetic) {
       return false;
     }
+    // The SDK implementation may implement disallowed types. For example,
+    // JSNumber in dart2js and _Smi in Dart VM both implement int.
+    if (_currentLibrary.source.isInSystemLibrary) {
+      return false;
+    }
     DartType superType = typeName.type;
     for (InterfaceType disallowedType
         in _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT) {
@@ -3250,7 +3264,7 @@
     if (staticType == null) {
       return false;
     }
-    if (staticType.isAssignableTo(fieldType)) {
+    if (_typeSystem.isAssignableTo(staticType, fieldType)) {
       return false;
     }
     // report problem
@@ -3400,22 +3414,22 @@
     }
     if (_enclosingFunction.isAsynchronous) {
       if (_enclosingFunction.isGenerator) {
-        if (!_enclosingFunction.returnType
-            .isAssignableTo(_typeProvider.streamDynamicType)) {
+        if (!_typeSystem.isAssignableTo(
+            _enclosingFunction.returnType, _typeProvider.streamDynamicType)) {
           _errorReporter.reportErrorForNode(
               StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE,
               returnType);
         }
       } else {
-        if (!_enclosingFunction.returnType
-            .isAssignableTo(_typeProvider.futureDynamicType)) {
+        if (!_typeSystem.isAssignableTo(
+            _enclosingFunction.returnType, _typeProvider.futureDynamicType)) {
           _errorReporter.reportErrorForNode(
               StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, returnType);
         }
       }
     } else if (_enclosingFunction.isGenerator) {
-      if (!_enclosingFunction.returnType
-          .isAssignableTo(_typeProvider.iterableDynamicType)) {
+      if (!_typeSystem.isAssignableTo(
+          _enclosingFunction.returnType, _typeProvider.iterableDynamicType)) {
         _errorReporter.reportErrorForNode(
             StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE,
             returnType);
@@ -3788,7 +3802,7 @@
         ? getStaticType(lhs)
         : leftVariableElement.type;
     DartType staticRightType = getStaticType(rhs);
-    if (!staticRightType.isAssignableTo(leftType)) {
+    if (!_typeSystem.isAssignableTo(staticRightType, leftType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.INVALID_ASSIGNMENT,
           rhs,
@@ -3822,7 +3836,7 @@
     if (leftType == null || rightType == null) {
       return false;
     }
-    if (!rightType.isAssignableTo(leftType)) {
+    if (!_typeSystem.isAssignableTo(rightType, leftType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
       return true;
@@ -4096,7 +4110,7 @@
     // (if the getter is null, it is dynamic which is assignable to everything).
     if (setterType != null &&
         getterType != null &&
-        !getterType.isAssignableTo(setterType)) {
+        !_typeSystem.isAssignableTo(getterType, setterType)) {
       if (enclosingClassForCounterpart == null) {
         _errorReporter.reportTypeErrorForNode(
             StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
@@ -4494,7 +4508,7 @@
           FunctionType requiredMemberFT = _inheritanceManager
               .substituteTypeArgumentsInMemberFromInheritance(
                   requiredMemberType, memberName, enclosingType);
-          if (foundConcreteFT.isSubtypeOf(requiredMemberFT)) {
+          if (_typeSystem.isSubtypeOf(foundConcreteFT, requiredMemberFT)) {
             continue;
           }
         }
@@ -4589,7 +4603,8 @@
    */
   bool _checkForNonBoolCondition(Expression condition) {
     DartType conditionType = getStaticType(condition);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+    if (conditionType != null &&
+        !_typeSystem.isAssignableTo(conditionType, _boolType)) {
       _errorReporter.reportErrorForNode(
           StaticTypeWarningCode.NON_BOOL_CONDITION, condition);
       return true;
@@ -4607,7 +4622,7 @@
     Expression expression = statement.condition;
     DartType type = getStaticType(expression);
     if (type is InterfaceType) {
-      if (!type.isAssignableTo(_boolType)) {
+      if (!_typeSystem.isAssignableTo(type, _boolType)) {
         _errorReporter.reportErrorForNode(
             StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
         return true;
@@ -4615,7 +4630,7 @@
     } else if (type is FunctionType) {
       FunctionType functionType = type;
       if (functionType.typeArguments.length == 0 &&
-          !functionType.returnType.isAssignableTo(_boolType)) {
+          !_typeSystem.isAssignableTo(functionType.returnType, _boolType)) {
         _errorReporter.reportErrorForNode(
             StaticTypeWarningCode.NON_BOOL_EXPRESSION, expression);
         return true;
@@ -4631,7 +4646,8 @@
    */
   bool _checkForNonBoolNegationExpression(Expression expression) {
     DartType conditionType = getStaticType(expression);
-    if (conditionType != null && !conditionType.isAssignableTo(_boolType)) {
+    if (conditionType != null &&
+        !_typeSystem.isAssignableTo(conditionType, _boolType)) {
       _errorReporter.reportErrorForNode(
           StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, expression);
       return true;
@@ -5027,7 +5043,7 @@
       ]);
       return true;
     }
-    if (staticReturnType.isAssignableTo(expectedReturnType)) {
+    if (_typeSystem.isAssignableTo(staticReturnType, expectedReturnType)) {
       return false;
     }
     _errorReporter.reportTypeErrorForNode(
@@ -5103,7 +5119,7 @@
       Expression caseExpression = switchCase.expression;
       DartType caseType = getStaticType(caseExpression);
       // check types
-      if (expressionType.isAssignableTo(caseType)) {
+      if (_typeSystem.isAssignableTo(expressionType, caseType)) {
         return false;
       }
       // report problem
@@ -5185,7 +5201,7 @@
             typeArguments.length == typeParameters.length) {
           boundType = boundType.substitute2(typeArguments, typeParameters);
         }
-        if (!argType.isSubtypeOf(boundType)) {
+        if (!_typeSystem.isSubtypeOf(argType, boundType)) {
           ErrorCode errorCode;
           if (_isInConstInstanceCreation) {
             errorCode = CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
@@ -5381,7 +5397,7 @@
                 [parameter.identifier.name]);
           } else if (declaredType != null &&
               fieldType != null &&
-              !declaredType.isAssignableTo(fieldType)) {
+              !_typeSystem.isAssignableTo(declaredType, fieldType)) {
             _errorReporter.reportTypeErrorForNode(
                 StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
                 parameter,
@@ -5542,7 +5558,7 @@
       impliedReturnType =
           _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]);
     }
-    if (!impliedReturnType.isAssignableTo(declaredReturnType)) {
+    if (!_typeSystem.isAssignableTo(impliedReturnType, declaredReturnType)) {
       _errorReporter.reportTypeErrorForNode(
           StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
           yieldExpression,
@@ -5559,7 +5575,7 @@
       } else {
         requiredReturnType = _typeProvider.iterableDynamicType;
       }
-      if (!impliedReturnType.isAssignableTo(requiredReturnType)) {
+      if (!_typeSystem.isAssignableTo(impliedReturnType, requiredReturnType)) {
         _errorReporter.reportTypeErrorForNode(
             StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
             yieldExpression,
@@ -5584,7 +5600,8 @@
     if (classElement == null) {
       return false;
     }
-    if (!classElement.type.isSubtypeOf(_typeProvider.functionType)) {
+    if (!_typeSystem.isSubtypeOf(
+        classElement.type, _typeProvider.functionType)) {
       return false;
     }
     // If there is a noSuchMethod method, then don't report the warning,
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 0341d59..46cd677 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -8,7 +8,7 @@
 import 'dart:math' as math;
 
 import 'package:analyzer/src/context/cache.dart'
-    show CacheEntry, Delta, DeltaResult, TargetedResult;
+    show CacheEntry, Delta, DeltaResult;
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/task/dart.dart';
@@ -857,6 +857,12 @@
   @override
   DeltaResult validate(InternalAnalysisContext context, AnalysisTarget target,
       ResultDescriptor descriptor) {
+    // A body change delta should never leak outside its source.
+    // It can cause invalidation of results (e.g. hints) in other sources,
+    // but only when a result in the updated source is INVALIDATE_NO_DELTA.
+    if (target.source != source) {
+      return DeltaResult.STOP;
+    }
     // don't invalidate results of standard Dart tasks
     bool isByTask(TaskDescriptor taskDescriptor) {
       return taskDescriptor.results.contains(descriptor);
@@ -864,6 +870,12 @@
     if (descriptor == CONTENT) {
       return DeltaResult.KEEP_CONTINUE;
     }
+    if (target is LibrarySpecificUnit && target.unit != source) {
+      if (isByTask(GatherUsedLocalElementsTask.DESCRIPTOR) ||
+          isByTask(GatherUsedImportedElementsTask.DESCRIPTOR)) {
+        return DeltaResult.KEEP_CONTINUE;
+      }
+    }
     if (isByTask(BuildCompilationUnitElementTask.DESCRIPTOR) ||
         isByTask(BuildDirectiveElementsTask.DESCRIPTOR) ||
         isByTask(BuildEnumMemberElementsTask.DESCRIPTOR) ||
@@ -874,9 +886,13 @@
         isByTask(BuildSourceImportExportClosureTask.DESCRIPTOR) ||
         isByTask(ComputeConstantDependenciesTask.DESCRIPTOR) ||
         isByTask(ComputeConstantValueTask.DESCRIPTOR) ||
+        isByTask(DartErrorsTask.DESCRIPTOR) ||
         isByTask(EvaluateUnitConstantsTask.DESCRIPTOR) ||
+        isByTask(GenerateHintsTask.DESCRIPTOR) ||
         isByTask(InferInstanceMembersInUnitTask.DESCRIPTOR) ||
         isByTask(InferStaticVariableTypesInUnitTask.DESCRIPTOR) ||
+        isByTask(LibraryErrorsReadyTask.DESCRIPTOR) ||
+        isByTask(LibraryUnitErrorsTask.DESCRIPTOR) ||
         isByTask(ParseDartTask.DESCRIPTOR) ||
         isByTask(PartiallyResolveUnitReferencesTask.DESCRIPTOR) ||
         isByTask(ScanDartTask.DESCRIPTOR) ||
@@ -889,7 +905,7 @@
       return DeltaResult.KEEP_CONTINUE;
     }
     // invalidate all the other results
-    return DeltaResult.INVALIDATE;
+    return DeltaResult.INVALIDATE_NO_DELTA;
   }
 }
 
@@ -914,6 +930,11 @@
   TypeProvider _typeProvider;
 
   /**
+   * The type system primitives.
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * The element for the library containing the compilation unit being resolved.
    */
   LibraryElementImpl _definingLibrary;
@@ -992,6 +1013,7 @@
     _source = _definingUnit.source;
     _context = _definingUnit.context;
     _typeProvider = _context.typeProvider;
+    _typeSystem = _context.typeSystem;
   }
 
   /**
@@ -1099,8 +1121,8 @@
     // compute values
     {
       CompilationUnit unit = node.getAncestor((n) => n is CompilationUnit);
-      ConstantValueComputer computer = new ConstantValueComputer(
-          _context, _typeProvider, _context.declaredVariables);
+      ConstantValueComputer computer = new ConstantValueComputer(_context,
+          _typeProvider, _context.declaredVariables, null, _typeSystem);
       computer.add(unit, _source, _librarySource);
       computer.computeValues();
     }
@@ -1241,9 +1263,14 @@
 
   void _updateCache() {
     if (newSourceEntry != null) {
-      newSourceEntry.setState(CONTENT, CacheState.INVALID,
-          delta: new IncrementalBodyDelta(_source, _updateOffset, _updateEndOld,
-              _updateEndNew, _updateDelta));
+      LoggingTimer timer = logger.startTimer();
+      try {
+        newSourceEntry.setState(CONTENT, CacheState.INVALID,
+            delta: new IncrementalBodyDelta(_source, _updateOffset,
+                _updateEndOld, _updateEndNew, _updateDelta));
+      } finally {
+        timer.stop('invalidate cache with delta');
+      }
     }
   }
 
@@ -1267,7 +1294,6 @@
 
   void _updateEntry_NEW() {
     _updateErrors_NEW(INFER_STATIC_VARIABLE_TYPES_ERRORS, _resolveErrors);
-    _updateErrors_NEW(LIBRARY_UNIT_ERRORS, _resolveErrors);
     _updateErrors_NEW(PARTIALLY_RESOLVE_REFERENCES_ERRORS, _resolveErrors);
     _updateErrors_NEW(RESOLVE_FUNCTION_BODIES_ERRORS, _resolveErrors);
     _updateErrors_NEW(RESOLVE_TYPE_NAMES_ERRORS, []);
@@ -1312,7 +1338,7 @@
       List<AnalysisError> newErrors) {
     List<AnalysisError> oldErrors = newUnitEntry.getValue(descriptor);
     List<AnalysisError> errors = _updateErrors(oldErrors, newErrors);
-    newUnitEntry.setValueIncremental(descriptor, errors);
+    newUnitEntry.setValueIncremental(descriptor, errors, true);
   }
 
   void _updateErrors_OLD(DataDescriptor<List<AnalysisError>> descriptor,
@@ -1685,21 +1711,12 @@
   }
 
   void _updateEntry_NEW() {
-    _newSourceEntry.setState(DART_ERRORS, CacheState.INVALID);
     // scan results
-    List<TargetedResult> scanDeps = <TargetedResult>[
-      new TargetedResult(_unitSource, CONTENT)
-    ];
-    _newSourceEntry.setState(SCAN_ERRORS, CacheState.INVALID);
-    _newSourceEntry.setValue(SCAN_ERRORS, _newScanErrors, scanDeps);
-    _newSourceEntry.setValue(LINE_INFO, _newLineInfo, scanDeps);
+    _newSourceEntry.setValueIncremental(SCAN_ERRORS, _newScanErrors, true);
+    _newSourceEntry.setValueIncremental(LINE_INFO, _newLineInfo, false);
     // parse results
-    List<TargetedResult> parseDeps = <TargetedResult>[
-      new TargetedResult(_unitSource, TOKEN_STREAM)
-    ];
-    _newSourceEntry.setState(PARSE_ERRORS, CacheState.INVALID);
-    _newSourceEntry.setValue(PARSE_ERRORS, _newParseErrors, parseDeps);
-    _newSourceEntry.setValue(PARSED_UNIT, _oldUnit, parseDeps);
+    _newSourceEntry.setValueIncremental(PARSE_ERRORS, _newParseErrors, true);
+    _newSourceEntry.setValueIncremental(PARSED_UNIT, _oldUnit, false);
   }
 
   void _updateEntry_OLD() {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 36d68f9..6061588 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -73,12 +73,19 @@
   final InterfaceType _futureNullType;
 
   /**
+   * The type system primitives
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * Create a new instance of the [BestPracticesVerifier].
    *
    * @param errorReporter the error reporter
    */
-  BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider)
-      : _futureNullType = typeProvider.futureNullType;
+  BestPracticesVerifier(this._errorReporter, TypeProvider typeProvider,
+      {TypeSystem typeSystem})
+      : _futureNullType = typeProvider.futureNullType,
+        _typeSystem = (typeSystem != null) ? typeSystem : new TypeSystemImpl();
 
   @override
   Object visitArgumentList(ArgumentList node) {
@@ -304,7 +311,7 @@
     // Warning case: test static type information
     //
     if (actualStaticType != null && expectedStaticType != null) {
-      if (!actualStaticType.isAssignableTo(expectedStaticType)) {
+      if (!_typeSystem.isAssignableTo(actualStaticType, expectedStaticType)) {
         // A warning was created in the ErrorVerifier, return false, don't
         // create a hint when a warning has already been created.
         return false;
@@ -320,7 +327,7 @@
     DartType actualBestType =
         actualPropagatedType != null ? actualPropagatedType : actualStaticType;
     if (actualBestType != null && expectedBestType != null) {
-      if (!actualBestType.isAssignableTo(expectedBestType)) {
+      if (!_typeSystem.isAssignableTo(actualBestType, expectedBestType)) {
         _errorReporter.reportTypeErrorForNode(
             hintCode, expression, [actualBestType, expectedBestType]);
         return true;
@@ -519,14 +526,14 @@
         ? ErrorVerifier.getStaticType(lhs)
         : leftVariableElement.type;
     DartType staticRightType = ErrorVerifier.getStaticType(rhs);
-    if (!staticRightType.isAssignableTo(leftType)) {
+    if (!_typeSystem.isAssignableTo(staticRightType, leftType)) {
       // The warning was generated on this rhs
       return false;
     }
     // Test for, and then generate the hint
     DartType bestRightType = rhs.bestType;
     if (leftType != null && bestRightType != null) {
-      if (!bestRightType.isAssignableTo(leftType)) {
+      if (!_typeSystem.isAssignableTo(bestRightType, leftType)) {
         _errorReporter.reportTypeErrorForNode(
             HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
         return true;
@@ -593,7 +600,8 @@
     }
     // For async, give no hint if Future<Null> is assignable to the return
     // type.
-    if (body.isAsynchronous && _futureNullType.isAssignableTo(returnTypeType)) {
+    if (body.isAsynchronous &&
+        _typeSystem.isAssignableTo(_futureNullType, returnTypeType)) {
       return false;
     }
     // Check the block for a return statement, if not, create the hint
@@ -839,6 +847,11 @@
   final TypeProvider _typeProvider;
 
   /**
+   * The type system in use.
+   */
+  final TypeSystem _typeSystem;
+
+  /**
    * The set of variables declared using '-D' on the command line.
    */
   final DeclaredVariables declaredVariables;
@@ -873,8 +886,10 @@
    *
    * @param errorReporter the error reporter by which errors will be reported
    */
-  ConstantVerifier(this._errorReporter, this._currentLibrary,
-      this._typeProvider, this.declaredVariables) {
+  ConstantVerifier(this._errorReporter, LibraryElement currentLibrary,
+      this._typeProvider, this.declaredVariables)
+      : _currentLibrary = currentLibrary,
+        _typeSystem = currentLibrary.context.typeSystem {
     this._boolType = _typeProvider.boolType;
     this._intType = _typeProvider.intType;
     this._numType = _typeProvider.numType;
@@ -932,7 +947,8 @@
       ConstructorElement constructor = node.staticElement;
       if (constructor != null) {
         ConstantEvaluationEngine evaluationEngine =
-            new ConstantEvaluationEngine(_typeProvider, declaredVariables);
+            new ConstantEvaluationEngine(_typeProvider, declaredVariables,
+                typeSystem: _typeSystem);
         ConstantVisitor constantVisitor =
             new ConstantVisitor(evaluationEngine, _errorReporter);
         evaluationEngine.evaluateConstructorCall(
@@ -1006,7 +1022,8 @@
         ErrorReporter subErrorReporter =
             new ErrorReporter(errorListener, _errorReporter.source);
         DartObjectImpl result = key.accept(new ConstantVisitor(
-            new ConstantEvaluationEngine(_typeProvider, declaredVariables),
+            new ConstantEvaluationEngine(_typeProvider, declaredVariables,
+                typeSystem: _typeSystem),
             subErrorReporter));
         if (result != null) {
           if (keys.contains(result)) {
@@ -1212,7 +1229,8 @@
     ErrorReporter subErrorReporter =
         new ErrorReporter(errorListener, _errorReporter.source);
     DartObjectImpl result = expression.accept(new ConstantVisitor(
-        new ConstantEvaluationEngine(_typeProvider, declaredVariables),
+        new ConstantEvaluationEngine(_typeProvider, declaredVariables,
+            typeSystem: _typeSystem),
         subErrorReporter));
     _reportErrors(errorListener.errors, errorCode);
     return result;
@@ -1320,8 +1338,8 @@
               ErrorReporter subErrorReporter =
                   new ErrorReporter(errorListener, _errorReporter.source);
               DartObjectImpl result = initializer.accept(new ConstantVisitor(
-                  new ConstantEvaluationEngine(
-                      _typeProvider, declaredVariables),
+                  new ConstantEvaluationEngine(_typeProvider, declaredVariables,
+                      typeSystem: _typeSystem),
                   subErrorReporter));
               if (result == null) {
                 _errorReporter.reportErrorForNode(
@@ -1350,7 +1368,8 @@
         new ErrorReporter(errorListener, _errorReporter.source);
     DartObjectImpl result = expression.accept(
         new _ConstantVerifier_validateInitializerExpression(_typeProvider,
-            subErrorReporter, this, parameterElements, declaredVariables));
+            subErrorReporter, this, parameterElements, declaredVariables,
+            typeSystem: _typeSystem));
     _reportErrors(errorListener.errors,
         CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER);
     if (result != null) {
@@ -1475,11 +1494,18 @@
   final ErrorReporter _errorReporter;
 
   /**
+   *  The type system for this visitor
+   */
+  final TypeSystem _typeSystem;
+
+  /**
    * Create a new instance of the [DeadCodeVerifier].
    *
    * @param errorReporter the error reporter
    */
-  DeadCodeVerifier(this._errorReporter);
+  DeadCodeVerifier(this._errorReporter, {TypeSystem typeSystem})
+      : this._typeSystem =
+            (typeSystem != null) ? typeSystem : new TypeSystemImpl();
 
   @override
   Object visitBinaryExpression(BinaryExpression node) {
@@ -1644,7 +1670,7 @@
             }
           }
           for (DartType type in visitedTypes) {
-            if (currentType.isSubtypeOf(type)) {
+            if (_typeSystem.isSubtypeOf(currentType, type)) {
               CatchClause lastCatchClause = catchClauses[numOfCatchClauses - 1];
               int offset = catchClause.offset;
               int length = lastCatchClause.end - offset;
@@ -4799,15 +4825,16 @@
     ErrorReporter errorReporter = new ErrorReporter(_errorListener, source);
     unit.accept(_usedImportedElementsVisitor);
     // dead code analysis
-    unit.accept(new DeadCodeVerifier(errorReporter));
+    unit.accept(
+        new DeadCodeVerifier(errorReporter, typeSystem: _context.typeSystem));
     unit.accept(_usedLocalElementsVisitor);
     // dart2js analysis
     if (_enableDart2JSHints) {
       unit.accept(new Dart2JSVerifier(errorReporter));
     }
     // Dart best practices
-    unit.accept(
-        new BestPracticesVerifier(errorReporter, _context.typeProvider));
+    unit.accept(new BestPracticesVerifier(errorReporter, _context.typeProvider,
+        typeSystem: _context.typeSystem));
     unit.accept(new OverrideVerifier(errorReporter, _manager));
     // Find to-do comments
     new ToDoFinder(errorReporter).findIn(unit);
@@ -6268,11 +6295,13 @@
               continue;
             }
             bool subtypeOfAllTypes = true;
+            TypeSystem typeSystem = _library.context.typeSystem;
             for (int j = 0;
                 j < numOfEltsWithMatchingNames && subtypeOfAllTypes;
                 j++) {
               if (i != j) {
-                if (!subtype.isSubtypeOf(executableElementTypes[j])) {
+                if (!typeSystem.isSubtypeOf(
+                    subtype, executableElementTypes[j])) {
                   subtypeOfAllTypes = false;
                   break;
                 }
@@ -7570,6 +7599,11 @@
   TypeProvider _typeProvider;
 
   /**
+   * The type system in use for the library
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
   HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
@@ -7612,6 +7646,11 @@
   TypeProvider get typeProvider => _typeProvider;
 
   /**
+   * The type system in use.
+   */
+  TypeSystem get typeSystem => _typeSystem;
+
+  /**
    * Create an object to represent the information about the library defined by the compilation unit
    * with the given source.
    *
@@ -7696,6 +7735,7 @@
     }
     _buildDirectiveModels();
     _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _typeSystem = TypeSystem.create(analysisContext);
     _buildTypeHierarchies();
     //
     // Perform resolution and type analysis.
@@ -7774,6 +7814,7 @@
     }
     _buildDirectiveModels();
     _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _typeSystem = TypeSystem.create(analysisContext);
     _buildEnumMembers();
     _buildTypeHierarchies();
     //
@@ -8286,7 +8327,11 @@
   void _performConstantEvaluation() {
     PerformanceStatistics.resolve.makeCurrentWhile(() {
       ConstantValueComputer computer = new ConstantValueComputer(
-          analysisContext, _typeProvider, analysisContext.declaredVariables);
+          analysisContext,
+          _typeProvider,
+          analysisContext.declaredVariables,
+          null,
+          _typeSystem);
       for (Library library in _librariesInCycles) {
         for (Source source in library.compilationUnitSources) {
           try {
@@ -8419,6 +8464,11 @@
   TypeProvider _typeProvider;
 
   /**
+   * The type system in use for the library
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
   HashMap<Source, ResolvableLibrary> _libraryMap =
@@ -8508,6 +8558,7 @@
     }
     _buildDirectiveModels();
     _typeProvider = new TypeProviderImpl(coreElement, asyncElement);
+    _typeSystem = TypeSystem.create(analysisContext);
     _buildEnumMembers();
     _buildTypeHierarchies();
     //
@@ -8781,7 +8832,11 @@
   void _performConstantEvaluation() {
     PerformanceStatistics.resolve.makeCurrentWhile(() {
       ConstantValueComputer computer = new ConstantValueComputer(
-          analysisContext, _typeProvider, analysisContext.declaredVariables);
+          analysisContext,
+          _typeProvider,
+          analysisContext.declaredVariables,
+          null,
+          _typeSystem);
       for (ResolvableLibrary library in _librariesInCycle) {
         for (ResolvableCompilationUnit unit
             in library.resolvableCompilationUnits) {
@@ -10227,6 +10282,11 @@
    */
   StaticTypeAnalyzer typeAnalyzer;
 
+  /*
+  * The type system in use during resolution.
+  */
+  TypeSystem typeSystem;
+
   /**
    * The class element representing the class containing the current node,
    * or `null` if the current node is not contained in a class.
@@ -10307,6 +10367,7 @@
       this._inheritanceManager = inheritanceManager;
     }
     this.elementResolver = new ElementResolver(this);
+    this.typeSystem = definingLibrary.context.typeSystem;
     if (typeAnalyzerFactory == null) {
       this.typeAnalyzer = new StaticTypeAnalyzer(this);
     } else {
@@ -14897,14 +14958,25 @@
  */
 abstract class TypeSystem {
   /**
-   * Return the [TypeProvider] associated with this [TypeSystem].
+   * Create either a strong mode or regular type system based on context.
    */
-  TypeProvider get typeProvider;
+  static TypeSystem create(AnalysisContext context) {
+    return (context.analysisOptions.strongMode)
+        ? new StrongTypeSystemImpl()
+        : new TypeSystemImpl();
+  }
 
   /**
    * Compute the least upper bound of two types.
    */
-  DartType getLeastUpperBound(DartType type1, DartType type2);
+  DartType getLeastUpperBound(
+      TypeProvider typeProvider, DartType type1, DartType type2);
+
+  /**
+   * Return `true` if the [leftType] is assignable to the [rightType] (that is,
+   * if leftType <==> rightType).
+   */
+  bool isAssignableTo(DartType leftType, DartType rightType);
 
   /**
    * Return `true` if the [leftType] is a subtype of the [rightType] (that is,
@@ -14917,13 +14989,11 @@
  * Implementation of [TypeSystem] using the rules in the Dart specification.
  */
 class TypeSystemImpl implements TypeSystem {
-  @override
-  final TypeProvider typeProvider;
-
-  TypeSystemImpl(this.typeProvider);
+  TypeSystemImpl();
 
   @override
-  DartType getLeastUpperBound(DartType type1, DartType type2) {
+  DartType getLeastUpperBound(
+      TypeProvider typeProvider, DartType type1, DartType type2) {
     // The least upper bound relation is reflexive.
     if (identical(type1, type2)) {
       return type1;
@@ -15002,11 +15072,323 @@
   }
 
   @override
+  bool isAssignableTo(DartType leftType, DartType rightType) {
+    return leftType.isAssignableTo(rightType);
+  }
+
+  @override
   bool isSubtypeOf(DartType leftType, DartType rightType) {
     return leftType.isSubtypeOf(rightType);
   }
 }
 
+typedef bool _GuardedSubtypeChecker<T>(T t1, T t2, Set<Element> visited);
+typedef bool _SubtypeChecker<T>(T t1, T t2);
+
+/**
+ * Implementation of [TypeSystem] using the strong mode rules.
+ * https://github.com/dart-lang/dev_compiler/blob/master/STRONG_MODE.md
+ */
+class StrongTypeSystemImpl implements TypeSystem {
+  StrongTypeSystemImpl();
+
+  final _specTypeSystem = new TypeSystemImpl();
+
+  @override
+  DartType getLeastUpperBound(
+      TypeProvider typeProvider, DartType type1, DartType type2) {
+    // TODO(leafp): Implement a strong mode version of this.
+    return _specTypeSystem.getLeastUpperBound(typeProvider, type1, type2);
+  }
+
+  // TODO(leafp): Document the rules in play here
+  @override
+  bool isAssignableTo(DartType toType, DartType fromType) {
+    // An actual subtype
+    if (isSubtypeOf(fromType, toType)) {
+      return true;
+    }
+
+    // Don't allow implicit downcasts between function types
+    // and call method objects, as these will almost always fail.
+    if ((fromType is FunctionType && _getCallMethodType(toType) != null) ||
+        (toType is FunctionType && _getCallMethodType(fromType) != null)) {
+      return false;
+    }
+
+    // If the subtype relation goes the other way, allow the implicit downcast.
+    // TODO(leafp): Emit warnings and hints for these in some way.
+    // TODO(leafp): Consider adding a flag to disable these?  Or just rely on
+    //   --warnings-as-errors?
+    if (isSubtypeOf(toType, fromType) ||
+        _specTypeSystem.isAssignableTo(toType, fromType)) {
+      // TODO(leafp): error if type is known to be exact (literal,
+      //  instance creation).
+      // TODO(leafp): Warn on composite downcast.
+      // TODO(leafp): hint on object/dynamic downcast.
+      // TODO(leafp): Consider allowing assignment casts.
+      return true;
+    }
+
+    return false;
+  }
+
+  bool _isBottom(DartType t, {bool dynamicIsBottom: false}) {
+    return (t.isDynamic && dynamicIsBottom) || t.isBottom;
+  }
+
+  bool _isTop(DartType t, {bool dynamicIsBottom: false}) {
+    return (t.isDynamic && !dynamicIsBottom) || t.isObject;
+  }
+
+  // Given a type t, if t is an interface type with a call method
+  // defined, return the function type for the call method, otherwise
+  // return null.
+  FunctionType _getCallMethodType(DartType t) {
+    if (t is InterfaceType) {
+      ClassElement element = t.element;
+      InheritanceManager manager = new InheritanceManager(element.library);
+      FunctionType callType = manager.lookupMemberType(t, "call");
+      return callType;
+    }
+    return null;
+  }
+
+  /**
+   * Check that [f1] is a subtype of [f2]. 
+   * [fuzzyArrows] indicates whether or not the f1 and f2 should be
+   * treated as fuzzy arrow types (and hence dynamic parameters to f2 treated
+   * as bottom).
+   */
+  bool _isFunctionSubtypeOf(FunctionType f1, FunctionType f2,
+      {bool fuzzyArrows: true}) {
+    final r1s = f1.normalParameterTypes;
+    final o1s = f1.optionalParameterTypes;
+    final n1s = f1.namedParameterTypes;
+    final r2s = f2.normalParameterTypes;
+    final o2s = f2.optionalParameterTypes;
+    final n2s = f2.namedParameterTypes;
+    final ret1 = f1.returnType;
+    final ret2 = f2.returnType;
+
+    // A -> B <: C -> D if C <: A and
+    // either D is void or B <: D
+    if (!ret2.isVoid && !isSubtypeOf(ret1, ret2)) {
+      return false;
+    }
+
+    // Reject if one has named and the other has optional
+    if (n1s.length > 0 && o2s.length > 0) {
+      return false;
+    }
+    if (n2s.length > 0 && o1s.length > 0) {
+      return false;
+    }
+
+    // Rebind _isSubtypeOf for convenience
+    _SubtypeChecker<DartType> parameterSubtype = (DartType t1, DartType t2) =>
+        _isSubtypeOf(t1, t2, null, dynamicIsBottom: fuzzyArrows);
+
+    // f2 has named parameters
+    if (n2s.length > 0) {
+      // Check that every named parameter in f2 has a match in f1
+      for (String k2 in n2s.keys) {
+        if (!n1s.containsKey(k2)) {
+          return false;
+        }
+        if (!parameterSubtype(n2s[k2], n1s[k2])) {
+          return false;
+        }
+      }
+    }
+    // If we get here, we either have no named parameters,
+    // or else the named parameters match and we have no optional
+    // parameters
+
+    // If f1 has more required parameters, reject
+    if (r1s.length > r2s.length) {
+      return false;
+    }
+
+    // If f2 has more required + optional parameters, reject
+    if (r2s.length + o2s.length > r1s.length + o1s.length) {
+      return false;
+    }
+
+    // The parameter lists must look like the following at this point
+    // where rrr is a region of required, and ooo is a region of optionals.
+    // f1: rrr ooo ooo ooo
+    // f2: rrr rrr ooo
+    int rr = r1s.length; // required in both
+    int or = r2s.length - r1s.length; // optional in f1, required in f2
+    int oo = o2s.length; // optional in both
+
+    for (int i = 0; i < rr; ++i) {
+      if (!parameterSubtype(r2s[i], r1s[i])) {
+        return false;
+      }
+    }
+    for (int i = 0, j = rr; i < or; ++i, ++j) {
+      if (!parameterSubtype(r2s[j], o1s[i])) {
+        return false;
+      }
+    }
+    for (int i = or, j = 0; i < oo; ++i, ++j) {
+      if (!parameterSubtype(o2s[j], o1s[i])) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  // Guard against loops in the class hierarchy
+  _GuardedSubtypeChecker<DartType> _guard(
+      _GuardedSubtypeChecker<DartType> check) {
+    return (DartType t1, DartType t2, Set<Element> visited) {
+      Element element = t1.element;
+      if (visited == null) {
+        visited = new HashSet<Element>();
+      }
+      if (element == null || !visited.add(element)) {
+        return false;
+      }
+      try {
+        return check(t1, t2, visited);
+      } finally {
+        visited.remove(element);
+      }
+    };
+  }
+
+  bool _isInterfaceSubtypeOf(
+      InterfaceType i1, InterfaceType i2, Set<Element> visited) {
+    // Guard recursive calls
+    _GuardedSubtypeChecker<InterfaceType> guardedInterfaceSubtype =
+        _guard(_isInterfaceSubtypeOf);
+
+    if (i1 == i2) {
+      return true;
+    }
+
+    if (i1.element == i2.element) {
+      List<DartType> tArgs1 = i1.typeArguments;
+      List<DartType> tArgs2 = i2.typeArguments;
+
+      assert(tArgs1.length == tArgs2.length);
+
+      for (int i = 0; i < tArgs1.length; i++) {
+        DartType t1 = tArgs1[i];
+        DartType t2 = tArgs2[i];
+        if (!isSubtypeOf(t1, t2)) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    if (i2.isDartCoreFunction && i1.element.getMethod("call") != null) {
+      return true;
+    }
+
+    if (i1.isObject) {
+      return false;
+    }
+
+    if (guardedInterfaceSubtype(i1.superclass, i2, visited)) {
+      return true;
+    }
+
+    for (final parent in i1.interfaces) {
+      if (guardedInterfaceSubtype(parent, i2, visited)) {
+        return true;
+      }
+    }
+
+    for (final parent in i1.mixins) {
+      if (guardedInterfaceSubtype(parent, i2, visited)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
+  bool _isSubtypeOf(DartType t1, DartType t2, Set<Element> visited,
+      {bool dynamicIsBottom: false}) {
+    // Guard recursive calls
+    _GuardedSubtypeChecker<DartType> guardedSubtype = _guard(_isSubtypeOf);
+
+    if (t1 == t2) {
+      return true;
+    }
+
+    // The types are void, dynamic, bottom, interface types, function types
+    // and type parameters.  We proceed by eliminating these different classes
+    // from consideration.
+
+    // Trivially true.
+    if (_isTop(t2, dynamicIsBottom: dynamicIsBottom) ||
+        _isBottom(t1, dynamicIsBottom: dynamicIsBottom)) {
+      return true;
+    }
+
+    // Trivially false.
+    if (_isTop(t1, dynamicIsBottom: dynamicIsBottom) ||
+        _isBottom(t2, dynamicIsBottom: dynamicIsBottom)) {
+      return false;
+    }
+
+    // S <: T where S is a type variable
+    //  T is not dynamic or object (handled above)
+    //  S != T (handled above)
+    //  So only true if bound of S is S' and
+    //  S' <: T
+    if (t1 is TypeParameterType) {
+      DartType bound = t1.element.bound;
+      if (bound == null) return false;
+      return guardedSubtype(bound, t2, visited);
+    }
+
+    if (t2 is TypeParameterType) {
+      return false;
+    }
+
+    if (t1.isVoid || t2.isVoid) {
+      return false;
+    }
+
+    // We've eliminated void, dynamic, bottom, and type parameters.  The only
+    // cases are the combinations of interface type and function type.
+
+    // A function type can only subtype an interface type if
+    // the interface type is Function
+    if (t1 is FunctionType && t2 is InterfaceType) {
+      return t2.isDartCoreFunction;
+    }
+
+    // An interface type can only subtype a function type if
+    // the interface type declares a call method with a type
+    // which is a super type of the function type.
+    if (t1 is InterfaceType && t2 is FunctionType) {
+      var callType = _getCallMethodType(t1);
+      return (callType != null) && _isFunctionSubtypeOf(callType, t2);
+    }
+
+    // Two interface types
+    if (t1 is InterfaceType && t2 is InterfaceType) {
+      return _isInterfaceSubtypeOf(t1, t2, visited);
+    }
+
+    return _isFunctionSubtypeOf(t1 as FunctionType, t2 as FunctionType);
+  }
+
+  // TODO(leafp): Document the rules in play here
+  @override
+  bool isSubtypeOf(DartType leftType, DartType rightType) {
+    return _isSubtypeOf(leftType, rightType, null);
+  }
+}
+
 /**
  * Instances of the class [UnusedLocalElementsVerifier] traverse an element
  * structure looking for cases of [HintCode.UNUSED_ELEMENT],
@@ -15409,13 +15791,19 @@
 
   List<ParameterElement> parameterElements;
 
+  TypeSystem _typeSystem;
+
   _ConstantVerifier_validateInitializerExpression(
       TypeProvider typeProvider,
       ErrorReporter errorReporter,
       this.verifier,
       this.parameterElements,
-      DeclaredVariables declaredVariables)
-      : super(new ConstantEvaluationEngine(typeProvider, declaredVariables),
+      DeclaredVariables declaredVariables,
+      {TypeSystem typeSystem})
+      : _typeSystem = (typeSystem != null) ? typeSystem : new TypeSystemImpl(),
+        super(
+            new ConstantEvaluationEngine(typeProvider, declaredVariables,
+                typeSystem: typeSystem),
             errorReporter);
 
   @override
@@ -15428,19 +15816,20 @@
           if (type.isDynamic) {
             return new DartObjectImpl(
                 verifier._typeProvider.objectType, DynamicState.DYNAMIC_STATE);
-          } else if (type.isSubtypeOf(verifier._boolType)) {
+          } else if (_typeSystem.isSubtypeOf(type, verifier._boolType)) {
             return new DartObjectImpl(
                 verifier._typeProvider.boolType, BoolState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(verifier._typeProvider.doubleType)) {
+          } else if (_typeSystem.isSubtypeOf(
+              type, verifier._typeProvider.doubleType)) {
             return new DartObjectImpl(
                 verifier._typeProvider.doubleType, DoubleState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(verifier._intType)) {
+          } else if (_typeSystem.isSubtypeOf(type, verifier._intType)) {
             return new DartObjectImpl(
                 verifier._typeProvider.intType, IntState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(verifier._numType)) {
+          } else if (_typeSystem.isSubtypeOf(type, verifier._numType)) {
             return new DartObjectImpl(
                 verifier._typeProvider.numType, NumState.UNKNOWN_VALUE);
-          } else if (type.isSubtypeOf(verifier._stringType)) {
+          } else if (_typeSystem.isSubtypeOf(type, verifier._stringType)) {
             return new DartObjectImpl(
                 verifier._typeProvider.stringType, StringState.UNKNOWN_VALUE);
           }
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 31bd28a..1a47516 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -272,6 +272,9 @@
    * @param columnNumber the one-based index of the column containing the character
    */
   LineInfo_Location(this.lineNumber, this.columnNumber);
+
+  @override
+  String toString() => '$lineNumber:$columnNumber';
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 3da6e37..0dcd014 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -58,6 +58,11 @@
   InterfaceType thisType;
 
   /**
+   * Are we running in strong mode or not.
+   */
+  bool _strongMode;
+
+  /**
    * The object keeping track of which elements have had their types overridden.
    */
   TypeOverrideManager _overrideManager;
@@ -80,10 +85,11 @@
    */
   StaticTypeAnalyzer(this._resolver) {
     _typeProvider = _resolver.typeProvider;
+    _typeSystem = _resolver.typeSystem;
     _dynamicType = _typeProvider.dynamicType;
     _overrideManager = _resolver.overrideManager;
     _promoteManager = _resolver.promoteManager;
-    _typeSystem = new TypeSystemImpl(_typeProvider);
+    _strongMode = _resolver.definingLibrary.context.analysisOptions.strongMode;
   }
 
   /**
@@ -306,9 +312,10 @@
   @override
   Object visitDeclaredIdentifier(DeclaredIdentifier node) {
     super.visitDeclaredIdentifier(node);
-    if (_resolver.definingLibrary.context.analysisOptions.strongMode) {
+    if (_strongMode) {
       _inferForEachLoopVariableType(node);
     }
+    return null;
   }
 
   /**
@@ -618,6 +625,15 @@
     // Check for special cases.
     bool needPropagatedType = true;
     String methodName = methodNameNode.name;
+    if (_strongMode) {
+      // TODO(leafp): Revisit this.  It's here to associate a type with the
+      // method name, which is important to the DDC backend (but apparently
+      // no-one else).  Not sure that there's a problem having this here, but
+      // it's a little ad hoc.
+      visitSimpleIdentifier(methodNameNode);
+
+      _inferMethodInvocation(node);
+    }
     if (methodName == "then") {
       Expression target = node.realTarget;
       if (target != null) {
@@ -882,8 +898,11 @@
     } else if (staticElement is VariableElement) {
       staticType = staticElement.type;
     }
-    _recordStaticType(prefixedIdentifier, staticType);
-    _recordStaticType(node, staticType);
+    if (!(_strongMode &&
+        _inferObjectAccess(node, staticType, prefixedIdentifier))) {
+      _recordStaticType(prefixedIdentifier, staticType);
+      _recordStaticType(node, staticType);
+    }
     Element propagatedElement = prefixedIdentifier.propagatedElement;
     // HACK: special case for object getters ([hashCode] and [runtimeType]) on
     // dynamic expressions. More special cases in [visitMethodInvocation].
@@ -1011,8 +1030,10 @@
     } else {
       // TODO(brianwilkerson) Report this internal error.
     }
-    _recordStaticType(propertyName, staticType);
-    _recordStaticType(node, staticType);
+    if (!(_strongMode && _inferObjectAccess(node, staticType, propertyName))) {
+      _recordStaticType(propertyName, staticType);
+      _recordStaticType(node, staticType);
+    }
     Element propagatedElement = propertyName.propagatedElement;
     DartType propagatedType = _overrideManager.getType(propagatedElement);
     if (propagatedElement is MethodElement) {
@@ -1194,7 +1215,7 @@
   @override
   Object visitVariableDeclaration(VariableDeclaration node) {
     Expression initializer = node.initializer;
-    if (_resolver.definingLibrary.context.analysisOptions.strongMode) {
+    if (_strongMode) {
       _inferLocalVariableType(node, initializer);
     }
     if (initializer != null) {
@@ -1226,7 +1247,7 @@
       staticType2 = _dynamicType;
     }
     DartType staticType =
-        _typeSystem.getLeastUpperBound(staticType1, staticType2);
+        _typeSystem.getLeastUpperBound(_typeProvider, staticType1, staticType2);
     if (staticType == null) {
       staticType = _dynamicType;
     }
@@ -1240,8 +1261,8 @@
       if (propagatedType2 == null) {
         propagatedType2 = staticType2;
       }
-      DartType propagatedType =
-          _typeSystem.getLeastUpperBound(propagatedType1, propagatedType2);
+      DartType propagatedType = _typeSystem.getLeastUpperBound(
+          _typeProvider, propagatedType1, propagatedType2);
       _resolver.recordPropagatedTypeIfBetter(node, propagatedType);
     }
   }
@@ -1291,7 +1312,7 @@
     if (body is BlockFunctionBody) {
       _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction visitor =
           new _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(
-              _typeSystem);
+              _typeProvider, _typeSystem);
       body.accept(visitor);
       return visitor.result;
     }
@@ -1655,6 +1676,12 @@
     return returnType;
   }
 
+  /**
+   * Given a declared identifier from a foreach loop, attempt to infer
+   * a type for it if one is not already present.  Inference is based
+   * on the type of the iterator or stream over which the foreach loop
+   * is defined.
+   */
   void _inferForEachLoopVariableType(DeclaredIdentifier loopVariable) {
     if (loopVariable != null &&
         loopVariable.type == null &&
@@ -1678,6 +1705,85 @@
     }
   }
 
+  /**
+   * Given a method invocation [node], attempt to infer a better
+   * type for the result.
+   */
+  bool _inferMethodInvocation(MethodInvocation node) {
+    return _inferMethodInvocationObject(node) ||
+        _inferMethodInvocationGeneric(node) ||
+        _inferMethodInvocationInlineJS(node);
+  }
+
+  /**
+   * Given a method invocation [node], attempt to infer a better
+   * type for the result using an ad-hoc list of psuedo-generic methods.
+   */
+  bool _inferMethodInvocationGeneric(MethodInvocation node) {
+    DartType inferredType = _matchGeneric(node);
+    // TODO(vsm): If the inferred type is not a subtype,
+    // should we use a GLB instead?
+    if (inferredType != null &&
+        _typeSystem.isSubtypeOf(inferredType, node.staticType)) {
+      _recordStaticType(node, inferredType);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given a method invocation [node], attempt to infer a better
+   * type for the result if it is an inline JS invocation
+   */
+  bool _inferMethodInvocationInlineJS(MethodInvocation node) {
+    Element e = node.methodName.staticElement;
+    if (e is FunctionElement &&
+        e.library.source.uri.toString() == 'dart:_foreign_helper' &&
+        e.name == 'JS') {
+      DartType returnType = _getFirstArgumentAsType(
+          _typeProvider.objectType.element.library, node.argumentList);
+      if (returnType != null) {
+        _recordStaticType(node, returnType);
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Given a method invocation [node], attempt to infer a better
+   * type for the result if the target is dynamic and the method
+   * being called is one of the object methods.
+   */
+  bool _inferMethodInvocationObject(MethodInvocation node) {
+    // Object methods called on dynamic targets can have their types improved.
+    String name = node.methodName.name;
+    MethodElement inferredElement =
+        _typeProvider.objectType.element.getMethod(name);
+    DartType inferredType = (inferredElement != null &&
+        !inferredElement.isStatic) ? inferredElement.type : null;
+    DartType nodeType = node.staticType;
+    if (nodeType != null &&
+        nodeType.isDynamic &&
+        inferredType is FunctionType &&
+        inferredType.parameters.isEmpty &&
+        node.argumentList.arguments.isEmpty &&
+        _typeProvider.nonSubtypableTypes.contains(inferredType.returnType)) {
+      //TODO(leafp): When we start marking dynamic calls for the backend, be
+      // sure that this does not get marked as dynamic.
+      _recordStaticType(node.methodName, inferredType);
+      _recordStaticType(node, inferredType.returnType);
+      return true;
+    }
+    return false;
+  }
+
+  /**
+   * Given a local variable declaration and its initializer, attempt to infer
+   * a type for the local variable declaration based on the initializer.
+   * Inference is only done if an explicit type is not present, and if
+   * inferring a type improves the type.
+   */
   void _inferLocalVariableType(
       VariableDeclaration node, Expression initializer) {
     if (initializer != null &&
@@ -1692,6 +1798,35 @@
   }
 
   /**
+   * Given a property access [node], where [target] is the target of the access
+   * and [id] is the property name being accessed, infer a type for the
+   * access itself and its constituent components if the access is to one of the
+   * methods or getters of the built in 'Object' type, and if the result type is
+   * a sealed type. Returns true if inference succeeded.
+   */
+  bool _inferObjectAccess(
+      Expression node, DartType nodeType, SimpleIdentifier id) {
+    // Search for Object accesses.
+    String name = id.name;
+    PropertyAccessorElement inferredElement =
+        _typeProvider.objectType.element.getGetter(name);
+    DartType inferredType = (inferredElement != null &&
+        !inferredElement.isStatic) ? inferredElement.type.returnType : null;
+    if (nodeType != null &&
+        nodeType.isDynamic &&
+        inferredType != null &&
+        _typeProvider.nonSubtypableTypes.contains(inferredType)) {
+      // TODO(leafp): Eliminate the dynamic call here once we start
+      // annotating dynamic calls from this code.  Even if the type is not
+      // sealed we can eliminate the dynamic call.
+      _recordStaticType(id, inferredType);
+      _recordStaticType(node, inferredType);
+      return true;
+    }
+    return false;
+  }
+
+  /**
    * Return `true` if the given [Type] is the `Future` form the 'dart:async'
    * library.
    */
@@ -1736,6 +1871,91 @@
   }
 
   /**
+   * Return a more specialized type for a method invocation based on
+   * an ad-hoc list of pseudo-generic methids.
+   */
+  DartType _matchGeneric(MethodInvocation node) {
+    Element e = node.methodName.staticElement;
+
+    if (e == null || e.name == null) {
+      return null;
+    }
+
+    List<DartType> arguments =
+        node.argumentList.arguments.map((arg) => arg.staticType).toList();
+
+    bool matchInvocation(DartType t, int c) {
+      return (node.realTarget != null) &&
+          node.realTarget.staticType.isSubtypeOf(t) &&
+          arguments.length == c;
+    }
+
+    switch (e.name) {
+      case 'max':
+      case 'min':
+        if (e.library.source.uri.toString() == 'dart:math' &&
+            arguments.length == 2) {
+          DartType tx = arguments[0];
+          DartType ty = arguments[1];
+          if (tx == ty && tx == _typeProvider.intType ||
+              tx == _typeProvider.doubleType) {
+            return tx;
+          }
+        }
+        return null;
+      case 'wait':
+        if (matchInvocation(_typeProvider.futureType, 1)) {
+          DartType tx = arguments[0];
+          // Iterable<Future<T>> -> Future<List<T>>
+          DartType futureType =
+              _findIteratedType(tx, _typeProvider.iterableType);
+          if (futureType.element != _typeProvider.futureType.element) {
+            return null;
+          }
+          List<DartType> typeArguments =
+              (futureType as InterfaceType).typeArguments;
+          if (typeArguments.length != 1) {
+            return null;
+          }
+          DartType baseType = typeArguments[0];
+          if (baseType.isDynamic) {
+            return null;
+          }
+          return _typeProvider.futureType.substitute4([
+            _typeProvider.listType.substitute4([baseType])
+          ]);
+        }
+        return null;
+      case 'map':
+        if (matchInvocation(_typeProvider.iterableDynamicType, 1)) {
+          DartType tx = arguments[0];
+          return (tx is FunctionType)
+              ? _typeProvider.iterableType.substitute4([tx.returnType])
+              : null;
+        }
+        return null;
+      case 'fold':
+        if (matchInvocation(_typeProvider.iterableDynamicType, 2)) {
+          DartType tx = arguments[0];
+          DartType ty = arguments[1];
+          // TODO(vsm): LUB?
+          return (ty is FunctionType && tx == ty.returnType) ? tx : null;
+        }
+        return null;
+      case 'then':
+        if (matchInvocation(_typeProvider.futureDynamicType, 1)) {
+          DartType tx = arguments[0];
+          return (tx is FunctionType)
+              ? _typeProvider.futureType.substitute4([tx.returnType])
+              : null;
+        }
+        return null;
+      default:
+        return null;
+    }
+  }
+
+  /**
    * Record that the propagated type of the given node is the given type.
    *
    * @param expression the node whose type is to be recorded
@@ -2029,10 +2249,12 @@
 
 class _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction
     extends GeneralizingAstVisitor<Object> {
-  final TypeSystem typeSystem;
+  final TypeSystem _typeSystem;
+  final TypeProvider _typeProvider;
   DartType result = null;
 
-  _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(this.typeSystem);
+  _StaticTypeAnalyzer_computePropagatedReturnTypeOfFunction(
+      this._typeProvider, this._typeSystem);
 
   @override
   Object visitExpression(Expression node) => null;
@@ -2051,7 +2273,7 @@
     if (result == null) {
       result = type;
     } else {
-      result = typeSystem.getLeastUpperBound(result, type);
+      result = _typeSystem.getLeastUpperBound(_typeProvider, result, type);
     }
     return null;
   }
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index 58d7bae..9539d41 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -346,6 +346,40 @@
       functionElement4(
           functionName, null, normalParameters, names, namedParameters);
 
+  static FunctionElementImpl functionElement8(
+      List<DartType> parameters, DartType returnType,
+      {List<DartType> optional, Map<String, DartType> named}) {
+    List<ParameterElement> parameterElements = new List<ParameterElement>();
+    for (int i = 0; i < parameters.length; i++) {
+      ParameterElementImpl parameterElement =
+          new ParameterElementImpl("a$i", i);
+      parameterElement.type = parameters[i];
+      parameterElement.parameterKind = ParameterKind.REQUIRED;
+      parameterElements.add(parameterElement);
+    }
+    if (optional != null) {
+      int j = parameters.length;
+      for (int i = 0; i < optional.length; i++) {
+        ParameterElementImpl parameterElement =
+            new ParameterElementImpl("o$i", j);
+        parameterElement.type = optional[i];
+        parameterElement.parameterKind = ParameterKind.POSITIONAL;
+        parameterElements.add(parameterElement);
+        j++;
+      }
+    } else if (named != null) {
+      int j = parameters.length;
+      for (String s in named.keys) {
+        ParameterElementImpl parameterElement = new ParameterElementImpl(s, j);
+        parameterElement.type = named[s];
+        parameterElement.parameterKind = ParameterKind.NAMED;
+        parameterElements.add(parameterElement);
+      }
+    }
+
+    return functionElementWithParameters("f", returnType, parameterElements);
+  }
+
   static FunctionElementImpl functionElementWithParameters(String functionName,
       DartType returnType, List<ParameterElement> parameters) {
     FunctionElementImpl functionElement =
diff --git a/pkg/analyzer/lib/src/plugin/plugin_configuration.dart b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
new file mode 100644
index 0000000..b3a1d90
--- /dev/null
+++ b/pkg/analyzer/lib/src/plugin/plugin_configuration.dart
@@ -0,0 +1,119 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.src.plugin.plugin_configuration;
+
+import 'package:analyzer/plugin/options.dart';
+import 'package:yaml/yaml.dart';
+
+const _analyzerOptionScope = 'analyzer';
+
+const _pluginOptionScope = 'plugins';
+
+PluginInfo _processPluginMapping(dynamic name, dynamic details) {
+  if (name is String) {
+    if (details is String) {
+      return new PluginInfo(name: name, version: details);
+    }
+    if (details is YamlMap) {
+      return new PluginInfo(
+          name: name,
+          version: details['version'],
+          className: details['class_name'],
+          libraryUri: details['library_uri'],
+          packageName: details['package_name'],
+          path: details['path']);
+    }
+  }
+
+  return null;
+}
+
+PluginInfo _processPluginNode(dynamic node) {
+  if (node is String) {
+    return new PluginInfo(name: node);
+  }
+  if (node is YamlMap) {
+    if (node.length == 1) {
+      return new PluginInfo(name: node.keys.first, version: node.values.first);
+    }
+  }
+  return null;
+}
+
+typedef ErrorHandler(Exception);
+
+/// Describes plugin configuration information as extracted from an
+/// analysis options map.
+class PluginConfig {
+  final Iterable<PluginInfo> plugins;
+  PluginConfig(this.plugins);
+
+  /// Create a plugin configuration from an options map.
+  factory PluginConfig.fromOptions(Map<String, YamlNode> options) {
+    List<PluginInfo> plugins = [];
+    var analyzerOptions = options[_analyzerOptionScope];
+    if (analyzerOptions != null) {
+      if (analyzerOptions is YamlMap) {
+        var pluginConfig = analyzerOptions[_pluginOptionScope];
+        if (pluginConfig is YamlMap) {
+          pluginConfig.forEach((name, details) {
+            var plugin = _processPluginMapping(name, details);
+            if (plugin != null) {
+              plugins.add(plugin);
+            }
+          });
+        } else {
+          var plugin = _processPluginNode(pluginConfig);
+          if (plugin != null) {
+            plugins.add(plugin);
+          }
+        }
+      }
+    }
+
+    return new PluginConfig(plugins);
+  }
+}
+
+/// Extracts plugin config details from analysis options.
+class PluginConfigOptionsProcessor extends OptionsProcessor {
+  final ErrorHandler _errorHandler;
+
+  PluginConfig _config;
+
+  PluginConfigOptionsProcessor([this._errorHandler]);
+
+  /// The processed plugin config.
+  PluginConfig get config => _config;
+
+  @override
+  void onError(Exception exception) {
+    if (_errorHandler != null) {
+      _errorHandler(exception);
+    }
+  }
+
+  @override
+  void optionsProcessed(Map<String, YamlNode> options) {
+    _config = new PluginConfig.fromOptions(options);
+  }
+}
+
+/// Describes plugin information.
+class PluginInfo {
+  final String name;
+  final String className;
+  final String version;
+  final String libraryUri;
+  final String packageName;
+  final String path;
+  PluginInfo(
+      {this.name,
+      this.version,
+      this.className,
+      this.libraryUri,
+      this.packageName,
+      this.path});
+}
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 88a5637..a21d94b 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -1519,7 +1519,8 @@
     // Compute dependencies.
     //
     List<ConstantEvaluationTarget> dependencies = <ConstantEvaluationTarget>[];
-    new ConstantEvaluationEngine(typeProvider, context.declaredVariables)
+    new ConstantEvaluationEngine(typeProvider, context.declaredVariables,
+            typeSystem: context.typeSystem)
         .computeDependencies(constant, dependencies.add);
     //
     // Record outputs.
@@ -1610,7 +1611,8 @@
     // cycle.
     //
     ConstantEvaluationEngine constantEvaluationEngine =
-        new ConstantEvaluationEngine(typeProvider, context.declaredVariables);
+        new ConstantEvaluationEngine(typeProvider, context.declaredVariables,
+            typeSystem: context.typeSystem);
     if (dependencyCycle == null) {
       constantEvaluationEngine.computeConstantValue(constant);
     } else {
@@ -2342,10 +2344,12 @@
         getRequiredInput(USED_LOCAL_ELEMENTS_INPUT);
     CompilationUnitElement unitElement = unit.element;
     LibraryElement libraryElement = unitElement.library;
+    TypeSystem typeSystem = context.typeSystem;
+
     //
     // Generate errors.
     //
-    unit.accept(new DeadCodeVerifier(errorReporter));
+    unit.accept(new DeadCodeVerifier(errorReporter, typeSystem: typeSystem));
     // Verify imports.
     {
       ImportsVerifier verifier = new ImportsVerifier();
@@ -2370,7 +2374,9 @@
     InheritanceManager inheritanceManager =
         new InheritanceManager(libraryElement);
     TypeProvider typeProvider = getRequiredInput(TYPE_PROVIDER_INPUT);
-    unit.accept(new BestPracticesVerifier(errorReporter, typeProvider));
+
+    unit.accept(new BestPracticesVerifier(errorReporter, typeProvider,
+        typeSystem: typeSystem));
     unit.accept(new OverrideVerifier(errorReporter, inheritanceManager));
     // Find to-do comments.
     new ToDoFinder(errorReporter).findIn(unit);
@@ -2459,8 +2465,8 @@
     // Infer instance members.
     //
     if (context.analysisOptions.strongMode) {
-      InstanceMemberInferrer inferrer =
-          new InstanceMemberInferrer(typeProvider);
+      InstanceMemberInferrer inferrer = new InstanceMemberInferrer(typeProvider,
+          typeSystem: context.typeSystem);
       inferrer.inferCompilationUnit(unit.element);
     }
     //
diff --git a/pkg/analyzer/lib/src/task/html.dart b/pkg/analyzer/lib/src/task/html.dart
index d169560..0ab546a 100644
--- a/pkg/analyzer/lib/src/task/html.dart
+++ b/pkg/analyzer/lib/src/task/html.dart
@@ -13,7 +13,6 @@
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/plugin/engine_plugin.dart';
-import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/general.dart';
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
@@ -280,7 +279,7 @@
       'ParseHtmlTask',
       createTask,
       buildInputs,
-      <ResultDescriptor>[HTML_DOCUMENT, HTML_DOCUMENT_ERRORS]);
+      <ResultDescriptor>[HTML_DOCUMENT, HTML_DOCUMENT_ERRORS, LINE_INFO]);
 
   /**
    * Initialize a newly created task to access the content of the source
@@ -312,10 +311,14 @@
         new AnalysisError(
             target.source, 0, 0, ScannerErrorCode.UNABLE_GET_CONTENT, [message])
       ];
+      outputs[LINE_INFO] = new LineInfo(<int>[0]);
     } else {
       HtmlParser parser = new HtmlParser(content, generateSpans: true);
       parser.compatMode = 'quirks';
       Document document = parser.parse();
+      //
+      // Convert errors.
+      //
       List<ParseError> parseErrors = parser.errors;
       List<AnalysisError> errors = <AnalysisError>[];
       for (ParseError parseError in parseErrors) {
@@ -323,9 +326,12 @@
         errors.add(new AnalysisError(target.source, span.start.offset,
             span.length, HtmlErrorCode.PARSE_ERROR, [parseError.message]));
       }
-
+      //
+      // Record outputs.
+      //
       outputs[HTML_DOCUMENT] = document;
       outputs[HTML_DOCUMENT_ERRORS] = errors;
+      outputs[LINE_INFO] = _computeLineInfo(content);
     }
   }
 
@@ -345,6 +351,19 @@
       AnalysisContext context, AnalysisTarget target) {
     return new ParseHtmlTask(context, target);
   }
+
+  /**
+   * Compute [LineInfo] for the given [content].
+   */
+  static LineInfo _computeLineInfo(String content) {
+    List<int> lineStarts = <int>[0];
+    for (int index = 0; index < content.length; index++) {
+      if (content.codeUnitAt(index) == 0x0A) {
+        lineStarts.add(index + 1);
+      }
+    }
+    return new LineInfo(lineStarts);
+  }
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/task/html_work_manager.dart b/pkg/analyzer/lib/src/task/html_work_manager.dart
index faedfb2..218b48a 100644
--- a/pkg/analyzer/lib/src/task/html_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/html_work_manager.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/utilities_collection.dart';
-import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/task/html.dart';
 import 'package:analyzer/task/model.dart';
@@ -133,12 +132,10 @@
     // Try to find a new HTML file to analyze.
     while (sourceQueue.isNotEmpty) {
       Source htmlSource = sourceQueue.first;
-      // Maybe done with this library.
       if (!_needsComputing(htmlSource, HTML_ERRORS)) {
         sourceQueue.remove(htmlSource);
         continue;
       }
-      // Analyze this library.
       return new TargetedResult(htmlSource, HTML_ERRORS);
     }
     // No results to compute.
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index a78d590..2db9914 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -112,9 +112,8 @@
   /**
    * Initialize a newly create inferrer.
    */
-  InstanceMemberInferrer(this.typeProvider) {
-    typeSystem = new TypeSystemImpl(typeProvider);
-  }
+  InstanceMemberInferrer(this.typeProvider, {TypeSystem typeSystem})
+      : typeSystem = (typeSystem != null) ? typeSystem : new TypeSystemImpl();
 
   /**
    * Infer type information for all of the instance members in the given
diff --git a/pkg/analyzer/lib/task/model.dart b/pkg/analyzer/lib/task/model.dart
index 833a6d3..018b349 100644
--- a/pkg/analyzer/lib/task/model.dart
+++ b/pkg/analyzer/lib/task/model.dart
@@ -591,6 +591,11 @@
   /**
    * Return the next [TargetedResult] that this work manager wants to be
    * computed, or `null` if this manager doesn't need any new results.
+   *
+   * Note, that it is not guaranteed that this result will be computed, it is
+   * up to the work manager to check whether the result is already computed
+   * (for example during the next [getNextResult] invocation) or computation
+   * of the same result should be requested again.
    */
   TargetedResult getNextResult();
 
diff --git a/pkg/analyzer/test/generated/all_the_rest_test.dart b/pkg/analyzer/test/generated/all_the_rest_test.dart
index 9765af9..e3edac3 100644
--- a/pkg/analyzer/test/generated/all_the_rest_test.dart
+++ b/pkg/analyzer/test/generated/all_the_rest_test.dart
@@ -868,8 +868,9 @@
     NodeList<VariableDeclaration> variables =
         (declaration as TopLevelVariableDeclaration).variables.variables;
     expect(variables, hasLength(1));
-    ConstantEvaluator evaluator =
-        new ConstantEvaluator(source, analysisContext.typeProvider);
+    ConstantEvaluator evaluator = new ConstantEvaluator(
+        source, analysisContext.typeProvider,
+        typeSystem: analysisContext.typeSystem);
     return evaluator.evaluate(variables[0].initializer);
   }
 }
@@ -2362,7 +2363,8 @@
         analysisContext2,
         analysisContext2.typeProvider,
         analysisContext2.declaredVariables,
-        validator);
+        validator,
+        analysisContext2.typeSystem);
     return validator.computer;
   }
 
@@ -2394,7 +2396,8 @@
         0,
         expression.accept(new ConstantVisitor(
             new ConstantEvaluationEngine(
-                new TestTypeProvider(), new DeclaredVariables()),
+                new TestTypeProvider(), new DeclaredVariables(),
+                typeSystem: new TypeSystemImpl()),
             errorReporter)));
     errorListener.assertNoErrors();
   }
@@ -2410,7 +2413,8 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(new ConstantVisitor(
         new ConstantEvaluationEngine(
-            new TestTypeProvider(), new DeclaredVariables()),
+            new TestTypeProvider(), new DeclaredVariables(),
+            typeSystem: new TypeSystemImpl()),
         errorReporter));
     expect(result, isNull);
     errorListener
@@ -2427,7 +2431,8 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(new ConstantVisitor(
         new ConstantEvaluationEngine(
-            new TestTypeProvider(), new DeclaredVariables()),
+            new TestTypeProvider(), new DeclaredVariables(),
+            typeSystem: new TypeSystemImpl()),
         errorReporter));
     expect(result, isNull);
     errorListener
@@ -2444,7 +2449,8 @@
         new ErrorReporter(errorListener, _dummySource());
     DartObjectImpl result = expression.accept(new ConstantVisitor(
         new ConstantEvaluationEngine(
-            new TestTypeProvider(), new DeclaredVariables()),
+            new TestTypeProvider(), new DeclaredVariables(),
+            typeSystem: new TypeSystemImpl()),
         errorReporter));
     expect(result, isNull);
     errorListener
@@ -2463,7 +2469,8 @@
         1,
         expression.accept(new ConstantVisitor(
             new ConstantEvaluationEngine(
-                new TestTypeProvider(), new DeclaredVariables()),
+                new TestTypeProvider(), new DeclaredVariables(),
+                typeSystem: new TypeSystemImpl()),
             errorReporter)));
     errorListener.assertNoErrors();
   }
@@ -2536,7 +2543,8 @@
     GatheringErrorListener errorListener = new GatheringErrorListener();
     ErrorReporter errorReporter = new ErrorReporter(errorListener, source);
     DartObjectImpl result = expression.accept(new ConstantVisitor(
-        new ConstantEvaluationEngine(typeProvider, new DeclaredVariables()),
+        new ConstantEvaluationEngine(typeProvider, new DeclaredVariables(),
+            typeSystem: typeSystem),
         errorReporter,
         lexicalEnvironment: lexicalEnvironment));
     errorListener.assertNoErrors();
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index 4f8142a..e7c2025 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -1697,7 +1697,7 @@
 
   void test_visitAwaitExpression() {
     _assertSource(
-        "await e;", AstFactory.awaitExpression(AstFactory.identifier3("e")));
+        "await e", AstFactory.awaitExpression(AstFactory.identifier3("e")));
   }
 
   void test_visitBinaryExpression() {
diff --git a/pkg/analyzer/test/generated/engine_test.dart b/pkg/analyzer/test/generated/engine_test.dart
index e4746a4..310df94 100644
--- a/pkg/analyzer/test/generated/engine_test.dart
+++ b/pkg/analyzer/test/generated/engine_test.dart
@@ -5818,6 +5818,12 @@
   }
 
   @override
+  TypeSystem get typeSystem {
+    fail("Unexpected invocation of getTypeSystem");
+    return null;
+  }
+
+  @override
   TypeResolverVisitorFactory get typeResolverVisitorFactory {
     fail("Unexpected invocation of getTypeResolverVisitorFactory");
     return null;
diff --git a/pkg/analyzer/test/generated/incremental_resolver_test.dart b/pkg/analyzer/test/generated/incremental_resolver_test.dart
index a60941b..18a45f6 100644
--- a/pkg/analyzer/test/generated/incremental_resolver_test.dart
+++ b/pkg/analyzer/test/generated/incremental_resolver_test.dart
@@ -3435,11 +3435,19 @@
 ''');
   }
 
+  @override
   void setUp() {
+    AnalysisEngine.instance.useTaskModel = true;
     super.setUp();
     _resetWithIncremental(true);
   }
 
+  @override
+  void tearDown() {
+    super.tearDown();
+    AnalysisEngine.instance.useTaskModel = false;
+  }
+
   void test_computeConstants() {
     _resolveUnit(r'''
 int f() => 0;
@@ -4160,6 +4168,28 @@
 ''');
   }
 
+  void test_true_todoHint() {
+    _resolveUnit(r'''
+main() {
+  print(1);
+}
+foo() {
+ // TODO
+}
+''');
+    List<AnalysisError> oldErrors = analysisContext.computeErrors(source);
+    _updateAndValidate(r'''
+main() {
+  print(2);
+}
+foo() {
+ // TODO
+}
+''');
+    List<AnalysisError> newErrors = analysisContext.computeErrors(source);
+    _assertEqualErrors(newErrors, oldErrors);
+  }
+
   void test_unusedHint_add_wasUsedOnlyInPart() {
     Source partSource = addNamedSource(
         '/my_unit.dart',
@@ -4468,8 +4498,10 @@
       expect(newUnit.element, isNot(same(oldUnitElement)));
       return;
     }
-    // The existing CompilationUnitElement should be updated.
+    // The existing CompilationUnit[Element] should be updated.
+    expect(newUnit, same(oldUnit));
     expect(newUnit.element, same(oldUnitElement));
+    expect(analysisContext.parseCompilationUnit(source), same(oldUnit));
     // The only expected pending task should return the same resolved
     // "newUnit", so all clients will get it using the usual way.
     AnalysisResult analysisResult = analysisContext.performAnalysisTask();
diff --git a/pkg/analyzer/test/generated/java_io_test.dart b/pkg/analyzer/test/generated/java_io_test.dart
index 0a46feb..2bd611d 100644
--- a/pkg/analyzer/test/generated/java_io_test.dart
+++ b/pkg/analyzer/test/generated/java_io_test.dart
@@ -4,8 +4,6 @@
 
 library engine.java_io_test;
 
-import 'dart:io';
-
 import 'package:analyzer/src/generated/java_io.dart';
 import 'package:unittest/unittest.dart';
 
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index f5153cf..9027440 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -68,6 +68,7 @@
   runReflectiveTests(SimpleResolverTest);
   runReflectiveTests(StrictModeTest);
   runReflectiveTests(TypePropagationTest);
+  runReflectiveTests(StrongModeStaticTypeAnalyzer2Test);
   runReflectiveTests(StrongModeTypePropagationTest);
 }
 
@@ -193,7 +194,6 @@
     // Future
     ClassElementImpl futureElement =
         ElementFactory.classElement2("Future", ["T"]);
-    InterfaceType futureType = futureElement.type;
     //   factory Future.value([value])
     ConstructorElementImpl futureConstructor =
         ElementFactory.constructorElement2(futureElement, "value");
@@ -218,8 +218,10 @@
     FunctionTypeImpl aliasType = new FunctionTypeImpl.forTypedef(aliasElement);
     aliasElement.shareTypeParameters(futureElement.typeParameters);
     aliasType.typeArguments = futureElement.type.typeArguments;
+    DartType futureDynamicType =
+        futureElement.type.substitute4([provider.dynamicType]);
     MethodElement thenMethod = ElementFactory.methodElementWithParameters(
-        "then", futureElement.type.typeArguments, futureType, [
+        "then", futureElement.type.typeArguments, futureDynamicType, [
       ElementFactory.requiredParameter2("onValue", aliasType),
       ElementFactory.namedParameter2("onError", provider.functionType)
     ]);
@@ -338,6 +340,11 @@
         ClassElement.EMPTY_LIST);
     TopLevelVariableElement ln10Element = ElementFactory
         .topLevelVariableElement3("LN10", true, false, provider.doubleType);
+    FunctionElement maxElement = ElementFactory.functionElement3(
+        "max",
+        provider.numType.element,
+        <ClassElement>[provider.numType.element, provider.numType.element],
+        ClassElement.EMPTY_LIST);
     TopLevelVariableElement piElement = ElementFactory.topLevelVariableElement3(
         "PI", true, false, provider.doubleType);
     ClassElementImpl randomElement = ElementFactory.classElement2("Random");
@@ -364,7 +371,12 @@
       ln10Element.getter,
       piElement.getter
     ];
-    mathUnit.functions = <FunctionElement>[cosElement, sinElement, sqrtElement];
+    mathUnit.functions = <FunctionElement>[
+      cosElement,
+      maxElement,
+      sinElement,
+      sqrtElement
+    ];
     mathUnit.topLevelVariables = <TopLevelVariableElement>[
       ln10Element,
       piElement
@@ -7894,6 +7906,13 @@
   TypeProvider get typeProvider => analysisContext2.typeProvider;
 
   /**
+   * Return a type system that can be used to test the results of resolution.
+   *
+   * @return a type system
+   */
+  TypeSystem get typeSystem => analysisContext2.typeSystem;
+
+  /**
    * Add a source file to the content provider. The file path should be absolute.
    *
    * @param filePath the path of the file being added
@@ -9955,14 +9974,35 @@
 }
 
 /**
- * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
+ * Shared infrastructure for [StaticTypeAnalyzer2Test] and
+ * [StrongModeStaticTypeAnalyzer2Test].
  */
-@reflectiveTest
-class StaticTypeAnalyzer2Test extends ResolverTestCase {
+class _StaticTypeAnalyzer2TestShared extends ResolverTestCase {
   String testCode;
   Source testSource;
   CompilationUnit testUnit;
 
+  SimpleIdentifier _findIdentifier(String search) {
+    SimpleIdentifier identifier = EngineTestCase.findNode(
+        testUnit, testCode, search, (node) => node is SimpleIdentifier);
+    return identifier;
+  }
+
+  void _resolveTestUnit(String code) {
+    testCode = code;
+    testSource = addSource(testCode);
+    LibraryElement library = resolve2(testSource);
+    assertNoErrors(testSource);
+    verify([testSource]);
+    testUnit = resolveCompilationUnit(testSource, library);
+  }
+}
+
+/**
+ * Like [StaticTypeAnalyzerTest], but as end-to-end tests.
+ */
+@reflectiveTest
+class StaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
   void test_FunctionExpressionInvocation_block() {
     String code = r'''
 main() {
@@ -10054,21 +10094,6 @@
       expect(type.name, 'Foo');
     }
   }
-
-  SimpleIdentifier _findIdentifier(String search) {
-    SimpleIdentifier identifier = EngineTestCase.findNode(
-        testUnit, testCode, search, (node) => node is SimpleIdentifier);
-    return identifier;
-  }
-
-  void _resolveTestUnit(String code) {
-    testCode = code;
-    testSource = addSource(testCode);
-    LibraryElement library = resolve2(testSource);
-    assertNoErrors(testSource);
-    verify([testSource]);
-    testUnit = resolveCompilationUnit(testSource, library);
-  }
 }
 
 @reflectiveTest
@@ -11879,6 +11904,151 @@
   }
 }
 
+/**
+ * Strong mode static analyzer end to end tests
+ */
+@reflectiveTest
+class StrongModeStaticTypeAnalyzer2Test extends _StaticTypeAnalyzer2TestShared {
+  void setUp() {
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.strongMode = true;
+    resetWithOptions(options);
+  }
+
+  void test_ternaryOperator_null_right() {
+    String code = r'''
+main() {
+  var foo = (true) ? 3 : null;
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_ternaryOperator_null_left() {
+    String code = r'''
+main() {
+  var foo = (true) ? null : 3;
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_dynamicObjectMethod_toString() {
+    String code = r'''
+main() {
+  dynamic a = null;
+  var foo = a.toString();
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'String');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_dynamicObjectGetter_hashCode() {
+    String code = r'''
+main() {
+  dynamic a = null;
+  var foo = a.hashCode;
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_pseudoGeneric_max_intInt() {
+    String code = r'''
+import 'dart:math';
+main() {
+  var foo = max(1, 2);
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'int');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_pseudoGeneric_max_doubleDouble() {
+    String code = r'''
+import 'dart:math';
+main() {
+  var foo = max(1.0, 2.0);
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'double');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_pseudoGeneric_max_intDouble() {
+    String code = r'''
+import 'dart:math';
+main() {
+  var foo = max(1, 2.0);
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    expect(declaration.initializer.staticType.name, 'num');
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+
+  void test_pseudoGeneric_then() {
+    String code = r'''
+import 'dart:async';
+String toString(int x) => x.toString();
+main() {
+  Future<int> bar = null;
+  var foo = bar.then(toString);
+}
+''';
+    _resolveTestUnit(code);
+
+    SimpleIdentifier identifier = _findIdentifier('foo');
+    VariableDeclaration declaration =
+        identifier.getAncestor((node) => node is VariableDeclaration);
+    InterfaceType stringType = typeProvider.stringType;
+    InterfaceType futureType = typeProvider.futureType;
+    InterfaceType futureOfStringType =
+        futureType.substitute4(<DartType>[stringType]);
+
+    expect(declaration.initializer.staticType.toString(), "Future<String>");
+    expect(declaration.initializer.propagatedType, isNull);
+  }
+}
+
 @reflectiveTest
 class StrongModeTypePropagationTest extends ResolverTestCase {
   @override
@@ -11958,7 +12128,7 @@
     String code = r'''
 main() {
   var v = null;
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(code, typeProvider.dynamicType, null);
     _assertTypeOfMarkedExpression(code, typeProvider.dynamicType, null);
@@ -11968,7 +12138,7 @@
     String code = r'''
 main() {
   var v = 3;
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(code, typeProvider.intType, null);
     _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
@@ -11978,7 +12148,7 @@
     String code = r'''
 main() {
   dynamic v = 3;
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(
         code, typeProvider.dynamicType, typeProvider.intType);
@@ -11991,7 +12161,7 @@
 main() {
   var v;
   v = 3;
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(
         code, typeProvider.dynamicType, typeProvider.intType);
@@ -12074,7 +12244,7 @@
 main() {
   var x = <int>[3];
   var v = x[0];
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(code, typeProvider.intType, null);
     _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
@@ -12085,7 +12255,7 @@
 main() {
   var x = 3;
   var v = x;
-  return v; // marker
+  v; // marker
 }''';
     _assertPropagatedAssignedType(code, typeProvider.intType, null);
     _assertTypeOfMarkedExpression(code, typeProvider.intType, null);
@@ -12099,7 +12269,7 @@
 final x = 3;
 main() {
   var v = x;
-  return v; // marker
+  v; // marker
 }
 ''';
     _assertPropagatedAssignedType(code, typeProvider.intType, null);
@@ -12113,7 +12283,7 @@
     String code = r'''
 main() {
   var v = x;
-  return v; // marker
+  v; // marker
 }
 final x = 3;
 ''';
@@ -12126,7 +12296,7 @@
 int x = 3;
 main() {
   var v = x;
-  return v; // marker
+  v; // marker
 }
 ''';
     _assertPropagatedAssignedType(code, typeProvider.intType, null);
@@ -12137,7 +12307,7 @@
     String code = r'''
 main() {
   var v = x;
-  return v; // marker
+  v; // marker
 }
 int x = 3;
 ''';
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 a14e8c8..79ccd58 100644
--- a/pkg/analyzer/test/generated/static_type_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_type_warning_code_test.dart
@@ -7,7 +7,6 @@
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/source_io.dart';
-import 'package:unittest/unittest.dart';
 
 import '../reflective_tests.dart';
 import '../utils.dart';
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index c24297f..a6c552a 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -18,6 +18,8 @@
 main() {
   initializeTestEnvironment();
   runReflectiveTests(TypeSystemTest);
+  runReflectiveTests(StrongSubtypingTest);
+  runReflectiveTests(StrongAssignabilityTest);
 }
 
 @reflectiveTest
@@ -39,7 +41,7 @@
 
   void setUp() {
     typeProvider = new TestTypeProvider();
-    typeSystem = new TypeSystemImpl(typeProvider);
+    typeSystem = new TypeSystemImpl();
     FunctionTypeAliasElementImpl typeAlias =
         ElementFactory.functionTypeAliasElement('A');
     typeAlias.parameters = [];
@@ -160,14 +162,21 @@
     DartType typeParam = ElementFactory.typeParameterElement('T').type;
     DartType interfaceType = ElementFactory.classElement2('A', []).type;
     expect(
-        typeSystem.getLeastUpperBound(dynamicType, dynamicType), dynamicType);
-    expect(typeSystem.getLeastUpperBound(voidType, voidType), voidType);
-    expect(typeSystem.getLeastUpperBound(bottomType, bottomType), bottomType);
-    expect(typeSystem.getLeastUpperBound(typeParam, typeParam), typeParam);
-    expect(typeSystem.getLeastUpperBound(interfaceType, interfaceType),
+        typeSystem.getLeastUpperBound(typeProvider, dynamicType, dynamicType),
+        dynamicType);
+    expect(typeSystem.getLeastUpperBound(typeProvider, voidType, voidType),
+        voidType);
+    expect(typeSystem.getLeastUpperBound(typeProvider, bottomType, bottomType),
+        bottomType);
+    expect(typeSystem.getLeastUpperBound(typeProvider, typeParam, typeParam),
+        typeParam);
+    expect(
+        typeSystem.getLeastUpperBound(
+            typeProvider, interfaceType, interfaceType),
         interfaceType);
     expect(
-        typeSystem.getLeastUpperBound(simpleFunctionType, simpleFunctionType),
+        typeSystem.getLeastUpperBound(
+            typeProvider, simpleFunctionType, simpleFunctionType),
         simpleFunctionType);
   }
 
@@ -329,7 +338,9 @@
     // List<int>
     //
     InterfaceType listOfIntType = listType.substitute4(<DartType>[intType]);
-    expect(typeSystem.getLeastUpperBound(listOfIntType, listOfIntType),
+    expect(
+        typeSystem.getLeastUpperBound(
+            typeProvider, listOfIntType, listOfIntType),
         listOfIntType);
   }
 
@@ -353,6 +364,565 @@
 
   void _checkLeastUpperBound(
       DartType type1, DartType type2, DartType expectedResult) {
-    expect(typeSystem.getLeastUpperBound(type1, type2), expectedResult);
+    expect(typeSystem.getLeastUpperBound(typeProvider, type1, type2),
+        expectedResult);
+  }
+}
+
+class TypeBuilder {
+  static FunctionType functionType(
+      List<DartType> parameters, DartType returnType,
+      {List<DartType> optional, Map<String, DartType> named}) {
+    return ElementFactory
+        .functionElement8(parameters, returnType,
+            optional: optional, named: named)
+        .type;
+  }
+}
+
+@reflectiveTest
+class StrongSubtypingTest {
+  TypeProvider typeProvider;
+  TypeSystem typeSystem;
+
+  DartType get bottomType => typeProvider.bottomType;
+  InterfaceType get doubleType => typeProvider.doubleType;
+  DartType get dynamicType => typeProvider.dynamicType;
+  InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get intType => typeProvider.intType;
+  InterfaceType get listType => typeProvider.listType;
+  InterfaceType get numType => typeProvider.numType;
+  InterfaceType get objectType => typeProvider.objectType;
+  InterfaceType get stringType => typeProvider.stringType;
+  DartType get voidType => VoidTypeImpl.instance;
+
+  void setUp() {
+    typeProvider = new TestTypeProvider();
+    typeSystem = new StrongTypeSystemImpl();
+  }
+
+  void test_isSubtypeOf_dynamic_isTop() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> equivalents = <DartType>[dynamicType, objectType];
+    List<DartType> subtypes = <DartType>[
+      intType,
+      doubleType,
+      numType,
+      stringType,
+      functionType,
+      interfaceType,
+      bottomType
+    ];
+    _checkGroups(dynamicType, equivalents: equivalents, subtypes: subtypes);
+  }
+
+  void test_isSubtypeOf_bottom_isBottom() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> equivalents = <DartType>[bottomType];
+    List<DartType> supertypes = <DartType>[
+      dynamicType,
+      objectType,
+      intType,
+      doubleType,
+      numType,
+      stringType,
+      functionType,
+      interfaceType
+    ];
+    _checkGroups(bottomType, equivalents: equivalents, supertypes: supertypes);
+  }
+
+  void test_isSubtypeOf_int() {
+    List<DartType> equivalents = <DartType>[intType];
+    List<DartType> supertypes = <DartType>[numType];
+    List<DartType> unrelated = <DartType>[doubleType];
+    _checkGroups(intType,
+        equivalents: equivalents, supertypes: supertypes, unrelated: unrelated);
+  }
+
+  void test_isSubtypeOf_double() {
+    List<DartType> equivalents = <DartType>[doubleType];
+    List<DartType> supertypes = <DartType>[numType];
+    List<DartType> unrelated = <DartType>[intType];
+    _checkGroups(doubleType,
+        equivalents: equivalents, supertypes: supertypes, unrelated: unrelated);
+  }
+
+  void test_isSubtypeOf_num() {
+    List<DartType> equivalents = <DartType>[numType];
+    List<DartType> supertypes = <DartType>[];
+    List<DartType> unrelated = <DartType>[stringType];
+    List<DartType> subtypes = <DartType>[intType, doubleType];
+    _checkGroups(numType,
+        equivalents: equivalents,
+        supertypes: supertypes,
+        unrelated: unrelated,
+        subtypes: subtypes);
+  }
+
+  void test_isSubtypeOf_classes() {
+    ClassElement classTop = ElementFactory.classElement2("A");
+    ClassElement classLeft = ElementFactory.classElement("B", classTop.type);
+    ClassElement classRight = ElementFactory.classElement("C", classTop.type);
+    ClassElement classBottom = ElementFactory.classElement("D", classLeft.type)
+      ..interfaces = <InterfaceType>[classRight.type];
+    InterfaceType top = classTop.type;
+    InterfaceType left = classLeft.type;
+    InterfaceType right = classRight.type;
+    InterfaceType bottom = classBottom.type;
+
+    _checkLattice(top, left, right, bottom);
+  }
+
+  void test_isSubtypeOf_simple_function() {
+    FunctionType top =
+        TypeBuilder.functionType(<DartType>[intType], objectType);
+    FunctionType left = TypeBuilder.functionType(<DartType>[intType], intType);
+    FunctionType right =
+        TypeBuilder.functionType(<DartType>[objectType], objectType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], intType);
+
+    _checkLattice(top, left, right, bottom);
+  }
+
+  void test_isSubtypeOf_call_method() {
+    ClassElementImpl classBottom = ElementFactory.classElement2("Bottom");
+    MethodElement methodBottom =
+        ElementFactory.methodElement("call", objectType, <DartType>[intType]);
+    classBottom.methods = <MethodElement>[methodBottom];
+
+    DartType top = TypeBuilder.functionType(<DartType>[intType], objectType);
+    InterfaceType bottom = classBottom.type;
+
+    _checkIsStrictSubtypeOf(bottom, top);
+  }
+
+  void test_isSubtypeOf_fuzzy_arrows() {
+    FunctionType top =
+        TypeBuilder.functionType(<DartType>[dynamicType], objectType);
+    FunctionType left =
+        TypeBuilder.functionType(<DartType>[objectType], objectType);
+    FunctionType right =
+        TypeBuilder.functionType(<DartType>[dynamicType], bottomType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], bottomType);
+
+    _checkLattice(top, left, right, bottom);
+  }
+
+  void test_isSubtypeOf_void_functions() {
+    FunctionType top = TypeBuilder.functionType(<DartType>[intType], voidType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], intType);
+
+    _checkIsStrictSubtypeOf(bottom, top);
+  }
+
+  void test_isSubtypeOf_named_optional() {
+    DartType r = TypeBuilder.functionType(<DartType>[intType], intType);
+    DartType o = TypeBuilder.functionType(<DartType>[], intType,
+        optional: <DartType>[intType]);
+    DartType n = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType});
+    DartType rr =
+        TypeBuilder.functionType(<DartType>[intType, intType], intType);
+    DartType ro = TypeBuilder.functionType(<DartType>[intType], intType,
+        optional: <DartType>[intType]);
+    DartType rn = TypeBuilder.functionType(<DartType>[intType], intType,
+        named: <String, DartType>{'x': intType});
+    DartType oo = TypeBuilder.functionType(<DartType>[], intType,
+        optional: <DartType>[intType, intType]);
+    DartType nn = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType, 'y': intType});
+    DartType nnn = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType, 'y': intType, 'z': intType});
+
+    _checkGroups(r,
+        equivalents: [r],
+        subtypes: [o, ro, rn, oo],
+        unrelated: [n, rr, nn, nnn]);
+    _checkGroups(o,
+        equivalents: [o], subtypes: [oo], unrelated: [n, rr, ro, rn, nn, nnn]);
+    _checkGroups(n,
+        equivalents: [n],
+        subtypes: [nn, nnn],
+        unrelated: [r, o, rr, ro, rn, oo]);
+    _checkGroups(rr,
+        equivalents: [rr],
+        subtypes: [ro, oo],
+        unrelated: [r, o, n, rn, nn, nnn]);
+    _checkGroups(ro,
+        equivalents: [ro], subtypes: [oo], unrelated: [o, n, rn, nn, nnn]);
+    _checkGroups(rn,
+        equivalents: [rn],
+        subtypes: [],
+        unrelated: [o, n, rr, ro, oo, nn, nnn]);
+    _checkGroups(oo,
+        equivalents: [oo], subtypes: [], unrelated: [n, rn, nn, nnn]);
+    _checkGroups(nn,
+        equivalents: [nn], subtypes: [nnn], unrelated: [r, o, rr, ro, rn, oo]);
+    _checkGroups(nnn,
+        equivalents: [nnn], subtypes: [], unrelated: [r, o, rr, ro, rn, oo]);
+  }
+
+  void test_isSubtypeOf_generics() {
+    ClassElementImpl LClass = ElementFactory.classElement2('L', ["T"]);
+    InterfaceType LType = LClass.type;
+    ClassElementImpl MClass = ElementFactory.classElement2('M', ["T"]);
+    DartType typeParam = MClass.typeParameters[0].type;
+    InterfaceType superType = LType.substitute4(<DartType>[typeParam]);
+    MClass.interfaces = <InterfaceType>[superType];
+    InterfaceType MType = MClass.type;
+
+    InterfaceType top = LType.substitute4(<DartType>[dynamicType]);
+    InterfaceType left = MType.substitute4(<DartType>[dynamicType]);
+    InterfaceType right = LType.substitute4(<DartType>[intType]);
+    InterfaceType bottom = MType.substitute4(<DartType>[intType]);
+
+    _checkLattice(top, left, right, bottom);
+  }
+
+  void _checkLattice(
+      DartType top, DartType left, DartType right, DartType bottom) {
+    _checkGroups(top,
+        equivalents: <DartType>[top],
+        subtypes: <DartType>[left, right, bottom]);
+    _checkGroups(left,
+        equivalents: <DartType>[left],
+        subtypes: <DartType>[bottom],
+        unrelated: <DartType>[right],
+        supertypes: <DartType>[top]);
+    _checkGroups(right,
+        equivalents: <DartType>[right],
+        subtypes: <DartType>[bottom],
+        unrelated: <DartType>[left],
+        supertypes: <DartType>[top]);
+    _checkGroups(bottom,
+        equivalents: <DartType>[bottom],
+        supertypes: <DartType>[top, left, right]);
+  }
+
+  void _checkGroups(DartType t1,
+      {List<DartType> equivalents,
+      List<DartType> unrelated,
+      List<DartType> subtypes,
+      List<DartType> supertypes}) {
+    if (equivalents != null) {
+      for (DartType t2 in equivalents) {
+        _checkEquivalent(t1, t2);
+      }
+    }
+    if (unrelated != null) {
+      for (DartType t2 in unrelated) {
+        _checkUnrelated(t1, t2);
+      }
+    }
+    if (subtypes != null) {
+      for (DartType t2 in subtypes) {
+        _checkIsStrictSubtypeOf(t2, t1);
+      }
+    }
+    if (supertypes != null) {
+      for (DartType t2 in supertypes) {
+        _checkIsStrictSubtypeOf(t1, t2);
+      }
+    }
+  }
+
+  void _checkUnrelated(DartType type1, DartType type2) {
+    _checkIsNotSubtypeOf(type1, type2);
+    _checkIsNotSubtypeOf(type2, type1);
+  }
+
+  void _checkEquivalent(DartType type1, DartType type2) {
+    _checkIsSubtypeOf(type1, type2);
+    _checkIsSubtypeOf(type2, type1);
+  }
+
+  void _checkIsStrictSubtypeOf(DartType type1, DartType type2) {
+    _checkIsSubtypeOf(type1, type2);
+    _checkIsNotSubtypeOf(type2, type1);
+  }
+
+  void _checkIsSubtypeOf(DartType type1, DartType type2) {
+    expect(typeSystem.isSubtypeOf(type1, type2), true);
+  }
+
+  void _checkIsNotSubtypeOf(DartType type1, DartType type2) {
+    expect(typeSystem.isSubtypeOf(type1, type2), false);
+  }
+}
+
+@reflectiveTest
+class StrongAssignabilityTest {
+  TypeProvider typeProvider;
+  TypeSystem typeSystem;
+
+  DartType get bottomType => typeProvider.bottomType;
+  InterfaceType get doubleType => typeProvider.doubleType;
+  DartType get dynamicType => typeProvider.dynamicType;
+  InterfaceType get functionType => typeProvider.functionType;
+  InterfaceType get intType => typeProvider.intType;
+  InterfaceType get listType => typeProvider.listType;
+  InterfaceType get numType => typeProvider.numType;
+  InterfaceType get objectType => typeProvider.objectType;
+  InterfaceType get stringType => typeProvider.stringType;
+  DartType get voidType => VoidTypeImpl.instance;
+
+  void setUp() {
+    typeProvider = new TestTypeProvider();
+    typeSystem = new StrongTypeSystemImpl();
+  }
+
+  void test_isAssignableTo_dynamic_isTop() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> interassignable = <DartType>[
+      dynamicType,
+      objectType,
+      intType,
+      doubleType,
+      numType,
+      stringType,
+      interfaceType,
+      bottomType
+    ];
+    _checkGroups(dynamicType, interassignable: interassignable);
+  }
+
+  void test_isAssignableTo_bottom_isBottom() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> interassignable = <DartType>[
+      dynamicType,
+      objectType,
+      intType,
+      doubleType,
+      numType,
+      stringType,
+      interfaceType,
+      bottomType
+    ];
+
+    _checkGroups(bottomType, interassignable: interassignable);
+  }
+
+  void test_isAssignableTo_int() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> interassignable = <DartType>[
+      dynamicType,
+      objectType,
+      intType,
+      numType,
+      bottomType
+    ];
+    List<DartType> unrelated = <DartType>[
+      doubleType,
+      stringType,
+      interfaceType,
+    ];
+
+    _checkGroups(intType,
+        interassignable: interassignable, unrelated: unrelated);
+  }
+
+  void test_isAssignableTo_double() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> interassignable = <DartType>[
+      dynamicType,
+      objectType,
+      doubleType,
+      numType,
+      bottomType
+    ];
+    List<DartType> unrelated = <DartType>[intType, stringType, interfaceType,];
+
+    _checkGroups(doubleType,
+        interassignable: interassignable, unrelated: unrelated);
+  }
+
+  void test_isAssignableTo_num() {
+    DartType interfaceType = ElementFactory.classElement2('A', []).type;
+    List<DartType> interassignable = <DartType>[
+      dynamicType,
+      objectType,
+      numType,
+      intType,
+      doubleType,
+      bottomType
+    ];
+    List<DartType> unrelated = <DartType>[stringType, interfaceType,];
+
+    _checkGroups(numType,
+        interassignable: interassignable, unrelated: unrelated);
+  }
+
+  void test_isAssignableTo_classes() {
+    ClassElement classTop = ElementFactory.classElement2("A");
+    ClassElement classLeft = ElementFactory.classElement("B", classTop.type);
+    ClassElement classRight = ElementFactory.classElement("C", classTop.type);
+    ClassElement classBottom = ElementFactory.classElement("D", classLeft.type)
+      ..interfaces = <InterfaceType>[classRight.type];
+    InterfaceType top = classTop.type;
+    InterfaceType left = classLeft.type;
+    InterfaceType right = classRight.type;
+    InterfaceType bottom = classBottom.type;
+
+    _checkLattice(top, left, right, bottom);
+  }
+
+  void test_isAssignableTo_simple_function() {
+    FunctionType top =
+        TypeBuilder.functionType(<DartType>[intType], objectType);
+    FunctionType left = TypeBuilder.functionType(<DartType>[intType], intType);
+    FunctionType right =
+        TypeBuilder.functionType(<DartType>[objectType], objectType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], intType);
+
+    _checkCrossLattice(top, left, right, bottom);
+  }
+
+  void test_isAssignableTo_call_method() {
+    ClassElementImpl classBottom = ElementFactory.classElement2("B");
+    MethodElement methodBottom =
+        ElementFactory.methodElement("call", objectType, <DartType>[intType]);
+    classBottom.methods = <MethodElement>[methodBottom];
+
+    DartType top = TypeBuilder.functionType(<DartType>[intType], objectType);
+    InterfaceType bottom = classBottom.type;
+
+    _checkIsAssignableTo(top, bottom);
+  }
+
+  void test_isAssignableTo_fuzzy_arrows() {
+    FunctionType top =
+        TypeBuilder.functionType(<DartType>[dynamicType], objectType);
+    FunctionType left =
+        TypeBuilder.functionType(<DartType>[objectType], objectType);
+    FunctionType right =
+        TypeBuilder.functionType(<DartType>[dynamicType], bottomType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], bottomType);
+
+    _checkCrossLattice(top, left, right, bottom);
+  }
+
+  void test_isAssignableTo_void_functions() {
+    FunctionType top = TypeBuilder.functionType(<DartType>[intType], voidType);
+    FunctionType bottom =
+        TypeBuilder.functionType(<DartType>[objectType], intType);
+
+    _checkEquivalent(bottom, top);
+  }
+
+  void test_isAssignableTo_named_optional() {
+    DartType r = TypeBuilder.functionType(<DartType>[intType], intType);
+    DartType o = TypeBuilder.functionType(<DartType>[], intType,
+        optional: <DartType>[intType]);
+    DartType n = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType});
+    DartType rr =
+        TypeBuilder.functionType(<DartType>[intType, intType], intType);
+    DartType ro = TypeBuilder.functionType(<DartType>[intType], intType,
+        optional: <DartType>[intType]);
+    DartType rn = TypeBuilder.functionType(<DartType>[intType], intType,
+        named: <String, DartType>{'x': intType});
+    DartType oo = TypeBuilder.functionType(<DartType>[], intType,
+        optional: <DartType>[intType, intType]);
+    DartType nn = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType, 'y': intType});
+    DartType nnn = TypeBuilder.functionType(<DartType>[], intType,
+        named: <String, DartType>{'x': intType, 'y': intType, 'z': intType});
+
+    _checkGroups(r,
+        interassignable: [r, o, ro, rn, oo], unrelated: [n, rr, nn, nnn]);
+    _checkGroups(o,
+        interassignable: [o, oo], unrelated: [n, rr, ro, rn, nn, nnn]);
+    _checkGroups(n,
+        interassignable: [n, nn, nnn], unrelated: [r, o, rr, ro, rn, oo]);
+    _checkGroups(rr,
+        interassignable: [rr, ro, oo], unrelated: [r, o, n, rn, nn, nnn]);
+    _checkGroups(ro, interassignable: [ro, oo], unrelated: [o, n, rn, nn, nnn]);
+    _checkGroups(rn,
+        interassignable: [rn], unrelated: [o, n, rr, ro, oo, nn, nnn]);
+    _checkGroups(oo, interassignable: [oo], unrelated: [n, rn, nn, nnn]);
+    _checkGroups(nn,
+        interassignable: [nn, nnn], unrelated: [r, o, rr, ro, rn, oo]);
+    _checkGroups(nnn,
+        interassignable: [nnn], unrelated: [r, o, rr, ro, rn, oo]);
+  }
+
+  void test_isAssignableTo_generics() {
+    ClassElementImpl LClass = ElementFactory.classElement2('L', ["T"]);
+    InterfaceType LType = LClass.type;
+    ClassElementImpl MClass = ElementFactory.classElement2('M', ["T"]);
+    DartType typeParam = MClass.typeParameters[0].type;
+    InterfaceType superType = LType.substitute4(<DartType>[typeParam]);
+    MClass.interfaces = <InterfaceType>[superType];
+    InterfaceType MType = MClass.type;
+
+    InterfaceType top = LType.substitute4(<DartType>[dynamicType]);
+    InterfaceType left = MType.substitute4(<DartType>[dynamicType]);
+    InterfaceType right = LType.substitute4(<DartType>[intType]);
+    InterfaceType bottom = MType.substitute4(<DartType>[intType]);
+
+    _checkCrossLattice(top, left, right, bottom);
+  }
+
+  void _checkCrossLattice(
+      DartType top, DartType left, DartType right, DartType bottom) {
+    _checkGroups(top, interassignable: <DartType>[top, left, right, bottom]);
+    _checkGroups(left, interassignable: <DartType>[top, left, right, bottom]);
+    _checkGroups(right, interassignable: <DartType>[top, left, right, bottom]);
+    _checkGroups(bottom, interassignable: <DartType>[top, left, right, bottom]);
+  }
+
+  void _checkLattice(
+      DartType top, DartType left, DartType right, DartType bottom) {
+    _checkGroups(top, interassignable: <DartType>[top, left, right, bottom]);
+    _checkGroups(left,
+        interassignable: <DartType>[top, left, bottom],
+        unrelated: <DartType>[right]);
+    _checkGroups(right,
+        interassignable: <DartType>[top, right, bottom],
+        unrelated: <DartType>[left]);
+    _checkGroups(bottom, interassignable: <DartType>[top, left, right, bottom]);
+  }
+
+  void _checkGroups(DartType t1,
+      {List<DartType> interassignable, List<DartType> unrelated}) {
+    if (interassignable != null) {
+      for (DartType t2 in interassignable) {
+        _checkEquivalent(t1, t2);
+      }
+    }
+    if (unrelated != null) {
+      for (DartType t2 in unrelated) {
+        _checkUnrelated(t1, t2);
+      }
+    }
+  }
+
+  void _checkUnrelated(DartType type1, DartType type2) {
+    _checkIsNotAssignableTo(type1, type2);
+    _checkIsNotAssignableTo(type2, type1);
+  }
+
+  void _checkEquivalent(DartType type1, DartType type2) {
+    _checkIsAssignableTo(type1, type2);
+    _checkIsAssignableTo(type2, type1);
+  }
+
+  void _checkIsStrictAssignableTo(DartType type1, DartType type2) {
+    _checkIsAssignableTo(type1, type2);
+    _checkIsNotAssignableTo(type2, type1);
+  }
+
+  void _checkIsAssignableTo(DartType type1, DartType type2) {
+    expect(typeSystem.isAssignableTo(type1, type2), true);
+  }
+
+  void _checkIsNotAssignableTo(DartType type1, DartType type2) {
+    expect(typeSystem.isAssignableTo(type1, type2), false);
   }
 }
diff --git a/pkg/analyzer/test/src/context/cache_test.dart b/pkg/analyzer/test/src/context/cache_test.dart
index 21432ed..b012ffd 100644
--- a/pkg/analyzer/test/src/context/cache_test.dart
+++ b/pkg/analyzer/test/src/context/cache_test.dart
@@ -738,7 +738,7 @@
     expect(entry.getValue(result2), 222);
     expect(entry.getValue(result3), 333);
     // replace result1, keep "dependedOn", invalidate result3
-    entry.setValueIncremental(result2, 2222);
+    entry.setValueIncremental(result2, 2222, true);
     expect(entry.getState(result1), CacheState.VALID);
     expect(entry.getState(result2), CacheState.VALID);
     expect(entry.getState(result3), CacheState.INVALID);
diff --git a/pkg/analyzer/test/src/context/context_test.dart b/pkg/analyzer/test/src/context/context_test.dart
index acfb596..ab4df64 100644
--- a/pkg/analyzer/test/src/context/context_test.dart
+++ b/pkg/analyzer/test/src/context/context_test.dart
@@ -1795,7 +1795,7 @@
     // TODO(scheglov) no threads in Dart
 //    Source source = _addSource("/test.dart", "library lib;");
 //    int initialTime = _context.getModificationStamp(source);
-//    List<Source> sources = new List<Source>();
+//    List<Source> sources = <Source>[];
 //    sources.add(source);
 //    _context.analysisPriorityOrder = sources;
 //    _context.parseCompilationUnit(source);
@@ -1910,7 +1910,7 @@
 
   void test_setAnalysisPriorityOrder() {
     int priorityCount = 4;
-    List<Source> sources = new List<Source>();
+    List<Source> sources = <Source>[];
     for (int index = 0; index < priorityCount; index++) {
       sources.add(addSource("/lib.dart$index", ""));
     }
@@ -1919,15 +1919,28 @@
   }
 
   void test_setAnalysisPriorityOrder_empty() {
-    context.analysisPriorityOrder = new List<Source>();
+    context.analysisPriorityOrder = <Source>[];
   }
 
   void test_setAnalysisPriorityOrder_nonEmpty() {
-    List<Source> sources = new List<Source>();
+    List<Source> sources = <Source>[];
     sources.add(addSource("/lib.dart", "library lib;"));
     context.analysisPriorityOrder = sources;
   }
 
+  void test_setAnalysisPriorityOrder_resetAnalysisDriver() {
+    Source source = addSource('/lib.dart', 'library lib;');
+    // start analysis
+    context.performAnalysisTask();
+    expect(context.driver.currentWorkOrder, isNotNull);
+    // set priority sources, AnalysisDriver is reset
+    context.analysisPriorityOrder = <Source>[source];
+    expect(context.driver.currentWorkOrder, isNull);
+    // analysis continues
+    context.performAnalysisTask();
+    expect(context.driver.currentWorkOrder, isNotNull);
+  }
+
   Future test_setChangedContents_libraryWithPart() {
     AnalysisOptionsImpl options = new AnalysisOptionsImpl();
     options.incremental = true;
@@ -2067,7 +2080,7 @@
     options.cacheSize = maxCacheSize;
     context.analysisOptions = options;
     int sourceCount = maxCacheSize + 2;
-    List<Source> sources = new List<Source>();
+    List<Source> sources = <Source>[];
     ChangeSet changeSet = new ChangeSet();
     for (int i = 0; i < sourceCount; i++) {
       Source source = addSource("/lib$i.dart", "library lib$i;");
@@ -2146,8 +2159,8 @@
     entry.setState(RESOLVED_UNIT, CacheState.FLUSHED);
   }
 
-  List<Source> _getPriorityOrder(AnalysisContextImpl context2) {
-    return context2.test_priorityOrder;
+  List<Source> _getPriorityOrder(AnalysisContextImpl context) {
+    return context.test_priorityOrder;
   }
 
   void _performPendingAnalysisTasks([int maxTasks = 512]) {
diff --git a/pkg/analyzer/test/src/plugin/plugin_config_test.dart b/pkg/analyzer/test/src/plugin/plugin_config_test.dart
new file mode 100644
index 0000000..809a1ec
--- /dev/null
+++ b/pkg/analyzer/test/src/plugin/plugin_config_test.dart
@@ -0,0 +1,49 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.src.plugin.plugin_config_test;
+
+import 'package:analyzer/source/analysis_options_provider.dart';
+import 'package:analyzer/src/plugin/plugin_configuration.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  group('PluginConfig', () {
+    group('parsing', () {
+      test('plugin map', () {
+        const optionsSrc = '''
+analyzer:
+  plugins:
+    my_plugin1: ^0.1.0 #shorthand 
+    my_plugin2:
+      version: ^0.2.0
+    my_plugin3:
+      class_name: MyPlugin
+      library_uri: myplugin/myplugin.dart
+      path: '/u/disk/src/'
+''';
+        var config = parseConfig(optionsSrc);
+        var plugins = pluginsSortedByName(config);
+        expect(plugins, hasLength(3));
+        expect(plugins[0].name, equals('my_plugin1'));
+        expect(plugins[0].version, equals('^0.1.0'));
+        expect(plugins[1].name, equals('my_plugin2'));
+        expect(plugins[1].version, equals('^0.2.0'));
+        expect(plugins[2].name, equals('my_plugin3'));
+        expect(plugins[2].version, isNull);
+        expect(plugins[2].path, equals('/u/disk/src/'));
+        expect(plugins[2].libraryUri, equals('myplugin/myplugin.dart'));
+        expect(plugins[2].className, equals('MyPlugin'));
+      });
+    });
+  });
+}
+
+PluginConfig parseConfig(String optionsSrc) {
+  var options = new AnalysisOptionsProvider().getOptionsFromString(optionsSrc);
+  return new PluginConfig.fromOptions(options);
+}
+
+List<PluginInfo> pluginsSortedByName(PluginConfig config) =>
+    config.plugins.toList()..sort((p1, p2) => p1.name.compareTo(p2.name));
diff --git a/pkg/analyzer/test/src/task/dart_work_manager_test.dart b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
index a5b6b26..d8b9cae 100644
--- a/pkg/analyzer/test/src/task/dart_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/dart_work_manager_test.dart
@@ -20,7 +20,6 @@
 import 'package:analyzer/src/generated/testing/ast_factory.dart';
 import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/dart_work_manager.dart';
-import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/task/dart.dart';
 import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/model.dart';
diff --git a/pkg/analyzer/test/src/task/html_test.dart b/pkg/analyzer/test/src/task/html_test.dart
index a07dc75..7d8da56 100644
--- a/pkg/analyzer/test/src/task/html_test.dart
+++ b/pkg/analyzer/test/src/task/html_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/task/html.dart';
+import 'package:analyzer/task/general.dart';
 import 'package:analyzer/task/html.dart';
 import 'package:analyzer/task/model.dart';
 import 'package:unittest/unittest.dart';
@@ -294,9 +295,7 @@
   }
 
   test_perform() {
-    AnalysisTarget target = newSource(
-        '/test.html',
-        r'''
+    String code = r'''
 <!DOCTYPE html>
 <html>
   <head>
@@ -306,10 +305,34 @@
     <h1 Test>
   </body>
 </html>
-''');
+''';
+    AnalysisTarget target = newSource('/test.html', code);
     computeResult(target, HTML_DOCUMENT);
     expect(task, isParseHtmlTask);
     expect(outputs[HTML_DOCUMENT], isNotNull);
     expect(outputs[HTML_DOCUMENT_ERRORS], isNotEmpty);
+    // LINE_INFO
+    {
+      LineInfo lineInfo = outputs[LINE_INFO];
+      expect(lineInfo, isNotNull);
+      {
+        int offset = code.indexOf('<!DOCTYPE');
+        LineInfo_Location location = lineInfo.getLocation(offset);
+        expect(location.lineNumber, 1);
+        expect(location.columnNumber, 1);
+      }
+      {
+        int offset = code.indexOf('<html>');
+        LineInfo_Location location = lineInfo.getLocation(offset);
+        expect(location.lineNumber, 2);
+        expect(location.columnNumber, 1);
+      }
+      {
+        int offset = code.indexOf('<title>');
+        LineInfo_Location location = lineInfo.getLocation(offset);
+        expect(location.lineNumber, 4);
+        expect(location.columnNumber, 5);
+      }
+    }
   }
 }
diff --git a/pkg/analyzer/test/src/task/html_work_manager_test.dart b/pkg/analyzer/test/src/task/html_work_manager_test.dart
index 35bc13d..0785f97 100644
--- a/pkg/analyzer/test/src/task/html_work_manager_test.dart
+++ b/pkg/analyzer/test/src/task/html_work_manager_test.dart
@@ -17,7 +17,6 @@
     show AnalysisError, HtmlErrorCode;
 import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/driver.dart';
 import 'package:analyzer/src/task/html.dart';
 import 'package:analyzer/src/task/html_work_manager.dart';
 import 'package:analyzer/task/dart.dart';
diff --git a/pkg/analyzer/test/src/task/strong_mode_test.dart b/pkg/analyzer/test/src/task/strong_mode_test.dart
index 7b719ab..ccc274f 100644
--- a/pkg/analyzer/test/src/task/strong_mode_test.dart
+++ b/pkg/analyzer/test/src/task/strong_mode_test.dart
@@ -7,9 +7,7 @@
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/dart.dart';
 import 'package:analyzer/src/task/strong_mode.dart';
-import 'package:analyzer/task/dart.dart';
 import 'package:unittest/unittest.dart';
 
 import '../../reflective_tests.dart';
@@ -25,7 +23,8 @@
 @reflectiveTest
 class InstanceMemberInferrerTest extends AbstractContextTest {
   InstanceMemberInferrer get createInferrer =>
-      new InstanceMemberInferrer(context.typeProvider);
+      new InstanceMemberInferrer(context.typeProvider,
+          typeSystem: context.typeSystem);
 
   /**
    * Add a source with the given [content] and return the result of resolving
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index b9e48ed..357404f 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -116,6 +116,8 @@
             fatalWarnings: hasOption(options, Flags.fatalWarnings),
             enableExperimentalMirrors:
                 hasOption(options, Flags.enableExperimentalMirrors),
+            enableAssertMessage:
+                hasOption(options, Flags.enableAssertMessage),
             generateCodeWithCompileTimeErrors:
                 hasOption(options, Flags.generateCodeWithCompileTimeErrors),
             testMode: hasOption(options, Flags.testMode),
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index f7d74f8..0f8f218 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -786,8 +786,6 @@
     } else if (node.isTypeCast) {
       DartType type = elements.getType(node.arguments.head);
       analyzeType(type);
-    } else if (elements.isAssert(node) && !compiler.enableUserAssertions) {
-      return;
     }
     node.visitChildren(this);
   }
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 4cd99ed..204bb2a 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -17,6 +17,7 @@
       '--disable-native-live-type-analysis';
   static const String disableTypeInference = '--disable-type-inference';
   static const String dumpInfo = '--dump-info';
+  static const String enableAssertMessage = '--assert-message';
   static const String enableCheckedMode = '--enable-checked-mode';
   static const String enableConcreteTypeInference =
       '--enable-concrete-type-inference';
diff --git a/pkg/compiler/lib/src/common.dart b/pkg/compiler/lib/src/common.dart
index b997eda..400ba5d 100644
--- a/pkg/compiler/lib/src/common.dart
+++ b/pkg/compiler/lib/src/common.dart
@@ -5,6 +5,9 @@
 library dart2js.common;
 
 
+export 'common/names.dart' show
+    Names;
+
 export 'common/tasks.dart' show
     CompilerTask;
 
@@ -32,7 +35,6 @@
 
 export 'elements/elements.dart' show
     ClassElement,
-    ClosureFieldElement,
     CompilationUnitElement,
     Element,
     Elements,
@@ -44,19 +46,17 @@
     TypedefElement,
     VariableElement;
 
-export 'resolution/resolution.dart' show
-    TreeElements;
-
 export 'tree/tree.dart' show
     Node;
 
 export 'types/types.dart' show
     TypeMask;
 
-export 'universe/universe.dart' show
-    CallStructure,
-    Selector,
-    SelectorKind;
+export 'universe/call_structure.dart' show
+    CallStructure;
+
+export 'universe/selector.dart' show
+    Selector;
 
 export 'util/util.dart' show
     Link;
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index 7af8750..71c8616 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -167,9 +167,6 @@
   void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
                                               DartType bound) {}
 
-  /// Returns `true` if [element] represent the assert function.
-  bool isAssertMethod(Element element) => false;
-
   /**
    * Call this to register that an instantiated generic class has a call
    * method.
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 323822b..9a95982 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -26,8 +26,9 @@
     JavaScriptBackend;
 import '../resolution/tree_elements.dart' show
     TreeElements;
+import '../universe/selector.dart' show
+    Selector;
 import '../universe/universe.dart' show
-    Selector,
     UniverseSelector;
 import '../util/util.dart' show
     Setlet;
@@ -56,6 +57,11 @@
   CodegenEnqueuer get world => compiler.enqueuer.codegen;
   JavaScriptBackend get backend => compiler.backend;
 
+  void registerAssert(bool hasMessage) {
+    // Codegen does not register asserts.  They have been lowered to calls.
+    assert(false);
+  }
+
   void registerDependency(Element element) {
     treeElements.registerDependency(element);
   }
diff --git a/pkg/compiler/lib/src/common/names.dart b/pkg/compiler/lib/src/common/names.dart
index 5d104ef..45c7b1f 100644
--- a/pkg/compiler/lib/src/common/names.dart
+++ b/pkg/compiler/lib/src/common/names.dart
@@ -9,8 +9,9 @@
 import '../elements/elements.dart' show
     Name,
     PublicName;
-import '../universe/universe.dart' show
-    CallStructure,
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
     Selector;
 
 /// [String]s commonly used.
@@ -62,6 +63,10 @@
 
   /// The name of the to-string method on 'Object'.
   static const Name toString_ = const PublicName('toString');
+
+  static const Name INDEX_NAME = const PublicName("[]");
+  static const Name INDEX_SET_NAME = const PublicName("[]=");
+  static const Name CALL_NAME = Names.call;
 }
 
 /// [Selector]s commonly used.
diff --git a/pkg/compiler/lib/src/common/registry.dart b/pkg/compiler/lib/src/common/registry.dart
index 1530bfe..47510b5 100644
--- a/pkg/compiler/lib/src/common/registry.dart
+++ b/pkg/compiler/lib/src/common/registry.dart
@@ -33,4 +33,6 @@
   void registerInstantiation(InterfaceType type);
 
   void registerGetOfStaticFunction(FunctionElement element);
+
+  void registerAssert(bool hasMessage);
 }
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index e43cf14..86a21bd 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -43,8 +43,8 @@
 
 /// Backend callbacks function specific to the resolution phase.
 class ResolutionCallbacks {
-  /// Register that [node] is a call to `assert`.
-  void onAssert(Send node, Registry registry) {}
+  /// Register that an assert has been seen.
+  void onAssert(bool hasMessage, Registry registry) {}
 
   /// Register that an 'await for' has been seen.
   void onAsyncForIn(AsyncForIn node, Registry registry) {}
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 53d037a..2f95b7b 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -29,7 +29,7 @@
 import 'tree/tree.dart';
 import 'util/util.dart' show
     Link;
-import 'universe/universe.dart' show
+import 'universe/call_structure.dart' show
     CallStructure;
 
 /// A [ConstantEnvironment] provides access for constants compiled for variable
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 747dc38..0ccc51a 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -69,8 +69,7 @@
     DeferredLoaderGetterElementX,
     MethodElementX,
     LibraryElementX,
-    PrefixElementX,
-    VoidElementX;
+    PrefixElementX;
 import 'enqueue.dart' show
     CodegenEnqueuer,
     Enqueuer,
@@ -94,7 +93,6 @@
 import 'parser/diet_parser_task.dart' show
     DietParserTask;
 import 'parser/parser_task.dart' show
-    DietParserTask,
     ParserTask;
 import 'patch_parser.dart' show
     PatchParserTask;
@@ -128,9 +126,11 @@
 import 'typechecker.dart' show
     TypeCheckerTask;
 import 'types/types.dart' as ti;
+import 'universe/call_structure.dart' show
+    CallStructure;
+import 'universe/selector.dart' show
+    Selector;
 import 'universe/universe.dart' show
-    CallStructure,
-    Selector,
     Universe;
 import 'util/util.dart' show
     Link,
@@ -189,6 +189,7 @@
   final bool dumpInfo;
   final bool useContentSecurityPolicy;
   final bool enableExperimentalMirrors;
+  final bool enableAssertMessage;
 
   /**
    * The maximum size of a concrete type before it widens to dynamic during
@@ -522,6 +523,7 @@
             this.fatalWarnings: false,
             bool hasIncrementalSupport: false,
             this.enableExperimentalMirrors: false,
+            this.enableAssertMessage: false,
             this.allowNativeExtensions: false,
             this.generateCodeWithCompileTimeErrors: false,
             this.testMode: false,
diff --git a/pkg/compiler/lib/src/constants/constant_constructors.dart b/pkg/compiler/lib/src/constants/constant_constructors.dart
index e3773cf..fa774e8 100644
--- a/pkg/compiler/lib/src/constants/constant_constructors.dart
+++ b/pkg/compiler/lib/src/constants/constant_constructors.dart
@@ -18,7 +18,8 @@
 import '../resolution/tree_elements.dart' show
     TreeElements;
 import '../tree/tree.dart';
-import '../universe/universe.dart' show CallStructure;
+import '../universe/call_structure.dart' show
+    CallStructure;
 import 'constructors.dart';
 import 'expressions.dart';
 
diff --git a/pkg/compiler/lib/src/constants/constructors.dart b/pkg/compiler/lib/src/constants/constructors.dart
index a13149a..7faf593 100644
--- a/pkg/compiler/lib/src/constants/constructors.dart
+++ b/pkg/compiler/lib/src/constants/constructors.dart
@@ -8,7 +8,8 @@
 import '../elements/elements.dart' show
     ConstructorElement,
     FieldElement;
-import '../universe/universe.dart' show CallStructure;
+import '../universe/call_structure.dart' show
+    CallStructure;
 import '../util/util.dart';
 import 'evaluation.dart';
 import 'expressions.dart';
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index 5b7c85d..176d736 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -6,7 +6,7 @@
 
 import '../compiler.dart' show
     Compiler;
-import '../universe/universe.dart' show
+import '../universe/call_structure.dart' show
     CallStructure;
 import 'expressions.dart';
 
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index fd0f68a..3edb116 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -17,8 +17,10 @@
     PrefixElement,
     VariableElement;
 import '../resolution/operators.dart';
-import '../tree/tree.dart' show DartString;
-import '../universe/universe.dart' show CallStructure;
+import '../tree/tree.dart' show
+    DartString;
+import '../universe/call_structure.dart' show
+    CallStructure;
 import 'evaluation.dart';
 import 'values.dart';
 
diff --git a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
index a9190dd..4a1f340 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
@@ -6,7 +6,7 @@
 
 import 'cps_ir_nodes.dart';
 import '../constants/values.dart';
-import '../universe/universe.dart' show Selector;
+import '../universe/selector.dart' show Selector;
 import '../types/types.dart' show TypeMask;
 import '../io/source_information.dart';
 import '../elements/elements.dart';
@@ -112,11 +112,11 @@
     return letPrim(new ApplyBuiltinOperator(op, args, sourceInformation));
   }
 
-  Primitive invokeBuiltin(BuiltinMethod method, 
-                          Primitive receiver, 
+  Primitive invokeBuiltin(BuiltinMethod method,
+                          Primitive receiver,
                           List<Primitive> arguments,
                           {bool receiverIsNotNull: false}) {
-    ApplyBuiltinMethod apply = 
+    ApplyBuiltinMethod apply =
         new ApplyBuiltinMethod(method, receiver, arguments, sourceInformation);
     apply.receiverIsNotNull = receiverIsNotNull;
     return letPrim(apply);
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index e4cb699..ca34d15 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -22,8 +22,9 @@
 import '../types/types.dart' show
     TypeMask;
 import '../closure.dart' hide ClosureScope;
-import '../universe/universe.dart' show
-    CallStructure,
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
     Selector,
     SelectorKind;
 import 'cps_ir_nodes.dart' as ir;
@@ -2805,8 +2806,13 @@
   ir.Node buildAwait(ir.Primitive value) {
     return _continueWithExpression((k) => new ir.Await(value, k));
   }
-}
 
+  void buildYield(ir.Primitive value, bool hasStar) {
+    _continueWithExpression((k) {
+      return new ir.Yield(value, hasStar, k);
+    });
+  }
+}
 
 /// Location of a variable relative to a given closure.
 class ClosureLocation {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
index 8ad289f..6faf8d1 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
@@ -35,10 +35,10 @@
 import '../tree/tree.dart' as ast;
 import '../types/types.dart' show
     TypeMask;
-import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
-    SelectorKind;
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 import '../constants/values.dart' show
     ConstantValue;
 import 'cps_ir_nodes.dart' as ir;
@@ -379,6 +379,11 @@
     return irBuilder.buildAwait(value);
   }
 
+  visitYield(ast.Yield node) {
+    ir.Primitive value = visit(node.expression);
+    return irBuilder.buildYield(value, node.hasStar);
+  }
+
   visitSyncForIn(ast.SyncForIn node) {
     // [node.declaredIdentifier] can be either an [ast.VariableDefinitions]
     // (defining a new local variable) or a send designating some existing
@@ -648,9 +653,8 @@
     return receiver;
   }
 
-  // ## Sends ##
   @override
-  ir.Primitive visitAssert(ast.Send node, ast.Node condition, _) {
+  ir.Primitive visitAssert(ast.Assert node) {
     assert(irBuilder.isOpen);
     if (compiler.enableUserAssertions) {
       return giveup(node, 'assert in checked mode not implemented');
@@ -663,6 +667,7 @@
     }
   }
 
+  // ## Sends ##
   @override
   void previsitDeferredAccess(ast.Send node, PrefixElement prefix, _) {
     giveup(node, 'deferred access is not implemented');
@@ -2011,7 +2016,7 @@
     String nameString = Elements.reconstructConstructorName(constructor);
     Name name = new Name(nameString, constructor.library);
     return buildStaticNoSuchMethod(
-        new Selector(SelectorKind.CALL, name, callStructure),
+        new Selector.call(name, callStructure),
         translateDynamicArguments(arguments, callStructure));
   }
 
@@ -2190,7 +2195,7 @@
     // Translate as a method call.
     List<ir.Primitive> args = arguments.nodes.mapToList(visit);
     return buildStaticNoSuchMethod(
-        new Selector(SelectorKind.CALL, setter.memberName, callStructure),
+        new Selector.call(setter.memberName, callStructure),
         args);
   }
 
@@ -2237,7 +2242,7 @@
     List<ir.Primitive> args =
         translateDynamicArguments(arguments, callStructure);
     return buildInstanceNoSuchMethod(
-        new Selector(SelectorKind.CALL, setter.memberName, callStructure),
+        new Selector.call(setter.memberName, callStructure),
         elements.getTypeMask(node),
         args);
   }
@@ -2399,6 +2404,7 @@
     currentFunction = elements[node];
 
     if (currentFunction.asyncMarker != AsyncMarker.SYNC &&
+        currentFunction.asyncMarker != AsyncMarker.SYNC_STAR &&
         currentFunction.asyncMarker != AsyncMarker.ASYNC) {
       giveup(node, "cannot handle sync*/async* functions");
     }
@@ -3370,9 +3376,9 @@
             'Isolate library and compiler mismatch.');
       }
       List<ir.Primitive> arguments = translateStaticArguments(argumentList,
-          element, CallStructure.TWO_ARGS);
+          element, callStructure);
       return irBuilder.buildStaticFunctionInvocation(element,
-          CallStructure.TWO_ARGS, arguments,
+          callStructure, arguments,
           sourceInformation:
                 sourceInformationBuilder.buildCall(node, node.selector));
     }
@@ -3521,12 +3527,12 @@
         if (!compiler.hasIsolateSupport) {
           // If the isolate library is not used, we just generate code
           // to fetch the current isolate.
-          continue GET_STATIC_STATE;
+          continue getStaticState;
         }
         return buildIsolateHelperInvocation('_currentIsolate',
             CallStructure.NO_ARGS);
 
-      GET_STATIC_STATE: case 'JS_GET_STATIC_STATE':
+      getStaticState: case 'JS_GET_STATIC_STATE':
         validateArgumentCount(exactly: 0);
 
         return irBuilder.buildForeignCode(
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index 070aa60..4415214 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -9,7 +9,7 @@
 import '../elements/elements.dart';
 import '../io/source_information.dart' show SourceInformation;
 import '../types/types.dart' show TypeMask;
-import '../universe/universe.dart' show Selector;
+import '../universe/selector.dart' show Selector;
 
 import 'builtin_operator.dart';
 export 'builtin_operator.dart';
@@ -86,7 +86,7 @@
 
 /// An expression without a continuation or a subexpression body.
 ///
-/// These break straight-line control flow and can be throught of as ending a
+/// These break straight-line control flow and can be thought of as ending a
 /// basic block.
 abstract class TailExpression extends Expression {
   Expression get next => null;
@@ -1261,6 +1261,21 @@
   }
 }
 
+class Yield extends CallExpression {
+  final Reference<Primitive> input;
+  final Reference<Continuation> continuation;
+  final bool hasStar;
+
+  Yield(Primitive input, this.hasStar, Continuation continuation)
+    : this.input = new Reference<Primitive>(input),
+      this.continuation = new Reference<Continuation>(continuation);
+
+  @override
+  accept(Visitor visitor) {
+    return visitor.visitYield(this);
+  }
+}
+
 List<Reference<Primitive>> _referenceList(Iterable<Primitive> definitions) {
   return definitions.map((e) => new Reference<Primitive>(e)).toList();
 }
@@ -1293,6 +1308,7 @@
   T visitSetField(SetField node);
   T visitUnreachable(Unreachable node);
   T visitAwait(Await node);
+  T visitYield(Yield node);
 
   // Definitions.
   T visitLiteralList(LiteralList node);
@@ -1602,6 +1618,13 @@
     processReference(node.continuation);
   }
 
+  processYield(Yield node) {}
+  visitYield(Yield node) {
+    processYield(node);
+    processReference(node.input);
+    processReference(node.continuation);
+  }
+
   processGetLength(GetLength node) {}
   visitGetLength(GetLength node) {
     processGetLength(node);
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
index 631e909..3fd8503 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
@@ -7,7 +7,10 @@
 import '../constants/values.dart';
 import '../util/util.dart';
 import 'cps_ir_nodes.dart';
-import '../universe/universe.dart' show Selector, CallStructure;
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 
 /// A [Decorator] is a function used by [SExpressionStringifier] to augment the
 /// output produced for a node or reference.  It can be provided to the
@@ -73,24 +76,14 @@
     String conts;
     bool first = true;
     for (Continuation continuation in node.continuations) {
-      String name = newContinuationName(continuation);
-      if (continuation.isRecursive) name = 'rec $name';
-      // TODO(karlklose): this should be changed to `.map(visit).join(' ')`  and
-      // should recurse to [visit].  Currently we can't do that, because the
-      // unstringifier_test produces [LetConts] with dummy arguments on them.
-      String parameters = continuation.parameters
-          .map((p) => '${decorator(p, newValueName(p))}')
-          .join(' ');
-      String body =
-          indentBlock(() => indentBlock(() => visit(continuation.body)));
       if (first) {
         first = false;
-        conts = '($name ($parameters)\n$body)';
+        conts = visit(continuation);
       } else {
         // Each subsequent line is indented additional spaces to align it
         // with the previous continuation.
         String indent = '$indentation${' ' * '(LetCont ('.length}';
-        conts = '$conts\n$indent($name ($parameters)\n$body)';
+        conts = '$conts\n$indent${visit(continuation)}';
       }
     }
     String body = indentBlock(() => visit(node.body));
@@ -117,10 +110,12 @@
   }
 
   String formatArguments(CallStructure call,
-                         List<Reference<Primitive>> arguments) {
+                         List<Reference<Primitive>> arguments,
+                         {bool isIntercepted: false}) {
     int positionalArgumentCount = call.positionalArgumentCount;
-    List<String> args = new List<String>();
-    args.addAll(arguments.getRange(0, positionalArgumentCount).map(access));
+    if (isIntercepted) ++positionalArgumentCount;
+    List<String> args =
+        arguments.getRange(0, positionalArgumentCount).map(access).toList();
     List<String> argumentNames = call.getOrderedNamedArguments();
     for (int i = 0; i < argumentNames.length; ++i) {
       String name = argumentNames[i];
@@ -141,7 +136,8 @@
     String name = node.selector.name;
     String rcv = access(node.receiver);
     String cont = access(node.continuation);
-    String args = formatArguments(node.selector.callStructure, node.arguments);
+    String args = formatArguments(node.selector.callStructure, node.arguments,
+        isIntercepted: node.receiverIsIntercepted);
     return '$indentation(InvokeMethod $rcv $name $args $cont)';
   }
 
@@ -215,8 +211,16 @@
   }
 
   String visitContinuation(Continuation node) {
-    // Continuations are visited directly in visitLetCont.
-    return '(Unexpected Continuation)';
+    String name = newContinuationName(node);
+    if (node.isRecursive) name = 'rec $name';
+    // TODO(karlklose): this should be changed to `.map(visit).join(' ')`  and
+    // should recurse to [visit].  Currently we can't do that, because the
+    // unstringifier_test produces [LetConts] with dummy arguments on them.
+    String parameters = node.parameters
+        .map((p) => '${decorator(p, newValueName(p))}')
+        .join(' ');
+    String body = indentBlock(() => indentBlock(() => visit(node.body)));
+    return '($name ($parameters)\n$body)';
   }
 
   String visitGetMutable(GetMutable node) {
@@ -291,7 +295,7 @@
     String className = node.classElement.name;
     String arguments = node.arguments.map(access).join(' ');
     String typeInformation = node.typeInformation.map(access).join(' ');
-    return '(CreateInstance $className ($arguments)$typeInformation)';
+    return '(CreateInstance $className ($arguments) ($typeInformation))';
   }
 
   String visitInterceptor(Interceptor node) {
@@ -364,6 +368,12 @@
   }
 
   @override
+  String visitYield(Yield node) {
+    String value = access(node.input);
+    String continuation = access(node.continuation);
+    return '(Yield $value $continuation)';
+  }
+
   String visitRefinement(Refinement node) {
     String value = access(node.value);
     return '(Refinement $value ${node.type})';
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index 5240db9..a969bdb 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -5,7 +5,7 @@
 library dart2js.ir_tracer;
 
 import 'dart:async' show EventSink;
-import 'cps_ir_nodes.dart' as cps_ir hide Function;
+import 'cps_ir_nodes.dart' as cps_ir;
 import '../tracer.dart';
 
 /**
@@ -119,7 +119,7 @@
         String name = names.name(cont);
         return cont.isRecursive ? '$name*' : name;
       }
-      
+
       String ids = node.continuations.map(nameContinuation).join(', ');
       printStmt(dummy, "LetCont $ids");
     }
@@ -397,6 +397,13 @@
   }
 
   @override
+  visitYield(cps_ir.Yield node) {
+    String value = formatReference(node.input);
+    String continuation = formatReference(node.continuation);
+    return 'Yield $value $continuation';
+  }
+
+  @override
   visitRefinement(cps_ir.Refinement node) {
     String value = formatReference(node.value);
     return 'Refinement $value ${node.type}';
@@ -675,9 +682,15 @@
 
   @override
   visitAwait(cps_ir.Await node) {
-    unexpectedNode(node);
+    addEdgeToContinuation(node.continuation);
   }
 
+  @override
+  visitYield(cps_ir.Yield node) {
+    addEdgeToContinuation(node.continuation);
+  }
+
+  @override
   visitRefinement(cps_ir.Refinement node) {
     unexpectedNode(node);
   }
diff --git a/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart b/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
index fb6b539..18bb14d 100644
--- a/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
+++ b/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
@@ -8,7 +8,7 @@
 import 'dart:collection' show Queue;
 
 import '../closure.dart' show
-    ClosureClassElement, Identifiers;
+    ClosureClassElement;
 import '../common/names.dart' show
     Selectors, Identifiers;
 import '../compiler.dart' as dart2js show
diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
index 0e61782..4aa4ba0 100644
--- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
+++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
@@ -697,6 +697,11 @@
   processRefinement(Refinement node) {
     node.value.parent = node;
   }
+
+  processYield(Yield node) {
+    node.continuation.parent = node;
+    node.input.parent = node;
+  }
 }
 
 class _ReductionKind {
diff --git a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
index e05db65..c911b5f 100644
--- a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
@@ -4,7 +4,7 @@
 
 library dart2js.type_mask_system;
 
-import '../closure.dart' show ClosureClassElement, Identifiers;
+import '../closure.dart' show ClosureClassElement;
 import '../common/names.dart' show Selectors, Identifiers;
 import '../compiler.dart' as dart2js show Compiler;
 import '../constants/constant_system.dart';
@@ -15,7 +15,7 @@
 import '../js_backend/js_backend.dart' show JavaScriptBackend;
 import '../types/types.dart';
 import '../types/constants.dart' show computeTypeMask;
-import '../universe/universe.dart';
+import '../universe/selector.dart' show Selector;
 import '../world.dart' show World;
 
 enum AbstractBool {
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index 631aaf2..8c37b3a 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -6,9 +6,10 @@
 import 'optimizers.dart';
 
 import '../closure.dart' show
-    ClosureClassElement, Identifiers;
+    ClosureClassElement;
 import '../common/names.dart' show
-    Selectors, Identifiers;
+    Identifiers,
+    Selectors;
 import '../compiler.dart' as dart2js show
     Compiler;
 import '../constants/constant_system.dart';
@@ -17,16 +18,21 @@
 import '../diagnostics/invariant.dart' as dart2js show
     InternalErrorFunction;
 import '../elements/elements.dart';
-import '../io/source_information.dart' show SourceInformation;
-import '../js_backend/js_backend.dart' show JavaScriptBackend;
-import '../js_backend/codegen/task.dart' show CpsFunctionCompiler;
+import '../io/source_information.dart' show
+    SourceInformation;
+import '../js_backend/js_backend.dart' show
+    JavaScriptBackend;
+import '../js_backend/codegen/task.dart' show
+    CpsFunctionCompiler;
 import '../resolution/access_semantics.dart';
 import '../resolution/operators.dart';
 import '../resolution/send_structure.dart';
 import '../tree/tree.dart' as ast;
 import '../types/types.dart';
-import '../types/constants.dart' show computeTypeMask;
-import '../universe/universe.dart';
+import '../types/constants.dart' show
+    computeTypeMask;
+import '../universe/selector.dart' show
+    Selector;
 import '../world.dart' show World;
 import 'cps_fragment.dart';
 import 'cps_ir_nodes.dart';
@@ -379,8 +385,6 @@
         _internalError);
     transformer.transform(root);
   }
-
-  getType(Node node) => _values[node];
 }
 
 final Map<String, BuiltinOperator> NumBinaryBuiltins =
@@ -978,8 +982,7 @@
         CpsFragment cps = new CpsFragment(sourceInfo);
         cps.invokeBuiltin(BuiltinMethod.Push,
             list,
-            <Primitive>[addedItem],
-            receiverIsNotNull: listValue.isDefinitelyNotNull);
+            <Primitive>[addedItem]);
         cps.invokeContinuation(cont, [cps.makeNull()]);
         replaceSubtree(node, cps.result);
         push(cps.result);
@@ -1002,8 +1005,7 @@
             [list, fail.makeConstant(new IntConstantValue(-1))]);
         Primitive removedItem = cps.invokeBuiltin(BuiltinMethod.Pop,
             list,
-            <Primitive>[],
-            receiverIsNotNull: listValue.isDefinitelyNotNull);
+            <Primitive>[]);
         cps.invokeContinuation(cont, [removedItem]);
         replaceSubtree(node, cps.result);
         push(cps.result);
@@ -1027,8 +1029,7 @@
         CpsFragment cps = new CpsFragment(sourceInfo);
         cps.invokeBuiltin(BuiltinMethod.Push,
             list,
-            addedLiteral.values.map((ref) => ref.definition).toList(),
-            receiverIsNotNull: listValue.isDefinitelyNotNull);
+            addedLiteral.values.map((ref) => ref.definition).toList());
         cps.invokeContinuation(cont, [cps.makeNull()]);
         replaceSubtree(node, cps.result);
         push(cps.result);
@@ -1075,7 +1076,7 @@
             !node.selector.isCall) return false;
         assert(node.selector.positionalArgumentCount == 1);
         assert(node.selector.namedArgumentCount == 0);
-        FunctionDefinition target = functionCompiler.compileToCpsIR(element);
+        FunctionDefinition target = functionCompiler.compileToCpsIr(element);
 
         node.receiver.definition.substituteFor(target.thisParameter);
         for (int i = 0; i < node.arguments.length; ++i) {
@@ -1344,7 +1345,7 @@
 
       InvokeMethod invoke = new InvokeMethod.byReference(
         new Reference<Primitive>(object),
-        new Selector(SelectorKind.CALL, getter.memberName, call.callStructure),
+        new Selector.call(getter.memberName, call.callStructure),
         type,
         node.arguments,
         node.continuation,
@@ -1421,7 +1422,7 @@
     if (functionElement.resolvedAst.elements.containsTryStatement) return false;
 
     FunctionDefinition target =
-        functionCompiler.compileToCpsIR(functionElement);
+        functionCompiler.compileToCpsIr(functionElement);
 
     // Accesses to closed-over values are field access primitives.  We we don't
     // inline if there are other uses of 'this' since that could be an escape or
@@ -1476,7 +1477,6 @@
     if (specializeClosureCall(node)) return;
 
     AbstractValue receiver = getValue(node.receiver.definition);
-    node.receiverIsNotNull = receiver.isDefinitelyNotNull;
 
     if (node.receiverIsIntercepted &&
         node.receiver.definition.sameValue(node.arguments[0].definition)) {
@@ -1646,7 +1646,7 @@
 
     if (!shouldInline()) return false;
 
-    FunctionDefinition target = functionCompiler.compileToCpsIR(node.target);
+    FunctionDefinition target = functionCompiler.compileToCpsIr(node.target);
     for (int i = 0; i < node.arguments.length; ++i) {
       node.arguments[i].definition.substituteFor(target.parameters[i]);
     }
@@ -1833,14 +1833,6 @@
     return null;
   }
 
-  void visitGetField(GetField node) {
-    node.objectIsNotNull = getValue(node.object.definition).isDefinitelyNotNull;
-  }
-
-  void visitGetLength(GetLength node) {
-    node.objectIsNotNull = getValue(node.object.definition).isDefinitelyNotNull;
-  }
-
   Primitive visitInterceptor(Interceptor node) {
     AbstractValue value = getValue(node.input.definition);
     // If the exact class of the input is known, replace with a constant
@@ -2111,7 +2103,7 @@
   }
 
   void visitInvokeStatic(InvokeStatic node) {
-    if (node.target.library.isInternalLibrary) {
+    if (node.target.library != null && node.target.library.isInternalLibrary) {
       switch (node.target.name) {
         case InternalMethod.Stringify:
           AbstractValue argValue = getValue(node.arguments[0].definition);
@@ -2139,6 +2131,7 @@
 
   void visitInvokeMethod(InvokeMethod node) {
     AbstractValue receiver = getValue(node.receiver.definition);
+    node.receiverIsNotNull = receiver.isDefinitelyNotNull;
     if (receiver.isNothing) {
       return;  // And come back later.
     }
@@ -2443,6 +2436,7 @@
   }
 
   void visitGetField(GetField node) {
+    node.objectIsNotNull = getValue(node.object.definition).isDefinitelyNotNull;
     setValue(node, nonConstant(typeSystem.getFieldType(node.field)));
   }
 
@@ -2488,6 +2482,7 @@
   @override
   void visitGetLength(GetLength node) {
     AbstractValue input = getValue(node.object.definition);
+    node.objectIsNotNull = getValue(node.object.definition).isDefinitelyNotNull;
     int length = typeSystem.getContainerLength(input.type);
     if (length != null) {
       // TODO(asgerf): Constant-folding the length might degrade the VM's
@@ -2511,8 +2506,12 @@
 
   @override
   void visitAwait(Await node) {
-    Continuation continuation = node.continuation.definition;
-    setReachable(continuation);
+    setResult(node, nonConstant());
+  }
+
+  @override
+  visitYield(Yield node) {
+    setReachable(node.continuation.definition);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index 31c62c7..c250be1 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -356,6 +356,7 @@
     new OptionHandler(Flags.showPackageWarnings, passThrough),
     new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
     new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
+    new OptionHandler(Flags.enableAssertMessage, passThrough),
     new OptionHandler('--enable-async', (_) {
       diagnosticHandler.info(
           "Option '--enable-async' is no longer needed. "
diff --git a/pkg/compiler/lib/src/dart_backend/dart_backend.dart b/pkg/compiler/lib/src/dart_backend/dart_backend.dart
index 2e754f8..9c42e1d 100644
--- a/pkg/compiler/lib/src/dart_backend/dart_backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/dart_backend.dart
@@ -52,8 +52,9 @@
 import '../tokens/keyword.dart' show
     Keyword;
 import '../tree/tree.dart';
+import '../universe/selector.dart' show
+    Selector;
 import '../universe/universe.dart' show
-    Selector,
     UniverseSelector;
 import '../util/util.dart';
 import 'backend_ast_to_frontend_ast.dart' as backend2frontend;
diff --git a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
index ed0c6bc..b15e76a 100644
--- a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
+++ b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
@@ -45,9 +45,7 @@
 
   visitSend(Send node) {
     Element element = elements[node];
-    if (elements.isAssert(node)) {
-      return;
-    } else if (elements.isTypeLiteral(node)) {
+    if (elements.isTypeLiteral(node)) {
       DartType type = elements.getTypeLiteralType(node);
       if (!type.isDynamic) {
         if (type is TypeVariableType) {
@@ -139,7 +137,6 @@
         collector.currentElement, element, node);
 
     if (Elements.isUnresolved(element)
-        || elements.isAssert(node)
         || element.isDeferredLoaderGetter) {
       return;
     }
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 949a37b..bd9c01a 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -34,8 +34,7 @@
     MetadataAnnotation,
     PrefixElement,
     ScopeContainerElement,
-    TypedefElement,
-    VoidElement;
+    TypedefElement;
 import 'js_backend/js_backend.dart' show
     JavaScriptBackend;
 import 'resolution/resolution.dart' show
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index 8fabdf8..33a6ba3 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -184,10 +184,13 @@
   DUPLICATED_RESOURCE,
   EMPTY_CATCH_DECLARATION,
   EMPTY_ENUM_DECLARATION,
+  EMPTY_HIDE,
   EQUAL_MAP_ENTRY_KEY,
+  EMPTY_SHOW,
   EXISTING_DEFINITION,
   EXISTING_LABEL,
   EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
+  EXPERIMENTAL_ASSERT_MESSAGE,
   EXPONENT_MISSING,
   EXPORT_BEFORE_PARTS,
   EXTERNAL_WITH_BODY,
@@ -822,7 +825,7 @@
       MessageKind.DUPLICATE_EXPORT:
         const MessageTemplate(MessageKind.DUPLICATE_EXPORT,
           "Duplicate export of '#{name}'.",
-          howToFix: "Trying adding 'hide #{name}' to one of the exports.",
+          howToFix: "Try adding 'hide #{name}' to one of the exports.",
           examples: const [const {
 'main.dart': """
 export 'decl1.dart';
@@ -840,6 +843,40 @@
         const MessageTemplate(MessageKind.DUPLICATE_EXPORT_DECL,
           "The exported '#{name}' from export #{uriString} is defined here."),
 
+      MessageKind.EMPTY_HIDE:
+        const MessageTemplate(MessageKind.EMPTY_HIDE,
+            "Library '#{uri}' doesn't export a '#{name}' declaration.",
+      howToFix: "Try removing '#{name}' the 'hide' clause.",
+      examples: const [
+        const {
+            'main.dart': """
+import 'dart:core' hide Foo;
+
+main() {}"""},
+        const {
+'main.dart': """
+export 'dart:core' hide Foo;
+
+main() {}"""},
+]),
+
+      MessageKind.EMPTY_SHOW:
+        const MessageTemplate(MessageKind.EMPTY_SHOW,
+            "Library '#{uri}' doesn't export a '#{name}' declaration.",
+      howToFix: "Try removing '#{name}' from the 'show' clause.",
+      examples: const [
+        const {
+            'main.dart': """
+import 'dart:core' show Foo;
+
+main() {}"""},
+        const {
+'main.dart': """
+export 'dart:core' show Foo;
+
+main() {}"""},
+]),
+
       MessageKind.NOT_A_TYPE:
         const MessageTemplate(MessageKind.NOT_A_TYPE,
           "'#{node}' is not a type."),
@@ -3269,6 +3306,19 @@
   // Patch errors end.
   //////////////////////////////////////////////////////////////////////////////
 
+      MessageKind.EXPERIMENTAL_ASSERT_MESSAGE:
+        const MessageTemplate(MessageKind.EXPERIMENTAL_ASSERT_MESSAGE,
+          "Experimental language feature 'assertion with message'"
+          " is not supported.",
+          howToFix:
+            "Use option '--assert-message' to use assertions with messages.",
+          examples: const [r'''
+main() {
+  int n = -7;
+  assert(n > 0, 'must be positive: $n');
+}
+''']),
+
       MessageKind.IMPORT_EXPERIMENTAL_MIRRORS:
         const MessageTemplate(MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, r'''
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index adf558d..88d1be1 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -30,7 +30,6 @@
     Emitter;
 import 'js/js.dart' as jsAst;
 import 'universe/universe.dart' show
-    Selector,
     UniverseSelector;
 
 class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> {
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index de3c11f..8c20320 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -1403,7 +1403,7 @@
     if (isPatch) {
       ConstantVariableMixin originVariable = origin;
       originVariable.constant = value;
-      return null;
+      return;
     }
     assert(invariant(
         this, constantCache == null || constantCache == value,
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 6ad5177..35b5640 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -55,6 +55,8 @@
     Send;
 import 'types/types.dart' show
     TypeMaskStrategy;
+import 'universe/selector.dart' show
+    Selector;
 import 'universe/universe.dart';
 import 'util/util.dart' show
     Link,
diff --git a/pkg/compiler/lib/src/inferrer/concrete_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/concrete_types_inferrer.dart
index 474f71f..4bb654a 100644
--- a/pkg/compiler/lib/src/inferrer/concrete_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/concrete_types_inferrer.dart
@@ -25,7 +25,11 @@
     TypeMask,
     TypesInferrer,
     UnionTypeMask;
-import '../universe/universe.dart';
+import '../universe/selector.dart' show
+    Selector,
+    SelectorKind;
+import '../universe/side_effects.dart' show
+    SideEffects;
 import '../world.dart' show
     ClassWorld;
 
@@ -2011,7 +2015,7 @@
                                      SideEffects sideEffects,
                                      bool inLoop) {
     caller = getRealCaller(caller);
-    if ((selector == null) || (selector.kind == SelectorKind.CALL)) {
+    if ((selector == null) || (selector.isCall)) {
       callee = callee.implementation;
       if (selector != null && selector.name == 'JS') {
         return null;
@@ -2044,7 +2048,7 @@
         }
         return getSendReturnType(selector, callee, receiverClass, arguments);
       }
-    } else if (selector.kind == SelectorKind.GETTER) {
+    } else if (selector.isGetter) {
       if (callee.isField) {
         addFieldReader(callee, caller);
         return getFieldType(selector, callee);
@@ -2058,7 +2062,7 @@
         addClosure(callee, null, null);
         return singletonConcreteType(baseTypes.functionBaseType);
       }
-    } else if (selector.kind == SelectorKind.SETTER) {
+    } else if (selector.isSetter) {
       ConcreteType argumentType = arguments.positional.first;
       if (callee.isField) {
         augmentFieldType(callee, argumentType);
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
index e542d49..08fa945 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
@@ -26,7 +26,10 @@
     TypeMask;
 import '../types/constants.dart' show
     computeTypeMask;
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 import '../util/util.dart';
 import '../world.dart' show
     ClassWorld;
@@ -755,6 +758,14 @@
 
   T handleDynamicInvoke(Send node);
 
+  T visitAssert(Assert node) {
+    // Avoid pollution from assert statement unless enabled.
+    if (compiler.enableUserAssertions) {
+      super.visitAssert(node);
+    }
+    return null;
+  }
+
   T visitAsyncForIn(AsyncForIn node);
 
   T visitSyncForIn(SyncForIn node);
@@ -793,17 +804,6 @@
     return types.dynamicType;
   }
 
-  @override
-  T visitAssert(Send node, Node expression, _) {
-    if (!compiler.enableUserAssertions) {
-      return types.nullType;
-    }
-    return handleAssert(node, expression);
-  }
-
-  /// Handle an enabled assertion of [expression].
-  T handleAssert(Send node, Node expression);
-
   T visitNode(Node node) {
     return node.visitChildren(this);
   }
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index fccfb80..ec61e4b 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -35,16 +35,15 @@
     FlatTypeMask,
     TypeMask,
     ContainerTypeMask,
-    ElementTypeMask,
-    ValueTypeMask,
-    TypeSystem,
-    MinimalInferrerEngine;
+    ValueTypeMask;
 import '../util/util.dart' show
     Link,
     Setlet;
-import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
+import '../universe/side_effects.dart' show
     SideEffects;
 import '../world.dart' show ClassWorld;
 
@@ -1572,20 +1571,6 @@
   }
 
   @override
-  T handleAssert(ast.Send node, ast.Node expression) {
-    js.JavaScriptBackend backend = compiler.backend;
-    Element element = backend.assertMethod;
-    ArgumentsTypes<T> arguments =
-        new ArgumentsTypes<T>(<T>[expression.accept(this)], null);
-    return handleStaticSend(
-        node,
-        new Selector.fromElement(element),
-        null,
-        element,
-        arguments);
-  }
-
-  @override
   T handleTypeLiteralInvoke(ast.NodeList arguments) {
     // This is reached when users forget to put a `new` in front of a type
     // literal. The emitter will generate an actual call (even though it is
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index cf7e1cc..efaae28 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -47,11 +47,12 @@
     ValueTypeMask;
 import '../types/constants.dart' show
     computeTypeMask;
-import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
-    SideEffects,
-    TypedSelector;
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
+import '../universe/side_effects.dart' show
+    SideEffects;
 import '../util/util.dart' show
     ImmutableEmptySet,
     Setlet;
@@ -1036,16 +1037,16 @@
       if (parameter.functionDeclaration.isInstanceMember) {
         ParameterAssignments assignments = info.assignments;
         assignments.replace(existing, type);
-        type.addUser(info);
       } else {
         List<TypeInformation> assignments = info.assignments;
         for (int i = 0; i < assignments.length; i++) {
           if (assignments[i] == existing) {
             assignments[i] = type;
-            type.addUser(info);
           }
         }
       }
+      // Also forward all users.
+      type.addUsersOf(existing);
     } else {
       assert(existing == null);
     }
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 900bd47..9b2123e 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -88,6 +88,10 @@
     users.add(user);
   }
 
+  void addUsersOf(TypeInformation other) {
+    users.addAll(other.users);
+  }
+
   void removeUser(TypeInformation user) {
     assert(!user.isConcrete);
     users.remove(user);
@@ -524,6 +528,10 @@
   void tagAsTearOffClosureParameter(TypeGraphInferrerEngine inferrer) {
     assert(element.isParameter);
     isTearOffClosureParameter = true;
+    // We have to add a flow-edge for the default value (if it exists), as we
+    // might not see all call-sites and thus miss the use of it.
+    TypeInformation defaultType = inferrer.getDefaultTypeOfParameter(element);
+    if (defaultType != null) defaultType.addUser(this);
   }
 
   // TODO(herhut): Cleanup into one conditional.
@@ -540,8 +548,7 @@
     // initializing formals.
     if (element.isInitializingFormal) return null;
 
-    FunctionElement function = element.functionDeclaration;
-    if ((isTearOffClosureParameter || function.isLocal) &&
+    if ((isTearOffClosureParameter || declaration.isLocal) &&
         disableInferenceForClosures) {
       // Do not infer types for parameters of closures. We do not
       // clear the assignments in case the closure is successfully
@@ -549,16 +556,20 @@
       giveUp(inferrer, clearAssignments: false);
       return safeType(inferrer);
     }
-    if (function.isInstanceMember &&
-        (function.name == Identifiers.noSuchMethod_ ||
-        (function.name == Identifiers.call &&
+    if (declaration.isInstanceMember &&
+        (declaration.name == Identifiers.noSuchMethod_ ||
+        (declaration.name == Identifiers.call &&
          disableInferenceForClosures))) {
       // Do not infer types for parameters of [noSuchMethod] and
       // [call] instance methods.
       giveUp(inferrer);
       return safeType(inferrer);
     }
-    if (function == inferrer.mainElement) {
+    if (inferrer.compiler.world.getMightBePassedToApply(declaration)) {
+      giveUp(inferrer);
+      return safeType(inferrer);
+    }
+    if (declaration == inferrer.mainElement) {
       // The implicit call to main is not seen by the inferrer,
       // therefore we explicitly set the type of its parameters as
       // dynamic.
@@ -1070,6 +1081,11 @@
     // needs to notify its users.
   }
 
+  void addUsersOf(TypeInformation other) {
+    // Nothing to do, a concrete type does not get updated so never
+    // needs to notify its users.
+  }
+
   void removeUser(TypeInformation user) {
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index bb88478..a8d66e0 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -278,7 +278,10 @@
 
   ClassElement closureClass;
   ClassElement boundClosureClass;
-  Element assertMethod;
+  Element assertTestMethod;
+  Element assertThrowMethod;
+  Element assertHelperMethod;
+  Element assertUnreachableMethod;
   Element invokeOnMethod;
 
   ClassElement jsInterceptorClass;
@@ -1195,6 +1198,7 @@
       assert(traceHelper != null);
       enqueueInResolution(traceHelper, registry);
     }
+    enqueueInResolution(assertUnreachableMethod, registry);
     registerCheckedModeHelpers(registry);
   }
 
@@ -1357,8 +1361,6 @@
     }
   }
 
-  bool isAssertMethod(Element element) => element == assertMethod;
-
   void registerRequiredType(DartType type, Element enclosingElement) {
     // If [argument] has type variables or is a type variable, this method
     // registers a RTI dependency between the class where the type variable is
@@ -2121,7 +2123,10 @@
         jsMutableIndexableClass = findClass('JSMutableIndexable');
       } else if (uri == DART_JS_HELPER) {
         initializeHelperClasses();
-        assertMethod = findHelper('assertHelper');
+        assertTestMethod = findHelper('assertTest');
+        assertThrowMethod = findHelper('assertThrow');
+        assertHelperMethod = findHelper('assertHelper');
+        assertUnreachableMethod = findHelper('assertUnreachable');
 
         typeLiteralClass = findClass('TypeImpl');
         constMapLiteralClass = findClass('ConstantMap');
@@ -2921,8 +2926,13 @@
     registry.registerInstantiation(element.rawType);
   }
 
-  void onAssert(Send node, Registry registry) {
-    registerBackendStaticInvocation(backend.assertMethod, registry);
+  void onAssert(bool hasMessage, Registry registry) {
+    if (hasMessage) {
+      registerBackendStaticInvocation(backend.assertTestMethod, registry);
+      registerBackendStaticInvocation(backend.assertThrowMethod, registry);
+    } else {
+      registerBackendStaticInvocation(backend.assertHelperMethod, registry);
+    }
   }
 
   void onAsyncForIn(AsyncForIn node, Registry registry) {
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 878145d..963f1d7 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -18,8 +18,9 @@
 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
 import '../../tree_ir/tree_ir_nodes.dart' show BuiltinOperator, BuiltinMethod;
 import '../../types/types.dart' show TypeMask;
+import '../../universe/selector.dart' show
+    Selector;
 import '../../universe/universe.dart' show
-    Selector,
     UniverseSelector;
 import '../../util/maplet.dart';
 
@@ -129,7 +130,7 @@
       jsVariables.add(jsVariable);
 
       // Remove the initializer from the for loop.
-      accumulator[accumulatorIndex] = 
+      accumulator[accumulatorIndex] =
           new js.For(null, forLoop.condition, forLoop.update, forLoop.body);
     }
 
@@ -572,7 +573,7 @@
       loopNode = new js.While(condition, body);
     } else { // Compile as a for loop.
       js.Expression init;
-      if (accumulator.isNotEmpty && 
+      if (accumulator.isNotEmpty &&
           accumulator.last is js.ExpressionStatement) {
         // Take the preceding expression from the accumulator and use
         // it as the initializer expression.
@@ -837,6 +838,12 @@
   }
 
   @override
+  void visitYield(tree_ir.Yield node) {
+    js.Expression value = visitExpression(node.input);
+    accumulator.add(new js.DartYield(value, node.hasStar));
+  }
+
+  @override
   js.Expression visitApplyBuiltinOperator(tree_ir.ApplyBuiltinOperator node) {
     List<js.Expression> args = visitExpressionList(node.arguments);
     switch (node.operator) {
@@ -890,7 +897,7 @@
   }
 
   /// The JS name of a built-in method.
-  static final Map<BuiltinMethod, String> builtinMethodName = 
+  static final Map<BuiltinMethod, String> builtinMethodName =
     const <BuiltinMethod, String>{
       BuiltinMethod.Push: 'push',
       BuiltinMethod.Pop: 'pop',
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index 8472318..37dd0ae 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -19,7 +19,7 @@
 import '../../elements/elements.dart';
 import '../../js_emitter/js_emitter.dart';
 import '../../js/js.dart' as js;
-import '../../universe/universe.dart' show
+import '../../universe/selector.dart' show
     Selector;
 import '../../world.dart' show
     ClassWorld;
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index 16093d3..4bae7de 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -84,10 +84,10 @@
         if (tracer != null) {
           tracer.traceCompilation(element.name, null);
         }
-        cps.FunctionDefinition cpsFunction = compileToCpsIR(element);
-        cpsFunction = optimizeCpsIR(cpsFunction);
-        tree_ir.FunctionDefinition treeFunction = compileToTreeIR(cpsFunction);
-        treeFunction = optimizeTreeIR(treeFunction);
+        cps.FunctionDefinition cpsFunction = compileToCpsIr(element);
+        cpsFunction = optimizeCpsIr(cpsFunction);
+        tree_ir.FunctionDefinition treeFunction = compileToTreeIr(cpsFunction);
+        treeFunction = optimizeTreeIr(treeFunction);
         return compileToJavaScript(work, treeFunction);
       } on CodegenBailout catch (e) {
         String message = "Unable to compile $element with the new compiler.\n"
@@ -107,23 +107,29 @@
     }
   }
 
-  cps.FunctionDefinition compileToCpsIR(AstElement element) {
-    cps.FunctionDefinition cpsNode = irBuilderTask.buildNode(element);
-    if (cpsNode == null) {
+  void applyCpsPass(cps_opt.Pass pass, cps.FunctionDefinition cpsFunction) {
+    pass.rewrite(cpsFunction);
+    traceGraph(pass.passName, cpsFunction);
+    dumpTypedIr(pass.passName, cpsFunction);
+    assert(checkCpsIntegrity(cpsFunction));
+  }
+
+  cps.FunctionDefinition compileToCpsIr(AstElement element) {
+    cps.FunctionDefinition cpsFunction = irBuilderTask.buildNode(element);
+    if (cpsFunction == null) {
       if (irBuilderTask.bailoutMessage == null) {
         giveUp('unable to build cps definition of $element');
       } else {
         giveUp(irBuilderTask.bailoutMessage);
       }
     }
-    traceGraph("IR Builder", cpsNode);
+    traceGraph('IR Builder', cpsFunction);
+    dumpTypedIr('IR Builder', cpsFunction);
     // Eliminating redundant phis before the unsugaring pass will make it
     // insert fewer getInterceptor calls.
-    new RedundantPhiEliminator().rewrite(cpsNode);
-    traceGraph("Redundant phi elimination", cpsNode);
-    new UnsugarVisitor(glue).rewrite(cpsNode);
-    traceGraph("Unsugaring", cpsNode);
-    return cpsNode;
+    applyCpsPass(new RedundantPhiEliminator(), cpsFunction);
+    applyCpsPass(new UnsugarVisitor(glue), cpsFunction);
+    return cpsFunction;
   }
 
   static const Pattern PRINT_TYPED_IR_FILTER = null;
@@ -143,19 +149,20 @@
     throw 'unsupported: $type';
   }
 
-  void dumpTypedIR(cps.FunctionDefinition cpsNode,
-                   TypePropagator typePropagator) {
+  void dumpTypedIr(String passName, cps.FunctionDefinition cpsFunction) {
     if (PRINT_TYPED_IR_FILTER != null &&
-        PRINT_TYPED_IR_FILTER.matchAsPrefix(cpsNode.element.name) != null) {
+        PRINT_TYPED_IR_FILTER.matchAsPrefix(cpsFunction.element.name) != null) {
       String printType(nodeOrRef, String s) {
         cps.Node node = nodeOrRef is cps.Reference
             ? nodeOrRef.definition
             : nodeOrRef;
-        var type = typePropagator.getType(node);
-        return type == null ? s : "$s:${formatTypeMask(type.type)}";
+        return node is cps.Variable && node.type != null
+            ? '$s:${formatTypeMask(node.type)}'
+            : s;
       }
       DEBUG_MODE = true;
-      print(new SExpressionStringifier(printType).visit(cpsNode));
+      print(';;; ==== After $passName ====');
+      print(new SExpressionStringifier(printType).visit(cpsFunction));
     }
   }
 
@@ -164,38 +171,28 @@
     return true; // So this can be used from assert().
   }
 
-  cps.FunctionDefinition optimizeCpsIR(cps.FunctionDefinition cpsNode) {
-    // Transformations on the CPS IR.
-    void applyCpsPass(cps_opt.Pass pass) {
-      pass.rewrite(cpsNode);
-      traceGraph(pass.passName, cpsNode);
-      assert(checkCpsIntegrity(cpsNode));
-    }
-
+  cps.FunctionDefinition optimizeCpsIr(cps.FunctionDefinition cpsFunction) {
     TypeMaskSystem typeSystem = new TypeMaskSystem(compiler);
 
-    applyCpsPass(new RedundantJoinEliminator());
-    applyCpsPass(new RedundantPhiEliminator());
-    applyCpsPass(new InsertRefinements(typeSystem));
-    TypePropagator typePropagator =
-        new TypePropagator(compiler, typeSystem, this);
-    applyCpsPass(typePropagator);
-    dumpTypedIR(cpsNode, typePropagator);
-    applyCpsPass(new RemoveRefinements());
-    applyCpsPass(new ShrinkingReducer());
-    applyCpsPass(new ScalarReplacer(compiler));
-    applyCpsPass(new MutableVariableEliminator());
-    applyCpsPass(new RedundantJoinEliminator());
-    applyCpsPass(new RedundantPhiEliminator());
-    applyCpsPass(new ShrinkingReducer());
-    applyCpsPass(new LoopInvariantCodeMotion());
-    applyCpsPass(new ShareInterceptors());
-    applyCpsPass(new ShrinkingReducer());
+    applyCpsPass(new RedundantJoinEliminator(), cpsFunction);
+    applyCpsPass(new RedundantPhiEliminator(), cpsFunction);
+    applyCpsPass(new InsertRefinements(typeSystem), cpsFunction);
+    applyCpsPass(new TypePropagator(compiler, typeSystem, this), cpsFunction);
+    applyCpsPass(new RemoveRefinements(), cpsFunction);
+    applyCpsPass(new ShrinkingReducer(), cpsFunction);
+    applyCpsPass(new ScalarReplacer(compiler), cpsFunction);
+    applyCpsPass(new MutableVariableEliminator(), cpsFunction);
+    applyCpsPass(new RedundantJoinEliminator(), cpsFunction);
+    applyCpsPass(new RedundantPhiEliminator(), cpsFunction);
+    applyCpsPass(new ShrinkingReducer(), cpsFunction);
+    applyCpsPass(new LoopInvariantCodeMotion(), cpsFunction);
+    applyCpsPass(new ShareInterceptors(), cpsFunction);
+    applyCpsPass(new ShrinkingReducer(), cpsFunction);
 
-    return cpsNode;
+    return cpsFunction;
   }
 
-  tree_ir.FunctionDefinition compileToTreeIR(cps.FunctionDefinition cpsNode) {
+  tree_ir.FunctionDefinition compileToTreeIr(cps.FunctionDefinition cpsNode) {
     tree_builder.Builder builder = new tree_builder.Builder(
         compiler.internalError);
     tree_ir.FunctionDefinition treeNode = builder.buildFunction(cpsNode);
@@ -210,7 +207,7 @@
     return true; // So this can be used from assert().
   }
 
-  tree_ir.FunctionDefinition optimizeTreeIR(tree_ir.FunctionDefinition node) {
+  tree_ir.FunctionDefinition optimizeTreeIr(tree_ir.FunctionDefinition node) {
     void applyTreePass(tree_opt.Pass pass) {
       pass.rewrite(node);
       traceGraph(pass.passName, node);
diff --git a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
index 6209cda..3f68eed 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
@@ -2,12 +2,12 @@
 
 import '../../cps_ir/cps_ir_nodes.dart';
 
-import '../../cps_ir/optimizers.dart' show ParentVisitor;
+import '../../cps_ir/optimizers.dart' show ParentVisitor, Pass;
 import '../../constants/values.dart';
 import '../../elements/elements.dart';
 import '../../io/source_information.dart';
 import '../../js_backend/codegen/glue.dart';
-import '../../universe/universe.dart' show Selector;
+import '../../universe/selector.dart' show Selector;
 import '../../cps_ir/cps_ir_builder.dart' show ThisParameterLocal;
 
 class ExplicitReceiverParameterEntity implements Local {
@@ -35,7 +35,7 @@
 ///  - Add explicit receiver argument for methods that are called in interceptor
 ///    calling convention.
 ///  - Convert two-parameter exception handlers to one-parameter ones.
-class UnsugarVisitor extends RecursiveVisitor {
+class UnsugarVisitor extends RecursiveVisitor implements Pass {
   Glue _glue;
   ParentVisitor _parentVisitor = new ParentVisitor();
 
@@ -49,10 +49,12 @@
 
   UnsugarVisitor(this._glue);
 
+  String get passName => 'Unsugaring';
+
   bool methodUsesReceiverArgument(FunctionElement function) {
     assert(_glue.isInterceptedMethod(function));
     ClassElement clazz = function.enclosingClass.declaration;
-    return _glue.isInterceptorClass(clazz) || 
+    return _glue.isInterceptorClass(clazz) ||
            _glue.isUsedAsMixin(clazz);
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/js_backend.dart b/pkg/compiler/lib/src/js_backend/js_backend.dart
index af8df51..d616728 100644
--- a/pkg/compiler/lib/src/js_backend/js_backend.dart
+++ b/pkg/compiler/lib/src/js_backend/js_backend.dart
@@ -63,12 +63,10 @@
     JavaScriptSourceInformationStrategy;
 import '../js/rewrite_async.dart';
 import '../js_emitter/js_emitter.dart' show
-    ClassBuilder,
     CodeEmitterTask,
     Emitter,
     MetadataCollector,
     Placeholder,
-    TokenFinalizer,
     USE_LAZY_EMITTER;
 import '../library_loader.dart' show LibraryLoader, LoadedLibraries;
 import '../native/native.dart' as native;
@@ -79,6 +77,11 @@
 import '../ssa/ssa.dart';
 import '../tree/tree.dart';
 import '../types/types.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector,
+    SelectorKind;
 import '../universe/universe.dart';
 import '../util/characters.dart';
 import '../util/util.dart';
diff --git a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
index 4f372c3..fa70021 100644
--- a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
@@ -25,7 +25,6 @@
     FunctionSignature,
     LibraryElement,
     VariableElement;
-import '../enqueue.dart' show Enqueuer;
 import 'js_backend.dart' show JavaScriptBackend;
 import '../dart_types.dart' show DynamicType, InterfaceType;
 import 'package:pub_semver/pub_semver.dart';
diff --git a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
index 5d779a0..82b4fe5 100644
--- a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
+++ b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
@@ -43,8 +43,7 @@
       // On first encounter, we have to ensure that the support classes get
       // resolved.
       if (!_seenClassesWithTypeVariables) {
-        _backend.enqueueClass(
-            enqueuer, _typeVariableClass, registry);
+        _backend.enqueueClass(enqueuer, _typeVariableClass, registry);
         _typeVariableClass.ensureResolved(_compiler);
         Link constructors = _typeVariableClass.constructors;
         if (constructors.isEmpty && constructors.tail.isEmpty) {
@@ -53,9 +52,9 @@
         }
         _typeVariableConstructor = _typeVariableClass.constructors.head;
         _backend.enqueueInResolution(_typeVariableConstructor, registry);
-        enqueuer.registerInstantiatedType(_typeVariableClass.rawType,
-                                          registry);
-        enqueuer.registerStaticUse(_backend.getCreateRuntimeType());
+        enqueuer.registerInstantiatedType(_typeVariableClass.rawType, registry);
+        enqueuer.registerStaticUse(
+            _backend.registerBackendUse(_backend.getCreateRuntimeType()));
         _seenClassesWithTypeVariables = true;
       }
     } else {
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index c8d478b..1ea0be0 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -48,7 +48,7 @@
    * Invariant: [member] must be a declaration element.
    */
   Map<jsAst.Name, jsAst.Expression> generateCallStubsForGetter(
-      Element member, Map<Selector, ReceiverMaskSet> selectors) {
+      Element member, Map<Selector, SelectorConstraints> selectors) {
     assert(invariant(member, member.isDeclaration));
 
     // If the method is intercepted, the stub gets the
@@ -124,9 +124,9 @@
     }
 
     void addNoSuchMethodHandlers(String ignore,
-                                 Map<Selector, ReceiverMaskSet> selectors) {
+                                 Map<Selector, SelectorConstraints> selectors) {
       for (Selector selector in selectors.keys) {
-        ReceiverMaskSet maskSet = selectors[selector];
+        SelectorConstraints maskSet = selectors[selector];
         if (maskSet.needsNoSuchMethodHandling(selector, compiler.world)) {
           jsAst.Name jsName = namer.invocationMirrorInternalName(selector);
           jsNames[jsName] = selector;
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
index b6b04b8..c5723ae 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
@@ -49,7 +49,7 @@
       // We add a special getter here to allow for tearing off a closure from
       // itself.
       jsAst.Fun function = js('function() { return this; }');
-      jsAst.Name name = namer.getterForMember(Selector.CALL_NAME);
+      jsAst.Name name = namer.getterForMember(Names.call);
       builder.addProperty(name, function);
     }
 
diff --git a/pkg/compiler/lib/src/js_emitter/js_emitter.dart b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
index 2f2dffd..1472e53 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
@@ -61,8 +61,7 @@
 import 'startup_emitter/emitter.dart' as startup_js_emitter;
 
 import '../universe/universe.dart' show
-    ReceiverMaskSet,
-    TypedSelector;
+    SelectorConstraints;
 
 import '../util/util.dart' show
     Setlet;
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
index ad3b1cb..3982bf8 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
@@ -18,7 +18,7 @@
     Namer,
     ConstantEmitter;
 
-import '../js_emitter.dart' show AstContainer, NativeEmitter;
+import '../js_emitter.dart' show NativeEmitter;
 
 import 'package:js_runtime/shared/embedded_names.dart' show
     CREATE_NEW_ISOLATE,
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 7e4703e..15a1271 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -10,7 +10,7 @@
 
 import '../deferred_load.dart' show OutputUnit;
 
-import 'js_emitter.dart' show MetadataCollector, TokenFinalizer;
+import 'js_emitter.dart' show MetadataCollector;
 
 import '../common.dart';
 
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index 07398b3..f632f90 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -60,8 +60,8 @@
     // If the method is intercepted, we need to also pass the actual receiver.
     int extraArgumentCount = isInterceptedMethod ? 1 : 0;
     // Use '$receiver' to avoid clashes with other parameter names. Using
-    // '$receiver' works because namer.safeVariableName used for getting parameter
-    // names never returns a name beginning with a single '$'.
+    // '$receiver' works because namer.safeVariableName used for getting
+    // parameter names never returns a name beginning with a single '$'.
     String receiverArgumentName = r'$receiver';
 
     // The parameters that this stub takes.
@@ -200,14 +200,14 @@
     // The set of selectors that apply to `member`. For example, for
     // a member `foo(x, [y])` the following selectors may apply:
     // `foo(x)`, and `foo(x, y)`.
-    Map<Selector, ReceiverMaskSet> selectors;
+    Map<Selector, SelectorConstraints> selectors;
     // The set of selectors that apply to `member` if it's name was `call`.
     // This happens when a member is torn off. In that case calls to the
     // function use the name `call`, and we must be able to handle every
     // `call` invocation that matches the signature. For example, for
     // a member `foo(x, [y])` the following selectors would be possible
     // call-selectors: `call(x)`, and `call(x, y)`.
-    Map<Selector, ReceiverMaskSet> callSelectors;
+    Map<Selector, SelectorConstraints> callSelectors;
 
     // Only instance members (not static methods) need stubs.
     if (member.isInstanceMember) {
@@ -220,9 +220,9 @@
     }
 
     assert(emptySelectorSet.isEmpty);
-    if (selectors == null) selectors = const <Selector, ReceiverMaskSet>{};
+    if (selectors == null) selectors = const <Selector, SelectorConstraints>{};
     if (callSelectors == null) callSelectors =
-        const <Selector, ReceiverMaskSet>{};
+        const <Selector, SelectorConstraints>{};
 
     List<ParameterStubMethod> stubs = <ParameterStubMethod>[];
 
@@ -243,8 +243,7 @@
     // Start with the callSelectors since they imply the generation of the
     // non-call version.
     for (Selector selector in callSelectors.keys) {
-      Selector renamedSelector = new Selector(
-          SelectorKind.CALL,
+      Selector renamedSelector = new Selector.call(
           member.memberName,
           selector.callStructure);
       renamedCallSelectors.add(renamedSelector);
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index b10abf2a..54e15f9 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -30,7 +30,7 @@
     MethodElement,
     ParameterElement;
 
-import '../../universe/universe.dart' show Universe, ReceiverMaskSet;
+import '../../universe/universe.dart' show Universe, SelectorConstraints;
 import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit;
 
 part 'collector.dart';
@@ -385,7 +385,7 @@
         if (method != null) methods.add(method);
       }
       if (member.isGetter || member.isField) {
-        Map<Selector, ReceiverMaskSet> selectors =
+        Map<Selector, SelectorConstraints> selectors =
             _compiler.codegenWorld.invocationsByName(member.name);
         if (selectors != null && !selectors.isEmpty) {
 
@@ -422,7 +422,7 @@
     if (element == backend.closureClass) {
       // We add a special getter here to allow for tearing off a closure from
       // itself.
-      js.Name name = namer.getterForMember(Selector.CALL_NAME);
+      js.Name name = namer.getterForMember(Names.call);
       js.Fun function = js.js('function() { return this; }');
       callStubs.add(_buildStubMethod(name, function));
     }
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 8ce9e34..7885940 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -38,7 +38,7 @@
     relativize;
 
 import '../headers.dart';
-import '../js_emitter.dart' show AstContainer, NativeEmitter;
+import '../js_emitter.dart' show NativeEmitter;
 
 import 'package:js_runtime/shared/embedded_names.dart' show
     CLASS_FIELDS_EXTRACTOR,
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index 9984f05d..dbdd3a0 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -874,7 +874,14 @@
     }
   }
 
-  void registerHandledExports(LibraryElement exportedLibraryElement,
+  /// Register the already computed export scope of [exportedLibraryElement] to
+  /// export from the library of this node through the [export]  declaration
+  /// with the given combination [filter].
+  ///
+  /// Additionally, check that all names in the show/hide combinators are in the
+  /// export scope of [exportedLibraryElement].
+  void registerHandledExports(DiagnosticListener listener,
+                              LibraryElement exportedLibraryElement,
                               ExportElementX export,
                               CombinatorFilter filter) {
     assert(invariant(library, exportedLibraryElement.exportsHandled));
@@ -886,6 +893,9 @@
         pendingExportMap[exportedElement] = exports.prepend(export);
       }
     });
+    listener.withCurrentElement(library, () {
+      checkLibraryDependency(listener, export.node, exportedLibraryElement);
+    });
   }
 
   /**
@@ -1011,6 +1021,45 @@
     }
     return changed;
   }
+
+  /// Check that all names in the show/hide combinators of imports and exports
+  /// are in the export scope of the imported/exported libraries.
+  void checkCombinators(DiagnosticListener listener) {
+    listener.withCurrentElement(library, () {
+      for (ImportLink importLink in imports) {
+        checkLibraryDependency(
+            listener, importLink.import.node, importLink.importedLibrary);
+      }
+    });
+    for (ExportLink exportLink in dependencies) {
+      listener.withCurrentElement(exportLink.exportNode.library, () {
+        checkLibraryDependency(listener, exportLink.export.node, library);
+      });
+    }
+  }
+
+  /// Check that all names in the show/hide combinators of [tag] are in the
+  /// export scope of [library].
+  void checkLibraryDependency(DiagnosticListener listener,
+                              LibraryDependency tag,
+                              LibraryElement library) {
+    if (tag == null || tag.combinators == null) return;
+    for (Combinator combinator in tag.combinators) {
+      for (Identifier identifier in combinator.identifiers) {
+        String name = identifier.source;
+        Element element = library.findExported(name);
+        if (element == null) {
+          listener.reportHint(
+              identifier,
+              combinator.isHide
+                  ? MessageKind.EMPTY_HIDE : MessageKind.EMPTY_SHOW,
+              {'uri': library.canonicalUri,
+               'name': name});
+        }
+      }
+    }
+  }
+
 }
 
 /**
@@ -1084,6 +1133,10 @@
     nodeMap.forEach((LibraryElement library, LibraryDependencyNode node) {
       node.registerImports(compiler);
     });
+
+    nodeMap.forEach((LibraryElement library, LibraryDependencyNode node) {
+      node.checkCombinators(compiler);
+    });
   }
 
   /// Registers that [library] depends on [loadedLibrary] through
@@ -1099,7 +1152,7 @@
         CombinatorFilter combinatorFilter =
             new CombinatorFilter.fromTag(libraryDependency.node);
         exportingNode.registerHandledExports(
-            loadedLibrary, libraryDependency, combinatorFilter);
+            compiler, loadedLibrary, libraryDependency, combinatorFilter);
         return;
       }
       LibraryDependencyNode exportedNode = nodeMap[loadedLibrary];
diff --git a/pkg/compiler/lib/src/native/native.dart b/pkg/compiler/lib/src/native/native.dart
index ebe88a9..fe1659e 100644
--- a/pkg/compiler/lib/src/native/native.dart
+++ b/pkg/compiler/lib/src/native/native.dart
@@ -48,7 +48,8 @@
     EOF_TOKEN,
     STRING_TOKEN;
 import '../tree/tree.dart';
-import '../universe/universe.dart' show SideEffects;
+import '../universe/side_effects.dart' show
+    SideEffects;
 import '../util/util.dart';
 
 part 'behavior.dart';
diff --git a/pkg/compiler/lib/src/parser/listener.dart b/pkg/compiler/lib/src/parser/listener.dart
index 5252d46..ec8274d 100644
--- a/pkg/compiler/lib/src/parser/listener.dart
+++ b/pkg/compiler/lib/src/parser/listener.dart
@@ -489,7 +489,8 @@
   void handleEmptyStatement(Token token) {
   }
 
-  void handleAssertStatement(Token assertKeyword, Token semicolonToken) {
+  void handleAssertStatement(Token assertKeyword,
+                             Token commaToken, Token semicolonToken) {
   }
 
   /** Called with either the token containing a double literal, or
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart
index 455f53e..d8383f3 100644
--- a/pkg/compiler/lib/src/parser/node_listener.dart
+++ b/pkg/compiler/lib/src/parser/node_listener.dart
@@ -763,11 +763,16 @@
     }
   }
 
-  void handleAssertStatement(Token assertKeyword, Token semicolonToken) {
-    NodeList arguments = popNode();
-    Node selector = new Identifier(assertKeyword);
-    Node send = new Send(null, selector, arguments);
-    pushNode(new ExpressionStatement(send, semicolonToken));
+  void handleAssertStatement(Token assertKeyword,
+                             Token commaToken, Token semicolonToken) {
+    Node message;
+    Node condition;
+    if (commaToken != null) {
+      message = popNode();
+    }
+    condition = popNode();
+    pushNode(new Assert(assertKeyword, condition,
+                        message, semicolonToken));
   }
 
   void endUnnamedFunction(Token token) {
diff --git a/pkg/compiler/lib/src/parser/parser.dart b/pkg/compiler/lib/src/parser/parser.dart
index 68f96bc..6ed2657 100644
--- a/pkg/compiler/lib/src/parser/parser.dart
+++ b/pkg/compiler/lib/src/parser/parser.dart
@@ -2697,10 +2697,20 @@
 
   Token parseAssertStatement(Token token) {
     Token assertKeyword = token;
+    Token commaToken = null;
     token = expect('assert', token);
-    expect('(', token);
-    token = parseArguments(token);
-    listener.handleAssertStatement(assertKeyword, token);
+    token = expect('(', token);
+    bool old = mayParseFunctionExpressions;
+    mayParseFunctionExpressions = true;
+    token = parseExpression(token);
+    if (optional(',', token)) {
+      commaToken = token;
+      token = token.next;
+      token = parseExpression(token);
+    }
+    token = expect(')', token);
+    mayParseFunctionExpressions = old;
+    listener.handleAssertStatement(assertKeyword, commaToken, token);
     return expectSemicolon(token);
   }
 
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index 5b26ba0..738761d 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -25,9 +25,8 @@
 import '../util/util.dart' show
     Link,
     Setlet;
-import '../universe/universe.dart' show
-    CallStructure,
-    Selector;
+import '../universe/call_structure.dart' show
+    CallStructure;
 
 import 'enum_creator.dart';
 import 'members.dart' show
diff --git a/pkg/compiler/lib/src/resolution/constructors.dart b/pkg/compiler/lib/src/resolution/constructors.dart
index 66af813..8528ca0 100644
--- a/pkg/compiler/lib/src/resolution/constructors.dart
+++ b/pkg/compiler/lib/src/resolution/constructors.dart
@@ -28,8 +28,9 @@
 import '../tree/tree.dart';
 import '../util/util.dart' show
     Link;
-import '../universe/universe.dart' show
-    CallStructure,
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
     Selector;
 
 import 'members.dart' show
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index 9d8b71e..168013c 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -38,9 +38,11 @@
 import '../tree/tree.dart';
 import '../util/util.dart' show
     Link;
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
     UniverseSelector;
 
 import 'access_semantics.dart';
@@ -499,6 +501,20 @@
     }
   }
 
+  ResolutionResult visitAssert(Assert node) {
+    if (!compiler.enableAssertMessage) {
+      if (node.hasMessage) {
+        compiler.reportError(node, MessageKind.EXPERIMENTAL_ASSERT_MESSAGE);
+      }
+    }
+    // TODO(sra): We could completely ignore the assert in production mode if we
+    // didn't need it to be resolved for type checking.
+    registry.registerAssert(node.hasMessage);
+    visit(node.condition);
+    visit(node.message);
+    return const NoneResult();
+  }
+
   ResolutionResult visitCascade(Cascade node) {
     visit(node.expression);
     return const NoneResult();
@@ -1526,34 +1542,6 @@
     return const NoneResult();
   }
 
-  /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`.
-  ResolutionResult handleAssert(Send node) {
-    assert(invariant(node, node.isCall,
-        message: "Unexpected assert: $node"));
-    // If this send is of the form "assert(expr);", then
-    // this is an assertion.
-
-    CallStructure callStructure =
-        resolveArguments(node.argumentsNode).callStructure;
-    SendStructure sendStructure = const AssertStructure();
-    if (callStructure.argumentCount != 1) {
-      compiler.reportError(
-          node.selector,
-          MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT,
-          {'argumentCount': callStructure.argumentCount});
-      sendStructure = const InvalidAssertStructure();
-    } else if (callStructure.namedArgumentCount != 0) {
-      compiler.reportError(
-          node.selector,
-          MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS,
-          {'argumentCount': callStructure.namedArgumentCount});
-      sendStructure = const InvalidAssertStructure();
-    }
-    registry.registerAssert(node);
-    registry.registerSendStructure(node, sendStructure);
-    return const AssertResult();
-  }
-
   /// Handle access of a property of [name] on `this`, like `this.name` and
   /// `this.name()`, or `name` and `name()` in instance context.
   ResolutionResult handleThisPropertyAccess(Send node, Name name) {
@@ -3031,10 +3019,7 @@
       return handleExpressionInvoke(node);
     }
     String text = selector.source;
-    if (text == 'assert') {
-      // `assert()`.
-      return handleAssert(node);
-    } else if (text == 'this') {
+    if (text == 'this') {
       // `this()`.
       return handleThisAccess(node);
     }
diff --git a/pkg/compiler/lib/src/resolution/operators.dart b/pkg/compiler/lib/src/resolution/operators.dart
index b25f898..6486262 100644
--- a/pkg/compiler/lib/src/resolution/operators.dart
+++ b/pkg/compiler/lib/src/resolution/operators.dart
@@ -5,8 +5,9 @@
 library dart2js.operators;
 
 import '../elements/elements.dart';
-import '../universe/universe.dart' show
-    CallStructure,
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
     Selector,
     SelectorKind;
 
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 625f8f0..64089c0 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -21,10 +21,9 @@
 import '../tree/tree.dart';
 import '../util/util.dart' show
     Setlet;
+import '../universe/selector.dart' show
+    Selector;
 import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
-    SelectorKind,
     UniverseSelector;
 import '../world.dart' show World;
 
@@ -55,6 +54,11 @@
   Iterable<Element> get otherDependencies => mapping.otherDependencies;
 
   @override
+  void registerAssert(bool hasMessage) {
+    // TODO(johnniwinther): Do something here?
+  }
+
+  @override
   void registerDependency(Element element) {
     mapping.registerDependency(element);
   }
@@ -579,13 +583,8 @@
     world.registerInstantiatedType(type, this);
   }
 
-  void registerAssert(Send node) {
-    mapping.setAssert(node);
-    backend.resolutionCallbacks.onAssert(node, this);
-  }
-
-  bool isAssert(Send node) {
-    return mapping.isAssert(node);
+  void registerAssert(bool hasMessage) {
+    backend.resolutionCallbacks.onAssert(hasMessage, this);
   }
 
   void registerSendStructure(Send node, SendStructure sendStructure) {
diff --git a/pkg/compiler/lib/src/resolution/resolution_result.dart b/pkg/compiler/lib/src/resolution/resolution_result.dart
index f4192e9..6168025 100644
--- a/pkg/compiler/lib/src/resolution/resolution_result.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_result.dart
@@ -8,7 +8,7 @@
 import '../dart_types.dart';
 import '../elements/elements.dart';
 import '../tree/tree.dart';
-import '../universe/universe.dart' show
+import '../universe/call_structure.dart' show
     CallStructure;
 
 enum ResultKind {
@@ -83,15 +83,6 @@
   String toString() => 'TypeResult($type)';
 }
 
-/// The result for the resolution of the `assert` method.
-class AssertResult extends ResolutionResult {
-  const AssertResult();
-
-  ResultKind get kind => ResultKind.ASSERT;
-
-  String toString() => 'AssertResult()';
-}
-
 /// The result for resolving a constant expression.
 class ConstantResult extends ResolutionResult {
   final Node node;
@@ -143,4 +134,4 @@
       return result.constant;
     }).toList();
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/resolution/semantic_visitor.dart b/pkg/compiler/lib/src/resolution/semantic_visitor.dart
index 6ef3a4b..f87664b 100644
--- a/pkg/compiler/lib/src/resolution/semantic_visitor.dart
+++ b/pkg/compiler/lib/src/resolution/semantic_visitor.dart
@@ -11,7 +11,10 @@
     SpannableAssertionFailure;
 import '../tree/tree.dart';
 import '../elements/elements.dart';
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 
 import 'operators.dart';
 import 'send_resolver.dart';
@@ -1297,32 +1300,6 @@
       Node rhs,
       A arg);
 
-  /// Call to `assert` with [expression] as the condition.
-  ///
-  /// For instance:
-  ///
-  ///     m() { assert(expression); }
-  ///
-  R visitAssert(
-      Send node,
-      Node expression,
-      A arg);
-
-  /// Call to `assert` with the wrong number of [arguments].
-  ///
-  /// For instance:
-  ///
-  ///     m() { assert(); }
-  ///
-  /// or
-  ///
-  ///     m() { assert(expression1, expression2); }
-  ///
-  R errorInvalidAssert(
-      Send node,
-      NodeList arguments,
-      A arg);
-
   /// Binary expression `left operator right` where [operator] is a user
   /// definable operator. Binary expressions using operator `==` are handled
   /// by [visitEquals] and index operations `a[b]` are handled by [visitIndex].
diff --git a/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart b/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
index fce1179..5e15a7d 100644
--- a/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
+++ b/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
@@ -27,14 +27,6 @@
   }
 
   @override
-  R errorInvalidAssert(
-      Send node,
-      NodeList arguments,
-      A arg) {
-    return bulkHandleError(node, null, arg);
-  }
-
-  @override
   R errorNonConstantConstructorInvoke(
       NewExpression node,
       Element element,
@@ -2943,14 +2935,6 @@
   }
 
   @override
-  R visitAssert(
-      Send node,
-      Node expression,
-      A arg) {
-    return bulkHandleNode(node, 'Assert `#` unhandled.', arg);
-  }
-
-  @override
   R visitIs(
       Send node,
       Node expression,
@@ -4535,15 +4519,6 @@
   }
 
   @override
-  R visitAssert(
-      Send node,
-      Node expression,
-      A arg) {
-    apply(expression, arg);
-    return null;
-  }
-
-  @override
   R visitBinary(
       Send node,
       Node left,
diff --git a/pkg/compiler/lib/src/resolution/send_resolver.dart b/pkg/compiler/lib/src/resolution/send_resolver.dart
index 49369cc..93297f6 100644
--- a/pkg/compiler/lib/src/resolution/send_resolver.dart
+++ b/pkg/compiler/lib/src/resolution/send_resolver.dart
@@ -13,7 +13,10 @@
     SpannableAssertionFailure;
 import '../elements/elements.dart';
 import '../tree/tree.dart';
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 
 import 'access_semantics.dart';
 import 'semantic_visitor.dart';
diff --git a/pkg/compiler/lib/src/resolution/send_structure.dart b/pkg/compiler/lib/src/resolution/send_structure.dart
index f2850ce..a427db9 100644
--- a/pkg/compiler/lib/src/resolution/send_structure.dart
+++ b/pkg/compiler/lib/src/resolution/send_structure.dart
@@ -10,7 +10,10 @@
 import '../constants/expressions.dart';
 import '../elements/elements.dart';
 import '../tree/tree.dart';
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 
 import 'access_semantics.dart';
 import 'operators.dart';
@@ -32,35 +35,6 @@
   R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg);
 }
 
-/// The structure for a [Send] of the form `assert(e)`.
-class AssertStructure<R, A> implements SendStructure<R, A> {
-  const AssertStructure();
-
-  R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
-    return visitor.visitAssert(
-        node,
-        node.arguments.single,
-        arg);
-  }
-
-  String toString() => 'assert';
-}
-
-/// The structure for a [Send] of the form an `assert` with less or more than
-/// one argument.
-class InvalidAssertStructure<R, A> implements SendStructure<R, A> {
-  const InvalidAssertStructure();
-
-  R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
-    return visitor.errorInvalidAssert(
-        node,
-        node.argumentsNode,
-        arg);
-  }
-
-  String toString() => 'invalid assert';
-}
-
 /// The structure for a [Send] of the form `a ?? b`.
 class IfNullStructure<R, A> implements SendStructure<R, A> {
   const IfNullStructure();
diff --git a/pkg/compiler/lib/src/resolution/tree_elements.dart b/pkg/compiler/lib/src/resolution/tree_elements.dart
index 3fed5c3..1204017 100644
--- a/pkg/compiler/lib/src/resolution/tree_elements.dart
+++ b/pkg/compiler/lib/src/resolution/tree_elements.dart
@@ -15,10 +15,11 @@
     TypeMask;
 import '../tree/tree.dart';
 import '../util/util.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
 import '../universe/universe.dart' show
-    CallStructure,
-    Selector,
-    SelectorKind,
     UniverseSelector;
 
 import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
@@ -71,7 +72,6 @@
   void setCurrentTypeMask(ForIn node, TypeMask mask);
   void setConstant(Node node, ConstantExpression constant);
   ConstantExpression getConstant(Node node);
-  bool isAssert(Send send);
 
   /// Returns the [FunctionElement] defined by [node].
   FunctionElement getFunctionDefinition(FunctionExpression node);
@@ -140,7 +140,6 @@
   Map<VariableElement, List<Node>> _potentiallyMutatedInClosure;
   Map<Node, Map<VariableElement, List<Node>>> _accessedByClosureIn;
   Setlet<Element> _elements;
-  Setlet<Send> _asserts;
   Maplet<Send, SendStructure> _sendStructureMap;
   Setlet<DartType> _requiredTypes;
   bool containsTryStatement = false;
@@ -412,17 +411,6 @@
     }
   }
 
-  void setAssert(Send node) {
-    if (_asserts == null) {
-      _asserts = new Setlet<Send>();
-    }
-    _asserts.add(node);
-  }
-
-  bool isAssert(Send node) {
-    return _asserts != null && _asserts.contains(node);
-  }
-
   FunctionElement getFunctionDefinition(FunctionExpression node) {
     return this[node];
   }
diff --git a/pkg/compiler/lib/src/scanner/string_scanner.dart b/pkg/compiler/lib/src/scanner/string_scanner.dart
index aec14a0..21bc2bb 100644
--- a/pkg/compiler/lib/src/scanner/string_scanner.dart
+++ b/pkg/compiler/lib/src/scanner/string_scanner.dart
@@ -9,7 +9,6 @@
 import '../tokens/precedence.dart' show
     PrecedenceInfo;
 import '../tokens/token.dart' show
-    PrecedenceInfo,
     StringToken,
     Token;
 
diff --git a/pkg/compiler/lib/src/serialization/constant_serialization.dart b/pkg/compiler/lib/src/serialization/constant_serialization.dart
index d2d2dd4..3af1b4f 100644
--- a/pkg/compiler/lib/src/serialization/constant_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/constant_serialization.dart
@@ -7,9 +7,11 @@
 import '../constants/constructors.dart';
 import '../constants/expressions.dart';
 import '../dart_types.dart';
-import '../elements/elements.dart' show FieldElement;
+import '../elements/elements.dart' show
+    FieldElement;
 import '../resolution/operators.dart';
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
 import 'serialization.dart';
 import 'keys.dart';
 
diff --git a/pkg/compiler/lib/src/serialization/element_serialization.dart b/pkg/compiler/lib/src/serialization/element_serialization.dart
index 9ef5187..71dffef 100644
--- a/pkg/compiler/lib/src/serialization/element_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/element_serialization.dart
@@ -10,7 +10,6 @@
 import '../diagnostics/source_span.dart' show
     SourceSpan;
 import '../elements/elements.dart';
-import '../tree/tree.dart';
 import 'constant_serialization.dart';
 import 'keys.dart';
 import 'modelz.dart';
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index bf19f70..a853635 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -1363,14 +1363,16 @@
 
     bool doesNotContainCode() {
       // A function with size 1 does not contain any code.
-      return InlineWeeder.canBeInlined(function, 1, true);
+      return InlineWeeder.canBeInlined(function, 1, true,
+          enableUserAssertions: compiler.enableUserAssertions);
     }
 
     bool reductiveHeuristic() {
       // The call is on a path which is executed rarely, so inline only if it
       // does not make the program larger.
       if (isCalledOnce(element)) {
-        return InlineWeeder.canBeInlined(function, -1, false);
+        return InlineWeeder.canBeInlined(function, -1, false,
+            enableUserAssertions: compiler.enableUserAssertions);
       }
       // TODO(sra): Measure if inlining would 'reduce' the size.  One desirable
       // case we miss by doing nothing is inlining very simple constructors
@@ -1408,7 +1410,8 @@
         // We may have forced the inlining of some methods. Therefore check
         // if we can inline this method regardless of size.
         assert(InlineWeeder.canBeInlined(function, -1, false,
-                                         allowLoops: true));
+                allowLoops: true,
+                enableUserAssertions: compiler.enableUserAssertions));
         return true;
       }
 
@@ -1431,7 +1434,8 @@
       }
       bool canInline;
       canInline = InlineWeeder.canBeInlined(
-          function, maxInliningNodes, useMaxInliningNodes);
+          function, maxInliningNodes, useMaxInliningNodes,
+          enableUserAssertions: compiler.enableUserAssertions);
       if (canInline) {
         backend.inlineCache.markAsInlinable(element, insideLoop: insideLoop);
       } else {
@@ -1628,15 +1632,9 @@
       var emptyParameters = parameters.values.where((p) =>
           p.instructionType.isEmpty && !p.instructionType.isNullable);
       if (emptyParameters.length > 0) {
-        String message = compiler.enableMinification
-            ? 'unreachable'
-            : 'unreachable: ${functionElement} because: ${emptyParameters}';
-        // TODO(sra): Use a library function that throws a proper error object.
-        push(new HForeignCode(
-            js.js.parseForeignJS('throw "$message"'),
-            backend.dynamicType,
-            <HInstruction>[],
-            isStatement: true));
+        addComment('${emptyParameters} inferred as [empty]');
+        pushInvokeStatic(function.body, backend.assertUnreachableMethod, []);
+        pop();
         return closeFunction();
       }
     }
@@ -1644,6 +1642,19 @@
     return closeFunction();
   }
 
+  /// Adds a JavaScript comment to the output. The comment will be omitted in
+  /// minified mode.  Each line in [text] is preceded with `//` and indented.
+  /// Use sparingly. In order for the comment to be retained it is modeled as
+  /// having side effects which will inhibit code motion.
+  // TODO(sra): Figure out how to keep comment anchored without effects.
+  void addComment(String text) {
+    add(new HForeignCode(
+        js.js.statementTemplateYielding(new js.Comment(text)),
+        backend.dynamicType,
+        <HInstruction>[],
+        isStatement: true));
+  }
+
   HGraph buildCheckedSetter(VariableElement field) {
     openFunction(field, field.node);
     HInstruction thisInstruction = localsHandler.readThis();
@@ -2608,6 +2619,37 @@
     return pop();
   }
 
+  visitAssert(ast.Assert node) {
+    if (!compiler.enableUserAssertions) return;
+
+    if (!node.hasMessage) {
+      // Generate:
+      //
+      //     assertHelper(condition);
+      //
+      visit(node.condition);
+      pushInvokeStatic(node, backend.assertHelperMethod, [pop()]);
+      pop();
+      return;
+    }
+    // Assert has message. Generate:
+    //
+    //     if (assertTest(condition)) assertThrow(message);
+    //
+    void buildCondition() {
+      visit(node.condition);
+      pushInvokeStatic(node, backend.assertTestMethod, [pop()]);
+    }
+    void fail() {
+      visit(node.message);
+      pushInvokeStatic(node, backend.assertThrowMethod, [pop()]);
+      pop();
+    }
+    handleIf(node,
+             visitCondition: buildCondition,
+             visitThen: fail);
+  }
+
   visitBlock(ast.Block node) {
     assert(!isAborted());
     if (!isReachable) return;  // This can only happen when inlining.
@@ -4032,6 +4074,7 @@
     // Don't visit the first argument, which is the type, and the second
     // argument, which is the foreign code.
     if (link.isEmpty || link.tail.isEmpty) {
+      // We should not get here because the call should be compiled to NSM.
       compiler.internalError(node.argumentsNode,
           'At least two arguments expected.');
     }
@@ -4041,6 +4084,16 @@
     List<HInstruction> inputs = <HInstruction>[];
     addGenericSendArgumentsToList(link.tail.tail, inputs);
 
+    if (nativeBehavior.codeTemplate.positionalArgumentCount != inputs.length) {
+      compiler.reportError(
+          node, MessageKind.GENERIC,
+          {'text':
+            'Mismatch between number of placeholders'
+            ' and number of arguments.'});
+      stack.add(graph.addConstantNull(compiler));  // Result expected on stack.
+      return;
+    }
+
     TypeMask ssaType =
         TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
 
@@ -5183,18 +5236,6 @@
     return false;
   }
 
-  @override
-  visitAssert(ast.Send node, ast.Node expression, _) {
-    if (!compiler.enableUserAssertions) {
-      stack.add(graph.addConstantNull(compiler));
-      return;
-    }
-    assert(invariant(node, node.arguments.tail.isEmpty,
-        message: "Invalid assertion: $node"));
-    generateStaticFunctionInvoke(
-        node, backend.assertMethod, CallStructure.ONE_ARG);
-  }
-
   visitStaticSend(ast.Send node) {
     internalError(node, "Unexpected visitStaticSend");
   }
@@ -8311,14 +8352,6 @@
   }
 
   @override
-  void errorInvalidAssert(
-      ast.Send node,
-      ast.NodeList arguments,
-      _) {
-    visitNode(node);
-  }
-
-  @override
   void errorUndefinedBinaryExpression(
       ast.Send node,
       ast.Node left,
@@ -8457,19 +8490,24 @@
   final int maxInliningNodes;
   final bool useMaxInliningNodes;
   final bool allowLoops;
+  final bool enableUserAssertions;
 
   InlineWeeder(this.maxInliningNodes,
                this.useMaxInliningNodes,
-               this.allowLoops);
+               this.allowLoops,
+               this.enableUserAssertions);
 
   static bool canBeInlined(FunctionElement function,
                            int maxInliningNodes,
                            bool useMaxInliningNodes,
-                           {bool allowLoops: false}) {
+                           {bool allowLoops: false,
+                            bool enableUserAssertions: null}) {
+    assert(enableUserAssertions is bool); // Ensure we passed it.
     if (function.resolvedAst.elements.containsTryStatement) return false;
 
     InlineWeeder weeder =
-        new InlineWeeder(maxInliningNodes, useMaxInliningNodes, allowLoops);
+        new InlineWeeder(maxInliningNodes, useMaxInliningNodes, allowLoops,
+            enableUserAssertions);
     ast.FunctionExpression functionExpression = function.node;
     weeder.visit(functionExpression.initializers);
     weeder.visit(functionExpression.body);
@@ -8501,6 +8539,13 @@
   }
 
   @override
+  void visitAssert(ast.Assert node) {
+    if (enableUserAssertions) {
+      visitNode(node);
+    }
+  }
+
+  @override
   void visitAsyncModifier(ast.AsyncModifier node) {
     if (node.isYielding || node.isAsynchronous) {
       tooDifficult = true;
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index be3406f..e0c5611 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -27,11 +27,11 @@
   Operation operation(ConstantSystem constantSystem) => null;
 
   static InvokeDynamicSpecializer lookupSpecializer(Selector selector) {
-    if (selector.kind == SelectorKind.INDEX) {
-      return selector.name == '[]'
-          ? const IndexSpecializer()
-          : const IndexAssignSpecializer();
-    } else if (selector.kind == SelectorKind.OPERATOR) {
+    if (selector.isIndex) {
+      return const IndexSpecializer();
+    } else if (selector.isIndexSet) {
+      return const IndexAssignSpecializer();
+    } else if (selector.isOperator) {
       if (selector.name == 'unary-') {
         return const UnaryNegateSpecializer();
       } else if (selector.name == '~') {
@@ -69,7 +69,7 @@
       } else if (selector.name == '>=') {
         return const GreaterEqualSpecializer();
       }
-    } else if (selector.kind == SelectorKind.CALL) {
+    } else if (selector.isCall) {
       if (selector.argumentCount == 1 && selector.namedArguments.length == 0) {
         if (selector.name == 'codeUnitAt') {
           return const CodeUnitAtSpecializer();
@@ -238,8 +238,7 @@
                                      Compiler compiler) {
     if (selector.name == name) return selector;
     JavaScriptBackend backend = compiler.backend;
-    return new Selector(
-        SelectorKind.CALL, new Name(name, backend.interceptorsLibrary),
+    return new Selector.call(new Name(name, backend.interceptorsLibrary),
         new CallStructure(selector.argumentCount));
   }
 }
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 2318c31..77322c9 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -52,7 +52,14 @@
 import '../types/types.dart';
 import '../types/constants.dart' show
     computeTypeMask;
-import '../universe/universe.dart';
+import '../universe/call_structure.dart' show
+    CallStructure;
+import '../universe/selector.dart' show
+    Selector;
+import '../universe/side_effects.dart' show
+    SideEffects;
+import '../universe/universe.dart' show
+    UniverseSelector;
 import '../util/util.dart';
 import '../world.dart' show
     ClassWorld,
diff --git a/pkg/compiler/lib/src/tree/nodes.dart b/pkg/compiler/lib/src/tree/nodes.dart
index 6c4516b..7ef28dc 100644
--- a/pkg/compiler/lib/src/tree/nodes.dart
+++ b/pkg/compiler/lib/src/tree/nodes.dart
@@ -9,6 +9,7 @@
 
   R visitNode(Node node);
 
+  R visitAssert(Assert node) => visitStatement(node);
   R visitAsyncForIn(AsyncForIn node) => visitLoop(node);
   R visitAsyncModifier(AsyncModifier node) => visitNode(node);
   R visitAwait(Await node) => visitExpression(node);
@@ -146,6 +147,7 @@
 
   Token getEndToken();
 
+  Assert asAssert() => null;
   AsyncModifier asAsyncModifier() => null;
   Await asAwait() => null;
   Block asBlock() => null;
@@ -1211,6 +1213,30 @@
   Token getEndToken() => expression.getEndToken();
 }
 
+class Assert extends Statement {
+  final Token assertToken;
+  final Expression condition;
+  /** Message may be `null`. */
+  final Expression message;
+  final Token semicolonToken;
+
+  Assert(this.assertToken, this.condition, this.message, this.semicolonToken);
+
+  Assert asAssert() => this;
+
+  bool get hasMessage => message != null;
+
+  accept(Visitor visitor) => visitor.visitAssert(this);
+
+  visitChildren(Visitor visitor) {
+    condition.accept(visitor);
+    if (message != null) message.accept(visitor);
+  }
+
+  Token getBeginToken() => assertToken;
+  Token getEndToken() => semicolonToken;
+}
+
 class Rethrow extends Statement {
   final Token throwToken;
   final Token endToken;
diff --git a/pkg/compiler/lib/src/tree/prettyprint.dart b/pkg/compiler/lib/src/tree/prettyprint.dart
index ab4c87c..5096e74 100644
--- a/pkg/compiler/lib/src/tree/prettyprint.dart
+++ b/pkg/compiler/lib/src/tree/prettyprint.dart
@@ -39,6 +39,10 @@
     closeNode();
   }
 
+  visitAssert(Assert node) {
+    visitNodeWithChildren(node, "Assert");
+  }
+
   visitAsyncModifier(AsyncModifier node) {
     openAndCloseNode(node, "AsyncModifier",
         {'asyncToken': node.asyncToken,
diff --git a/pkg/compiler/lib/src/tree/unparser.dart b/pkg/compiler/lib/src/tree/unparser.dart
index a0156be..6f141fd 100644
--- a/pkg/compiler/lib/src/tree/unparser.dart
+++ b/pkg/compiler/lib/src/tree/unparser.dart
@@ -58,6 +58,18 @@
     if (node != null) node.accept(this);
   }
 
+  visitAssert(Assert node) {
+    write(node.assertToken.value);
+    write('(');
+    visit(node.condition);
+    if (node.hasMessage) {
+      write(',');
+      space();
+      visit(node.message);
+    }
+    write(');');
+  }
+
   visitBlock(Block node) => unparseBlockStatements(node.statements);
 
   unparseBlockStatements(NodeList statements) {
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
index f6b6a72..00487ee 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -1135,6 +1135,13 @@
 
   @override
   Expression visitAwait(Await node) {
+    node.input = visitExpression(node.input);
+    return node;
+  }
+
+  @override
+  Statement visitYield(Yield node) {
+    node.input = visitExpression(node.input);
     return node;
   }
 }
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index c4b993b..8adf3a9 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -436,6 +436,19 @@
     return makeCallExpression(node, value);
   }
 
+  @override
+  NodeCallback visitYield(cps_ir.Yield node) {
+    return (Statement next) {
+      return new Yield(getVariableUse(node.input), node.hasStar, next);
+    };
+  }
+
+  @override
+  NodeCallback visitAwait(cps_ir.Await node) {
+    Expression value = new Await(getVariableUse(node.input));
+    return makeCallExpression(node, value);
+  }
+
 
   /************************** TAIL EXPRESSIONS  **************************/
   //
@@ -670,12 +683,6 @@
   }
 
   @override
-  NodeCallback visitAwait(cps_ir.Await node) {
-    Expression value = new Await(getVariableUse(node.input));
-    return makeCallExpression(node, value);
-  }
-
-  @override
   Expression visitRefinement(cps_ir.Refinement node) {
     throw 'Unexpected Refinement node in tree builder';
   }
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index 7c41a53..3aef3a6 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -9,7 +9,7 @@
 import '../elements/elements.dart';
 import '../io/source_information.dart' show SourceInformation;
 import '../types/types.dart' show TypeMask;
-import '../universe/universe.dart' show Selector;
+import '../universe/selector.dart' show Selector;
 
 import '../cps_ir/builtin_operator.dart';
 export '../cps_ir/builtin_operator.dart';
@@ -372,7 +372,7 @@
 
   bool receiverIsNotNull;
 
-  ApplyBuiltinMethod(this.method, 
+  ApplyBuiltinMethod(this.method,
                      this.receiver,
                      this.arguments,
                      {this.receiverIsNotNull: false});
@@ -501,7 +501,7 @@
 /**
  * A loop with a condition and update expressions. If there are any update
  * expressions, this generates a for loop, otherwise a while loop.
- * 
+ *
  * When the condition is false, control resumes at the [next] statement.
  *
  * It is NOT valid to target this statement with a [Break].
@@ -938,6 +938,22 @@
   }
 }
 
+class Yield extends Statement {
+  Statement next;
+  Expression input;
+  final bool hasStar;
+
+  Yield(this.input, this.hasStar, this.next);
+
+  accept(StatementVisitor visitor) {
+    return visitor.visitYield(this);
+  }
+
+  accept1(StatementVisitor1 visitor, arg) {
+    return visitor.visitYield(this, arg);
+  }
+}
+
 abstract class ExpressionVisitor<E> {
   E visitExpression(Expression node) => node.accept(this);
   E visitVariableUse(VariableUse node);
@@ -1027,6 +1043,7 @@
   S visitTry(Try node);
   S visitUnreachable(Unreachable node);
   S visitForeignStatement(ForeignStatement node);
+  S visitYield(Yield node);
 }
 
 abstract class StatementVisitor1<S, A> {
@@ -1044,6 +1061,7 @@
   S visitTry(Try node, A arg);
   S visitUnreachable(Unreachable node, A arg);
   S visitForeignStatement(ForeignStatement node, A arg);
+  S visitYield(Yield node, A arg);
 }
 
 abstract class RecursiveVisitor implements StatementVisitor, ExpressionVisitor {
@@ -1253,6 +1271,11 @@
   visitAwait(Await node) {
     visitExpression(node.input);
   }
+
+  visitYield(Yield node) {
+    visitExpression(node.input);
+    visitStatement(node.next);
+  }
 }
 
 abstract class Transformer implements ExpressionVisitor<Expression>,
@@ -1432,6 +1455,7 @@
 
   visitCreateInstance(CreateInstance node) {
     _replaceExpressions(node.arguments);
+    _replaceExpressions(node.typeInformation);
     return node;
   }
 
@@ -1507,6 +1531,11 @@
     node.input = visitExpression(node.input);
     return node;
   }
+
+  visitYield(Yield node) {
+    node.input = visitExpression(node.input);
+    return node;
+  }
 }
 
 class FallthroughTarget {
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
index 86a24b6..01b5847 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
@@ -178,6 +178,11 @@
   visitForeignStatement(ForeignStatement node) {
     _addStatement(node);
   }
+
+  @override
+  visitYield(Yield node) {
+    _addStatement(node);
+  }
 }
 
 class TreeTracer extends TracerUtil with StatementVisitor {
@@ -336,6 +341,11 @@
   visitForeignStatement(ForeignStatement node) {
     printStatement(null, 'foreign ${node.codeTemplate.source}');
   }
+
+  @override
+  visitYield(Yield node) {
+    printStatement(null, 'yield ${expr(node.input)}');
+  }
 }
 
 class SubexpressionVisitor extends ExpressionVisitor<String> {
@@ -569,6 +579,12 @@
     String value = visitExpression(node.input);
     return 'Await($value)';
   }
+
+  @override
+  String visitYield(Yield node) {
+    String value = visitExpression(node.input);
+    return 'Yield($value)';
+  }
 }
 
 /**
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index cb64d9b..323c19d 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -146,25 +146,6 @@
   String toString() => 'DynamicAccess';
 }
 
-/// An access of the `assert` method.
-class AssertAccess implements ElementAccess {
-  const AssertAccess();
-
-  Element get element => null;
-
-  String get name => 'assert';
-
-  DartType computeType(Compiler compiler) {
-    return new FunctionType.synthesized(
-        const VoidType(),
-        <DartType>[const DynamicType()]);
-  }
-
-  bool isCallable(Compiler compiler) => true;
-
-  String toString() => 'AssertAccess';
-}
-
 /**
  * An access of a resolved top-level or static property or function, or an
  * access of a resolved element through [:this:].
@@ -614,6 +595,12 @@
     return type;
   }
 
+  DartType visitAssert(Assert node) {
+    analyze(node.condition);
+    if (node.hasMessage) analyze(node.message);
+    return const StatementType();
+  }
+
   DartType visitBlock(Block node) {
     return analyze(node.statements);
   }
@@ -1165,10 +1152,6 @@
   }
 
   DartType visitSend(Send node) {
-    if (elements.isAssert(node)) {
-      return analyzeInvocation(node, const AssertAccess());
-    }
-
     Element element = elements[node];
 
     if (element != null && element.isConstructor) {
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index 65cf596..7cbecc5 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -4,10 +4,10 @@
 
 part of types;
 
-/// An implementation of a [UniverseReceiverMaskSet] that is consists if an only
+/// An implementation of a [UniverseSelectorConstraints] that is consists if an only
 /// increasing set of [TypeMask]s, that is, once a mask is added it cannot be
 /// removed.
-class IncreasingTypeMaskSet extends UniverseReceiverMaskSet {
+class IncreasingTypeMaskSet extends UniverseSelectorConstraints {
   bool isAll = false;
   Set<TypeMask> _masks;
 
@@ -37,7 +37,7 @@
   }
 
   @override
-  bool addReceiverMask(TypeMask mask) {
+  bool addReceiverConstraint(TypeMask mask) {
     if (isAll) return false;
     if (mask == null) {
       isAll = true;
@@ -61,11 +61,11 @@
   }
 }
 
-class TypeMaskStrategy implements ReceiverMaskStrategy {
+class TypeMaskStrategy implements SelectorConstraintsStrategy {
   const TypeMaskStrategy();
 
   @override
-  UniverseReceiverMaskSet createReceiverMaskSet(Selector selector) {
+  UniverseSelectorConstraints createSelectorConstraints(Selector selector) {
     return new IncreasingTypeMaskSet();
   }
 }
@@ -75,7 +75,7 @@
  * operations on it are not guaranteed to be precise and they may
  * yield conservative answers that contain too many classes.
  */
-abstract class TypeMask implements ReceiverMask {
+abstract class TypeMask implements ReceiverConstraint {
   factory TypeMask(ClassElement base,
                    int kind,
                    bool isNullable,
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index a06404b..b99a368 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -15,11 +15,18 @@
 import '../diagnostics/spannable.dart' show
     NO_LOCATION_SPANNABLE;
 import '../elements/elements.dart';
-import '../inferrer/concrete_types_inferrer.dart' show ConcreteTypesInferrer;
-import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
+import '../inferrer/concrete_types_inferrer.dart' show
+    ConcreteTypesInferrer;
+import '../inferrer/type_graph_inferrer.dart' show
+    TypeGraphInferrer;
 import '../tree/tree.dart';
 import '../util/util.dart';
-import '../universe/universe.dart';
+import '../universe/selector.dart' show
+    Selector;
+import '../universe/universe.dart' show
+    ReceiverConstraint,
+    UniverseSelectorConstraints,
+    SelectorConstraintsStrategy;
 import '../world.dart' show
     ClassWorld,
     World;
diff --git a/pkg/compiler/lib/src/universe/call_structure.dart b/pkg/compiler/lib/src/universe/call_structure.dart
index 12e4fd8..d37d2c98 100644
--- a/pkg/compiler/lib/src/universe/call_structure.dart
+++ b/pkg/compiler/lib/src/universe/call_structure.dart
@@ -2,7 +2,31 @@
 // 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 universe;
+library dart2js.call_structure;
+
+import 'dart:collection';
+
+import '../common/names.dart' show
+    Identifiers,
+    Names,
+    Selectors;
+import '../compiler.dart' show
+    Compiler;
+import '../diagnostics/invariant.dart' show
+    invariant;
+import '../diagnostics/spannable.dart' show
+    SpannableAssertionFailure;
+import '../elements/elements.dart';
+import '../dart_types.dart';
+import '../tree/tree.dart';
+import '../types/types.dart';
+import '../util/util.dart';
+import '../world.dart' show
+    ClassWorld,
+    World;
+
+import 'selector.dart' show
+    Selector;
 
 /// The structure of the arguments at a call-site.
 // TODO(johnniwinther): Should these be cached?
@@ -48,9 +72,7 @@
 
   String toString() => 'CallStructure(${structureToString()})';
 
-  Selector get callSelector {
-    return new Selector(SelectorKind.CALL, Selector.CALL_NAME, this);
-  }
+  Selector get callSelector => new Selector.call(Names.call, this);
 
   bool match(CallStructure other) {
     if (identical(this, other)) return true;
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 5f8dedd..72a1813 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -2,7 +2,23 @@
 // 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 universe;
+library universe.function_set;
+
+import '../common/names.dart' show
+    Identifiers,
+    Selectors;
+import '../compiler.dart' show
+    Compiler;
+import '../elements/elements.dart';
+import '../types/types.dart';
+import '../util/util.dart' show
+    Hashing,
+    Setlet;
+import '../world.dart' show
+    ClassWorld;
+
+import 'selector.dart' show
+    Selector;
 
 // TODO(kasperl): This actually holds getters and setters just fine
 // too and stricly they aren't functions. Maybe this needs a better
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index 94fa6b4..357055a 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -2,7 +2,27 @@
 // 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 universe;
+library dart2js.selector;
+
+import '../common/names.dart' show
+    Names;
+import '../diagnostics/spannable.dart' show
+    SpannableAssertionFailure;
+import '../elements/elements.dart' show
+    Element,
+    Elements,
+    FunctionElement,
+    FunctionSignature,
+    Name,
+    LibraryElement,
+    PublicName;
+import '../util/util.dart' show
+    Hashing;
+import '../world.dart' show
+    World;
+
+import 'call_structure.dart' show
+    CallStructure;
 
 class SelectorKind {
   final String name;
@@ -34,16 +54,13 @@
 
   LibraryElement get library => memberName.library;
 
-  static const Name INDEX_NAME = const PublicName("[]");
-  static const Name INDEX_SET_NAME = const PublicName("[]=");
-  static const Name CALL_NAME = Names.call;
-
   Selector.internal(this.kind,
                     this.memberName,
                     this.callStructure,
                     this.hashCode) {
     assert(kind == SelectorKind.INDEX ||
-           (memberName != INDEX_NAME && memberName != INDEX_SET_NAME));
+           (memberName != Names.INDEX_NAME &&
+            memberName != Names.INDEX_SET_NAME));
     assert(kind == SelectorKind.OPERATOR ||
            kind == SelectorKind.INDEX ||
            !Elements.isOperatorName(memberName.text) ||
@@ -82,9 +99,9 @@
   factory Selector.fromElement(Element element) {
     Name name = new Name(element.name, element.library);
     if (element.isFunction) {
-      if (name == INDEX_NAME) {
+      if (name == Names.INDEX_NAME) {
         return new Selector.index();
-      } else if (name == INDEX_SET_NAME) {
+      } else if (name == Names.INDEX_SET_NAME) {
         return new Selector.indexSet();
       }
       FunctionSignature signature =
@@ -141,22 +158,22 @@
       CallStructure.ONE_ARG);
 
   factory Selector.index()
-      => new Selector(SelectorKind.INDEX, INDEX_NAME,
+      => new Selector(SelectorKind.INDEX, Names.INDEX_NAME,
                       CallStructure.ONE_ARG);
 
   factory Selector.indexSet()
-      => new Selector(SelectorKind.INDEX, INDEX_SET_NAME,
+      => new Selector(SelectorKind.INDEX, Names.INDEX_SET_NAME,
                       CallStructure.TWO_ARGS);
 
   factory Selector.call(Name name, CallStructure callStructure)
       => new Selector(SelectorKind.CALL, name, callStructure);
 
   factory Selector.callClosure(int arity, [List<String> namedArguments])
-      => new Selector(SelectorKind.CALL, CALL_NAME,
+      => new Selector(SelectorKind.CALL, Names.call,
                       new CallStructure(arity, namedArguments));
 
   factory Selector.callClosureFrom(Selector selector)
-      => new Selector(SelectorKind.CALL, CALL_NAME, selector.callStructure);
+      => new Selector(SelectorKind.CALL, Names.call, selector.callStructure);
 
   factory Selector.callConstructor(Name name,
                                    [int arity = 0,
@@ -173,7 +190,7 @@
   bool get isGetter => kind == SelectorKind.GETTER;
   bool get isSetter => kind == SelectorKind.SETTER;
   bool get isCall => kind == SelectorKind.CALL;
-  bool get isClosureCall => isCall && memberName == CALL_NAME;
+  bool get isClosureCall => isCall && memberName == Names.CALL_NAME;
 
   bool get isIndex => kind == SelectorKind.INDEX && argumentCount == 1;
   bool get isIndexSet => kind == SelectorKind.INDEX && argumentCount == 2;
@@ -181,9 +198,6 @@
   bool get isOperator => kind == SelectorKind.OPERATOR;
   bool get isUnaryOperator => isOperator && argumentCount == 0;
 
-  /** Check whether this is a call to 'assert'. */
-  bool get isAssert => isCall && identical(name, "assert");
-
   /**
    * The member name for invocation mirrors created from this selector.
    */
@@ -236,9 +250,7 @@
 
   bool sameNameHack(Element element, World world) {
     // TODO(ngeoffray): Remove workaround checks.
-    return element.isConstructor ||
-           name == element.name ||
-           name == 'assert' && world.isAssertMethod(element);
+    return element.isConstructor || name == element.name;
   }
 
   bool applies(Element element, World world) {
diff --git a/pkg/compiler/lib/src/universe/side_effects.dart b/pkg/compiler/lib/src/universe/side_effects.dart
index 66b4aa7..4c5a719 100644
--- a/pkg/compiler/lib/src/universe/side_effects.dart
+++ b/pkg/compiler/lib/src/universe/side_effects.dart
@@ -2,7 +2,31 @@
 // 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 universe;
+library universe.side_effects;
+
+import 'dart:collection';
+
+import '../common/names.dart' show
+    Identifiers,
+    Names,
+    Selectors;
+import '../compiler.dart' show
+    Compiler;
+import '../diagnostics/invariant.dart' show
+    invariant;
+import '../diagnostics/spannable.dart' show
+    SpannableAssertionFailure;
+import '../elements/elements.dart';
+import '../dart_types.dart';
+import '../tree/tree.dart';
+import '../types/types.dart';
+import '../util/util.dart';
+import '../world.dart' show
+    ClassWorld,
+    World;
+
+import 'selector.dart' show
+    Selector;
 
 class SideEffects {
   // Changes flags.
diff --git a/pkg/compiler/lib/src/universe/universe.dart b/pkg/compiler/lib/src/universe/universe.dart
index 5268be3..e7d15be 100644
--- a/pkg/compiler/lib/src/universe/universe.dart
+++ b/pkg/compiler/lib/src/universe/universe.dart
@@ -25,14 +25,15 @@
     ClassWorld,
     World;
 
-part 'call_structure.dart';
-part 'function_set.dart';
-part 'selector.dart';
-part 'side_effects.dart';
+import 'call_structure.dart';
+import 'selector.dart' show
+    Selector;
+import 'function_set.dart';
+import 'side_effects.dart';
 
 class UniverseSelector {
   final Selector selector;
-  final ReceiverMask mask;
+  final ReceiverConstraint mask;
 
   UniverseSelector(this.selector, this.mask);
 
@@ -44,31 +45,62 @@
   String toString() => '$selector,$mask';
 }
 
-/// A potential receiver for a dynamic call site.
-abstract class ReceiverMask {
+/// The known constraint on receiver for a dynamic call site.
+///
+/// This can for instance be used to constrain this dynamic call to `foo` to
+/// 'receivers of the exact instance `Bar`':
+///
+///     class Bar {
+///        void foo() {}
+///     }
+///     main() => new Bar().foo();
+///
+abstract class ReceiverConstraint {
   /// Returns whether [element] is a potential target when being
-  /// invoked on this receiver mask. [selector] is used to ensure library
-  /// privacy is taken into account.
+  /// invoked on a receiver with this constraint. [selector] is used to ensure
+  /// library privacy is taken into account.
   bool canHit(Element element, Selector selector, ClassWorld classWorld);
 }
 
-/// A set of potential receivers for the dynamic call sites of the same
+/// The combined constraints on receivers all the dynamic call sites of the same
 /// selector.
 ///
 /// For instance for these calls
 ///
+///     class A {
+///        foo(a, b) {}
+///     }
+///     class B {
+///        foo(a, b) {}
+///     }
+///     class C {
+///        foo(a, b) {}
+///     }
 ///     new A().foo(a, b);
 ///     new B().foo(0, 42);
 ///
-/// the receiver mask set for dynamic calls to 'foo' with to positional
-/// arguments will contain receiver masks abstracting `new A()` and `new B()`.
-abstract class ReceiverMaskSet {
-  /// Returns `true` if [selector] applies to any of the potential receivers
-  /// in this set given the closed [world].
+/// the selector constaints for dynamic calls to 'foo' with two positional
+/// arguments could be 'receiver of exact instance `A` or `B`'.
+abstract class SelectorConstraints {
+  /// Returns `true` if [selector] applies to [element] under these constraints
+  /// given the closed [world].
+  ///
+  /// Consider for instance in this world:
+  ///
+  ///     class A {
+  ///        foo(a, b) {}
+  ///     }
+  ///     class B {
+  ///        foo(a, b) {}
+  ///     }
+  ///     new A().foo(a, b);
+  ///
+  /// Ideally the selector constraints for calls `foo` with two positional
+  /// arguments apply to `A.foo` but `B.foo`.
   bool applies(Element element, Selector selector, ClassWorld world);
 
-  /// Returns `true` if any potential receivers in this set given the closed
-  /// [world] have no implementation matching [selector].
+  /// Returns `true` if at least one of the receivers matching these constraints
+  /// in the closed [world] have no implementation matching [selector].
   ///
   /// For instance for this code snippet
   ///
@@ -76,23 +108,24 @@
   ///     class B { foo() {} }
   ///     m(b) => (b ? new A() : new B()).foo();
   ///
-  /// the potential receiver `new A()` have no implementation of `foo` and thus
-  /// needs to handle the call though its `noSuchMethod` handler.
+  /// the potential receiver `new A()` has no implementation of `foo` and thus
+  /// needs to handle the call through its `noSuchMethod` handler.
   bool needsNoSuchMethodHandling(Selector selector, ClassWorld world);
 }
 
-/// A mutable [ReceiverMaskSet] used in [Universe].
-abstract class UniverseReceiverMaskSet extends ReceiverMaskSet {
-  /// Adds [mask] to this set of potential receivers. Return `true` if the
-  /// set expanded due to the new mask.
-  bool addReceiverMask(ReceiverMask mask);
+/// A mutable [SelectorConstraints] used in [Universe].
+abstract class UniverseSelectorConstraints extends SelectorConstraints {
+  /// Adds [constraint] to these selector constraints. Return `true` if the set
+  /// of potential receivers expanded due to the new constraint.
+  bool addReceiverConstraint(ReceiverConstraint constraint);
 }
 
-/// Strategy for computing potential receivers of dynamic call sites.
-abstract class ReceiverMaskStrategy {
-  /// Create a [UniverseReceiverMaskSet] to represent the potential receiver for
-  /// a dynamic call site with [selector].
-  UniverseReceiverMaskSet createReceiverMaskSet(Selector selector);
+/// Strategy for computing the constraints on potential receivers of dynamic
+/// call sites.
+abstract class SelectorConstraintsStrategy {
+  /// Create a [UniverseSelectorConstraints] to represent the global receiver
+  /// constraints for dynamic call sites with [selector].
+  UniverseSelectorConstraints createSelectorConstraints(Selector selector);
 }
 
 class Universe {
@@ -132,12 +165,12 @@
       new Set<FunctionElement>();
   final Set<FunctionElement> methodsNeedingSuperGetter =
       new Set<FunctionElement>();
-  final Map<String, Map<Selector, ReceiverMaskSet>> _invokedNames =
-      <String, Map<Selector, ReceiverMaskSet>>{};
-  final Map<String, Map<Selector, ReceiverMaskSet>> _invokedGetters =
-      <String, Map<Selector, ReceiverMaskSet>>{};
-  final Map<String, Map<Selector, ReceiverMaskSet>> _invokedSetters =
-      <String, Map<Selector, ReceiverMaskSet>>{};
+  final Map<String, Map<Selector, SelectorConstraints>> _invokedNames =
+      <String, Map<Selector, SelectorConstraints>>{};
+  final Map<String, Map<Selector, SelectorConstraints>> _invokedGetters =
+      <String, Map<Selector, SelectorConstraints>>{};
+  final Map<String, Map<Selector, SelectorConstraints>> _invokedSetters =
+      <String, Map<Selector, SelectorConstraints>>{};
 
   /**
    * Fields accessed. Currently only the codegen knows this
@@ -179,9 +212,9 @@
    */
   final Set<Element> closurizedMembers = new Set<Element>();
 
-  final ReceiverMaskStrategy receiverMaskStrategy;
+  final SelectorConstraintsStrategy selectorConstraintsStrategy;
 
-  Universe(this.receiverMaskStrategy);
+  Universe(this.selectorConstraintsStrategy);
 
   /// All directly instantiated classes, that is, classes with a generative
   /// constructor that has been called directly and not only through a
@@ -244,13 +277,13 @@
     });
   }
 
-  bool _hasMatchingSelector(Map<Selector, ReceiverMaskSet> selectors,
+  bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
                             Element member,
                             World world) {
     if (selectors == null) return false;
     for (Selector selector in selectors.keys) {
       if (selector.appliesUnnamed(member, world)) {
-        ReceiverMaskSet masks = selectors[selector];
+        SelectorConstraints masks = selectors[selector];
         if (masks.applies(member, selector, world)) {
           return true;
         }
@@ -285,47 +318,47 @@
 
   bool _registerNewSelector(
       UniverseSelector universeSelector,
-      Map<String, Map<Selector, ReceiverMaskSet>> selectorMap) {
+      Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
     Selector selector = universeSelector.selector;
     String name = selector.name;
-    ReceiverMask mask = universeSelector.mask;
-    Map<Selector, ReceiverMaskSet> selectors = selectorMap.putIfAbsent(
-        name, () => new Maplet<Selector, ReceiverMaskSet>());
-    UniverseReceiverMaskSet masks = selectors.putIfAbsent(
-        selector, () => receiverMaskStrategy.createReceiverMaskSet(selector));
-    return masks.addReceiverMask(mask);
+    ReceiverConstraint mask = universeSelector.mask;
+    Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
+        name, () => new Maplet<Selector, SelectorConstraints>());
+    UniverseSelectorConstraints constraints = selectors.putIfAbsent(
+        selector, () => selectorConstraintsStrategy.createSelectorConstraints(selector));
+    return constraints.addReceiverConstraint(mask);
   }
 
-  Map<Selector, ReceiverMaskSet> _asUnmodifiable(
-      Map<Selector, ReceiverMaskSet> map) {
+  Map<Selector, SelectorConstraints> _asUnmodifiable(
+      Map<Selector, SelectorConstraints> map) {
     if (map == null) return null;
     return new UnmodifiableMapView(map);
   }
 
-  Map<Selector, ReceiverMaskSet> invocationsByName(String name) {
+  Map<Selector, SelectorConstraints> invocationsByName(String name) {
     return _asUnmodifiable(_invokedNames[name]);
   }
 
-  Map<Selector, ReceiverMaskSet> getterInvocationsByName(String name) {
+  Map<Selector, SelectorConstraints> getterInvocationsByName(String name) {
     return _asUnmodifiable(_invokedGetters[name]);
   }
 
-  Map<Selector, ReceiverMaskSet> setterInvocationsByName(String name) {
+  Map<Selector, SelectorConstraints> setterInvocationsByName(String name) {
     return _asUnmodifiable(_invokedSetters[name]);
   }
 
   void forEachInvokedName(
-      f(String name, Map<Selector, ReceiverMaskSet> selectors)) {
+      f(String name, Map<Selector, SelectorConstraints> selectors)) {
     _invokedNames.forEach(f);
   }
 
   void forEachInvokedGetter(
-      f(String name, Map<Selector, ReceiverMaskSet> selectors)) {
+      f(String name, Map<Selector, SelectorConstraints> selectors)) {
     _invokedGetters.forEach(f);
   }
 
   void forEachInvokedSetter(
-      f(String name, Map<Selector, ReceiverMaskSet> selectors)) {
+      f(String name, Map<Selector, SelectorConstraints> selectors)) {
     _invokedSetters.forEach(f);
   }
 
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index 6cfa45f..12bb5dc 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -11,10 +11,7 @@
 import 'common/registry.dart' show
     Registry;
 import 'compiler.dart' show
-    invariant,
-    Backend,
-    Compiler,
-    Registry;
+    Compiler;
 import 'dart_types.dart';
 import 'diagnostics/invariant.dart' show
     invariant;
@@ -27,11 +24,13 @@
     VariableElement;
 import 'ordered_typeset.dart';
 import 'types/types.dart' as ti;
-import 'universe/universe.dart' show
-    FunctionSet,
-    Selector,
-    SideEffects;
 import 'universe/class_set.dart';
+import 'universe/function_set.dart' show
+    FunctionSet;
+import 'universe/selector.dart' show
+    Selector;
+import 'universe/side_effects.dart' show
+    SideEffects;
 import 'util/util.dart' show
     Link;
 
@@ -378,11 +377,6 @@
   bool get isClosed => compiler.phase > Compiler.PHASE_RESOLVING;
 
   // Used by selectors.
-  bool isAssertMethod(Element element) {
-    return compiler.backend.isAssertMethod(element);
-  }
-
-  // Used by selectors.
   bool isForeign(Element element) {
     return compiler.backend.isForeign(element);
   }
diff --git a/pkg/dart2js_incremental/lib/library_updater.dart b/pkg/dart2js_incremental/lib/library_updater.dart
index faca103..3499f4f 100644
--- a/pkg/dart2js_incremental/lib/library_updater.dart
+++ b/pkg/dart2js_incremental/lib/library_updater.dart
@@ -110,7 +110,7 @@
     FieldElementX,
     LibraryElementX;
 
-import 'package:compiler/src/universe/universe.dart' show
+import 'package:compiler/src/universe/selector.dart' show
     Selector;
 
 import 'package:compiler/src/constants/values.dart' show
diff --git a/pkg/docgen/LICENSE b/pkg/docgen/LICENSE
deleted file mode 100644
index 5c60afe..0000000
--- a/pkg/docgen/LICENSE
+++ /dev/null
@@ -1,26 +0,0 @@
-Copyright 2014, the Dart project authors. All rights reserved.
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-    * Redistributions of source code must retain the above copyright
-      notice, this list of conditions and the following disclaimer.
-    * Redistributions in binary form must reproduce the above
-      copyright notice, this list of conditions and the following
-      disclaimer in the documentation and/or other materials provided
-      with the distribution.
-    * Neither the name of Google Inc. nor the names of its
-      contributors may be used to endorse or promote products derived
-      from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/docgen/README.md b/pkg/docgen/README.md
deleted file mode 100644
index de80e8c..0000000
--- a/pkg/docgen/README.md
+++ /dev/null
@@ -1,140 +0,0 @@
-docgen
-======
-
-**Deprecated** please use https://pub.dartlang.org/packages/dartdoc instead.
-
-A documentation generator for Dart.
-
-- - -
-The docgen tool takes in a file or directory as input and produces documentation
-for all `.dart` file it finds as YAML or JSON files. This outputs information 
-about all classes, variables, functions, and methods defined in the library and 
-its imported libraries.
-
-### Quick Start: Common Commands 
-
-##### To only generate documentation, while standing in the `bin` directory:
-
-`dartdoc.py` generates all documentation and runs a local server with your html
-pages.
-
-`dartdoc.py -d` ONLY generates documentation for the SDK and all packages (no
-html pages generated and no server).
-
-`dartdoc.py -d -o package/to/document` ONLY generates documenation for the
-specified package.
-
-##### To generate documentation and view it through the webpage:
-- Install [Google App Engine SDK for Python][GAE] (one time setup) and agree to
-   add symlinks so that dev\_appserver.py can be found on your PATH.
-- Run `dartdoc.py`.
-
-### Generating files & uploading to Cloud Storage
-
-The viewer uses YAML files generated by the docgen package as the data 
-being displayed. These files are stored in Google Cloud Storage.
-
- - Run `python upload_docgen.py` to generate these files and upload them to 
- Cloud Storage as a new version.
-- - -
-These tasks can be done separately if necessary:
-
-##### 
-
-#### Generating YAML files
-
-YAML files can be generated using the docgen package in the dart repository. 
-
-###### Usage 
-
-Run  `dart docgen.dart [OPTIONS] <path to directory or file>`
-
-###### Options available
-
-- `-h`, `--help` Prints help and usage information.
-- `-v`, `--verbose` Output more logging information.
-- `-j`, `--[no-]json` Outputs to JSON. Files are outputted to YAML by default. 
-If `--append` is used, it takes the file-format of the previous run stated in 
-library_list.json ignoring the flag.
-- `--include-private` Flag to include private declarations.
-- `--include-sdk` Flag to parse SDK Library files imported.
-- `--parse-sdk` Parses the SDK libraries only. (Ignores the path passed in.)
-- `--package-root` Sets the package root of the library being analyzed.
-- `--append` Appends to the docs folder, library_list.json, and index.txt.
-- `--introduction` Adds the provided markdown text file as the introduction
-for the outputted documentation.
-
-
-###### Output directory
-Documented libraries will be located at bin/docs in either YAML or JSON format 
-depending on options specified. There will also be a library\_list.json, 
-containing a list of all the libraries inside the docs folder. 
-
-To get more information on how to use the outputted documentation with 
-dartdoc-viewer, please take a look at the 
-[dartdoc-viewer documentation][dartdoc-viewer].
-
-#### Uploading to Cloud Storage
-
-To push new files to Google Cloud Storage for use by the viewer, use the 
-`gsutil` tool located at third_party/gsutil/gsutil in the Dart repository.
-
- - Run `python gsutil -m cp -q -a public-read -r <folder> gs://dartlang-docgen`
- to upload the specified folder to the viewer's bucket. Be sure to also upload 
- a new VERSION file if the uploaded folder is to be used.**
-
-**Note that the bucket contains several numbered folders for each version of 
-the documentation. Run `python gsutil ls gs://dartlang-docgen` to see the file 
-layout. Follow this convention and update a new VERSION file when uploading 
-a new version of documentation. You can see the format of the VERSION file 
-by running `python gsutil cat gs://dartlang-docgen/VERSION`.
-
-### Viewing generated documentation
-
-Docgen's generated YAML files can be used by the 
-[Dart Documentation Viewer][dartdoc-viewer] for easy viewing and navigation 
-through a project. 
-
----
-
-#### Using dartdoc.py
-
-The `dartdoc.py` script located in the `bin` directory is a useful tool for 
-creating documentation for a Dart project and running it locally. 
-
-##### Setup
-
-The `dartdoc.py` script makes use of the 
-[Google App Engine SDK for Python][GAE]'s development server to serve the 
-documentation viewer. Install a recent version of the SDK before running 
-`dartdoc.py`.
-
-##### Running dartdoc.py
-
-######Common Options
-
-The following options are the most used:
-
-    python dartdoc.py --gae-sdk=<path to SDK>
-      --options=<path to files>
-      --options=--parse-sdk
-      --options='--include-sdk <path to files>'
-      --options='--append <path to files>'
-
-######All Options
-
-Run `python dartdoc.py -h` from the `bin` directory for all available options. 
-The two required options are as follows:
- 
- 1. The `--options` option describes any options being passed into `docgen.dart`.
- If more then one option is desired, separate the options with a space 
- (ex. `--options='--include-sdk files'`).
- 2. The `--gae-sdk` option gives the absolute path to the 
- [Google App Engine SDK][GAE]. 
-
-Running `python dartdoc.py --options=<docgen options> --gae-sdk=<path to SDK>` 
-will serve files generated by `docgen.dart` in your browser.
-
-[dartdoc-viewer]: https://github.com/dart-lang/dartdoc-viewer "Dartdoc-Viewer"
-[GAE]: https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Python  "Google App Engine SDK for Python"
-
diff --git a/pkg/docgen/bin/docgen.dart b/pkg/docgen/bin/docgen.dart
deleted file mode 100644
index 6ed8392..0000000
--- a/pkg/docgen/bin/docgen.dart
+++ /dev/null
@@ -1,173 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:io';
-
-import 'package:args/args.dart';
-import 'package:logging/logging.dart';
-import 'package:path/path.dart' as path;
-
-// Must use relative paths because library imports mirrors via relative paths
-import '../lib/docgen.dart';
-
-/**
- * Analyzes Dart files and generates a representation of included libraries,
- * classes, and members.
- */
-void main(List<String> arguments) {
-  var options = _initArgParser().parse(arguments);
-  var files = options.rest.map(path.normalize).toList();
-  if (files.isEmpty) _printHelpAndExit();
-  var startPage = options['start-page'];
-  if (_singlePackage(files) && startPage == null) {
-    startPage = _defaultStartPageFor(files);
-    _printDeprecatedMessage();
-    print("Using default options for documenting a single package: "
-        "--start-page=$startPage");
-  }
-  var includeSdk = options['parse-sdk'] || options['include-sdk'];
-  var scriptDir = path.dirname(Platform.script.toFilePath());
-  var introduction = includeSdk ? '' : options['introduction'];
-
-  var pubScript =
-      options['sdk'] != null ? path.join(options['sdk'], 'bin', 'pub') : 'pub';
-
-  var dartBinary = options['sdk'] != null
-      ? path.join(options['sdk'], 'bin', 'dart')
-      : 'dart';
-
-  var excludedLibraries = options['exclude-lib'];
-  if (excludedLibraries == null) excludedLibraries = [];
-
-  var indentJSON = options['indent-json'] as bool;
-
-  docgen(files,
-      packageRoot: options['package-root'],
-      includePrivate: options['include-private'],
-      includeSdk: includeSdk,
-      parseSdk: options['parse-sdk'],
-      introFileName: introduction,
-      out: options['out'],
-      excludeLibraries: excludedLibraries,
-      includeDependentPackages: options['include-dependent-packages'],
-      compile: options['compile'],
-      serve: options['serve'],
-      dartBinary: dartBinary,
-      pubScript: pubScript,
-      noDocs: options['no-docs'],
-      startPage: startPage,
-      indentJSON: indentJSON,
-      sdk: options['sdk']);
-}
-
-/**
- * Print help if we are passed the help option or invalid arguments.
- */
-void _printHelpAndExit() {
-  _printDeprecatedMessage();
-  print(_initArgParser().usage);
-  print('Usage: dartdocgen [OPTIONS] fooDir/barFile');
-  exit(0);
-}
-
-void _printDeprecatedMessage() {
-  print(
-      '\nDeprecated: please use https://pub.dartlang.org/packages/dartdoc instead.');
-  print('Dart SDK 1.12 will be the last release to ship with docgen.\n');
-}
-
-/**
- * If the user seems to have given us a single package to document, use some
- * reasonable arguments for what they probably meant.
- */
-bool _singlePackage(List files) {
-  if (files.length != 1) return false;
-  var pubspec = new File(path.join(files.first, 'pubspec.yaml'));
-  if (!pubspec.existsSync()) return false;
-  return true;
-}
-
-/**
- * If we've specified just a package and no other command-line options,
- * use the single package name as the start page.
- */
-String _defaultStartPageFor(files) {
-  var pubspec = new File(path.join(files.first, 'pubspec.yaml'));
-  if (!pubspec.existsSync()) return null;
-  return packageNameFor(files.first);
-}
-
-/**
- * Creates parser for docgen command line arguments.
- */
-ArgParser _initArgParser() {
-  var parser = new ArgParser();
-  parser.addFlag('help',
-      abbr: 'h',
-      help: 'Prints help and usage information.',
-      negatable: false, callback: (help) {
-    if (help) _printHelpAndExit();
-  });
-  parser.addFlag('verbose',
-      abbr: 'v',
-      help: 'Output more logging information.',
-      negatable: false, callback: (verbose) {
-    if (verbose) Logger.root.level = Level.FINEST;
-  });
-  parser.addFlag('include-private',
-      help: 'Flag to include private declarations.', negatable: false);
-  parser.addFlag('include-sdk',
-      help: 'Flag to parse SDK Library files.',
-      defaultsTo: false,
-      negatable: true);
-  parser.addFlag('parse-sdk',
-      help: 'Parses the SDK libraries only.',
-      defaultsTo: false,
-      negatable: false);
-  parser.addOption('package-root',
-      help: 'Sets the package root of the library being analyzed.');
-  parser.addFlag('compile',
-      help: 'Clone the documentation viewer repo locally '
-          '(if not already present) and compile with dart2js',
-      defaultsTo: false,
-      negatable: false);
-  parser.addFlag('serve',
-      help: 'Clone the documentation viewer repo locally '
-          '(if not already present), compile with dart2js, '
-          'and start a simple server',
-      defaultsTo: false,
-      negatable: false);
-  parser.addFlag('no-docs',
-      help: 'Do not generate any new documentation',
-      defaultsTo: false,
-      negatable: false);
-  parser.addOption('introduction',
-      help: 'Adds the provided markdown text file as the introduction'
-          ' for the generated documentation.',
-      defaultsTo: '');
-  parser.addOption('out',
-      help: 'The name of the output directory.', defaultsTo: 'docs');
-  parser.addOption('exclude-lib',
-      help: 'Exclude the library by this name from the documentation',
-      allowMultiple: true);
-  parser.addFlag('include-dependent-packages',
-      help: 'Assumes we are documenting a single package and are running '
-          'in the directory with its pubspec. Includes documentation for all '
-          'of its dependent packages.',
-      defaultsTo: true,
-      negatable: true);
-  parser.addOption('sdk', help: 'SDK directory', defaultsTo: null);
-  parser.addOption('start-page',
-      help: 'By default the viewer will start at the SDK introduction page. '
-          'To start at some other page, e.g. for a package, provide the name '
-          'of the package in this argument, e.g. --start-page=intl will make '
-          'the start page of the viewer be the intl package.',
-      defaultsTo: null);
-  parser.addFlag('indent-json',
-      help: 'Indents each level of JSON output by two spaces',
-      defaultsTo: false,
-      negatable: true);
-
-  return parser;
-}
diff --git a/pkg/docgen/lib/docgen.dart b/pkg/docgen/lib/docgen.dart
deleted file mode 100644
index a9f171a..0000000
--- a/pkg/docgen/lib/docgen.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// **docgen** is a tool for creating machine readable representations of Dart
-/// code metadata, including: classes, members, comments and annotations.
-///
-/// docgen is run on a `.dart` file or a directory containing `.dart` files.
-///
-///      $ dart docgen.dart [OPTIONS] [FILE/DIR]
-///
-/// This creates files called `docs/<library_name>.yaml` in your current
-/// working directory.
-library docgen;
-
-import 'dart:async';
-
-import 'src/generator.dart' as gen;
-import 'src/viewer.dart' as viewer;
-
-export 'src/generator.dart' show getMirrorSystem;
-export 'src/library_helpers.dart' show getDocgenObject;
-export 'src/models.dart';
-export 'src/package_helpers.dart' show packageNameFor;
-
-/// Docgen constructor initializes the link resolver for markdown parsing.
-/// Also initializes the command line arguments.
-///
-/// [packageRoot] is the packages directory of the directory being analyzed.
-/// If [includeSdk] is `true`, then any SDK libraries explicitly imported will
-/// also be documented.
-/// If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
-/// This option is useful when only the SDK libraries are needed.
-/// If [compile] is `true`, then after generating the documents, compile the
-/// viewer with dart2js.
-/// If [serve] is `true`, then after generating the documents we fire up a
-/// simple server to view the documentation.
-///
-/// Returned Future completes with true if document generation is successful.
-Future<bool> docgen(List<String> files, {String packageRoot,
-    bool includePrivate: false, bool includeSdk: false, bool parseSdk: false,
-    String introFileName: '', String out: gen.DEFAULT_OUTPUT_DIRECTORY,
-    List<String> excludeLibraries: const [],
-    bool includeDependentPackages: false, bool compile: false,
-    bool serve: false, bool noDocs: false, String startPage,
-    String pubScript : 'pub', String dartBinary: 'dart',
-    bool indentJSON: false, String sdk}) {
-  var result;
-  if (!noDocs) {
-    viewer.ensureMovedViewerCode();
-    result = gen.generateDocumentation(files, packageRoot: packageRoot,
-        includePrivate: includePrivate,
-        includeSdk: includeSdk, parseSdk: parseSdk,
-        introFileName: introFileName, out: out,
-        excludeLibraries: excludeLibraries,
-        includeDependentPackages: includeDependentPackages,
-        startPage: startPage, pubScriptValue: pubScript,
-        dartBinaryValue: dartBinary, indentJSON: indentJSON, sdk: sdk);
-    viewer.addBackViewerCode();
-    if (compile || serve) {
-      result.then((success) {
-        if (success) {
-          viewer.createViewer(serve);
-        }
-      });
-    }
-  } else if (compile || serve) {
-    gen.pubScript = pubScript;
-    gen.dartBinary = dartBinary;
-    viewer.createViewer(serve);
-  }
-  return result;
-}
diff --git a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart b/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
deleted file mode 100644
index d99a98c..0000000
--- a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
+++ /dev/null
@@ -1,7 +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.
-
-library docgen.exports.dart2js_mirrors;
-
-export 'package:compiler/src/mirrors/dart2js_mirrors.dart';
diff --git a/pkg/docgen/lib/src/exports/libraries.dart b/pkg/docgen/lib/src/exports/libraries.dart
deleted file mode 100644
index 7e48c79..0000000
--- a/pkg/docgen/lib/src/exports/libraries.dart
+++ /dev/null
@@ -1,7 +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.
-
-library docgen.exports.libraries;
-
-export 'package:sdk_library_metadata/libraries.dart';
diff --git a/pkg/docgen/lib/src/exports/mirrors_util.dart b/pkg/docgen/lib/src/exports/mirrors_util.dart
deleted file mode 100644
index f02b55e..0000000
--- a/pkg/docgen/lib/src/exports/mirrors_util.dart
+++ /dev/null
@@ -1,7 +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.
-
-library docgen.exports.mirrors_util;
-
-export 'package:compiler/src/mirrors/mirrors_util.dart';
diff --git a/pkg/docgen/lib/src/exports/source_mirrors.dart b/pkg/docgen/lib/src/exports/source_mirrors.dart
deleted file mode 100644
index 5f2f1ff..0000000
--- a/pkg/docgen/lib/src/exports/source_mirrors.dart
+++ /dev/null
@@ -1,8 +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.
-
-library docgen.exports.source_mirrors;
-
-export 'package:compiler/src/mirrors/source_mirrors.dart'
-    hide SourceLocation;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
deleted file mode 100644
index 18ed895..0000000
--- a/pkg/docgen/lib/src/generator.dart
+++ /dev/null
@@ -1,487 +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.
-
-library docgen.generator;
-
-import 'dart:async';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:markdown/markdown.dart' as markdown;
-import 'package:path/path.dart' as path;
-
-import 'package:compiler/compiler.dart' as api;
-import 'package:compiler/src/filenames.dart';
-import 'package:compiler/src/mirrors/analyze.dart'
-    as dart2js;
-import 'package:compiler/src/source_file_provider.dart';
-
-import 'exports/dart2js_mirrors.dart' as dart2js_mirrors;
-import 'exports/libraries.dart';
-import 'exports/mirrors_util.dart' as dart2js_util;
-import 'exports/source_mirrors.dart';
-
-import 'io.dart';
-import 'library_helpers.dart';
-import 'models.dart';
-import 'package_helpers.dart';
-
-const String DEFAULT_OUTPUT_DIRECTORY = 'docs';
-
-/// The directory where the output docs are generated.
-String get outputDirectory => _outputDirectory;
-String _outputDirectory;
-
-/// Library names to explicitly exclude.
-///
-///   Set from the command line option
-/// --exclude-lib.
-List<String> _excluded;
-
-/// The path of the pub script.
-String pubScript;
-
-/// The path of Dart binary.
-String dartBinary;
-
-/// Docgen constructor initializes the link resolver for markdown parsing.
-/// Also initializes the command line arguments.
-///
-/// [packageRoot] is the packages directory of the directory being analyzed.
-/// If [includeSdk] is `true`, then any SDK libraries explicitly imported will
-/// also be documented.
-/// If [parseSdk] is `true`, then all Dart SDK libraries will be documented.
-/// This option is useful when only the SDK libraries are needed.
-///
-/// Returned Future completes with true if document generation is successful.
-Future<bool> generateDocumentation(List<String> files, {String packageRoot,
-    bool outputToYaml: true, bool includePrivate: false, bool includeSdk: false,
-    bool parseSdk: false, String introFileName: '',
-    out: DEFAULT_OUTPUT_DIRECTORY, List<String> excludeLibraries: const [], bool
-    includeDependentPackages: false, String startPage, String dartBinaryValue,
-    String pubScriptValue, bool indentJSON: false, String sdk}) {
-  _excluded = excludeLibraries;
-  dartBinary = dartBinaryValue;
-  pubScript = pubScriptValue;
-
-  logger.onRecord.listen((record) => print(record.message));
-
-  _ensureOutputDirectory(out);
-  var updatedPackageRoot = _obtainPackageRoot(packageRoot, parseSdk, files);
-
-  var requestedLibraries = _findLibrariesToDocument(files,
-      includeDependentPackages);
-
-  var allLibraries = []..addAll(requestedLibraries);
-  if (includeSdk) {
-    allLibraries.addAll(_listSdk());
-  }
-
-  return getMirrorSystem(allLibraries, includePrivate,
-      packageRoot: updatedPackageRoot, parseSdk: parseSdk, sdkRoot: sdk)
-      .then((MirrorSystem mirrorSystem) {
-    if (mirrorSystem.libraries.isEmpty) {
-      throw new StateError('No library mirrors were created.');
-    }
-    initializeTopLevelLibraries(mirrorSystem);
-
-    var availableLibraries = mirrorSystem.libraries.values
-        .where((each) => each.uri.scheme == 'file');
-    var availableLibrariesByPath =
-        new Map.fromIterables(availableLibraries.map((each) => each.uri),
-            availableLibraries);
-    var librariesToDocument = requestedLibraries
-          .map((each) {
-            return availableLibrariesByPath
-                .putIfAbsent(each, () => throw "Missing library $each");
-    }).toList();
-    librariesToDocument.addAll((includeSdk || parseSdk) ? sdkLibraries : []);
-    librariesToDocument.removeWhere((x) => _excluded.contains(
-        dart2js_util.nameOf(x)));
-    _documentLibraries(librariesToDocument, includeSdk, parseSdk, introFileName,
-        startPage, indentJSON);
-    return true;
-  });
-}
-
-
-/// Analyzes set of libraries by getting a mirror system and triggers the
-/// documentation of the libraries.
-Future<MirrorSystem> getMirrorSystem(List<Uri> libraries,
-    bool includePrivate, {String packageRoot, bool parseSdk: false,
-    String sdkRoot}) {
-  if (libraries.isEmpty) throw new StateError('No Libraries.');
-
-  includePrivateMembers = includePrivate;
-
-  // Finds the root of SDK library based off the location of docgen.
-  // We have two different places to look, depending if we're in a development
-  // repo or in a built SDK, either sdk or dart-sdk respectively
-  if (sdkRoot == null) {
-    var root = rootDirectory;
-    sdkRoot = path.normalize(path.absolute(path.join(root, 'sdk')));
-    if (!new Directory(sdkRoot).existsSync()) {
-      sdkRoot = path.normalize(path.absolute(path.join(root, 'dart-sdk')));
-    }
-  }
-  logger.info('SDK Root: ${sdkRoot}');
-  return analyzeLibraries(libraries, sdkRoot, packageRoot: packageRoot);
-}
-
-/// Writes [text] to a file in the output directory.
-void _writeToFile(String text, String filename) {
-  if (text == null) return;
-
-  var filePath = path.join(_outputDirectory, filename);
-
-  var parentDir = new Directory(path.dirname(filePath));
-  if (!parentDir.existsSync()) parentDir.createSync(recursive: true);
-
-  try {
-    new File(filePath)
-        .writeAsStringSync(text, mode: FileMode.WRITE);
-  } on FileSystemException catch (e) {
-    print('Failed to write to the path $filePath. Do you have write '
-        'permissions to that directory? If not, please specify a different '
-        'output directory using the --out option.');
-    exit(1);
-  }
-}
-
-/// Resolve all the links in the introductory comments for a given library or
-/// package as specified by [filename].
-String _readIntroductionFile(String fileName, bool includeSdk) {
-  var linkResolver = (name) => globalFixReference(name);
-  var defaultText = includeSdk ? _DEFAULT_SDK_INTRODUCTION : '';
-  var introText = defaultText;
-  if (fileName.isNotEmpty) {
-    var introFile = new File(fileName);
-    introText = introFile.existsSync() ? introFile.readAsStringSync() :
-        defaultText;
-  }
-  return markdown.markdownToHtml(introText, linkResolver: linkResolver,
-      inlineSyntaxes: MARKDOWN_SYNTAXES);
-}
-
-int _indexableComparer(Indexable a, Indexable b) {
-  if (a is Library && b is Library) {
-    var compare = a.packageName.compareTo(b.packageName);
-    if (compare == 0) {
-      compare = a.name.compareTo(b.name);
-    }
-    return compare;
-  }
-
-  if (a is Library) return -1;
-  if (b is Library) return 1;
-
-  return a.qualifiedName.compareTo(b.qualifiedName);
-}
-
-/// Creates documentation for filtered libraries.
-void _documentLibraries(List<LibraryMirror> libs, bool includeSdk,
-  bool parseSdk, String introFileName, String startPage, bool indentJson) {
-  libs.forEach((lib) {
-    // Files belonging to the SDK have a uri that begins with 'dart:'.
-    if (includeSdk || !lib.uri.toString().startsWith('dart:')) {
-      generateLibrary(lib);
-    }
-  });
-
-  var filteredEntities = new SplayTreeSet<Indexable>(_indexableComparer);
-  for (Indexable item in allIndexables) {
-    if (isFullChainVisible(item)) {
-      if (item is! Method ||
-          (item is Method && item.methodInheritedFrom == null)) {
-        filteredEntities.add(item);
-      }
-    }
-  }
-
-  // Outputs a JSON file with all libraries and their preview comments.
-  // This will help the viewer know what libraries are available to read in.
-  Map<String, dynamic> libraryMap = {
-      'libraries': filteredEntities.where((e) => e is Library).map((e) =>
-          e.previewMap).toList(),
-      'introduction': _readIntroductionFile(introFileName, includeSdk),
-      'filetype': 'json',
-      'sdkVersion': packageVersion(coreLibrary.mirror)
-    };
-
-  var encoder = new JsonEncoder.withIndent(indentJson ? '  ' : null);
-
-  _writeOutputFiles(libraryMap, filteredEntities, startPage, encoder);
-}
-
-/// Output all of the libraries and classes into json files for consumption by a
-/// viewer.
-void _writeOutputFiles(Map<String, dynamic> libraryMap, Iterable<Indexable>
-    filteredEntities, String startPage, JsonEncoder encoder) {
-  if (startPage != null) libraryMap['start-page'] = startPage;
-
-  _writeToFile(encoder.convert(libraryMap), 'library_list.json');
-
-  // Output libraries and classes to file after all information is generated.
-  filteredEntities.where((e) => e is Class || e is Library).forEach((output) {
-    _writeIndexableToFile(output, encoder);
-  });
-
-  // Outputs all the qualified names documented with their type.
-  // This will help generate search results.
-  var sortedEntities = filteredEntities
-      .map((e) => '${e.qualifiedName} ${e.typeName}')
-      .toList();
-
-  sortedEntities.sort();
-
-  var buffer = new StringBuffer()
-      ..writeAll(sortedEntities, '\n')
-      ..write('\n');
-
-  _writeToFile(buffer.toString(), 'index.txt');
-
-  var index = new SplayTreeMap.fromIterable(filteredEntities,
-      key: (e) => e.qualifiedName, value: (e) => e.typeName);
-
-  _writeToFile(encoder.convert(index), 'index.json');
-}
-
-/// Helper method to serialize the given Indexable out to a file.
-void _writeIndexableToFile(Indexable result, JsonEncoder encoder) {
-  var outputFile = result.fileName + '.json';
-  var output = encoder.convert(result.toMap());
-  _writeToFile(output, outputFile);
-}
-
-/// Set the location of the ouput directory, and ensure that the location is
-/// available on the file system.
-void _ensureOutputDirectory(String outputDirectory) {
-  _outputDirectory = outputDirectory;
-  var dir = new Directory(_outputDirectory);
-  if (dir.existsSync()) dir.deleteSync(recursive: true);
-}
-
-/// Analyzes set of libraries and provides a mirror system which can be used
-/// for static inspection of the source code.
-Future<MirrorSystem> analyzeLibraries(List<Uri> libraries, String
-    libraryRoot, {String packageRoot}) {
-  SourceFileProvider provider = new CompilerSourceFileProvider();
-  api.DiagnosticHandler diagnosticHandler = new FormattingDiagnosticHandler(
-      provider)
-      ..showHints = false
-      ..showWarnings = false;
-  Uri libraryUri = new Uri.file(appendSlash(libraryRoot));
-  Uri packageUri = null;
-  if (packageRoot == null) {
-    packageRoot = Platform.packageRoot;
-  }
-  packageUri = new Uri.file(appendSlash(packageRoot));
-  return dart2js.analyze(libraries, libraryUri, packageUri,
-      provider.readStringFromUri, diagnosticHandler, ['--preserve-comments',
-      '--categories=Client,Server'])..catchError((error) {
-        logger.severe('Error: Failed to create mirror system. ');
-        // TODO(janicejl): Use the stack trace package when bug is resolved.
-        // Currently, a string is thrown when it fails to create a mirror
-        // system, and it is not possible to use the stack trace. BUG(#11622)
-        // To avoid printing the stack trace.
-        exit(1);
-      });
-}
-
-/// For this run of docgen, determine the packageRoot value.
-///
-/// If packageRoot is not explicitly passed, we examine the files we're
-/// documenting to attempt to find a package root.
-String _obtainPackageRoot(String packageRoot, bool parseSdk,
-    List<String> files) {
-  if (packageRoot == null && !parseSdk) {
-    var type = FileSystemEntity.typeSync(files.first);
-    if (type == FileSystemEntityType.DIRECTORY) {
-      var files2 = listDir(files.first, recursive: true);
-      // Return '' means that there was no pubspec.yaml and therefore no
-      // packageRoot.
-      packageRoot = files2.firstWhere((f) => f.endsWith(
-          '${path.separator}pubspec.yaml'), orElse: () => '');
-      if (packageRoot != '') {
-        packageRoot = path.join(path.dirname(packageRoot), 'packages');
-      }
-    } else if (type == FileSystemEntityType.FILE) {
-      logger.warning('WARNING: No package root defined. If Docgen fails, try '
-          'again by setting the --package-root option.');
-    }
-  }
-  logger.info('Package Root: ${packageRoot}');
-  return path.normalize(path.absolute(packageRoot));
-}
-
-/// Given the user provided list of items to document, expand all directories
-/// to document out into specific files and add any dependent packages for
-/// documentation if desired.
-List<Uri> _findLibrariesToDocument(List<String> args, bool
-    includeDependentPackages) {
-  if (includeDependentPackages) {
-    args.addAll(_allDependentPackageDirs(args.first));
-  }
-
-  var libraries = new List<Uri>();
-  for (var arg in args) {
-    if (FileSystemEntity.typeSync(arg) == FileSystemEntityType.FILE) {
-      if (arg.endsWith('.dart')) {
-        var lib = new Uri.file(path.absolute(arg));
-        libraries.add(lib);
-        logger.info('Added to libraries: $lib');
-      }
-    } else {
-      libraries.addAll(_findFilesToDocumentInPackage(arg));
-    }
-  }
-  return libraries;
-}
-
-/// Given a package name, explore the directory and pull out all top level
-/// library files in the "lib" directory to document.
-List<Uri> _findFilesToDocumentInPackage(String packageDir) {
-  var libraries = [];
-  // To avoid anaylzing package files twice, only files with paths not
-  // containing '/packages' will be added. The only exception is if the file
-  // to analyze already has a '/package' in its path.
-  var files = listDir(packageDir, recursive: true, listDir: _packageDirList)
-      .where((f) => f.endsWith('.dart') &&
-        (!f.contains('${path.separator}packages') ||
-            packageDir.contains('${path.separator}packages')))
-      .toList();
-
-  var packageLibDir = path.join(packageDir, 'lib');
-  var packageLibSrcDir = path.join(packageLibDir, 'src');
-
-  files.forEach((String lib) {
-    // Only include libraries within the lib dir that are not in lib/src
-    if (path.isWithin(packageLibDir, lib) &&
-        !path.isWithin(packageLibSrcDir, lib)) {
-      // Only add the file if it does not contain 'part of'
-      // TODO(janicejl): Remove when Issue(12406) is resolved.
-      var contents = new File(lib).readAsStringSync();
-
-
-      if (contents.contains(new RegExp('\npart of ')) ||
-          contents.startsWith(new RegExp('part of '))) {
-        logger.warning('Skipping part "$lib". '
-            'Part files should be in "lib/src".');
-      } else {
-        libraries.add(new Uri.file(path.normalize(path.absolute(lib))));
-        logger.info('Added to libraries: $lib');
-      }
-    }
-  });
-  return libraries;
-}
-
-/// If [dir] contains both a `lib` directory and a `pubspec.yaml` file treat
-/// it like a package and only return the `lib` dir.
-///
-/// This ensures that packages don't have non-`lib` content documented.
-List<FileSystemEntity> _packageDirList(Directory dir) {
-  var entities = dir.listSync();
-
-  var pubspec = entities.firstWhere((e) => e is File &&
-      path.basename(e.path) == 'pubspec.yaml', orElse: () => null);
-
-  var libDir = entities.firstWhere((e) => e is Directory &&
-      path.basename(e.path) == 'lib', orElse: () => null);
-
-  if (pubspec != null && libDir != null) {
-    return [libDir];
-  } else {
-    return entities;
-  }
-}
-
-/// All of the directories for our dependent packages
-/// If this is not a package, return an empty list.
-List<String> _allDependentPackageDirs(String packageDirectory) {
-  var packageName = packageNameFor(packageDirectory);
-  if (packageName == '') return [];
-  var dependentsJson = Process.runSync(pubScript, ['list-package-dirs'],
-      workingDirectory: packageDirectory, runInShell: true);
-  if (dependentsJson.exitCode != 0) {
-    print(dependentsJson.stderr);
-  }
-  var dependents = JSON.decode(dependentsJson.stdout)['packages'];
-  return dependents != null ? dependents.values.toList() : [];
-}
-
-/// For all the libraries, return a list of the libraries that are part of
-/// the SDK.
-List<Uri> _listSdk() {
-  var sdk = new List<Uri>();
-  LIBRARIES.forEach((String name, LibraryInfo info) {
-    if (info.documented) {
-      sdk.add(Uri.parse('dart:$name'));
-      logger.info('Add to SDK: ${sdk.last}');
-    }
-  });
-  return sdk;
-}
-
-/// Currently left public for testing purposes. :-/
-void generateLibrary(dart2js_mirrors.Dart2JsLibraryMirror library) {
-  var result = new Library(library);
-  result.updateLibraryPackage(library);
-  logger.fine('Generated library for ${result.name}');
-}
-
-/// If we can't find the SDK introduction text, which will happen if running
-/// from a snapshot and using --parse-sdk or --include-sdk, then use this
-/// hard-coded version. This should be updated to be consistent with the text
-/// in docgen/doc/sdk-introduction.md
-// TODO(alanknight): It would be better if we could resolve the references to
-// dart:core etc. at load-time in the viewer. dartbug.com/20112
-const _DEFAULT_SDK_INTRODUCTION =
-    """
-Welcome to the Dart API reference documentation,
-covering the official Dart API libraries.
-Some of the most fundamental Dart libraries include:
-
-* [dart:core](./dart:core):
-  Core functionality such as strings, numbers, collections, errors,
-  dates, and URIs.
-* [dart:html](./dart:html):
-  DOM manipulation for web apps.
-* [dart:io](./dart:io):
-  I/O for command-line apps.
-
-Except for dart:core, you must import a library before you can use it.
-Here's an example of importing dart:html, dart:math, and a
-third popular library called
-[polymer.dart](http://www.dartlang.org/polymer-dart/):
-
-    import 'dart:html';
-    import 'dart:math';
-    import 'package:polymer/polymer.dart';
-
-Polymer.dart is an example of a library that isn't
-included in the Dart download,
-but is easy to get and update using the _pub package manager_.
-For information on finding, using, and publishing libraries (and more)
-with pub, see
-[pub.dartlang.org](http://pub.dartlang.org).
-
-The main site for learning and using Dart is
-[www.dartlang.org](http://www.dartlang.org).
-Check out these pages:
-
-  * [Dart homepage](http://www.dartlang.org)
-  * [Tutorials](http://www.dartlang.org/docs/tutorials/)
-  * [Programmer's Guide](http://www.dartlang.org/docs/)
-  * [Samples](http://www.dartlang.org/samples/)
-  * [A Tour of the Dart Libraries](http://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html)
-
-This API reference is automatically generated from the source code in the
-[Dart project](https://code.google.com/p/dart/).
-If you'd like to contribute to this documentation, see
-[Contributing](https://code.google.com/p/dart/wiki/Contributing)
-and
-[Writing API Documentation](https://code.google.com/p/dart/wiki/WritingApiDocumentation).
-""";
diff --git a/pkg/docgen/lib/src/io.dart b/pkg/docgen/lib/src/io.dart
deleted file mode 100644
index 65e69e8..0000000
--- a/pkg/docgen/lib/src/io.dart
+++ /dev/null
@@ -1,61 +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.
-
-/// This is a helper library to make working with io easier.
-library docgen.io;
-
-// TODO(janicejl): listDir, canonicalize, resolveLink, and linkExists are from
-// pub/lib/src/io.dart. If the io.dart file becomes a package, should remove
-// copy of the functions.
-
-import 'dart:io';
-import 'package:path/path.dart' as path;
-
-/// Lists the contents of [dir].
-///
-/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
-///
-/// Excludes files and directories beginning with `.`
-///
-/// The returned paths are guaranteed to begin with [dir].
-List<String> listDir(String dir, {bool recursive: false,
-  List<FileSystemEntity> listDir(Directory dir)}) {
-  if (listDir == null) listDir = (Directory dir) => dir.listSync();
-
-  return _doList(dir, new Set<String>(), recursive, listDir);
-}
-
-List<String> _doList(String dir, Set<String> listedDirectories, bool recurse,
-    List<FileSystemEntity> listDir(Directory dir)) {
-  var contents = <String>[];
-
-  // Avoid recursive symlinks.
-  var resolvedPath = new Directory(dir).resolveSymbolicLinksSync();
-  if (listedDirectories.contains(resolvedPath)) return [];
-
-  listedDirectories = new Set<String>.from(listedDirectories);
-  listedDirectories.add(resolvedPath);
-
-  var children = <String>[];
-  for (var entity in listDir(new Directory(dir))) {
-    // Skip hidden files and directories
-    if (path.basename(entity.path).startsWith('.')) {
-      continue;
-    }
-
-    contents.add(entity.path);
-    if (entity is Directory) {
-      // TODO(nweiz): don't manually recurse once issue 4794 is fixed.
-      // Note that once we remove the manual recursion, we'll need to
-      // explicitly filter out files in hidden directories.
-      if (recurse) {
-        children.addAll(_doList(entity.path, listedDirectories, recurse,
-            listDir));
-      }
-    }
-  }
-
-  contents.addAll(children);
-  return contents;
-}
diff --git a/pkg/docgen/lib/src/library_helpers.dart b/pkg/docgen/lib/src/library_helpers.dart
deleted file mode 100644
index 24e89d3..0000000
--- a/pkg/docgen/lib/src/library_helpers.dart
+++ /dev/null
@@ -1,220 +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.
-
-library docgen.library_helpers;
-
-import 'package:logging/logging.dart';
-import 'package:markdown/markdown.dart' as markdown;
-
-import 'exports/source_mirrors.dart';
-import 'exports/mirrors_util.dart' as dart2js_util;
-
-import 'models/indexable.dart';
-import 'models/library.dart';
-import 'models/dummy_mirror.dart';
-
-typedef DeclarationMirror LookupFunction(DeclarationSourceMirror declaration,
-    String name);
-
-/// Support for [:foo:]-style code comments to the markdown parser.
-final List<markdown.InlineSyntax> MARKDOWN_SYNTAXES =
-  [new markdown.CodeSyntax(r'\[:\s?((?:.|\n)*?)\s?:\]')];
-
-bool get includePrivateMembers {
-  if (_includePrivate == null) {
-    throw new StateError('includePrivate has not been set');
-  }
-  return _includePrivate;
-}
-
-void set includePrivateMembers(bool value) {
-  if (value == null) throw new ArgumentError('includePrivate cannot be null');
-  _includePrivate = value;
-}
-
-bool _includePrivate;
-
-/// Return true if this item and all of its owners are all visible.
-bool isFullChainVisible(Indexable item) {
-  return includePrivateMembers || (!item.isPrivate && (item.owner != null ?
-      isFullChainVisible(item.owner) : true));
-}
-
-/// Logger for printing out progress of documentation generation.
-final Logger logger = new Logger('Docgen');
-
-/// The dart:core library, which contains all types that are always available
-/// without import.
-Library coreLibrary;
-
-/// Set of libraries declared in the SDK, so libraries that can be accessed
-/// when running dart by default.
-Iterable<LibraryMirror> get sdkLibraries => _sdkLibraries;
-Iterable<LibraryMirror> _sdkLibraries;
-
-////// Top level resolution functions
-/// Converts all [foo] references in comments to <a>libraryName.foo</a>.
-markdown.Node globalFixReference(String name) {
-  // Attempt the look up the whole name up in the scope.
-  String elementName = findElementInScopeWithPrefix(name, '');
-  if (elementName != null) {
-    return new markdown.Element.text('a', elementName);
-  }
-  return fixComplexReference(name);
-}
-
-/// This is a more complex reference. Try to break up if its of the form A<B>
-/// where A is an alphanumeric string and B is an A, a list of B ("B, B, B"),
-/// or of the form A<B>. Note: unlike other the other markdown-style links,
-/// all text inside the square brackets is treated as part of the link (aka
-/// the * is interpreted literally as a *, not as a indicator for bold <em>.
-///
-/// Example: [foo&lt;_bar_>] will produce
-/// <a>resolvedFoo</a>&lt;<a>resolved_bar_</a>> rather than an italicized
-/// version of resolvedBar.
-markdown.Node fixComplexReference(String name) {
-  // Parse into multiple elements we can try to resolve.
-  var tokens = _tokenizeComplexReference(name);
-
-  // Produce an html representation of our elements. Group unresolved and
-  // plain text are grouped into "link" elements so they display as code.
-  final textElements = [' ', ',', '>', _LESS_THAN];
-  var accumulatedHtml = '';
-
-  for (var token in tokens) {
-    bool added = false;
-    if (!textElements.contains(token)) {
-      String elementName = findElementInScopeWithPrefix(token, '');
-      if (elementName != null) {
-        accumulatedHtml += markdown.renderToHtml([new markdown.Element.text('a',
-            elementName)]);
-        added = true;
-      }
-    }
-    if (!added) {
-      accumulatedHtml += token;
-    }
-  }
-  return new markdown.Text(accumulatedHtml);
-}
-
-String findElementInScopeWithPrefix(String name, String packagePrefix) {
-  var lookupFunc = determineLookupFunc(name);
-  // Look in the dart core library scope.
-  var coreScope = coreLibrary == null ? null : lookupFunc(coreLibrary.mirror,
-      name);
-  if (coreScope != null) return packagePrefix + coreLibrary.docName;
-
-  // If it's a reference that starts with a another library name, then it
-  // looks for a match of that library name in the other sdk libraries.
-  if (name.contains('.')) {
-    var index = name.indexOf('.');
-    var libraryName = name.substring(0, index);
-    var remainingName = name.substring(index + 1);
-    foundLibraryName(library) => library.uri.pathSegments[0] == libraryName;
-
-    if (_sdkLibraries.any(foundLibraryName)) {
-      var library = _sdkLibraries.singleWhere(foundLibraryName);
-      // Look to see if it's a fully qualified library name.
-      var scope = determineLookupFunc(remainingName)(library, remainingName);
-      if (scope != null) {
-        var result = getDocgenObject(scope);
-        if (result is DummyMirror) {
-          return packagePrefix + result.docName;
-        } else {
-          return result.packagePrefix + result.docName;
-        }
-      }
-    }
-  }
-  return null;
-}
-
-/// Given a Dart2jsMirror, find the corresponding Docgen [MirrorBased] object.
-///
-/// We have this global lookup function to avoid re-implementing looking up
-/// the scoping rules for comment resolution here (it is currently done in
-/// mirrors). If no corresponding MirrorBased object is found, we return a
-/// [DummyMirror] that simply returns the original mirror's qualifiedName
-/// while behaving like a MirrorBased object.
-Indexable getDocgenObject(DeclarationMirror mirror, [Indexable owner]) {
-  Map<String, Indexable> docgenObj = lookupIndexableMap(mirror);
-
-  if (docgenObj == null) {
-    return new DummyMirror(mirror, owner);
-  }
-
-  var setToExamine = new Set();
-  if (owner != null) {
-    var firstSet = docgenObj[owner.docName];
-    if (firstSet != null) setToExamine.add(firstSet);
-    if (coreLibrary != null && docgenObj[coreLibrary.docName] != null) {
-      setToExamine.add(docgenObj[coreLibrary.docName]);
-    }
-  } else {
-    setToExamine.addAll(docgenObj.values);
-  }
-
-  Set<Indexable> results = new Set<Indexable>();
-  for (Indexable indexable in setToExamine) {
-    if (indexable.mirror.qualifiedName == mirror.qualifiedName &&
-        indexable.isValidMirror(mirror)) {
-      results.add(indexable);
-    }
-  }
-
-  if (results.length > 0) {
-    // This might occur if we didn't specify an "owner."
-    return results.first;
-  }
-  return new DummyMirror(mirror, owner);
-}
-
-void initializeTopLevelLibraries(MirrorSystem mirrorSystem) {
-  _sdkLibraries = mirrorSystem.libraries.values.where(
-      (each) => each.uri.scheme == 'dart');
-  coreLibrary = new Library(_sdkLibraries.singleWhere((lib) =>
-      lib.uri.toString().startsWith('dart:core')));
-}
-
-/// For a given name, determine if we need to resolve it as a qualified name
-/// or a simple name in the source mirors.
-LookupFunction determineLookupFunc(String name) => name.contains('.') ?
-  dart2js_util.lookupQualifiedInScope :
-    (mirror, name) => mirror.lookupInScope(name);
-
-/// Chunk the provided name into individual parts to be resolved. We take a
-/// simplistic approach to chunking, though, we break at " ", ",", "&lt;"
-/// and ">". All other characters are grouped into the name to be resolved.
-/// As a result, these characters will all be treated as part of the item to
-/// be resolved (aka the * is interpreted literally as a *, not as an
-/// indicator for bold <em>.
-List<String> _tokenizeComplexReference(String name) {
-  var tokens = [];
-  var append = false;
-  var index = 0;
-  while (index < name.length) {
-    if (name.indexOf(_LESS_THAN, index) == index) {
-      tokens.add(_LESS_THAN);
-      append = false;
-      index += _LESS_THAN.length;
-    } else if (name[index] == ' ' || name[index] == ',' || name[index] == '>') {
-      tokens.add(name[index]);
-      append = false;
-      index++;
-    } else {
-      if (append) {
-        tokens[tokens.length - 1] = tokens.last + name[index];
-      } else {
-        tokens.add(name[index]);
-        append = true;
-      }
-      index++;
-    }
-  }
-  return tokens;
-}
-
-// HTML escaped version of '<' character.
-const _LESS_THAN = '&lt;';
diff --git a/pkg/docgen/lib/src/mdn.dart b/pkg/docgen/lib/src/mdn.dart
deleted file mode 100644
index f5fd69b..0000000
--- a/pkg/docgen/lib/src/mdn.dart
+++ /dev/null
@@ -1,65 +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.
-
-library docgen.mdn;
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:logging/logging.dart';
-import 'package:path/path.dart' as p;
-
-// TODO(janicejl): Make MDN content generic or pluggable.
-
-/// Map of all the comments for dom elements from MDN.
-Map<String, dynamic> _mdn;
-
-/// Generates MDN comments from database.json.
-String mdnComment(String root, Logger logger, String domName) {
-  //Check if MDN is loaded.
-  if (_mdn == null) {
-    // Reading in MDN related json file.
-    var mdnPath = p.join(root, 'utils/apidoc/mdn/database.json');
-    var mdnFile = new File(mdnPath);
-    if (mdnFile.existsSync()) {
-      _mdn = JSON.decode(mdnFile.readAsStringSync());
-    } else {
-      logger.warning("Cannot find MDN docs expected at $mdnPath");
-      _mdn = {};
-    }
-  }
-
-  var parts = domName.split('.');
-  if (parts.length == 2) return _mdnMemberComment(parts[0], parts[1]);
-  if (parts.length == 1) return _mdnTypeComment(parts[0]);
-
-  throw new StateError('More than two items is not supported: $parts');
-}
-
-/// Generates the MDN Comment for variables and method DOM elements.
-String _mdnMemberComment(String type, String member) {
-  var mdnType = _mdn[type];
-  if (mdnType == null) return '';
-  var mdnMember = mdnType['members'].firstWhere((e) => e['name'] == member,
-      orElse: () => null);
-  if (mdnMember == null) return '';
-  if (mdnMember['help'] == null || mdnMember['help'] == '') return '';
-  if (mdnMember['url'] == null) return '';
-  return _htmlifyMdn(mdnMember['help'], mdnMember['url']);
-}
-
-/// Generates the MDN Comment for class DOM elements.
-String _mdnTypeComment(String type) {
-  var mdnType = _mdn[type];
-  if (mdnType == null) return '';
-  if (mdnType['summary'] == null || mdnType['summary'] == "") return '';
-  if (mdnType['srcUrl'] == null) return '';
-  return _htmlifyMdn(mdnType['summary'], mdnType['srcUrl']);
-}
-
-/// Encloses the given content in an MDN div and the original source link.
-String _htmlifyMdn(String content, String url) {
-  return '<div class="mdn">' + content.trim() + '<p class="mdn-note">'
-      '<a href="' + url.trim() + '">from Mdn</a></p></div>';
-}
diff --git a/pkg/docgen/lib/src/models.dart b/pkg/docgen/lib/src/models.dart
deleted file mode 100644
index ad61145..0000000
--- a/pkg/docgen/lib/src/models.dart
+++ /dev/null
@@ -1,13 +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.
-
-library docgen.models;
-
-export 'models/class.dart';
-export 'models/indexable.dart';
-export 'models/library.dart';
-export 'models/method.dart';
-export 'models/parameter.dart';
-export 'models/typedef.dart';
-export 'models/variable.dart';
diff --git a/pkg/docgen/lib/src/models/annotation.dart b/pkg/docgen/lib/src/models/annotation.dart
deleted file mode 100644
index 766939c..0000000
--- a/pkg/docgen/lib/src/models/annotation.dart
+++ /dev/null
@@ -1,32 +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.
-
-library docgen.models.annotation;
-
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'library.dart';
-import 'mirror_based.dart';
-
-import 'dart:mirrors';
-
-/// Holds the name of the annotation, and its parameters.
-class Annotation extends MirrorBased<ClassMirror> {
-  /// The class of this annotation.
-  DeclarationMirror mirror;
-  final Library owningLibrary;
-  List<String> parameters;
-
-  Annotation(this.owningLibrary, this.mirror,
-             [List<String> this.parameters = const <String>[]]);
-
-  Map toMap() => {
-    'name': owningLibrary.packagePrefix +
-        getDocgenObject(mirror, owningLibrary).docName,
-    'parameters': parameters
-  };
-}
-
diff --git a/pkg/docgen/lib/src/models/class.dart b/pkg/docgen/lib/src/models/class.dart
deleted file mode 100644
index f323eb5..0000000
--- a/pkg/docgen/lib/src/models/class.dart
+++ /dev/null
@@ -1,245 +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.
-
-library docgen.models.clazz;
-
-import '../exports/dart2js_mirrors.dart' as dart2js_mirrors;
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'dummy_mirror.dart';
-import 'generic.dart';
-import 'library.dart';
-import 'method.dart';
-import 'model_helpers.dart';
-import 'owned_indexable.dart';
-import 'variable.dart';
-
-/// A class containing contents of a Dart class.
-class Class extends OwnedIndexable<dart2js_mirrors.Dart2JsInterfaceTypeMirror>
-    implements Comparable<Class> {
-
-  /// List of the names of interfaces that this class implements.
-  List<Class> interfaces = [];
-
-  /// Names of classes that extends or implements this class.
-  Set<Class> subclasses = new Set<Class>();
-
-  /// Top-level variables in the class.
-  Map<String, Variable> variables;
-
-  /// Inherited variables in the class.
-  final Map<String, Variable> inheritedVariables = {};
-
-  /// Methods in the class.
-  Map<String, Method> methods;
-
-  final Map<String, Method> inheritedMethods = new Map<String, Method>();
-
-  /// Generic infomation about the class.
-  final Map<String, Generic> generics;
-
-  Class _superclass;
-  bool get isAbstract => mirror.isAbstract;
-
-  /// Make sure that we don't check for inherited comments more than once.
-  bool _commentsEnsured = false;
-
-  /// Returns the [Class] for the given [mirror] if it has already been created,
-  /// else creates it.
-  factory Class(ClassMirror mirror, Library owner) {
-    var clazz = getDocgenObject(mirror, owner);
-    if (clazz is DummyMirror) {
-      clazz = new Class._(mirror, owner);
-    }
-    return clazz;
-  }
-
-  /// Called when we are constructing a superclass or interface class, but it
-  /// is not known if it belongs to the same owner as the original class. In
-  /// this case, we create an object whose owner is what the original mirror
-  /// says it is.
-  factory Class._possiblyDifferentOwner(ClassMirror mirror,
-      Library originalOwner) {
-    var realOwner = getDocgenObject(mirror.owner);
-    if (realOwner is Library) {
-      return new Class(mirror, realOwner);
-    } else {
-      return new Class(mirror, originalOwner);
-    }
-  }
-
-  Class._(ClassSourceMirror classMirror, Library owner)
-      : generics = createGenerics(classMirror),
-        super(classMirror, owner) {
-
-    // The reason we do this madness is the superclass and interface owners may
-    // not be this class's owner!! Example: BaseClient in http pkg.
-    var superinterfaces = classMirror.superinterfaces.map(
-        (interface) => new Class._possiblyDifferentOwner(interface, owner));
-    this._superclass = classMirror.superclass == null? null :
-        new Class._possiblyDifferentOwner(classMirror.superclass, owner);
-
-    interfaces = superinterfaces.toList();
-    variables = createVariables(
-        dart2js_util.variablesOf(classMirror.declarations), this);
-    methods = createMethods(dart2js_util.anyMethodOf(classMirror.declarations),
-        this);
-
-    // Tell superclass that you are a subclass, unless you are not
-    // visible or an intermediary mixin class.
-    if (!classMirror.isNameSynthetic && isVisible && _superclass != null) {
-      _superclass.addSubclass(this);
-    }
-
-    if (this._superclass != null) addInherited(_superclass);
-    interfaces.forEach((interface) => addInherited(interface));
-  }
-
-  String _lookupInClassAndSuperclasses(String name) {
-    var lookupFunc = determineLookupFunc(name);
-    var classScope = this;
-    while (classScope != null) {
-      var classFunc = lookupFunc(classScope.mirror, name);
-      if (classFunc != null) {
-        return packagePrefix + getDocgenObject(classFunc, owner).docName;
-      }
-      classScope = classScope._superclass;
-    }
-    return null;
-  }
-
-  /// Look for the specified name starting with the current member, and
-  /// progressively working outward to the current library scope.
-  String findElementInScope(String name) {
-    var lookupFunc = determineLookupFunc(name);
-    var result = _lookupInClassAndSuperclasses(name);
-    if (result != null) {
-      return result;
-    }
-    result = owner.findElementInScope(name);
-    return result == null ? super.findElementInScope(name) : result;
-  }
-
-  String get typeName => 'class';
-
-  /// Add all inherited variables and methods from the provided superclass.
-  /// If [_includePrivate] is true, it also adds the variables and methods from
-  /// the superclass.
-  void addInherited(Class superclass) {
-    inheritedVariables.addAll(superclass.inheritedVariables);
-    inheritedVariables.addAll(_allButStatics(superclass.variables));
-    addInheritedMethod(superclass, this);
-  }
-
-  /** [newParent] refers to the actual class is currently using these methods.
-   * which may be different because with the mirror system, we only point to the
-   * original canonical superclasse's method.
-   */
-  void addInheritedMethod(Class parent, Class newParent) {
-    parent.inheritedMethods.forEach((name, method) {
-      if (!method.mirror.isConstructor) {
-        inheritedMethods[name] = new Method(method.mirror, newParent, method);
-      }
-    });
-    _allButStatics(parent.methods).forEach((name, method) {
-      if (!method.mirror.isConstructor) {
-        inheritedMethods[name] = new Method(method.mirror, newParent, method);
-      }
-    });
-  }
-
-  /// Remove statics from the map of inherited items before adding them.
-  Map _allButStatics(Map items) {
-    var result = {};
-    items.forEach((name, item) {
-      if (!item.isStatic) {
-        result[name] = item;
-      }
-    });
-    return result;
-  }
-
-  /// Add the subclass to the class.
-  ///
-  /// If [this] is private (or an intermediary mixin class), it will add the
-  /// subclass to the list of subclasses in the superclasses.
-  void addSubclass(Class subclass) {
-    if (docName == 'dart:core.Object') return;
-
-    if (!includePrivateMembers && isPrivate || mirror.isNameSynthetic) {
-      if (_superclass != null) _superclass.addSubclass(subclass);
-      interfaces.forEach((interface) {
-        interface.addSubclass(subclass);
-      });
-    } else {
-      subclasses.add(subclass);
-    }
-  }
-
-  /// Check if this [Class] is an error or exception.
-  bool isError() {
-    if (qualifiedName == 'dart:core.Error' ||
-        qualifiedName == 'dart:core.Exception')
-      return true;
-    for (var interface in interfaces) {
-      if (interface.isError()) return true;
-    }
-    if (_superclass == null) return false;
-    return _superclass.isError();
-  }
-
-  /// Makes sure that all methods with inherited equivalents have comments.
-  void ensureComments() {
-    if (_commentsEnsured) return;
-    _commentsEnsured = true;
-    if (_superclass != null) _superclass.ensureComments();
-    inheritedMethods.forEach((qualifiedName, inheritedMethod) {
-      var method = methods[qualifiedName];
-      if (method != null) {
-        // if we have overwritten this method in this class, we still provide
-        // the opportunity to inherit the comments.
-        method.ensureCommentFor(inheritedMethod);
-      }
-    });
-    // we need to populate the comments for all methods. so that the subclasses
-    // can get for their inherited versions the comments.
-    methods.forEach((qualifiedName, method) {
-      if (!method.mirror.isConstructor) method.ensureCommentFor(method);
-    });
-  }
-
-  /// If a class extends a private superclass, find the closest public
-  /// superclass of the private superclass.
-  String validSuperclass() {
-    if (_superclass == null) return 'dart:core.Object';
-    if (_superclass.isVisible) return _superclass.qualifiedName;
-    return _superclass.validSuperclass();
-  }
-
-  /// Generates a map describing the [Class] object.
-  Map toMap() => {
-    'name': name,
-    'qualifiedName': qualifiedName,
-    'comment': comment,
-    'isAbstract' : isAbstract,
-    'superclass': validSuperclass(),
-    'implements': interfaces.where((i) => i.isVisible)
-        .map((e) => e.qualifiedName).toList(),
-    'subclass': (subclasses.toList()..sort())
-        .map((x) => x.qualifiedName).toList(),
-    'variables': recurseMap(variables),
-    'inheritedVariables': recurseMap(inheritedVariables),
-    'methods': expandMethodMap(methods),
-    'inheritedMethods': expandMethodMap(inheritedMethods),
-    'annotations': annotations.map((a) => a.toMap()).toList(),
-    'generics': recurseMap(generics)
-  };
-
-  int compareTo(Class other) => name.compareTo(other.name);
-
-  bool isValidMirror(DeclarationMirror mirror) => mirror is ClassMirror;
-}
diff --git a/pkg/docgen/lib/src/models/closure.dart b/pkg/docgen/lib/src/models/closure.dart
deleted file mode 100644
index 2fcfa19..0000000
--- a/pkg/docgen/lib/src/models/closure.dart
+++ /dev/null
@@ -1,35 +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.
-
-library docgen.models.closure;
-
-import '../exports/source_mirrors.dart';
-
-import 'doc_gen_type.dart';
-import 'indexable.dart';
-import 'mirror_based.dart';
-import 'model_helpers.dart';
-import 'parameter.dart';
-
-/// A class containing the properties of a function to be called (used in our
-/// case specifically to illustrate evidence of the type of function for a
-/// parameter).
-class Closure extends MirrorBased<FunctionTypeMirror> {
-
-  /// Parameters for this method.
-  final Map<String, Parameter> parameters;
-  final DocGenType returnType;
-  final FunctionTypeMirror mirror;
-
-  Closure(FunctionTypeMirror mirror, Indexable owner)
-    : returnType = new DocGenType(mirror.returnType, owner.owningLibrary),
-      parameters = createParameters(mirror.parameters, owner),
-      mirror = mirror;
-
-  /// Generates a map describing the [Method] object.
-  Map toMap() => {
-    'return': [returnType.toMap()],
-    'parameters': recurseMap(parameters),
-  };
-}
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/models/doc_gen_type.dart b/pkg/docgen/lib/src/models/doc_gen_type.dart
deleted file mode 100644
index 47fc99b..0000000
--- a/pkg/docgen/lib/src/models/doc_gen_type.dart
+++ /dev/null
@@ -1,66 +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.
-
-library docgen.models.doc_gen_type;
-
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'library.dart';
-import 'mirror_based.dart';
-
-/// Docgen wrapper around the mirror for a return type, and/or its generic
-/// type parameters.
-///
-/// Return types are of a form [outer]<[inner]>.
-/// If there is no [inner] part, [inner] will be an empty list.
-///
-/// For example:
-///        int size()
-///          "return" :
-///            - "outer" : "dart:core.int"
-///              "inner" :
-///
-///        List<String> toList()
-///          "return" :
-///            - "outer" : "dart:core.List"
-///              "inner" :
-///                - "outer" : "dart:core.String"
-///                  "inner" :
-///
-///        Map<String, List<int>>
-///          "return" :
-///            - "outer" : "dart:core.Map"
-///              "inner" :
-///                - "outer" : "dart:core.String"
-///                  "inner" :
-///                - "outer" : "dart:core.List"
-///                  "inner" :
-///                    - "outer" : "dart:core.int"
-///                      "inner" :
-class DocGenType extends MirrorBased {
-  final TypeMirror mirror;
-  final Library owningLibrary;
-
-  DocGenType(this.mirror, this.owningLibrary);
-
-  Map toMap() {
-    var result = getDocgenObject(mirror, owningLibrary);
-    return {
-      // We may encounter types whose corresponding library has not been
-      // processed yet, so look up with the owningLibrary at the last moment.
-      'outer': result.packagePrefix + result.docName,
-      'inner': _createTypeGenerics(mirror).map((e) => e.toMap()).toList(),
-    };
-  }
-
-  /// Returns a list of [DocGenType] objects constructed from TypeMirrors.
-  List<DocGenType> _createTypeGenerics(TypeMirror mirror) {
-    if (mirror is! ClassMirror) return [];
-    return mirror.typeArguments
-        .map((e) => new DocGenType(e, owningLibrary))
-        .toList();
-  }
-}
diff --git a/pkg/docgen/lib/src/models/dummy_mirror.dart b/pkg/docgen/lib/src/models/dummy_mirror.dart
deleted file mode 100644
index 9ad612a..0000000
--- a/pkg/docgen/lib/src/models/dummy_mirror.dart
+++ /dev/null
@@ -1,66 +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.
-
-library docgen.models.dummy_mirror;
-
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'indexable.dart';
-import 'model_helpers.dart';
-
-/// For types that we do not explicitly create or have not yet created in our
-/// entity map (like core types).
-class DummyMirror implements Indexable {
-  final DeclarationMirror mirror;
-  /// The library that contains this element, if any. Used as a hint to help
-  /// determine which object we're referring to when looking up this mirror in
-  /// our map.
-  final Indexable owner;
-
-  DummyMirror(this.mirror, [this.owner]);
-
-  String get docName {
-    if (mirror is LibraryMirror) {
-      return getLibraryDocName(mirror);
-    }
-    var mirrorOwner = mirror.owner;
-    if (mirrorOwner == null) return dart2js_util.qualifiedNameOf(mirror);
-    var simpleName = dart2js_util.nameOf(mirror);
-    if (mirror is MethodMirror && (mirror as MethodMirror).isConstructor) {
-      // We name constructors specially -- repeating the class name and a
-      // "-" to separate the constructor from its name (if any).
-      simpleName = '${dart2js_util.nameOf(mirrorOwner)}-$simpleName';
-    }
-    return getDocgenObject(mirrorOwner, owner).docName + '.' +
-        simpleName;
-  }
-
-  bool get isPrivate => mirror.isPrivate;
-
-  String get packageName {
-    var libMirror = _getOwningLibraryFromMirror(mirror);
-    if (libMirror != null) {
-      return getPackageName(libMirror);
-    }
-    return '';
-  }
-
-  String get packagePrefix => packageName == null || packageName.isEmpty ?
-      '' : '$packageName/';
-
-  // This is a known incomplete implementation of Indexable
-  // overriding noSuchMethod to remove static warnings
-  noSuchMethod(Invocation invocation) {
-    throw new UnimplementedError(invocation.memberName.toString());
-  }
-}
-
-LibraryMirror _getOwningLibraryFromMirror(DeclarationMirror mirror) {
-  if (mirror == null) return null;
-  if (mirror is LibraryMirror) return mirror;
-  return _getOwningLibraryFromMirror(mirror.owner);
-}
diff --git a/pkg/docgen/lib/src/models/generic.dart b/pkg/docgen/lib/src/models/generic.dart
deleted file mode 100644
index 46a48a1..0000000
--- a/pkg/docgen/lib/src/models/generic.dart
+++ /dev/null
@@ -1,22 +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.
-
-library docgen.models.generic;
-
-import '../exports/source_mirrors.dart';
-import '../exports/mirrors_util.dart' as dart2js_util;
-
-import 'mirror_based.dart';
-
-/// A Docgen wrapper around the dart2js mirror for a generic type.
-class Generic extends MirrorBased<TypeVariableMirror> {
-  final TypeVariableMirror mirror;
-
-  Generic(this.mirror);
-
-  Map toMap() => {
-    'name': dart2js_util.nameOf(mirror),
-    'type': dart2js_util.qualifiedNameOf(mirror.upperBound)
-  };
-}
diff --git a/pkg/docgen/lib/src/models/indexable.dart b/pkg/docgen/lib/src/models/indexable.dart
deleted file mode 100644
index 1c14a79..0000000
--- a/pkg/docgen/lib/src/models/indexable.dart
+++ /dev/null
@@ -1,221 +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.
-
-library docgen.models.indexable;
-
-import 'dart:collection';
-
-import 'package:markdown/markdown.dart' as markdown;
-
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-import 'library.dart';
-import 'mirror_based.dart';
-import 'model_helpers.dart';
-
-/// An item that is categorized in our mirrorToDocgen map, as a distinct,
-/// searchable element.
-///
-/// These are items that refer to concrete entities (a Class, for example,
-/// but not a Type, which is a "pointer" to a class) that we wish to be
-/// globally resolvable. This includes things such as class methods and
-/// variables, but parameters for methods are not "Indexable" as we do not want
-/// the user to be able to search for a method based on its parameter names!
-/// The set of indexable items also includes Typedefs, since the user can refer
-/// to them as concrete entities in a particular scope.
-abstract class Indexable<TMirror extends DeclarationMirror>
-    extends MirrorBased<TMirror> {
-
-  Library get owningLibrary => owner.owningLibrary;
-
-  /// The reference to this element based on where it is printed as a
-  /// documentation file and also the unique URL to refer to this item.
-  ///
-  /// The qualified name (for URL purposes) and the file name are the same,
-  /// of the form packageName/ClassName or packageName/ClassName.methodName.
-  /// This defines both the URL and the directory structure.
-  String get qualifiedName => packagePrefix + ownerPrefix + name;
-
-  /// The name of the file we write this object's data into. The same as the
-  /// qualified name but with leading colons (i.e. dart:)
-  /// replaced by hyphens because of Windows.
-  String get fileName => qualifiedName.replaceFirst(":", "-");
-
-  final TMirror mirror;
-  final bool isPrivate;
-  /// The comment text pre-resolution. We keep this around because inherited
-  /// methods need to resolve links differently from the superclass.
-  String unresolvedComment = '';
-
-  Indexable(TMirror mirror)
-      : this.mirror = mirror,
-        this.isPrivate = isHidden(mirror as DeclarationSourceMirror) {
-
-    var mirrorQualifiedName = dart2js_util.qualifiedNameOf(this.mirror);
-
-    var map = _mirrorToDocgen.putIfAbsent(mirrorQualifiedName,
-        () => new HashMap<String, Indexable>());
-
-    var added = false;
-    map.putIfAbsent(owner.docName, () {
-      added = true;
-      return this;
-    });
-
-    if (!added) {
-      throw new StateError('An indexable has already been stored for '
-          '${owner.docName}');
-    }
-  }
-
-  /// Returns this object's qualified name, but following the conventions
-  /// we're using in Dartdoc, which is that library names with dots in them
-  /// have them replaced with hyphens.
-  String get docName;
-
-  /// Converts all [foo] references in comments to <a>libraryName.foo</a>.
-  markdown.Node fixReference(String name) {
-    // Attempt the look up the whole name up in the scope.
-    String elementName = findElementInScope(name);
-    if (elementName != null) {
-      return new markdown.Element.text('a', elementName);
-    }
-    return fixComplexReference(name);
-  }
-
-  /// Look for the specified name starting with the current member, and
-  /// progressively working outward to the current library scope.
-  String findElementInScope(String name) =>
-      findElementInScopeWithPrefix(name, packagePrefix);
-
-  /// The full docName of the owner element, appended with a '.' for this
-  /// object's name to be appended.
-  String get ownerPrefix => owner.docName != '' ? owner.docName + '.' : '';
-
-  /// The prefix String to refer to the package that this item is in, for URLs
-  /// and comment resolution.
-  ///
-  /// The prefix can be prepended to a qualified name to get a fully unique
-  /// name among all packages.
-  String get packagePrefix;
-
-  /// Documentation comment with converted markdown and all links resolved.
-  String commentField;
-
-  /// Accessor to documentation comment with markdown converted to html and all
-  /// links resolved.
-  String get comment {
-    if (commentField != null) return commentField;
-
-    commentField = commentToHtml();
-    if (commentField.isEmpty) {
-      commentField = getMdnComment();
-    }
-    return commentField;
-  }
-
-  void set comment(x) {
-    commentField = x;
-  }
-
-  /// The simple name to refer to this item.
-  String get name => dart2js_util.nameOf(mirror);
-
-  /// Accessor to the parent item that owns this item.
-  ///
-  /// "Owning" is defined as the object one scope-level above which this item
-  /// is defined. Ex: The owner for a top level class, would be its enclosing
-  /// library. The owner of a local variable in a method would be the enclosing
-  /// method.
-  Indexable get owner;
-
-  /// Generates MDN comments from database.json.
-  String getMdnComment();
-
-  /// The type of this member to be used in index.txt.
-  String get typeName;
-
-  /// Creates a [Map] with this [Indexable]'s name and a preview comment.
-  Map get previewMap {
-    var finalMap = { 'name' : name, 'qualifiedName' : qualifiedName };
-    var pre = preview;
-    if (pre != null) finalMap['preview'] = pre;
-    return finalMap;
-  }
-
-  String get preview {
-    if (comment != '') {
-      var index = comment.indexOf('</p>');
-      return index > 0 ?
-          '${comment.substring(0, index)}</p>' :
-          '<p><i>Comment preview not available</i></p>';
-    }
-    return null;
-  }
-
-  /// Accessor to obtain the raw comment text for a given item, _without_ any
-  /// of the links resolved.
-  String get _commentText {
-    String commentText;
-    mirror.metadata.forEach((metadata) {
-      if (metadata is CommentInstanceMirror) {
-        CommentInstanceMirror comment = metadata;
-        if (comment.isDocComment) {
-          if (commentText == null) {
-            commentText = comment.trimmedText;
-          } else {
-            commentText = '$commentText\n${comment.trimmedText}';
-          }
-        }
-      }
-    });
-    return commentText;
-  }
-
-  /// Returns any documentation comments associated with a mirror with
-  /// simple markdown converted to html.
-  ///
-  /// By default we resolve any comment references within our own scope.
-  /// However, if a method is inherited, we want the inherited comments, but
-  /// links to the subclasses's version of the methods.
-  String commentToHtml([Indexable resolvingScope]) {
-    if (resolvingScope == null) resolvingScope = this;
-    var commentText = _commentText;
-    unresolvedComment = commentText;
-
-    commentText = commentText == null ? '' :
-        markdown.markdownToHtml(commentText.trim(),
-            linkResolver: resolvingScope.fixReference,
-            inlineSyntaxes: MARKDOWN_SYNTAXES);
-    return commentText;
-  }
-
-  /// Return a map representation of this type.
-  Map toMap();
-
-  /// Accessor to determine if this item and all of its owners are visible.
-  bool get isVisible => isFullChainVisible(this);
-
-  /// Returns true if [mirror] is the correct type of mirror that this Docgen
-  /// object wraps. (Workaround for the fact that Types are not first class.)
-  bool isValidMirror(DeclarationMirror mirror);
-}
-
-/// Index of all the dart2js mirrors examined to corresponding MirrorBased
-/// docgen objects.
-///
-/// Used for lookup because of the dart2js mirrors exports
-/// issue. The second level map is indexed by owner docName for faster lookup.
-/// Why two levels of lookup? Speed, man. Speed.
-final Map<String, Map<String, Indexable>> _mirrorToDocgen =
-    new HashMap<String, Map<String, Indexable>>();
-
-Iterable<Indexable> get allIndexables =>
-    _mirrorToDocgen.values.expand((map) => map.values);
-
-Map<String, Indexable> lookupIndexableMap(DeclarationMirror mirror) {
-  return _mirrorToDocgen[dart2js_util.qualifiedNameOf(mirror)];
-}
diff --git a/pkg/docgen/lib/src/models/library.dart b/pkg/docgen/lib/src/models/library.dart
deleted file mode 100644
index 9403239..0000000
--- a/pkg/docgen/lib/src/models/library.dart
+++ /dev/null
@@ -1,192 +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.
-
-library docgen.models.library;
-
-import 'dart:io';
-
-import 'package:markdown/markdown.dart' as markdown;
-
-import '../exports/source_mirrors.dart';
-import '../exports/mirrors_util.dart' as dart2js_util;
-
-import '../library_helpers.dart';
-import '../package_helpers.dart';
-
-import 'class.dart';
-import 'dummy_mirror.dart';
-import 'indexable.dart';
-import 'method.dart';
-import 'model_helpers.dart';
-import 'typedef.dart';
-import 'variable.dart';
-
-/// A class containing contents of a Dart library.
-class Library extends Indexable {
-  final Map<String, Class> classes = {};
-  final Map<String, Typedef> typedefs = {};
-  final Map<String, Class> errors = {};
-
-  /// Top-level variables in the library.
-  Map<String, Variable> variables;
-
-  /// Top-level functions in the library.
-  Map<String, Method> functions;
-
-  String packageName = '';
-  bool _hasBeenCheckedForPackage = false;
-  String packageIntro;
-
-  Indexable get owner => const _LibraryOwner();
-
-  Library get owningLibrary => this;
-
-  /// Returns the [Library] for the given [mirror] if it has already been
-  /// created, else creates it.
-  factory Library(LibraryMirror mirror) {
-    var library = getDocgenObject(mirror);
-    if (library is DummyMirror) {
-      library = new Library._(mirror);
-    }
-    return library;
-  }
-
-  Library._(LibraryMirror libraryMirror) : super(libraryMirror) {
-    var exported = calcExportedItems(libraryMirror, {});
-    var exportedClasses = addAll(exported['classes'],
-        dart2js_util.typesOf(libraryMirror.declarations));
-    updateLibraryPackage(mirror);
-    exportedClasses.forEach((String mirrorName, TypeMirror mirror) {
-      if (mirror is TypedefMirror) {
-        // This is actually a Dart2jsTypedefMirror, and it does define value,
-        // but we don't have visibility to that type.
-        if (includePrivateMembers || !mirror.isPrivate) {
-          typedefs[dart2js_util.nameOf(mirror)] = new Typedef(mirror, this);
-        }
-      } else if (mirror is ClassMirror) {
-        var clazz = new Class(mirror, this);
-
-        if (clazz.isError()) {
-          errors[dart2js_util.nameOf(mirror)] = clazz;
-        } else {
-          classes[dart2js_util.nameOf(mirror)] = clazz;
-        }
-      } else {
-        throw new ArgumentError(
-            '${dart2js_util.nameOf(mirror)} - no class type match. ');
-      }
-    });
-    this.functions = createMethods(addAll(exported['methods'],
-        libraryMirror.declarations.values.where(
-            (mirror) => mirror is MethodMirror)).values, this);
-    this.variables = createVariables(addAll(exported['variables'],
-        dart2js_util.variablesOf(libraryMirror.declarations)).values, this);
-  }
-
-  /// Look for the specified name starting with the current member, and
-  /// progressively working outward to the current library scope.
-  String findElementInScope(String name) {
-    var lookupFunc = determineLookupFunc(name);
-    var libraryScope = lookupFunc(mirror, name);
-    if (libraryScope != null) {
-      var result = getDocgenObject(libraryScope, this);
-      if (result is DummyMirror) return packagePrefix + result.docName;
-      return result.packagePrefix + result.docName;
-    }
-    return super.findElementInScope(name);
-  }
-
-  String getMdnComment() => '';
-
-  /// For a library's [mirror], determine the name of the package (if any) we
-  /// believe it came from (because of its file URI).
-  ///
-  /// If no package could be determined, we return an empty string.
-  void updateLibraryPackage(LibraryMirror mirror) {
-    if (mirror == null) return;
-    if (_hasBeenCheckedForPackage) return;
-    _hasBeenCheckedForPackage = true;
-    if (mirror.uri.scheme != 'file') return;
-    packageName = getPackageName(mirror);
-    // Associate the package readme with all the libraries. This is a bit
-    // wasteful, but easier than trying to figure out which partial match
-    // is best.
-    packageIntro = _packageIntro(getPackageDirectory(mirror));
-  }
-
-  String _packageIntro(packageDir) {
-    if (packageDir == null) return null;
-    var dir = new Directory(packageDir);
-    var files = dir.listSync();
-    var readmes = files.where((FileSystemEntity each) => (each is File &&
-        each.path.substring(packageDir.length + 1, each.path.length)
-          .startsWith('README'))).toList();
-    if (readmes.isEmpty) return '';
-    // If there are multiples, pick the shortest name.
-    readmes.sort((a, b) => a.path.length.compareTo(b.path.length));
-    var readme = readmes.first;
-    var linkResolver = (name) => globalFixReference(name);
-    var contents = markdown.markdownToHtml(readme
-      .readAsStringSync(), linkResolver: linkResolver,
-      inlineSyntaxes: MARKDOWN_SYNTAXES);
-    return contents;
-  }
-
-  String get packagePrefix => packageName == null || packageName.isEmpty ?
-      '' : '$packageName/';
-
-  Map get previewMap {
-    var map = {'packageName': packageName};
-    map.addAll(super.previewMap);
-    if (packageIntro != null) {
-      map['packageIntro'] = packageIntro;
-    }
-    var version = packageVersion(mirror);
-    if (version != '' && version != null) map['version'] = version;
-    return map;
-  }
-
-  String get name => docName;
-
-  String get docName => getLibraryDocName(mirror);
-
-  /// Generates a map describing the [Library] object.
-  Map toMap() => {
-    'name': name,
-    'qualifiedName': qualifiedName,
-    'comment': comment,
-    'variables': recurseMap(variables),
-    'functions': expandMethodMap(functions),
-    'classes': {
-      'class': classes.values.where((c) => c.isVisible)
-        .map((e) => e.previewMap).toList(),
-      'typedef': recurseMap(typedefs),
-      'error': errors.values.where((e) => e.isVisible)
-          .map((e) => e.previewMap).toList()
-    },
-    'packageName': packageName,
-    'packageIntro': packageIntro
-  };
-
-  String get typeName => 'library';
-
-  bool isValidMirror(DeclarationMirror mirror) => mirror is LibraryMirror;
-}
-
-/// Dummy implementation of Indexable to represent the owner of a Library.
-class _LibraryOwner implements Indexable {
-  const _LibraryOwner();
-
-  String get docName => '';
-
-  bool get isPrivate => false;
-
-  Indexable get owner => null;
-
-  // This is a known incomplete implementation of Indexable
-  // overriding noSuchMethod to remove static warnings
-  noSuchMethod(Invocation invocation) {
-    throw new UnimplementedError(invocation.memberName.toString());
-  }
-}
diff --git a/pkg/docgen/lib/src/models/method.dart b/pkg/docgen/lib/src/models/method.dart
deleted file mode 100644
index f25d53b..0000000
--- a/pkg/docgen/lib/src/models/method.dart
+++ /dev/null
@@ -1,156 +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.
-
-library docgen.models.method;
-
-import 'package:markdown/markdown.dart' as markdown;
-
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'class.dart';
-import 'doc_gen_type.dart';
-import 'dummy_mirror.dart';
-import 'indexable.dart';
-import 'model_helpers.dart';
-import 'owned_indexable.dart';
-import 'parameter.dart';
-
-
-/// A class containing properties of a Dart method.
-class Method extends OwnedIndexable<MethodMirror> {
-
-  /// Parameters for this method.
-  final Map<String, Parameter> parameters;
-
-  final bool isStatic;
-  final bool isAbstract;
-  final bool isConst;
-  final DocGenType returnType;
-  Method methodInheritedFrom;
-
-  /// Qualified name to state where the comment is inherited from.
-  String commentInheritedFrom = "";
-
-  factory Method(MethodMirror mirror, Indexable owner,
-      [Method methodInheritedFrom]) {
-    var method = getDocgenObject(mirror, owner);
-    if (method is DummyMirror) {
-      method = new Method._(mirror, owner, methodInheritedFrom);
-    }
-    return method;
-  }
-
-  Method._(MethodMirror mirror, Indexable owner, this.methodInheritedFrom)
-      : returnType = new DocGenType(mirror.returnType, owner.owningLibrary),
-        isStatic = mirror.isStatic,
-        isAbstract = mirror.isAbstract,
-        isConst = mirror.isConstConstructor,
-        parameters = createParameters(mirror.parameters, owner),
-        super(mirror, owner);
-
-  Method get originallyInheritedFrom => methodInheritedFrom == null ?
-      this : methodInheritedFrom.originallyInheritedFrom;
-
-  /// Look for the specified name starting with the current member, and
-  /// progressively working outward to the current library scope.
-  String findElementInScope(String name) {
-    var lookupFunc = determineLookupFunc(name);
-
-    var memberScope = lookupFunc(this.mirror, name);
-    if (memberScope != null) {
-      // do we check for a dummy mirror returned here and look up with an owner
-      // higher ooooor in getDocgenObject do we include more things in our
-      // lookup
-      var result = getDocgenObject(memberScope, owner);
-      if (result is DummyMirror && owner.owner != null
-          && owner.owner is! DummyMirror) {
-        var aresult = getDocgenObject(memberScope, owner.owner);
-        if (aresult is! DummyMirror) result = aresult;
-      }
-      if (result is DummyMirror) return packagePrefix + result.docName;
-      return result.packagePrefix + result.docName;
-    }
-
-    if (owner != null) {
-      var result = owner.findElementInScope(name);
-      if (result != null) return result;
-    }
-    return super.findElementInScope(name);
-  }
-
-  String get docName {
-    if (mirror.isConstructor) {
-      // We name constructors specially -- including the class name again and a
-      // "-" to separate the constructor from its name (if any).
-      return '${owner.docName}.${dart2js_util.nameOf(mirror.owner)}-'
-          '${dart2js_util.nameOf(mirror)}';
-    }
-    return super.docName;
-  }
-
-  String get qualifiedName => packagePrefix + docName;
-
-  /// Makes sure that the method with an inherited equivalent have comments.
-  void ensureCommentFor(Method inheritedMethod) {
-    if (comment.isNotEmpty) return;
-
-    comment = inheritedMethod.commentToHtml(this);
-    unresolvedComment = inheritedMethod.unresolvedComment;
-    commentInheritedFrom = inheritedMethod.commentInheritedFrom == '' ?
-        new DummyMirror(inheritedMethod.mirror).docName :
-        inheritedMethod.commentInheritedFrom;
-  }
-
-  /// Generates a map describing the [Method] object.
-  Map toMap() => {
-    'name': name,
-    'qualifiedName': qualifiedName,
-    'comment': comment,
-    'commentFrom': (methodInheritedFrom != null &&
-        commentInheritedFrom == methodInheritedFrom.docName ? ''
-        : commentInheritedFrom),
-    'inheritedFrom': (methodInheritedFrom == null? '' :
-        originallyInheritedFrom.docName),
-    'static': isStatic,
-    'abstract': isAbstract,
-    'constant': isConst,
-    'return': [returnType.toMap()],
-    'parameters': recurseMap(parameters),
-    'annotations': annotations.map((a) => a.toMap()).toList()
-  };
-
-  String get typeName {
-    if (mirror.isConstructor) return 'constructor';
-    if (mirror.isGetter) return 'getter';
-    if (mirror.isSetter) return 'setter';
-    if (mirror.isOperator) return 'operator';
-    return 'method';
-  }
-
-  String get comment {
-    if (commentField != null) return commentField;
-    if (owner is Class) {
-      (owner as Class).ensureComments();
-    }
-    var result = super.comment;
-    if (result == '' && methodInheritedFrom != null) {
-      // This should be NOT from the MIRROR, but from the COMMENT.
-      methodInheritedFrom.comment; // Ensure comment field has been populated.
-      unresolvedComment = methodInheritedFrom.unresolvedComment;
-
-      comment = unresolvedComment == null ? '' :
-        markdown.markdownToHtml(unresolvedComment.trim(),
-            linkResolver: fixReference, inlineSyntaxes: MARKDOWN_SYNTAXES);
-      commentInheritedFrom = comment != '' ?
-          methodInheritedFrom.commentInheritedFrom : '';
-      result = comment;
-    }
-    return result;
-  }
-
-  bool isValidMirror(DeclarationMirror mirror) => mirror is MethodMirror;
-}
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/models/mirror_based.dart b/pkg/docgen/lib/src/models/mirror_based.dart
deleted file mode 100644
index eceac68..0000000
--- a/pkg/docgen/lib/src/models/mirror_based.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library docgen.models.mirror_based;
-
-import '../exports/source_mirrors.dart';
-
-/// Docgen representation of an item to be documented, that wraps around a
-/// dart2js mirror.
-abstract class MirrorBased<TMirror extends DeclarationMirror> {
-  /// The original dart2js mirror around which this object wraps.
-  TMirror get mirror;
-
-  /// Return an informative [Object.toString] for debugging.
-  String toString() => "${super.toString()} - $mirror";
-}
diff --git a/pkg/docgen/lib/src/models/model_helpers.dart b/pkg/docgen/lib/src/models/model_helpers.dart
deleted file mode 100644
index 0aa8c9f..0000000
--- a/pkg/docgen/lib/src/models/model_helpers.dart
+++ /dev/null
@@ -1,443 +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.
-
-library docgen.model_helpers;
-
-import 'dart:collection';
-
-import 'package:compiler/src/constants/expressions.dart';
-
-import '../exports/dart2js_mirrors.dart' as dart2js_mirrors;
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-import '../exports/libraries.dart';
-
-import '../library_helpers.dart' show includePrivateMembers;
-import '../package_helpers.dart';
-
-import 'annotation.dart';
-import 'generic.dart';
-import 'indexable.dart';
-import 'library.dart';
-import 'method.dart';
-import 'parameter.dart';
-import 'variable.dart';
-
-String getLibraryDocName(LibraryMirror mirror) {
-  var dotsFixed = dart2js_util.qualifiedNameOf(mirror).replaceAll('.', '-');
-  if (dotsFixed.startsWith('dart-dom-')) {
-    return dotsFixed.replaceFirst("dart-dom-", "dart:");
-  } else if (dotsFixed.startsWith("dart-")) {
-    return dotsFixed.replaceFirst("dart-", "dart:");
-  } else {
-    return dotsFixed;
-  }
-}
-
-/// Expand the method map [mapToExpand] into a more detailed map that
-/// separates out setters, getters, constructors, operators, and methods.
-Map expandMethodMap(Map<String, Method> mapToExpand) => {
-  'setters': recurseMap(_filterMap(mapToExpand,
-      (key, val) => val.mirror.isSetter)),
-  'getters': recurseMap(_filterMap(mapToExpand,
-      (key, val) => val.mirror.isGetter)),
-  'constructors': recurseMap(_filterMap(mapToExpand,
-      (key, val) => val.mirror.isConstructor)),
-  'operators': recurseMap(_filterMap(mapToExpand,
-      (key, val) => val.mirror.isOperator)),
-  'methods': recurseMap(_filterMap(mapToExpand,
-      (key, val) => val.mirror.isRegularMethod && !val.mirror.isOperator))
-};
-
-String getDefaultValue(ParameterMirror mirror) {
-  if (!mirror.hasDefaultValue) return null;
-  return '${mirror.defaultValue}';
-}
-
-/// Returns a list of meta annotations assocated with a mirror.
-List<Annotation> createAnnotations(DeclarationMirror mirror,
-    Library owningLibrary) {
-  var annotations = [];
-  var info = new AnnotationInfo(mirror, owningLibrary);
-  for (var expr in dart2js_mirrors.BackDoor.metadataSyntaxOf(mirror)) {
-    var docgenAnnotation = expr.accept(const AnnotationCreator(), info);
-    if (docgenAnnotation != null &&
-        !_SKIPPED_ANNOTATIONS.contains(
-            dart2js_util.qualifiedNameOf(docgenAnnotation.mirror))) {
-      annotations.add(docgenAnnotation);
-    }
-  }
-  return annotations;
-}
-
-class AnnotationInfo {
-  final Mirror mirror;
-  final Library owningLibrary;
-
-  AnnotationInfo(this.mirror, this.owningLibrary);
-}
-
-class AnnotationCreator
-    extends ConstantExpressionVisitor<Annotation, AnnotationInfo> {
-
-  const AnnotationCreator();
-
-  Annotation createAnnotation(var element,
-                              AnnotationInfo context,
-                              [List<String> parameters = const <String>[]]) {
-    var mirror =
-        dart2js_mirrors.BackDoor.getMirrorFromElement(context.mirror, element);
-    if (mirror != null) {
-      return new Annotation(context.owningLibrary, mirror, parameters);
-    }
-    return null;
-  }
-
-  @override
-  Annotation visitBinary(BinaryConstantExpression exp,
-                         AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitIdentical(IdenticalConstantExpression exp,
-                            AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitConcatenate(ConcatenateConstantExpression exp,
-                              AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitConditional(ConditionalConstantExpression exp,
-                              AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitConstructed(ConstructedConstantExpression exp,
-                              AnnotationInfo context) {
-    return createAnnotation(exp.target, context,
-        exp.arguments.map((a) => a.getText()).toList());
-  }
-
-  @override
-  Annotation visitFunction(FunctionConstantExpression exp,
-                           AnnotationInfo context) {
-    return createAnnotation(exp.element, context);
-  }
-
-  @override
-  Annotation visitList(ListConstantExpression exp,
-                       AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitMap(MapConstantExpression exp,
-                      AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitSymbol(SymbolConstantExpression exp,
-                         AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitType(TypeConstantExpression exp,
-                       AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitUnary(UnaryConstantExpression exp,
-                        AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitVariable(VariableConstantExpression exp,
-                           AnnotationInfo context) {
-    return createAnnotation(exp.element, context);
-  }
-
-  @override
-  Annotation visitBool(BoolConstantExpression exp,
-                       AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
-                                      AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitDouble(DoubleConstantExpression exp,
-                         AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitInt(IntConstantExpression exp,
-                      AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp,
-                                     AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitNamed(NamedArgumentReference exp,
-                        AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitNull(NullConstantExpression exp,
-                       AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitPositional(PositionalArgumentReference exp,
-                             AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitString(StringConstantExpression exp,
-                         AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitStringFromEnvironment(
-      StringFromEnvironmentConstantExpression exp,
-      AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitStringLength(StringLengthConstantExpression exp,
-                               AnnotationInfo context) {
-    return null;
-  }
-
-  @override
-  Annotation visitDeferred(DeferredConstantExpression exp,
-                           AnnotationInfo context) {
-    return exp.expression.accept(this, context);
-  }
-}
-
-/// A declaration is private if itself is private, or the owner is private.
-bool isHidden(DeclarationSourceMirror mirror) {
-  if (mirror is LibraryMirror) {
-    return _isLibraryPrivate(mirror);
-  } else if (mirror.owner is LibraryMirror) {
-    return (mirror.isPrivate || _isLibraryPrivate(mirror.owner) ||
-        mirror.isNameSynthetic);
-  } else {
-    return (mirror.isPrivate || isHidden(mirror.owner) ||
-        mirror.isNameSynthetic);
-  }
-}
-
-/// Transforms the map by calling toMap on each value in it.
-Map recurseMap(Map inputMap) {
-  var outputMap = new LinkedHashMap();
-  inputMap.forEach((key, value) {
-    if (value is Map) {
-      outputMap[key] = recurseMap(value);
-    } else {
-      outputMap[key] = value.toMap();
-    }
-  });
-  return outputMap;
-}
-
-/// Read a pubspec and return the library name given a [LibraryMirror].
-String getPackageName(LibraryMirror mirror) {
-  if (mirror.uri.scheme != 'file') return '';
-  var rootdir = getPackageDirectory(mirror);
-  if (rootdir == null) return '';
-  return packageNameFor(rootdir);
-}
-
-
-/// Helper that maps [mirrors] to their simple name in map.
-Map addAll(Map map, Iterable<DeclarationMirror> mirrors) {
-  for (var mirror in mirrors) {
-    map[dart2js_util.nameOf(mirror)] = mirror;
-  }
-  return map;
-}
-
-/// For the given library determine what items (if any) are exported.
-///
-/// Returns a Map with three keys: "classes", "methods", and "variables" the
-/// values of which point to a map of exported name identifiers with values
-/// corresponding to the actual DeclarationMirror.
-Map<String, Map<String, DeclarationMirror>> calcExportedItems(
-    LibrarySourceMirror library, Map visited) {
-  var exports = {};
-  visited[library] = exports;
-  exports['classes'] = new SplayTreeMap();
-  exports['methods'] = new SplayTreeMap();
-  exports['variables'] = new SplayTreeMap();
-
-  // Determine the classes, variables and methods that are exported for a
-  // specific dependency.
-  void _populateExports(LibraryDependencyMirror export, bool showExport) {
-    if (visited[export.targetLibrary] != null) return;
-    var transitiveExports = calcExportedItems(export.targetLibrary, visited);
-    exports['classes'].addAll(transitiveExports['classes']);
-    exports['methods'].addAll(transitiveExports['methods']);
-    exports['variables'].addAll(transitiveExports['variables']);
-    // If there is a show in the export, add only the show items to the
-    // library. Ex: "export foo show bar"
-    // Otherwise, add all items, and then remove the hidden ones.
-    // Ex: "export foo hide bar"
-
-    if (!showExport) {
-      // Add all items, and then remove the hidden ones.
-      // Ex: "export foo hide bar"
-      addAll(exports['classes'],
-          dart2js_util.typesOf(export.targetLibrary.declarations));
-      addAll(exports['methods'],
-          export.targetLibrary.declarations.values.where(
-              (mirror) => mirror is MethodMirror));
-      addAll(exports['variables'],
-          dart2js_util.variablesOf(export.targetLibrary.declarations));
-    }
-    for (CombinatorMirror combinator in export.combinators) {
-      for (String identifier in combinator.identifiers) {
-        var librarySourceMirror =
-            export.targetLibrary as DeclarationSourceMirror;
-        var declaration = librarySourceMirror.lookupInScope(identifier);
-        if (declaration == null) {
-          // Technically this should be a bug, but some of our packages
-          // (such as the polymer package) are curently broken in this
-          // way, so we just produce a warning.
-          print('Warning identifier $identifier not found in library '
-              '${dart2js_util.qualifiedNameOf(export.targetLibrary)}');
-        } else {
-          var subMap = exports['classes'];
-          if (declaration is MethodMirror) {
-            subMap = exports['methods'];
-          } else if (declaration is VariableMirror) {
-            subMap = exports['variables'];
-          }
-          if (showExport) {
-            subMap[identifier] = declaration;
-          } else {
-            subMap.remove(identifier);
-          }
-        }
-      }
-    }
-  }
-
-  Iterable<LibraryDependencyMirror> exportList =
-      library.libraryDependencies.where((lib) => lib.isExport);
-  for (LibraryDependencyMirror export in exportList) {
-    _populateExports(export,
-        export.combinators.any((combinator) => combinator.isShow));
-  }
-  return exports;
-}
-
-
-/// Returns a map of [Variable] objects constructed from [mirrorMap].
-/// The optional parameter [containingLibrary] is contains data for variables
-/// defined at the top level of a library (potentially for exporting
-/// purposes).
-Map<String, Variable> createVariables(Iterable<VariableMirror> mirrors,
-    Indexable owner) {
-  var data = new SplayTreeMap<String, Variable>();
-  // TODO(janicejl): When map to map feature is created, replace the below
-  // with a filter. Issue(#9590).
-  mirrors.forEach((dart2js_mirrors.Dart2JsFieldMirror mirror) {
-    if (includePrivateMembers || !isHidden(mirror)) {
-      var mirrorName = dart2js_util.nameOf(mirror);
-      data[mirrorName] = new Variable(mirrorName, mirror, owner);
-    }
-  });
-  return data;
-}
-
-/// Returns a map of [Method] objects constructed from [mirrorMap].
-/// The optional parameter [containingLibrary] is contains data for variables
-/// defined at the top level of a library (potentially for exporting
-/// purposes).
-Map<String, Method> createMethods(Iterable<MethodMirror> mirrors,
-    Indexable owner) {
-  var group = new SplayTreeMap<String, Method>();
-  mirrors.forEach((MethodMirror mirror) {
-    if (includePrivateMembers || !mirror.isPrivate) {
-      group[dart2js_util.nameOf(mirror)] = new Method(mirror, owner);
-    }
-  });
-  return group;
-}
-
-/// Returns a map of [Parameter] objects constructed from [mirrorList].
-Map<String, Parameter> createParameters(List<ParameterMirror> mirrorList,
-    Indexable owner) {
-  var data = {};
-  mirrorList.forEach((ParameterMirror mirror) {
-    data[dart2js_util.nameOf(mirror)] =
-        new Parameter(mirror, owner.owningLibrary);
-  });
-  return data;
-}
-
-/// Returns a map of [Generic] objects constructed from the class mirror.
-Map<String, Generic> createGenerics(TypeMirror mirror) {
-  return new Map.fromIterable(mirror.typeVariables,
-      key: (e) => dart2js_util.nameOf(e),
-      value: (e) => new Generic(e));
-}
-
-Map _filterMap(Map map, bool test(k, v)) {
-  var exported = new SplayTreeMap();
-  map.forEach((key, value) {
-    if (test(key, value)) exported[key] = value;
-  });
-  return exported;
-}
-
-/// Annotations that we do not display in the viewer.
-const List<String> _SKIPPED_ANNOTATIONS = const [
-  'metadata.DocsEditable', '_js_helper.JSName', '_js_helper.Creates',
-  '_js_helper.Returns'
-];
-
-/// Returns true if a library name starts with an underscore, and false
-/// otherwise.
-///
-/// An example that starts with _ is _js_helper.
-/// An example that contains ._ is dart._collection.dev
-bool _isLibraryPrivate(dart2js_mirrors.Dart2JsLibraryMirror mirror) {
-  // This method is needed because LibraryMirror.isPrivate returns `false` all
-  // the time.
-  var sdkLibrary = LIBRARIES[dart2js_util.nameOf(mirror)];
-  if (sdkLibrary != null) {
-    return !sdkLibrary.documented;
-  } else if (dart2js_util.nameOf(mirror).startsWith('_') || dart2js_util.nameOf(
-      mirror).contains('._')) {
-    return true;
-  }
-  return false;
-}
diff --git a/pkg/docgen/lib/src/models/owned_indexable.dart b/pkg/docgen/lib/src/models/owned_indexable.dart
deleted file mode 100644
index ea3335d..0000000
--- a/pkg/docgen/lib/src/models/owned_indexable.dart
+++ /dev/null
@@ -1,70 +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.
-
-library docgen.models.owned_indexable;
-
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-import '../mdn.dart';
-import '../package_helpers.dart';
-
-import 'annotation.dart';
-import 'dummy_mirror.dart';
-import 'indexable.dart';
-import 'model_helpers.dart';
-
-abstract class OwnedIndexable<TMirror extends DeclarationMirror>
-    extends Indexable<TMirror> {
-  /// List of the meta annotations on this item.
-  final List<Annotation> annotations;
-
-  /// The object one scope-level above which this item is defined.
-  ///
-  /// Ex: The owner for a top level class, would be its enclosing library.
-  /// The owner of a local variable in a method would be the enclosing method.
-  final Indexable owner;
-
-  /// Returns this object's qualified name, but following the conventions
-  /// we're using in Dartdoc, which is that library names with dots in them
-  /// have them replaced with hyphens.
-  String get docName => owner.docName + '.' + dart2js_util.nameOf(mirror);
-
-  OwnedIndexable(DeclarationMirror mirror, Indexable owner)
-      : annotations = createAnnotations(mirror, owner.owningLibrary),
-        this.owner = owner,
-        super(mirror);
-
-  /// Generates MDN comments from database.json.
-  String getMdnComment() {
-    var domAnnotation = this.annotations.firstWhere(
-        (e) => e.mirror.qualifiedName == #metadata.DomName,
-        orElse: () => null);
-    if (domAnnotation == null) return '';
-    var domName = domAnnotation.parameters.single;
-
-    return mdnComment(rootDirectory, logger, domName);
-  }
-
-  String get packagePrefix => owner.packagePrefix;
-
-  String findElementInScope(String name) {
-    var lookupFunc = determineLookupFunc(name);
-    var result = lookupFunc(mirror, name);
-    if (result != null) {
-      result = getDocgenObject(result);
-      if (result is DummyMirror) return packagePrefix + result.docName;
-      return result.packagePrefix + result.docName;
-    }
-
-    if (owner != null) {
-      var result = owner.findElementInScope(name);
-      if (result != null) {
-        return result;
-      }
-    }
-    return super.findElementInScope(name);
-  }
-}
diff --git a/pkg/docgen/lib/src/models/parameter.dart b/pkg/docgen/lib/src/models/parameter.dart
deleted file mode 100644
index ef9d9ab..0000000
--- a/pkg/docgen/lib/src/models/parameter.dart
+++ /dev/null
@@ -1,65 +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.
-
-library docgen.models.parameter;
-
-import '../exports/mirrors_util.dart' as dart2js_util;
-import '../exports/source_mirrors.dart';
-
-import 'annotation.dart';
-import 'closure.dart';
-import 'doc_gen_type.dart';
-import 'library.dart';
-import 'mirror_based.dart';
-import 'model_helpers.dart';
-
-/// Docgen wrapper around the dart2js mirror for a Dart
-/// method/function parameter.
-class Parameter extends MirrorBased {
-  final ParameterMirror mirror;
-  final String name;
-  final bool isOptional;
-  final bool isNamed;
-  final bool hasDefaultValue;
-  final DocGenType type;
-  final String defaultValue;
-  /// List of the meta annotations on the parameter.
-  final List<Annotation> annotations;
-  final Library owningLibrary;
-  // Only non-null if this parameter is a function declaration.
-  Closure functionDeclaration;
-
-  Parameter(ParameterMirror mirror, Library owningLibrary)
-      : this.mirror = mirror,
-        name = dart2js_util.nameOf(mirror),
-        isOptional = mirror.isOptional,
-        isNamed = mirror.isNamed,
-        hasDefaultValue = mirror.hasDefaultValue,
-        defaultValue = getDefaultValue(mirror),
-        type = new DocGenType(mirror.type, owningLibrary),
-        annotations = createAnnotations(mirror, owningLibrary),
-        owningLibrary = owningLibrary {
-    if (mirror.type is FunctionTypeMirror) {
-      functionDeclaration =
-          new Closure(mirror.type as FunctionTypeMirror, owningLibrary);
-    }
-  }
-
-  /// Generates a map describing the [Parameter] object.
-  Map toMap() {
-    var map = {
-      'name': name,
-      'optional': isOptional,
-      'named': isNamed,
-      'default': hasDefaultValue,
-      'type': new List.filled(1, type.toMap()),
-      'value': defaultValue,
-      'annotations': annotations.map((a) => a.toMap()).toList()
-    };
-    if (functionDeclaration != null) {
-      map['functionDeclaration'] = functionDeclaration.toMap();
-    }
-    return map;
-  }
-}
\ No newline at end of file
diff --git a/pkg/docgen/lib/src/models/typedef.dart b/pkg/docgen/lib/src/models/typedef.dart
deleted file mode 100644
index 17e4208..0000000
--- a/pkg/docgen/lib/src/models/typedef.dart
+++ /dev/null
@@ -1,65 +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.
-
-library docgen.models.typedef;
-
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'dummy_mirror.dart';
-import 'library.dart';
-import 'model_helpers.dart';
-import 'generic.dart';
-import 'parameter.dart';
-import 'owned_indexable.dart';
-
-class Typedef extends OwnedIndexable<TypedefMirror> {
-  final String returnType;
-
-  final Map<String, Parameter> parameters;
-
-  /// Generic information about the typedef.
-  final Map<String, Generic> generics;
-
-  /// Returns the [Library] for the given [mirror] if it has already been
-  /// created, else creates it.
-  factory Typedef(TypedefMirror mirror, Library owningLibrary) {
-    var aTypedef = getDocgenObject(mirror, owningLibrary);
-    if (aTypedef is DummyMirror) {
-      aTypedef = new Typedef._(mirror, owningLibrary);
-    }
-    return aTypedef;
-  }
-
-  Typedef._(TypedefMirror mirror, Library owningLibrary)
-      : returnType = getDocgenObject(mirror.referent.returnType).docName,
-        generics = createGenerics(mirror),
-        parameters = createParameters(mirror.referent.parameters,
-            owningLibrary),
-        super(mirror, owningLibrary);
-
-  Map toMap() {
-    var map = {
-      'name': name,
-      'qualifiedName': qualifiedName,
-      'comment': comment,
-      'return': returnType,
-      'parameters': recurseMap(parameters),
-      'annotations': annotations.map((a) => a.toMap()).toList(),
-      'generics': recurseMap(generics)
-    };
-
-    // Typedef is displayed on the library page as a class, so a preview is
-    // added manually
-    var pre = preview;
-    if (pre != null) map['preview'] = pre;
-
-    return map;
-  }
-
-  String get typeName => 'typedef';
-
-  bool isValidMirror(DeclarationMirror mirror) => mirror is TypedefMirror;
-}
diff --git a/pkg/docgen/lib/src/models/variable.dart b/pkg/docgen/lib/src/models/variable.dart
deleted file mode 100644
index b4b83ac..0000000
--- a/pkg/docgen/lib/src/models/variable.dart
+++ /dev/null
@@ -1,64 +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.
-
-library docgen.models.variable;
-
-import '../exports/source_mirrors.dart';
-
-import '../library_helpers.dart';
-
-import 'class.dart';
-import 'doc_gen_type.dart';
-import 'dummy_mirror.dart';
-import 'indexable.dart';
-import 'owned_indexable.dart';
-
-
-/// A class containing properties of a Dart variable.
-class Variable extends OwnedIndexable<VariableMirror> {
-  final bool isFinal;
-  final bool isStatic;
-  final bool isConst;
-  final DocGenType type;
-  final String name;
-
-  factory Variable(String name, VariableMirror mirror, Indexable owner) {
-    var variable = getDocgenObject(mirror, owner);
-    if (variable is DummyMirror) {
-      return new Variable._(name, mirror, owner);
-    }
-    return variable;
-  }
-
-  Variable._(this.name, VariableMirror mirror, Indexable owner)
-      : isFinal = mirror.isFinal,
-        isStatic = mirror.isStatic,
-        isConst = mirror.isConst,
-        type = new DocGenType(mirror.type, owner.owningLibrary),
-        super(mirror, owner);
-
-  /// Generates a map describing the [Variable] object.
-  Map toMap() => {
-    'name': name,
-    'qualifiedName': qualifiedName,
-    'comment': comment,
-    'final': isFinal,
-    'static': isStatic,
-    'constant': isConst,
-    'type': new List.filled(1, type.toMap()),
-    'annotations': annotations.map((a) => a.toMap()).toList()
-  };
-
-  String get typeName => 'property';
-
-  String get comment {
-    if (commentField != null) return commentField;
-    if (owner is Class) {
-      (owner as Class).ensureComments();
-    }
-    return super.comment;
-  }
-
-  bool isValidMirror(DeclarationMirror mirror) => mirror is VariableMirror;
-}
diff --git a/pkg/docgen/lib/src/package_helpers.dart b/pkg/docgen/lib/src/package_helpers.dart
deleted file mode 100644
index f437166..0000000
--- a/pkg/docgen/lib/src/package_helpers.dart
+++ /dev/null
@@ -1,126 +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.
-
-library docgen.package_helpers;
-
-import 'exports/source_mirrors.dart';
-import 'generator.dart' show pubScript;
-
-import 'dart:io';
-import 'package:path/path.dart' as path;
-import 'package:yaml/yaml.dart';
-
-/// Helper accessor to determine the full pathname of the root of the dart
-/// checkout if we are running without the --sdk parameter specified. That
-/// normally means we are running directly from source, and we expect to
-/// find the root as the directory above 'pkg'. The only other time this
-/// would happen is running a snapshot directly, rather than from the
-/// dartdocgen script, where we look for the dart-sdk directory. If not
-/// using the script and not in a normal directory structure, you'll need
-/// to pass the --sdk parameter.
-String get rootDirectory {
-  if (_rootDirectoryCache != null) return _rootDirectoryCache;
-  var scriptDir = path.absolute(path.dirname(Platform.script.toFilePath()));
-  var root = scriptDir;
-  var base = path.basename(root);
-  while (base != 'dart-sdk' && base != 'pkg') {
-    root = path.dirname(root);
-    base = path.basename(root);
-    if (root == base) {
-      // We have reached the root of the filesystem without finding anything.
-      throw new FileSystemException("Cannot find SDK directory starting from ",
-          scriptDir);
-    }
-  }
-  _rootDirectoryCache = path.dirname(root);
-  return _rootDirectoryCache;
-}
-String _rootDirectoryCache;
-
-/// Given a LibraryMirror that is a library, return the name of the directory
-/// holding the package information for that library. If the library is not
-/// part of a package, return null.
-String getPackageDirectory(LibraryMirror mirror) {
-  var file = mirror.uri.toFilePath();
-  // Any file that's in a package will be in a directory of the form
-  // packagename/lib/.../filename.dart, so we know that a possible
-  // package directory is at least in the directory above the one containing
-  // [file]
-  var directoryAbove = path.dirname(path.dirname(file));
-  var possiblePackage = _packageDirectoryFor(directoryAbove);
-  // We only want components that are somewhere underneath the lib directory.
-  var subPath = path.relative(file, from: possiblePackage);
-  var subPathComponents = path.split(subPath);
-  if (subPathComponents.isNotEmpty && subPathComponents.first == 'lib') {
-    return possiblePackage;
-  } else {
-    return null;
-  }
-}
-
-Map _getPubspec(String directoryName) {
-  var pubspecName = path.join(directoryName, 'pubspec.yaml');
-  File pubspec = new File(pubspecName);
-  if (!pubspec.existsSync()) return {'name': ''};
-  var contents = pubspec.readAsStringSync();
-  return loadYaml(contents);
-}
-
-/// Read a pubspec and return the library name, given a directory
-String packageNameFor(String directoryName) =>
-    _getPubspec(directoryName)['name'];
-
-/// Read a pubspec and return the library name, given a directory
-String _packageVersionFor(String directoryName) {
-  var spec = _getPubspec(directoryName);
-  return '${spec['name']}-${spec['version']}';
-}
-
-/// Look in the pubspec.lock to determine what version of a package we are
-/// documenting (null if not applicable).
-String packageVersion(LibraryMirror mirror) {
-  if (mirror.uri.scheme == 'file') {
-    String packageDirectory = getPackageDirectory(mirror);
-    if (packageDirectory == null) return '';
-    if (packageDirectory.contains('.pub-cache')) {
-      return path.basename(packageDirectory);
-    }
-    String packageName = packageNameFor(packageDirectory);
-    return _packageVersionFor(packageDirectory);
-  } else if (mirror.uri.scheme == 'dart') {
-    // If this item is from the SDK, use what version of pub we're running to
-    // ascertain the SDK version.
-    var pubVersion = Process.runSync(pubScript, ['--version'],
-        runInShell: true);
-    if (pubVersion.exitCode != 0) {
-      print(pubVersion.stderr);
-    }
-    return pubVersion.stdout.replaceAll('Pub ', '').trim();
-  }
-  return '';
-}
-
-String _packageVersionHelper(String packageDirectory, String packageName) {
-  var publockName = path.join(packageDirectory, 'pubspec.lock');
-  File publock = new File(publockName);
-  if (!publock.existsSync()) return '';
-  var contents = publock.readAsStringSync();
-  var spec = loadYaml(contents);
-  return spec['packages'][packageName];
-}
-
-/// Recursively walk up from directory name looking for a pubspec. Return
-/// the directory that contains it, or null if none is found.
-String _packageDirectoryFor(String directoryName) {
-  var dir = directoryName;
-  while (!_pubspecFor(dir).existsSync()) {
-    var newDir = path.dirname(dir);
-    if (newDir == dir) return null;
-    dir = newDir;
-  }
-  return dir;
-}
-
-File _pubspecFor(String directoryName) =>
-    new File(path.join(directoryName, 'pubspec.yaml'));
diff --git a/pkg/docgen/lib/src/viewer.dart b/pkg/docgen/lib/src/viewer.dart
deleted file mode 100644
index f5b7172..0000000
--- a/pkg/docgen/lib/src/viewer.dart
+++ /dev/null
@@ -1,201 +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.
-
-/// Convenience methods wrapped up in a class to pull down the docgen viewer for
-/// a viewable website, and start up a server for viewing.
-library docgen.viewer;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-
-import 'generator.dart' as gen;
-import 'package_helpers.dart' show rootDirectory;
-
-final String _dartdocViewerString =
-    path.join(Directory.current.path, 'dartdoc-viewer');
-
-final Directory _dartdocViewerDir = new Directory(_dartdocViewerString);
-
-Directory _topLevelTempDir;
-Directory _webDocsDir;
-bool _movedViewerCode = false;
-
-void createViewer(bool serve) {
-  _clone();
-  _compile();
-  if (serve) {
-    _runServer();
-  }
-}
-
-/*
- * dartdoc-viewer currently has the web app code under a 'client' directory
- *
- * This is confusing for folks that want to clone and modify the code.
- * It also includes a number of python files and other content related to
- * app engine hosting that are not needed.
- *
- * This logic exists to support the current model and a (future) updated
- * dartdoc-viewer repo where the 'client' content exists at the root of the
- * project and the other content is removed.
- */
-String get _viewerCodePath {
-  if (_viewerCodePathCache == null) {
-    var pubspecFileName = 'pubspec.yaml';
-
-    var thePath = _dartdocViewerDir.path;
-
-    if (!FileSystemEntity.isFileSync(path.join(thePath, pubspecFileName))) {
-      thePath = path.join(thePath, 'client');
-      if (!FileSystemEntity.isFileSync(path.join(thePath, pubspecFileName))) {
-        throw new StateError('Could not find a pubspec file');
-      }
-    }
-
-    _viewerCodePathCache = thePath;
-  }
-  return _viewerCodePathCache;
-}
-String _viewerCodePathCache;
-
-/// If our dartdoc-viewer code is already checked out, move it to a temporary
-/// directory outside of the package directory, so we don't try to process it
-/// for documentation.
-void ensureMovedViewerCode() {
-  // TODO(efortuna): This will need to be modified to run on anyone's package
-  // outside of the checkout!
-  if (_dartdocViewerDir.existsSync()) {
-    _topLevelTempDir = new Directory(rootDirectory).createTempSync();
-    _dartdocViewerDir.renameSync(_topLevelTempDir.path);
-  }
-}
-
-/// Move the dartdoc-viewer code back into place for "webpage deployment."
-void addBackViewerCode() {
-  if (_movedViewerCode) _dartdocViewerDir.renameSync(_dartdocViewerString);
-}
-
-/// Serve up our generated documentation for viewing in a browser.
-void _clone() {
-  // If the viewer code is already there, then don't clone again.
-  if (_dartdocViewerDir.existsSync()) {
-    _moveDirectoryAndServe();
-  } else {
-    var processResult = Process.runSync('git', ['clone', '-b', 'master',
-        'https://github.com/dart-lang/dartdoc-viewer.git'], runInShell: true);
-
-    if (processResult.exitCode == 0) {
-      /// Move the generated json/yaml docs directory to the dartdoc-viewer
-      /// directory, to run as a webpage.
-      var processResult = Process.runSync(gen.pubScript, ['get'],
-          runInShell: true, workingDirectory: _viewerCodePath);
-      print('process output: ${processResult.stdout}');
-      print('process stderr: ${processResult.stderr}');
-
-      var dir = new Directory(gen.outputDirectory == null ? 'docs' :
-          gen.outputDirectory);
-      _webDocsDir = new Directory(path.join(_viewerCodePath, 'web', 'docs'));
-      if (dir.existsSync()) {
-        // Move the docs folder to dartdoc-viewer/client/web/docs
-        dir.renameSync(_webDocsDir.path);
-      }
-    } else {
-      print('Error cloning git repository:');
-      print('process output: ${processResult.stdout}');
-      print('process stderr: ${processResult.stderr}');
-    }
-  }
-}
-
-/// Move the generated json/yaml docs directory to the dartdoc-viewer
-/// directory, to run as a webpage.
-void _moveDirectoryAndServe() {
-  var processResult = Process.runSync(gen.pubScript, ['upgrade'], runInShell:
-      true, workingDirectory: path.join(_dartdocViewerDir.path, 'client'));
-  print('process output: ${processResult.stdout}');
-  print('process stderr: ${processResult.stderr}');
-
-  var dir = new Directory(gen.outputDirectory == null ? 'docs' :
-      gen.outputDirectory);
-  var webDocsDir = new Directory(path.join(_dartdocViewerDir.path, 'client',
-      'web', 'docs'));
-  if (dir.existsSync()) {
-    // Move the docs folder to dartdoc-viewer/client/web/docs
-    dir.renameSync(webDocsDir.path);
-  }
-
-  if (webDocsDir.existsSync()) {
-    // Compile the code to JavaScript so we can run on any browser.
-    print('Compiling the app to JavaScript.');
-    var processResult = Process.runSync(gen.dartBinary, ['deploy.dart'],
-        workingDirectory: path.join(_dartdocViewerDir.path, 'client'),
-        runInShell: true);
-    print('process output: ${processResult.stdout}');
-    print('process stderr: ${processResult.stderr}');
-    _runServer();
-  }
-}
-
-void _compile() {
-  if (_webDocsDir.existsSync()) {
-    // Compile the code to JavaScript so we can run on any browser.
-    print('Compiling the app to JavaScript.');
-    var processResult = Process.runSync(gen.dartBinary, ['deploy.dart'],
-        workingDirectory: _viewerCodePath, runInShell: true);
-    print('process output: ${processResult.stdout}');
-    print('process stderr: ${processResult.stderr}');
-    var outputDir = path.join(_viewerCodePath, 'out', 'web');
-    print('Docs are available at $outputDir');
-  }
-}
-
-/// A simple HTTP server. Implemented here because this is part of the SDK,
-/// so it shouldn't have any external dependencies.
-void _runServer() {
-  // Launch a server to serve out of the directory dartdoc-viewer/client/web.
-  HttpServer.bind(InternetAddress.ANY_IP_V6, 8080).then((HttpServer httpServer)
-      {
-    print('Server launched. Navigate your browser to: '
-        'http://localhost:${httpServer.port}');
-    httpServer.listen((HttpRequest request) {
-      var response = request.response;
-      var basePath = path.join(_viewerCodePath, 'out', 'web');
-      var requestPath = path.join(basePath, request.uri.path.substring(1));
-      bool found = true;
-      var file = new File(requestPath);
-      if (file.existsSync()) {
-        // Set the correct header type.
-        if (requestPath.endsWith('.html')) {
-          response.headers.set('Content-Type', 'text/html');
-        } else if (requestPath.endsWith('.js')) {
-          response.headers.set('Content-Type', 'application/javascript');
-        } else if (requestPath.endsWith('.dart')) {
-          response.headers.set('Content-Type', 'application/dart');
-        } else if (requestPath.endsWith('.css')) {
-          response.headers.set('Content-Type', 'text/css');
-        }
-      } else {
-        if (requestPath == basePath) {
-          response.headers.set('Content-Type', 'text/html');
-          file = new File(path.join(basePath, 'index.html'));
-        } else {
-          print('Path not found: $requestPath');
-          found = false;
-          response.statusCode = HttpStatus.NOT_FOUND;
-          response.close();
-        }
-      }
-
-      if (found) {
-        // Serve up file contents.
-        file.openRead().pipe(response).catchError((e) {
-          print('HttpServer: error while closing the response stream $e');
-        });
-      }
-    }, onError: (e) {
-      print('HttpServer: an error occured $e');
-    });
-  });
-}
diff --git a/pkg/docgen/pubspec.yaml b/pkg/docgen/pubspec.yaml
deleted file mode 100644
index d34a4d8..0000000
--- a/pkg/docgen/pubspec.yaml
+++ /dev/null
@@ -1,13 +0,0 @@
-name: docgen
-author: Dart Team <misc@dartlang.org>
-description: A documentation generator for the Dart repository.
-homepage: https://www.dartlang.org/
-dependencies:
-  args: '>=0.9.0 <0.14.0'
-  logging: '>=0.9.0 <0.12.0'
-  markdown: ^0.7.1+2
-  path: '>=0.9.0 <2.0.0'
-  yaml: '>=0.9.0 <3.0.0'
-dev_dependencies:
-  scheduled_test: '>=0.10.0 <0.12.0'
-  unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/docgen/test/async_await_test.dart b/pkg/docgen/test/async_await_test.dart
deleted file mode 100644
index e129455..0000000
--- a/pkg/docgen/test/async_await_test.dart
+++ /dev/null
@@ -1,150 +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.
-
-library async_await_test;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
-import '../lib/docgen.dart';
-
-const String DART_LIBRARY = '''
-  library test;
-  /**
-   * Doc comment for class [A].
-   *
-   * Multiline Test
-   */
-  /*
-   * Normal comment for class A.
-   */
-  class A {
-    m1() sync* {
-      yield 0;
-    }
-
-    m2() async {
-      await 0;
-      await for (var e in m1()) {}
-    }
-
-    m3() async* {
-      yield* m1();
-    }
-  }
-
-  m1() sync* {
-    yield 0;
-  }
-
-  m2() async {
-    await 0;
-    await for (var e in m1()) {}
-  }
-
-  m3() async* {
-    yield* m1();
-  }
-
-  main() {
-    m1();
-    m2();
-    m3();
-    A a = new A();
-    a.m1();
-    a.m2();
-    a.m3();
-  }
-''';
-
-main() {
-  group('Generate docs for', () {
-    test('file with async/await.', () {
-      var temporaryDir = Directory.systemTemp.createTempSync('single_library_');
-      var fileName = path.join(temporaryDir.path, 'temp.dart');
-      var file = new File(fileName);
-      file.writeAsStringSync(DART_LIBRARY);
-
-      return getMirrorSystem([new Uri.file(fileName)], false)
-        .then((mirrorSystem) {
-          var testLibraryUri = new Uri.file(path.absolute(fileName),
-                                            windows: Platform.isWindows);
-          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
-          expect(library is Library, isTrue);
-
-          var classTypes = library.classes;
-          var classes = [];
-          classes.addAll(classTypes.values);
-          classes.addAll(library.errors.values);
-          expect(classes.every((e) => e is Class), isTrue);
-
-          expect(library.typedefs.values.every((e) => e is Typedef), isTrue);
-
-          var classMethodTypes = [];
-          classes.forEach((e) {
-            classMethodTypes.add(e.methods);
-            classMethodTypes.add(e.inheritedMethods);
-          });
-          expect(classMethodTypes.every((e) => e is Map<String, Method>),
-                 isTrue);
-
-          var classMethods = [];
-          classMethodTypes.forEach((e) {
-            classMethods.addAll(e.values);
-          });
-          expect(classMethods.every((e) => e is Method), isTrue);
-
-          var methodParameters = [];
-          classMethods.forEach((e) {
-            methodParameters.addAll(e.parameters.values);
-          });
-          expect(methodParameters.every((e) => e is Parameter), isTrue);
-
-          var functionTypes = library.functions;
-          expect(functionTypes is Map<String, Method>, isTrue);
-
-          var functions = [];
-          functions.addAll(functionTypes.values);
-          expect(functions.every((e) => e is Method), isTrue);
-
-          var functionParameters = [];
-          functions.forEach((e) {
-            functionParameters.addAll(e.parameters.values);
-          });
-          expect(functionParameters.every((e) => e is Parameter), isTrue);
-
-          var variables = library.variables.values;
-          expect(variables.every((e) => e is Variable), isTrue);
-
-          /// Testing fixReference
-          // Testing Doc comment for class [A].
-          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
-          var classMirror =
-              dart2js_util.classesOf(libraryMirror.declarations).first;
-          var classDocComment = library.fixReference('A').children.first.text;
-          expect(classDocComment, 'test.A');
-
-          // Test for linking to parameter [A]
-          var method = getDocgenObject(
-              classMirror.declarations[dart2js_util.symbolOf('m1')]);
-
-          // Testing trying to refer to m1 method
-          var methodDocComment = method.fixReference(
-              'm1').children.first.text;
-          expect(methodDocComment, 'test.A.m1');
-
-          // Testing something with no reference
-          var libraryDocComment = method.fixReference('foobar').text;
-          expect(libraryDocComment, 'foobar');
-
-          // Testing trying to refer to m1 function
-          libraryDocComment = library.fixReference('m1').children.first.text;
-          expect(libraryDocComment, 'test.m1');
-        }).whenComplete(() => temporaryDir.deleteSync(recursive: true));
-    });
-  });
-}
diff --git a/pkg/docgen/test/constant_argument_test.dart b/pkg/docgen/test/constant_argument_test.dart
deleted file mode 100644
index bf5a84a..0000000
--- a/pkg/docgen/test/constant_argument_test.dart
+++ /dev/null
@@ -1,80 +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.
-
-library docgen.test.typedef;
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'util.dart';
-import '../lib/docgen.dart' as dg;
-
-void main() {
-
-  setUp(() {
-    scheduleTempDir();
-  });
-
-  test('argument default values', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    schedule(() {
-      var path = p.join(d.defaultRoot, 'docs', 'test_lib.json');
-      var dartCoreJson = new File(path).readAsStringSync();
-
-      var testLibBar = JSON.decode(dartCoreJson) as Map<String, dynamic>;
-
-      //
-      // Validate function doc references
-      //
-      var functionDef =
-          testLibBar['functions']['methods']['positionalDefaultValues']
-          as Map<String, dynamic>;
-
-      var params = functionDef['parameters'] as Map<String, dynamic>;
-
-      expect(params.keys, orderedEquals(_PARAM_NAME_ORDER),
-          reason: 'parameter order  must be maintained');
-
-      var vals = {};
-      params.forEach((paramName, paramHash) {
-        expect(_PARAM_VALUES, contains(paramName));
-        expect(paramHash['value'], _PARAM_VALUES[paramName],
-            reason: 'Value for $paramName should match expected');
-      });
-    });
-  });
-}
-
-final _PARAM_VALUES = {
-  "intConst": "42",
-  "boolConst": "true",
-  "listConst": 'const [true, 42, "Shanna", null, 3.14, const []]',
-  "stringConst": "\"Shanna\"",
-  "mapConst": 'const {"a": 1, 2: true, "c": const [1, null, true]}',
-  "emptyMap": 'const {}',
-  "referencedConst": "INT_CONST",
-  "constructedConstant1": "const ConstClass<int>(0, true)",
-  "constructedConstant2": 'const ConstClass(1, false, str: "str")'
-};
-
-const _PARAM_NAME_ORDER = const [
-  "intConst",
-  "boolConst",
-  "listConst",
-  "stringConst",
-  "mapConst",
-  "emptyMap",
-  "referencedConst",
-  "constructedConstant1",
-  "constructedConstant2"
-];
diff --git a/pkg/docgen/test/generate_json_test.dart b/pkg/docgen/test/generate_json_test.dart
deleted file mode 100644
index c22ae13..0000000
--- a/pkg/docgen/test/generate_json_test.dart
+++ /dev/null
@@ -1,50 +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.
-
-library docgen.generate_json_test;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'util.dart';
-import '../lib/docgen.dart' as dg;
-
-void main() {
-
-  setUp(() {
-    scheduleTempDir();
-  });
-
-  test('json output', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    d.dir('docs', [
-        d.matcherFile('index.json', isJsonMap),
-        d.matcherFile('index.txt', hasSortedLines),
-        d.matcherFile('library_list.json', isJsonMap),
-        d.matcherFile('library_list.json',
-            startsWith(_LIBRARY_LIST_UNINDENT_START)),
-        d.matcherFile('sub_lib.json', isJsonMap),
-        d.matcherFile('sub_lib.SubLibClass.json', isJsonMap),
-        d.matcherFile('sub_lib.SubLibPart.json', isJsonMap),
-        d.matcherFile('test_lib-bar.C.json', isJsonMap),
-        d.matcherFile('test_lib-bar.json', isJsonMap),
-        d.matcherFile('test_lib-foo.B.json', isJsonMap),
-        d.matcherFile('test_lib-foo.json', isJsonMap),
-        d.matcherFile('test_lib.A.json', isJsonMap),
-        d.matcherFile('test_lib.B.json', isJsonMap),
-        d.matcherFile('test_lib.C.json', isJsonMap),
-        d.matcherFile('test_lib.json', isJsonMap),
-    ]).validate();
-  });
-}
-
-const _LIBRARY_LIST_UNINDENT_START = '{"libraries":[{"packageName":""';
diff --git a/pkg/docgen/test/inherited_comments_test.dart b/pkg/docgen/test/inherited_comments_test.dart
deleted file mode 100644
index 3f07887..0000000
--- a/pkg/docgen/test/inherited_comments_test.dart
+++ /dev/null
@@ -1,49 +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.
-
-library docgen.test.inherited_comments;
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'util.dart';
-import '../lib/docgen.dart' as dg;
-
-void main() {
-
-  setUp(() {
-    scheduleTempDir();
-  });
-
-  test('inherited comments', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    schedule(() {
-      var path = p.join(d.defaultRoot, 'docs', 'dart-core.Set.json');
-      var dartCoreSetJson = new File(path).readAsStringSync();
-
-      var dartCoreSet = JSON.decode(dartCoreSetJson) as Map<String, dynamic>;
-
-      var toListDetails = dartCoreSet['inheritedMethods']['methods']['toList']
-          as Map<String, dynamic>;
-
-      expect(toListDetails, containsPair('comment', _TO_LIST_COMMENT));
-      expect(toListDetails, containsPair('commentFrom', _TO_LIST_COMMENT_FROM));
-    });
-  });
-}
-
-const _TO_LIST_COMMENT = "<p>Creates a <a>dart:core.List</a> containing the "
-    "elements of this <a>dart:core.Iterable</a>.</p>\n<p>The elements are in "
-    "iteration order. The list is fixed-length\nif "
-    "<a>dart:core.Set.toList.growable</a> is false.</p>";
-const _TO_LIST_COMMENT_FROM = "dart:core.Iterable.toList";
diff --git a/pkg/docgen/test/metadata_test.dart b/pkg/docgen/test/metadata_test.dart
deleted file mode 100644
index 87ea6f5..0000000
--- a/pkg/docgen/test/metadata_test.dart
+++ /dev/null
@@ -1,65 +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.
-
-library async_await_test;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
-import '../lib/src/models/annotation.dart';
-import '../lib/docgen.dart';
-
-const Map<String, String> SOURCES = const <String, String>{
-  'main.dart': '''
-import 'lib.dart' as lib;
-
-@lib.Annotation("foo", 42)
-main() {
-}
-''',
-  'lib.dart': '''
-class Annotation {
-  final String arg1;
-  final int arg2;
-  const Annotation(this.arg1, this.arg2);
-}
-'''};
-
-main() {
-  group('Generate docs for', () {
-    test('files with annotations', () {
-      var temporaryDir = Directory.systemTemp.createTempSync('metadata_');
-      var uris = <Uri>[];
-      SOURCES.forEach((name, code) {
-        var fileName = path.join(temporaryDir.path, name);
-        var file = new File(fileName);
-        file.writeAsStringSync(code);
-        uris.add(new Uri.file(fileName));
-      });
-
-      return getMirrorSystem(uris, false).then((mirrorSystem) {
-        var library = new Library(mirrorSystem.libraries[uris[0]]);
-        expect(library is Library, isTrue);
-
-        var main = library.functions['main'];
-        expect(main is Method, isTrue);
-
-        var annotations = main.annotations;
-        expect(annotations.length, equals(1));
-
-        var annotation = annotations[0];
-        expect(annotation is Annotation, isTrue);
-
-        var map = annotation.toMap();
-        expect(map['name'], equals('lib-dart.Annotation.Annotation-'));
-        expect(map['parameters'].length, equals(2));
-        expect(map['parameters'][0], equals('"foo"'));
-        expect(map['parameters'][1], equals('42'));
-      }).whenComplete(() => temporaryDir.deleteSync(recursive: true));
-    });
-  });
-}
diff --git a/pkg/docgen/test/method_param_test.dart b/pkg/docgen/test/method_param_test.dart
deleted file mode 100644
index a12840e..0000000
--- a/pkg/docgen/test/method_param_test.dart
+++ /dev/null
@@ -1,28 +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.
-
-library docgen.test.method_param;
-
-import 'package:path/path.dart' as path;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'util.dart';
-import '../lib/docgen.dart' as gen;
-
-void main() {
-  test('method function parameters', () {
-    var lib_file = path.toUri(path.join(getMultiLibraryCodePath(), 'lib',
-        'test_lib2.dart'));
-    return gen.getMirrorSystem([lib_file], false)
-      .then((mirrorSystem) {
-        var library = new gen.Library(mirrorSystem.libraries[lib_file]);
-
-        // Test that libraries do recursive exports correctly.
-        var funcParams = library.functions['fooFunc'].parameters;
-        expect('Symbol("dart.core.int")', library.functions['fooFunc']
-            .parameters['fooFuncParam'].functionDeclaration.parameters['x']
-            .type.mirror.qualifiedName.toString());
-      });
-  });
-}
\ No newline at end of file
diff --git a/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart b/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
deleted file mode 100644
index c4357c1..0000000
--- a/pkg/docgen/test/multi_library_code/lib/dottedLibraryName.dart
+++ /dev/null
@@ -1,38 +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.
-
-library library.name.wiith.dots.init;
-
-/// This library is purely for testing purposes, to ensure
-/// that we have a library that has dots in its name and
-/// that it works properly
-///
-/// In addition, it's nice to have something which has paragraph
-/// breaks inside a triple-slash doc comment.
-///
-/// Like this.
-
-/// This is a top level field holding the number three;
-int topLevelInt = 3;
-
-/// This is a class with various ways of getting the number three.
-///
-/// It also has a comment with paragraph breaks.
-class SomeClass {
-  /// This is a method that returns the number three. See
-  /// [three]
-  someMethod() => 3;
-
-  /// This is a symbolic representation of the number three.
-  int three = 3;
-}
-
-/// This is another class.
-class AnotherClass {
-  /// This method returns [List<int>] containing the number
-  /// three three times. Compare with [SomeClass.someMethod].
-  List<int> anotherMethod() {
-    return const [3, 3, 3];
-  }
-}
diff --git a/pkg/docgen/test/multi_library_code/lib/root_lib.dart b/pkg/docgen/test/multi_library_code/lib/root_lib.dart
deleted file mode 100644
index 74423ab..0000000
--- a/pkg/docgen/test/multi_library_code/lib/root_lib.dart
+++ /dev/null
@@ -1,13 +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.
-
-library root_lib;
-
-export 'test_lib.dart';
-export 'test_lib_foo.dart';
-export 'test_lib_bar.dart';
-
-class RootClass {
-  RootClass(int a, int b);
-}
diff --git a/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart b/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart
deleted file mode 100644
index 9755378..0000000
--- a/pkg/docgen/test/multi_library_code/lib/src/src_lib.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-library internal_lib;
-
-part 'src_lib_part.dart';
-
-class InternalLibClass {}
diff --git a/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart b/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart
deleted file mode 100644
index 1f866ed..0000000
--- a/pkg/docgen/test/multi_library_code/lib/src/src_lib_part.dart
+++ /dev/null
@@ -1,3 +0,0 @@
-part of internal_lib;
-
-class InternalLibPart {}
diff --git a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart
deleted file mode 100644
index b1726a9..0000000
--- a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib.dart
+++ /dev/null
@@ -1,5 +0,0 @@
-library sub_lib;
-
-part 'sub_lib_part.dart';
-
-class SubLibClass {}
diff --git a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart b/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart
deleted file mode 100644
index 9698296..0000000
--- a/pkg/docgen/test/multi_library_code/lib/sublib_dir/sub_lib_part.dart
+++ /dev/null
@@ -1,3 +0,0 @@
-part of sub_lib;
-
-class SubLibPart {}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib.dart b/pkg/docgen/test/multi_library_code/lib/test_lib.dart
deleted file mode 100644
index 8d76624..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib.dart
+++ /dev/null
@@ -1,65 +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.
-
-library test_lib;
-
-import 'test_lib_foo.dart';
-import 'test_lib_bar.dart';
-export 'test_lib_foo.dart';
-export 'test_lib_bar.dart';
-
-/**
- * Doc comment for class [A].
- *
- * Multiline Test
- */
-/*
- * Normal comment for class A.
- */
-class A {
-
-  int _someNumber;
-
-  A() {
-    _someNumber = 12;
-  }
-
-  A.customConstructor();
-
-  /**
-   * Test for linking to parameter [A]
-   */
-  void doThis(int A) {
-    print(A);
-  }
-}
-
-// A trivial use of `B` and `C` to eliminate import warnings
-B sampleMethod(C cInstance) {
-  throw new UnimplementedError();
-}
-
-int positionalDefaultValues([
-    int intConst = 42,
-    bool boolConst = true,
-    List listConst = const [true, 42, 'Shanna', null, 3.14, const []],
-    String stringConst = 'Shanna',
-    Map mapConst = const {'a':1, 2: true, 'c': const [1,null,true]},
-    Map emptyMap = const {},
-    int referencedConst = INT_CONST,
-    ConstClass constructedConstant1 = const ConstClass<int>(0, true),
-    ConstClass constructedConstant2 = const ConstClass(1, false, str: "str")]) {
-  throw new UnimplementedError();
-}
-
-const int INT_CONST = 42;
-
-class ConstClass<T> {
-  final bool boolField;
-  final int intField;
-  final String stringField;
-
-  const ConstClass(this.intField, this.boolField, {String str: 'default'})
-      : this.stringField = str;
-}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
deleted file mode 100644
index b28f6d8..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib2.dart
+++ /dev/null
@@ -1,9 +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.
-
-library test_lib2;
-
-export 'test_lib2_foo.dart';
-
-String fooFunc(bool fooFuncParam(int x)) => 'hi';
\ No newline at end of file
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
deleted file mode 100644
index 1a07d2b..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib2_bar.dart
+++ /dev/null
@@ -1,9 +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.
-
-library test_lib2_bar;
-
-class Bar {
-
-}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart b/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
deleted file mode 100644
index 1b3d037..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib2_foo.dart
+++ /dev/null
@@ -1,15 +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.
-
-library test_lib2_foo;
-
-export 'test_lib2_bar.dart';
-
-class Foo {
-
-}
-
-main() {
-  print('hello world');
-}
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
deleted file mode 100644
index 6f36d9b..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib_bar.dart
+++ /dev/null
@@ -1,30 +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.
-
-library test_lib.bar;
-
-import 'test_lib.dart';
-import 'test_lib_foo.dart';
-
-/*
- * Normal comment for class C.
- */
-class C {
-}
-
-/// Processes an [input] of type [C] instance for testing.
-///
-/// To eliminate import warnings for [A] and to test typedefs.
-///
-/// It's important that the [List<A>] for param [listOfA] is not empty.
-A testMethod(C input, List<A> listOfA, B aBee) {
-  throw 'noop';
-}
-
-/// Processes an [input] of type [C] instance for testing.
-///
-/// To eliminate import warnings for [A] and to test typedefs.
-///
-/// It's important that the [List<A>] for param [listOfA] is not empty.
-typedef A testTypedef(C other, List<A> listOfA, B aBee);
diff --git a/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart b/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
deleted file mode 100644
index b615bf6..0000000
--- a/pkg/docgen/test/multi_library_code/lib/test_lib_foo.dart
+++ /dev/null
@@ -1,41 +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.
-
-library test_lib.foo;
-
-import 'test_lib.dart';
-
-/**
- * Doc comment for class [B].
- *
- * Multiline Test
- */
-
-/*
- * Normal comment for class B.
- */
-class B extends A {
-
-  B();
-  B.fooBar();
-
-  /**
-   * Test for linking to super
-   */
-  int doElse(int b) {
-    print(b);
-    return b;
-  }
-
-  /**
-   * Test for linking to parameter [c]
-   */
-  void doThis(int c) {
-    print(c);
-  }
-}
-
-int testFunc(int a) {
-  return a;
-}
diff --git a/pkg/docgen/test/multi_library_test.dart b/pkg/docgen/test/multi_library_test.dart
deleted file mode 100644
index ceda276..0000000
--- a/pkg/docgen/test/multi_library_test.dart
+++ /dev/null
@@ -1,106 +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.
-
-library single_library_test;
-
-import 'package:path/path.dart' as p;
-import 'package:unittest/unittest.dart';
-
-import '../lib/docgen.dart';
-import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
-
-import 'util.dart';
-
-List<Uri> _writeLibFiles() {
-  var codePath = getMultiLibraryCodePath();
-
-  codePath = p.join(codePath, 'lib');
-
-  return ['test_lib.dart', 'test_lib_bar.dart', 'test_lib_foo.dart']
-      .map((name) => p.join(codePath, name))
-      .map(p.toUri)
-      .toList();
-}
-
-void main() {
-  group('Generate docs for', () {
-    test('multiple libraries.', () {
-      var files = _writeLibFiles();
-      return getMirrorSystem(files, false)
-        .then((mirrorSystem) {
-          var test_libraryUri = files[0];
-          var library = new Library(mirrorSystem.libraries[test_libraryUri]);
-
-          /// Testing fixReference
-          // Testing Doc comment for class [B].
-          var libraryMirror = mirrorSystem.libraries[test_libraryUri];
-          var classDocComment = library.fixReference('B').children.first.text;
-          expect(classDocComment, 'test_lib.B');
-
-          // Test for linking to parameter [c]
-          var importedLib = libraryMirror.libraryDependencies.firstWhere(
-            (dep) => dep.isImport).targetLibrary;
-          var aClassMirror =
-              dart2js_util.classesOf(importedLib.declarations).first;
-          expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'test_lib.foo.B');
-          var exportedClass = getDocgenObject(aClassMirror, library);
-          expect(exportedClass is Class, isTrue);
-
-
-          var method = exportedClass.methods['doThis'];
-          expect(method is Method, isTrue);
-          var methodParameterDocComment = method.fixReference(
-              'c').children.first.text;
-          expect(methodParameterDocComment, 'test_lib.B.doThis.c');
-
-
-          expect(method.fixReference('A').children.first.text, 'test_lib.A');
-          // Testing trying to refer to doThis function
-          expect(method.fixReference('doThis').children.first.text,
-              'test_lib.B.doThis');
-
-          // Testing trying to refer to doThis function
-          expect(method.fixReference('doElse').children.first.text,
-              'test_lib.B.doElse');
-
-
-          // Test a third library referencing another exported library in a
-          // separate file.
-          importedLib = libraryMirror.libraryDependencies.firstWhere(
-            (dep) => dep.isImport &&
-                     dart2js_util.qualifiedNameOf(dep.targetLibrary) ==
-            'test_lib.bar').targetLibrary;
-          aClassMirror = dart2js_util.classesOf(importedLib.declarations).first;
-          expect(dart2js_util.qualifiedNameOf(aClassMirror),
-                 'test_lib.bar.C');
-          exportedClass = getDocgenObject(aClassMirror, library);
-          expect(exportedClass is Class, isTrue);
-          expect(exportedClass.docName, 'test_lib.C');
-
-          methodParameterDocComment = exportedClass.fixReference(
-              'B').children.first.text;
-          expect(methodParameterDocComment, 'test_lib.B');
-
-          methodParameterDocComment = exportedClass.fixReference(
-              'testFunc').children.first.text;
-          expect(methodParameterDocComment, 'test_lib.testFunc');
-
-        });
-    });
-
-    test('multiple exported libraries.', () {
-      var lib_file = p.toUri(p.join(getMultiLibraryCodePath(), 'lib',
-          'test_lib2.dart'));
-      return getMirrorSystem([lib_file], false)
-        .then((mirrorSystem) {
-          var library = new Library(mirrorSystem.libraries[lib_file]);
-
-          // Test that libraries do recursive exports correctly.
-          expect(true, library.classes.keys.contains('Bar'));
-        });
-
-    });
-  });
-}
diff --git a/pkg/docgen/test/native_extensions_test.dart b/pkg/docgen/test/native_extensions_test.dart
deleted file mode 100644
index 70e789c..0000000
--- a/pkg/docgen/test/native_extensions_test.dart
+++ /dev/null
@@ -1,100 +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.
-
-library native_extensions_test;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
-import '../lib/docgen.dart';
-
-const String DART_LIBRARY = '''
-  library sample_synchronous_extension;
-
-  import 'dart-ext:sample_extension';
-
-  // The simplest way to call native code: top-level functions.
-  int systemRand() native "SystemRand";
-  bool systemSrand(int seed) native "SystemSrand";
-
-  void main() {
-    systemRand();
-    systemSrand(4);
-  }
-''';
-
-main() {
-  group('Generate docs for', () {
-    test('file with native extensions.', () {
-      var temporaryDir = Directory.systemTemp.createTempSync('native_ext_');
-      var fileName = path.join(temporaryDir.path, 'temp.dart');
-      var file = new File(fileName);
-      file.writeAsStringSync(DART_LIBRARY);
-
-      return getMirrorSystem([new Uri.file(fileName)], false)
-        .then((mirrorSystem) {
-          var testLibraryUri = new Uri.file(path.absolute(fileName),
-                                            windows: Platform.isWindows);
-          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
-          expect(library is Library, isTrue);
-
-          var classTypes = library.classes;
-          var classes = [];
-          classes.addAll(classTypes.values);
-          classes.addAll(library.errors.values);
-          expect(classes.every((e) => e is Class), isTrue);
-
-          expect(library.typedefs.values.every((e) => e is Typedef), isTrue);
-
-          var classMethodTypes = [];
-          classes.forEach((e) {
-            classMethodTypes.add(e.methods);
-            classMethodTypes.add(e.inheritedMethods);
-          });
-          expect(classMethodTypes.every((e) => e is Map<String, Method>),
-                 isTrue);
-
-          var classMethods = [];
-          classMethodTypes.forEach((e) {
-            classMethods.addAll(e.values);
-          });
-          expect(classMethods.every((e) => e is Method), isTrue);
-
-          var methodParameters = [];
-          classMethods.forEach((e) {
-            methodParameters.addAll(e.parameters.values);
-          });
-          expect(methodParameters.every((e) => e is Parameter), isTrue);
-
-          var functionTypes = library.functions;
-          expect(functionTypes is Map<String, Method>, isTrue);
-
-          var functions = [];
-          functions.addAll(functionTypes.values);
-          expect(functions.every((e) => e is Method), isTrue);
-
-          var functionParameters = [];
-          functions.forEach((e) {
-            functionParameters.addAll(e.parameters.values);
-          });
-          expect(functionParameters.every((e) => e is Parameter), isTrue);
-
-          var variables = library.variables.values;
-          expect(variables.every((e) => e is Variable), isTrue);
-
-          // Testing trying to refer to m1 function
-          var libraryDocComment =
-              library.fixReference('systemRand').children.first.text;
-          expect(libraryDocComment, 'sample_synchronous_extension.systemRand');
-
-          libraryDocComment =
-              library.fixReference('systemSrand').children.first.text;
-          expect(libraryDocComment, 'sample_synchronous_extension.systemSrand');
-        }).whenComplete(() => temporaryDir.deleteSync(recursive: true));
-    });
-  });
-}
diff --git a/pkg/docgen/test/only_lib_content_in_pkg_test.dart b/pkg/docgen/test/only_lib_content_in_pkg_test.dart
deleted file mode 100644
index b4ec488..0000000
--- a/pkg/docgen/test/only_lib_content_in_pkg_test.dart
+++ /dev/null
@@ -1,51 +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.
-
-library docgen.test.only_lib_content_in_pkg;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import '../lib/docgen.dart' as dg;
-import 'util.dart';
-
-void main() {
-
-  setUp(() {
-    scheduleTempDir();
-  });
-
-  test('exclude non-lib code from package docs', () {
-    schedule(() {
-      var thisScript = Platform.script;
-      var thisPath = p.fromUri(thisScript);
-      expect(p.basename(thisPath), 'only_lib_content_in_pkg_test.dart');
-      expect(p.dirname(thisPath), endsWith('test'));
-
-      var packageRoot = Platform.packageRoot;
-      if (packageRoot == '') packageRoot = null;
-
-      var codeDir = p.normalize(p.join(thisPath, '..', '..'));
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen(['$codeDir/'], out: p.join(d.defaultRoot, 'docs'),
-          packageRoot: packageRoot);
-    });
-
-    d.dir('docs', [
-        d.dir('docgen', [
-          d.matcherFile('docgen.json',  isJsonMap)
-        ]),
-        d.matcherFile('index.json', isJsonMap),
-        d.matcherFile('index.txt', hasSortedLines),
-        d.matcherFile('library_list.json', isJsonMap),
-        d.nothing('test_lib.json'),
-        d.nothing('test_lib-bar.json'),
-        d.nothing('test_lib-foo.json')
-    ]).validate();
-
-  });
-}
diff --git a/pkg/docgen/test/single_library_test.dart b/pkg/docgen/test/single_library_test.dart
deleted file mode 100644
index 31f3a5e..0000000
--- a/pkg/docgen/test/single_library_test.dart
+++ /dev/null
@@ -1,131 +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.
-
-library single_library_test;
-
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-import '../lib/src/exports/mirrors_util.dart' as dart2js_util;
-import '../lib/docgen.dart';
-
-const String DART_LIBRARY = '''
-  library test;
-  /**
-   * Doc comment for class [A].
-   *
-   * Multiline Test
-   */
-  /*
-   * Normal comment for class A.
-   */
-  class A {
-
-    int _someNumber;
-
-    A() {
-      _someNumber = 12;
-    }
-
-    /**
-     * Test for linking to parameter [A]
-     */
-    void doThis(int A) {
-      print(A);
-    }
-  }
-
-  main() {
-    A a = new A();
-    a.doThis(5);
-  }
-''';
-
-main() {
-  group('Generate docs for', () {
-    test('one simple file.', () {
-      var temporaryDir = Directory.systemTemp.createTempSync('single_library_');
-      var fileName = path.join(temporaryDir.path, 'temp.dart');
-      var file = new File(fileName);
-      file.writeAsStringSync(DART_LIBRARY);
-
-      return getMirrorSystem([new Uri.file(fileName)], false)
-        .then((mirrorSystem) {
-          var testLibraryUri = new Uri.file(path.absolute(fileName),
-                                            windows: Platform.isWindows);
-          var library = new Library(mirrorSystem.libraries[testLibraryUri]);
-          expect(library is Library, isTrue);
-
-          var classTypes = library.classes;
-          var classes = [];
-          classes.addAll(classTypes.values);
-          classes.addAll(library.errors.values);
-          expect(classes.every((e) => e is Class), isTrue);
-
-          expect(library.typedefs.values.every((e) => e is Typedef), isTrue);
-
-          var classMethodTypes = [];
-          classes.forEach((e) {
-            classMethodTypes.add(e.methods);
-            classMethodTypes.add(e.inheritedMethods);
-          });
-          expect(classMethodTypes.every((e) => e is Map<String, Method>), isTrue);
-
-          var classMethods = [];
-          classMethodTypes.forEach((e) {
-            classMethods.addAll(e.values);
-          });
-          expect(classMethods.every((e) => e is Method), isTrue);
-
-          var methodParameters = [];
-          classMethods.forEach((e) {
-            methodParameters.addAll(e.parameters.values);
-          });
-          expect(methodParameters.every((e) => e is Parameter), isTrue);
-
-          var functionTypes = library.functions;
-          expect(functionTypes is Map<String, Method>, isTrue);
-
-          var functions = [];
-          functions.addAll(functionTypes.values);
-          expect(functions.every((e) => e is Method), isTrue);
-
-          var functionParameters = [];
-          functions.forEach((e) {
-            functionParameters.addAll(e.parameters.values);
-          });
-          expect(functionParameters.every((e) => e is Parameter), isTrue);
-
-          var variables = library.variables.values;
-          expect(variables.every((e) => e is Variable), isTrue);
-
-          /// Testing fixReference
-          // Testing Doc comment for class [A].
-          var libraryMirror = mirrorSystem.libraries[testLibraryUri];
-          var classMirror =
-              dart2js_util.classesOf(libraryMirror.declarations).first;
-          var classDocComment = library.fixReference('A').children.first.text;
-          expect(classDocComment, 'test.A');
-
-          // Test for linking to parameter [A]
-          var method = getDocgenObject(
-              classMirror.declarations[dart2js_util.symbolOf('doThis')]);
-          var methodParameterDocComment = method.fixReference(
-              'A').children.first.text;
-          expect(methodParameterDocComment, 'test.A.doThis.A');
-
-          // Testing trying to refer to doThis function
-          var methodDocComment = method.fixReference(
-              'doThis').children.first.text;
-          expect(methodDocComment, 'test.A.doThis');
-
-          // Testing something with no reference
-          var libraryDocComment = method.fixReference('foobar').text;
-          expect(libraryDocComment, 'foobar');
-        }).whenComplete(() => temporaryDir.deleteSync(recursive: true));
-    });
-  });
-}
diff --git a/pkg/docgen/test/typedef_test.dart b/pkg/docgen/test/typedef_test.dart
deleted file mode 100644
index 7a1e217..0000000
--- a/pkg/docgen/test/typedef_test.dart
+++ /dev/null
@@ -1,105 +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.
-
-library docgen.test.typedef;
-
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-import 'util.dart';
-import '../lib/docgen.dart' as dg;
-
-void main() {
-  setUp(() {
-    scheduleTempDir();
-  });
-
-  test('typedef gen', () {
-    schedule(() {
-      var codeDir = getMultiLibraryCodePath();
-      expect(FileSystemEntity.isDirectorySync(codeDir), isTrue);
-      return dg.docgen([codeDir], out: p.join(d.defaultRoot, 'docs'));
-    });
-
-    schedule(() {
-      var path = p.join(d.defaultRoot, 'docs', 'root_lib.json');
-      var rootLibJson = new File(path).readAsStringSync();
-
-      var rootLib = JSON.decode(rootLibJson) as Map<String, dynamic>;
-
-      //
-      // Validate function doc references
-      //
-      //var testMethod =
-      //    rootLib['functions']['methods']['testMethod'] as Map<String, dynamic>;
-
-      // test commented out
-      // TODO: figure out why test is failing after upgrade to markdown 0.7.2
-      // Expected: '<p>Processes an <a>root_lib.testMethod.input</a> of type <a>root_lib.C</a> instance for testing.</p>\n'
-      //  '<p>To eliminate import warnings for <a>root_lib.A</a> and to test typedefs.</p>\n'
-      //  '<p>It\'s important that the <a>dart:core</a>&lt;A> for param <a>root_lib.testMethod.listOfA</a> is not empty.</p>'
-      // Actual: '<p>Processes an <a>root_lib.testMethod.input</a> of type <a>root_lib.C</a> instance for testing.</p>\n'
-      //  '<p>To eliminate import warnings for <a>root_lib.A</a> and to test typedefs.</p>\n'
-      //  '<p>It\'s important that the List<A> for param <a>root_lib.testMethod.listOfA</a> is not empty.</p>'
-      //   Which: is different.
-      // Expected: ...  that the <a>dart:co ...
-      // Actual: ...  that the List<A> fo ...
-      //                     ^
-      // Differ at offset 210
-      //
-      // expect(testMethod['comment'], _TEST_METHOD_COMMENT);
-
-//      var classes = rootLib['classes'] as Map<String, dynamic>;
-//
-//      expect(classes, hasLength(3));
-//
-//      expect(classes['class'], isList);
-//      expect(classes['error'], isList);
-//
-//      var typeDefs = classes['typedef'] as Map<String, dynamic>;
-//      var comparator = typeDefs['testTypedef'] as Map<String, dynamic>;
-//
-//      expect(comparator['preview'], _TEST_TYPEDEF_PREVIEW);
-//
-//      expect(comparator['comment'], _TEST_TYPEDEF_COMMENT);
-    });
-
-    schedule(() {
-      var path = p.join(d.defaultRoot, 'docs', 'root_lib.RootClass.json');
-      var rootClassJson = new File(path).readAsStringSync();
-
-      var rootClass = JSON.decode(rootClassJson) as Map<String, dynamic>;
-
-      var defaultCtor = rootClass['methods']['constructors'][''] as Map;
-
-      expect(defaultCtor['qualifiedName'], 'root_lib.RootClass.RootClass-');
-    });
-  });
-}
-
-// TOOD: [List<A>] is not formatted correctly - issue 16771
-const _TEST_METHOD_COMMENT = '<p>Processes an '
-    '<a>root_lib.testMethod.input</a> of type <a>root_lib.C</a> '
-    'instance for testing.</p>\n<p>To eliminate import warnings for '
-    '<a>root_lib.A</a> and to test typedefs.</p>\n<p>It\'s important that the'
-    ' <a>dart:core</a>&lt;A> for param <a>root_lib.testMethod.listOfA</a> '
-    'is not empty.</p>';
-
-// TODO: [input] is not turned into a param refenece
-// TODO(kevmoo): <a>test_lib.C</a> should be <a>root_lib.C</a> - Issues 18352
-const _TEST_TYPEDEF_PREVIEW = '<p>Processes an input of type '
-    '<a>test_lib.C</a> instance for testing.</p>';
-
-// TOOD: [List<A>] is not formatted correctly - issue 16771
-// TODO: [listOfA] is not turned into a param reference
-// TODO(kevmoo): <a>test_lib.C</a> should be <a>root_lib.C</a> - Issues 18352
-final _TEST_TYPEDEF_COMMENT = _TEST_TYPEDEF_PREVIEW +
-    '\n<p>To eliminate import'
-    ' warnings for <a>test_lib.A</a> and to test typedefs.</p>\n<p>It\'s '
-    'important that the <a>dart:core</a>&lt;A> for param listOfA is not '
-    'empty.</p>';
diff --git a/pkg/docgen/test/util.dart b/pkg/docgen/test/util.dart
deleted file mode 100644
index 3f7f2ed..0000000
--- a/pkg/docgen/test/util.dart
+++ /dev/null
@@ -1,54 +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.
-
-library docgen.test.util;
-
-import 'dart:convert';
-import 'dart:io';
-import 'package:path/path.dart' as p;
-import 'package:scheduled_test/descriptor.dart' as d;
-import 'package:scheduled_test/scheduled_test.dart';
-
-void scheduleTempDir() {
-  var tempDir;
-  schedule(() {
-    return Directory.systemTemp
-        .createTemp('docgen_test-')
-        .then((dir) {
-      tempDir = dir;
-      d.defaultRoot = tempDir.path;
-    });
-  });
-
-  currentSchedule.onComplete.schedule(() {
-    d.defaultRoot = null;
-    return tempDir.delete(recursive: true);
-  });
-}
-
-String getMultiLibraryCodePath() {
-  var currentScript = p.fromUri(Platform.script);
-  var codeDir = p.join(p.dirname(currentScript), 'multi_library_code');
-
-  assert(FileSystemEntity.isDirectorySync(codeDir));
-
-  return codeDir;
-}
-
-final Matcher hasSortedLines = predicate((String input) {
-  var lines = new LineSplitter().convert(input);
-
-  var sortedLines = new List.from(lines)..sort();
-
-  var orderedMatcher = orderedEquals(sortedLines);
-  return orderedMatcher.matches(lines, {});
-}, 'String has sorted lines');
-
-final Matcher isJsonMap = predicate((input) {
-  try {
-    return JSON.decode(input) is Map;
-  } catch (e) {
-    return false;
-  }
-}, 'Output is JSON encoded Map');
diff --git a/pkg/js_ast/lib/src/template.dart b/pkg/js_ast/lib/src/template.dart
index 632f273..34ad972 100644
--- a/pkg/js_ast/lib/src/template.dart
+++ b/pkg/js_ast/lib/src/template.dart
@@ -765,7 +765,6 @@
     int before = count;
     node.visitChildren(this);
     if (count != before) containsInterpolatedNode.add(node);
-    return null;
   }
 
   visitInterpolatedNode(InterpolatedNode node) {
diff --git a/pkg/pkg.status b/pkg/pkg.status
index ef4d6f7d..71af314 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -170,30 +170,4 @@
 analyzer/test/*: PubGetError
 
 [ $compiler == dart2js && $cps_ir ]
-analyzer/test/enum_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/all_the_rest_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/ast_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/compile_time_error_code_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/element_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/incremental_resolver_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/incremental_scanner_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/non_error_resolver_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/parser_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/resolver_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/scanner_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/source_factory_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/static_type_warning_code_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/static_warning_code_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/generated/utilities_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/source/package_map_provider_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/context/cache_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/context/context_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/dart_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/dart_work_manager_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/driver_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/general_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/html_work_manager_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/inputs_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/manager_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
-analyzer/test/src/task/model_test: Crash # (Iterable<JavaFile> ...  cannot handle sync*/async* functions
 lookup_map/test/lookup_map_test: RuntimeError # $async$temp1.get$tests is not a function
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 702a8a2..7e11163 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -751,23 +751,25 @@
   result = Dart_SetEnvironmentCallback(EnvironmentCallback);
   CHECK_RESULT(result);
 
-  // Load the script.
-  result = DartUtils::LoadScript(script_uri, builtin_lib);
-  CHECK_RESULT(result);
+  if (!has_run_precompiled_snapshot) {
+    // Load the script.
+    result = DartUtils::LoadScript(script_uri, builtin_lib);
+    CHECK_RESULT(result);
 
-  // Run event-loop and wait for script loading to complete.
-  result = Dart_RunLoop();
-  CHECK_RESULT(result);
+    // Run event-loop and wait for script loading to complete.
+    result = Dart_RunLoop();
+    CHECK_RESULT(result);
 
-  if (isolate_data->load_async_id >= 0) {
-    Dart_TimelineAsyncEnd("LoadScript", isolate_data->load_async_id);
+    if (isolate_data->load_async_id >= 0) {
+      Dart_TimelineAsyncEnd("LoadScript", isolate_data->load_async_id);
+    }
+
+    Platform::SetPackageRoot(package_root);
+
+    result = DartUtils::SetupIOLibrary(script_uri);
+    CHECK_RESULT(result);
   }
 
-  Platform::SetPackageRoot(package_root);
-
-  result = DartUtils::SetupIOLibrary(script_uri);
-  CHECK_RESULT(result);
-
   // Make the isolate runnable so that it is ready to handle messages.
   Dart_ExitScope();
   Dart_ExitIsolate();
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index 34d5715..8697e65 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -146,9 +146,16 @@
       return;
     }
     // HTTP based service request.
-    var client = new HttpRequestClient(request, _service);
-    var message = new Message.fromUri(client, request.uri);
-    client.onMessage(null, message);
+    try {
+      var client = new HttpRequestClient(request, _service);
+      var message = new Message.fromUri(client, request.uri);
+      client.onMessage(null, message);
+    } catch (e) {
+      print('Unexpected error processing HTTP request uri: '
+            '${request.uri}\n$e\n');
+      rethrow;
+    }
+
   }
 
   Future startup() {
diff --git a/runtime/include/dart_tools_api.h b/runtime/include/dart_tools_api.h
index 2ba982c..0ed7cd2 100644
--- a/runtime/include/dart_tools_api.h
+++ b/runtime/include/dart_tools_api.h
@@ -890,7 +890,10 @@
 /** Timeline stream for isolate events */
 #define DART_TIMELINE_STREAM_ISOLATE (1 << 4)
 
-/** Enable all timeline stream recording */
+/** Timeline stream for VM events */
+#define DART_TIMELINE_STREAM_VM (1 << 5)
+
+/** Enable all timeline stream recording for an isolate */
 #define DART_TIMELINE_STREAM_ALL (DART_TIMELINE_STREAM_API |                   \
                                   DART_TIMELINE_STREAM_COMPILER |              \
                                   DART_TIMELINE_STREAM_EMBEDDER |              \
@@ -909,6 +912,19 @@
  */
 DART_EXPORT void Dart_TimelineSetRecordedStreams(int64_t stream_mask);
 
+
+/**
+ * Start recording timeline events for the entire VM (including all isolates).
+ *
+ * NOTE: When enabled, the global flag, will override the per-isolate flag.
+ *
+ * \param stream_mask A bitmask of streams that should be recorded.
+ *
+ * NOTE: Calling with 0 disables recording of all streams.
+ */
+DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask);
+
+
 typedef enum {
   /** Indicates a new stream is being output */
   Dart_StreamConsumer_kStart = 0,
@@ -960,6 +976,23 @@
 DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer,
                                        void* user_data);
 
+
+/**
+ * Get the timeline for entire VM (including all isolates).
+ *
+ * NOTE: The timeline retrieved from this API call may not include the most
+ * recent events.
+ *
+ * \param consumer A Dart_StreamConsumer.
+ * \param user_data User data passed into consumer.
+ *
+ * NOTE: The trace-event format is documented here: https://goo.gl/hDZw5M
+ *
+ * \return True if a stream was output.
+ */
+DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer,
+                                             void* user_data);
+
 /**
  * Add a duration timeline event to the embedder stream for the current isolate.
  *
diff --git a/runtime/lib/invocation_mirror_patch.dart b/runtime/lib/invocation_mirror_patch.dart
index cc820cb..09b6827 100644
--- a/runtime/lib/invocation_mirror_patch.dart
+++ b/runtime/lib/invocation_mirror_patch.dart
@@ -80,7 +80,7 @@
       int numPositionalArguments = _argumentsDescriptor[1] - 1;
       int numNamedArguments = numArguments - numPositionalArguments;
       if (numNamedArguments == 0) {
-        return _namedArguments = const <Symbol, dynamic>{};
+        return _namedArguments = const {};
       }
       _namedArguments = new Map<Symbol, dynamic>();
       for (int i = 0; i < numNamedArguments; i++) {
diff --git a/runtime/lib/isolate_patch.dart b/runtime/lib/isolate_patch.dart
index 51b7ac0..daaaf97 100644
--- a/runtime/lib/isolate_patch.dart
+++ b/runtime/lib/isolate_patch.dart
@@ -309,13 +309,15 @@
   /* patch */ static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message,
       {bool paused: false,
-       bool checked,
-       Uri packageRoot,
-       Map<String, Uri> packages,
-       bool errorsAreFatal,
        SendPort onExit,
-       SendPort onError}) {
+       SendPort onError,
+       bool errorsAreFatal,
+       bool checked,
+       Map<String, String> environment,
+       Uri packageRoot,
+       Map<String, Uri> packages}) {
     RawReceivePort readyPort;
+    if (environment != null) throw new UnimplementedError("environment");
     try {
       // The VM will invoke [_startIsolate] and not `main`.
       // TODO: Handle [packages].
diff --git a/runtime/observatory/lib/src/app/analytics.dart b/runtime/observatory/lib/src/app/analytics.dart
index cb6a91f..8f09f61 100644
--- a/runtime/observatory/lib/src/app/analytics.dart
+++ b/runtime/observatory/lib/src/app/analytics.dart
@@ -7,7 +7,7 @@
 class Analytics {
   static final _UA = 'UA-26406144-17';
   static final _name = 'Observatory';
-  static final _version = '1.11';
+  static final _version = const String.fromEnvironment('OBS_VER');
   static final _googleAnalytics = new AnalyticsHtml(_UA, _name, _version);
 
   static initialize() {
diff --git a/runtime/observatory/tests/service/get_isolate_rpc_test.dart b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
index f45caf3..5cc4a63 100644
--- a/runtime/observatory/tests/service/get_isolate_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_isolate_rpc_test.dart
@@ -46,6 +46,17 @@
     }
     expect(caughtException, isTrue);
   },
+
+  // Plausible isolate id, not found.
+  (VM vm) async {
+    var params = {
+      'isolateId': 'isolates/9999999999',
+    };
+    var result = await vm.invokeRpcNoUpgrade('getIsolate', params);
+    expect(result['type'], equals('Sentinel'));
+    expect(result['kind'], equals('Collected'));
+    expect(result['valueAsString'], equals('<collected>'));
+  },
 ];
 
 main(args) async => runVMTests(args, tests);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 7f82dcb..dabc8b2 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -29,6 +29,9 @@
 cc/ThreadInterrupterMedium: Skip
 cc/ThreadInterrupterLow: Skip
 cc/Service_Profile: Skip
+cc/Dart2JSCompilerStats: Skip
+cc/CorelibCompilerStats: Skip
+
 
 [ $system == linux ]
 cc/ThreadInterrupterHigh: Skip
diff --git a/runtime/vm/assembler.cc b/runtime/vm/assembler.cc
index 5fe8c2f..4e1eca9 100644
--- a/runtime/vm/assembler.cc
+++ b/runtime/vm/assembler.cc
@@ -242,8 +242,9 @@
 }
 
 
-intptr_t ObjectPoolWrapper::AddObject(const Object& obj) {
-  return AddObject(ObjectPool::Entry(&obj), kNotPatchable);
+intptr_t ObjectPoolWrapper::AddObject(const Object& obj,
+                                      Patchability patchable) {
+  return AddObject(ObjectPool::Entry(&obj), patchable);
 }
 
 
@@ -264,14 +265,6 @@
 }
 
 
-intptr_t ObjectPoolWrapper::AddExternalLabel(const ExternalLabel* label,
-                                             Patchability patchable) {
-  return AddObject(ObjectPool::Entry(label->address(),
-                                     ObjectPool::kExternalLabel),
-                   patchable);
-}
-
-
 intptr_t ObjectPoolWrapper::FindObject(ObjectPool::Entry entry,
                                        Patchability patchable) {
   // If the object is not patchable, check if we've already got it in the
@@ -287,8 +280,9 @@
 }
 
 
-intptr_t ObjectPoolWrapper::FindObject(const Object& obj) {
-  return FindObject(ObjectPool::Entry(&obj), kNotPatchable);
+intptr_t ObjectPoolWrapper::FindObject(const Object& obj,
+                                       Patchability patchable) {
+  return FindObject(ObjectPool::Entry(&obj), patchable);
 }
 
 
@@ -298,14 +292,6 @@
 }
 
 
-intptr_t ObjectPoolWrapper::FindExternalLabel(const ExternalLabel* label,
-                                              Patchability patchable) {
-  return FindObject(ObjectPool::Entry(label->address(),
-                                      ObjectPool::kExternalLabel),
-                    patchable);
-}
-
-
 intptr_t ObjectPoolWrapper::FindNativeEntry(const ExternalLabel* label,
                                             Patchability patchable) {
   return FindObject(ObjectPool::Entry(label->address(),
diff --git a/runtime/vm/assembler.h b/runtime/vm/assembler.h
index 3f4d5ea..c414c0d 100644
--- a/runtime/vm/assembler.h
+++ b/runtime/vm/assembler.h
@@ -287,15 +287,13 @@
 
 class ObjectPoolWrapper : public ValueObject {
  public:
-  intptr_t AddObject(const Object& obj);
+  intptr_t AddObject(const Object& obj,
+                     Patchability patchable = kNotPatchable);
   intptr_t AddImmediate(uword imm);
-  intptr_t AddExternalLabel(const ExternalLabel* label,
-                            Patchability patchable);
 
-  intptr_t FindObject(const Object& obj);
+  intptr_t FindObject(const Object& obj,
+                      Patchability patchable = kNotPatchable);
   intptr_t FindImmediate(uword imm);
-  intptr_t FindExternalLabel(const ExternalLabel* label,
-                             Patchability patchable);
   intptr_t FindNativeEntry(const ExternalLabel* label,
                            Patchability patchable);
 
@@ -312,6 +310,12 @@
   DirectChainedHashMap<ObjIndexPair> object_pool_index_table_;
 };
 
+
+enum RestorePP {
+  kRestoreCallerPP,
+  kKeepCalleePP
+};
+
 }  // namespace dart
 
 
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index afb5744..0334d76 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1534,34 +1534,64 @@
 // Uses a code sequence that can easily be decoded.
 void Assembler::LoadWordFromPoolOffset(Register rd,
                                        int32_t offset,
+                                       Register pp,
                                        Condition cond) {
-  ASSERT(constant_pool_allowed());
-  ASSERT(rd != PP);
+  ASSERT((pp != PP) || constant_pool_allowed());
+  ASSERT(rd != pp);
   int32_t offset_mask = 0;
   if (Address::CanHoldLoadOffset(kWord, offset, &offset_mask)) {
-    ldr(rd, Address(PP, offset), cond);
+    ldr(rd, Address(pp, offset), cond);
   } else {
     int32_t offset_hi = offset & ~offset_mask;  // signed
     uint32_t offset_lo = offset & offset_mask;  // unsigned
-    // Inline a simplified version of AddImmediate(rd, PP, offset_hi).
+    // Inline a simplified version of AddImmediate(rd, pp, offset_hi).
     Operand o;
     if (Operand::CanHold(offset_hi, &o)) {
-      add(rd, PP, o, cond);
+      add(rd, pp, o, cond);
     } else {
       LoadImmediate(rd, offset_hi, cond);
-      add(rd, PP, Operand(rd), cond);
+      add(rd, pp, Operand(rd), cond);
     }
     ldr(rd, Address(rd, offset_lo), cond);
   }
 }
 
+void Assembler::CheckCodePointer() {
+#ifdef DEBUG
+  Label cid_ok, instructions_ok;
+  Push(R0);
+  Push(IP);
+  CompareClassId(CODE_REG, kCodeCid, R0);
+  b(&cid_ok, EQ);
+  bkpt(0);
+  Bind(&cid_ok);
 
-void Assembler::LoadPoolPointer() {
-  const intptr_t object_pool_pc_dist =
-     Instructions::HeaderSize() - Instructions::object_pool_offset() +
-     CodeSize() + Instr::kPCReadOffset;
-  LoadFromOffset(kWord, PP, PC, -object_pool_pc_dist);
-  set_constant_pool_allowed(true);
+  const intptr_t offset = CodeSize() + Instr::kPCReadOffset +
+      Instructions::HeaderSize() - kHeapObjectTag;
+  mov(R0, Operand(PC));
+  AddImmediate(R0, R0, -offset);
+  ldr(IP, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
+  cmp(R0, Operand(IP));
+  b(&instructions_ok, EQ);
+  bkpt(1);
+  Bind(&instructions_ok);
+  Pop(IP);
+  Pop(R0);
+#endif
+}
+
+
+void Assembler::RestoreCodePointer() {
+  ldr(CODE_REG, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  CheckCodePointer();
+}
+
+
+void Assembler::LoadPoolPointer(Register reg) {
+  // Load new pool pointer.
+  CheckCodePointer();
+  ldr(reg, FieldAddress(CODE_REG, Code::object_pool_offset()));
+  set_constant_pool_allowed(reg == PP);
 }
 
 
@@ -1570,54 +1600,67 @@
 }
 
 
+bool Assembler::CanLoadFromObjectPool(const Object& object) const {
+  ASSERT(!Thread::CanLoadFromThread(object));
+  if (!constant_pool_allowed()) {
+    return false;
+  }
+
+  ASSERT(object.IsNotTemporaryScopedHandle());
+  ASSERT(object.IsOld());
+  return true;
+}
+
+
 void Assembler::LoadObjectHelper(Register rd,
                                  const Object& object,
                                  Condition cond,
-                                 bool is_unique) {
+                                 bool is_unique,
+                                 Register pp) {
   // Load common VM constants from the thread. This works also in places where
   // no constant pool is set up (e.g. intrinsic code).
   if (Thread::CanLoadFromThread(object)) {
+    // Load common VM constants from the thread. This works also in places where
+    // no constant pool is set up (e.g. intrinsic code).
     ldr(rd, Address(THR, Thread::OffsetFromThread(object)), cond);
-    return;
-  }
-  // Smis and VM heap objects are never relocated; do not use object pool.
-  if (object.IsSmi()) {
+  } else if (object.IsSmi()) {
+    // Relocation doesn't apply to Smis.
     LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()), cond);
-  } else if (object.InVMHeap() || !constant_pool_allowed()) {
-    ASSERT(FLAG_allow_absolute_addresses);
-    // Make sure that class CallPattern is able to decode this load immediate.
-    const int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
-    LoadImmediate(rd, object_raw, cond);
-  } else {
+  } else if (CanLoadFromObjectPool(object)) {
     // Make sure that class CallPattern is able to decode this load from the
     // object pool.
     const int32_t offset = ObjectPool::element_offset(
        is_unique ? object_pool_wrapper_.AddObject(object)
                  : object_pool_wrapper_.FindObject(object));
-    LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, cond);
+    LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
+  } else {
+    ASSERT(FLAG_allow_absolute_addresses);
+    ASSERT(object.IsOld());
+    // Make sure that class CallPattern is able to decode this load immediate.
+    const int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
+    LoadImmediate(rd, object_raw, cond);
   }
 }
 
 
 void Assembler::LoadObject(Register rd, const Object& object, Condition cond) {
-  LoadObjectHelper(rd, object, cond, false);
+  LoadObjectHelper(rd, object, cond, /* is_unique = */ false, PP);
 }
 
 
 void Assembler::LoadUniqueObject(Register rd,
                                  const Object& object,
                                  Condition cond) {
-  LoadObjectHelper(rd, object, cond, true);
+  LoadObjectHelper(rd, object, cond, /* is_unique = */ true, PP);
 }
 
 
-void Assembler::LoadExternalLabel(Register rd,
-                                  const ExternalLabel* label,
-                                  Patchability patchable,
-                                  Condition cond) {
-  const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, cond);
+void Assembler::LoadFunctionFromCalleePool(Register dst,
+                                           const Function& function,
+                                           Register new_pp) {
+  const int32_t offset =
+      ObjectPool::element_offset(object_pool_wrapper_.FindObject(function));
+  LoadWordFromPoolOffset(dst, offset - kHeapObjectTag, new_pp, AL);
 }
 
 
@@ -1627,7 +1670,7 @@
                                 Condition cond) {
   const int32_t offset = ObjectPool::element_offset(
       object_pool_wrapper_.FindNativeEntry(label, patchable));
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, cond);
+  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
 }
 
 
@@ -1824,7 +1867,7 @@
     StoreIntoObjectFilterNoSmi(object, value, &done);
   }
   // A store buffer update is required.
-  RegList regs = (1 << LR);
+  RegList regs = (1 << CODE_REG) | (1 << LR);
   if (value != R0) {
     regs |= (1 << R0);  // Preserve R0.
   }
@@ -1832,6 +1875,7 @@
   if (object != R0) {
     mov(R0, Operand(object));
   }
+  ldr(CODE_REG, Address(THR, Thread::update_store_buffer_code_offset()));
   ldr(LR, Address(THR, Thread::update_store_buffer_entry_point_offset()));
   blx(LR);
   PopList(regs);
@@ -2687,20 +2731,41 @@
 }
 
 
-void Assembler::Branch(const StubEntry& stub_entry, Condition cond) {
-  // Address is never patched.
-  LoadImmediate(IP, stub_entry.label().address(), cond);
+void Assembler::Branch(const StubEntry& stub_entry,
+                       Patchability patchable,
+                       Register pp,
+                       Condition cond) {
+  const Code& target_code = Code::Handle(stub_entry.code());
+  const int32_t offset = ObjectPool::element_offset(
+      object_pool_wrapper_.FindObject(target_code, patchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
+  ldr(IP, FieldAddress(CODE_REG, Code::entry_point_offset()), cond);
   bx(IP, cond);
 }
 
 
-void Assembler::BranchPatchable(const StubEntry& stub_entry) {
-  // Use a fixed size code sequence, since a function prologue may be patched
-  // with this branch sequence.
-  // Contrarily to BranchLinkPatchable, BranchPatchable requires an instruction
-  // cache flush upon patching.
-  LoadPatchableImmediate(IP, stub_entry.label().address());
-  bx(IP);
+void Assembler::BranchLink(const Code& target, Patchability patchable) {
+  // Make sure that class CallPattern is able to patch the label referred
+  // to by this code sequence.
+  // For added code robustness, use 'blx lr' in a patchable sequence and
+  // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
+  const int32_t offset = ObjectPool::element_offset(
+      object_pool_wrapper_.FindObject(target, patchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
+  ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  blx(LR);  // Use blx instruction so that the return branch prediction works.
+}
+
+
+void Assembler::BranchLink(const StubEntry& stub_entry,
+                           Patchability patchable) {
+  const Code& code = Code::Handle(stub_entry.code());
+  BranchLink(code, patchable);
+}
+
+
+void Assembler::BranchLinkPatchable(const Code& target) {
+  BranchLink(target, kPatchable);
 }
 
 
@@ -2710,26 +2775,8 @@
 }
 
 
-void Assembler::BranchLink(const ExternalLabel* label, Patchability patchable) {
-  // Make sure that class CallPattern is able to patch the label referred
-  // to by this code sequence.
-  // For added code robustness, use 'blx lr' in a patchable sequence and
-  // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(LR, offset - kHeapObjectTag, AL);
-  blx(LR);  // Use blx instruction so that the return branch prediction works.
-}
-
-
-void Assembler::BranchLink(const StubEntry& stub_entry,
-                           Patchability patchable) {
-  BranchLink(&stub_entry.label(), patchable);
-}
-
-
 void Assembler::BranchLinkPatchable(const StubEntry& stub_entry) {
-  BranchLink(&stub_entry.label(), kPatchable);
+  BranchLinkPatchable(Code::Handle(stub_entry.code()));
 }
 
 
@@ -2770,7 +2817,7 @@
   if ((version == ARMv5TE) || (version == ARMv6)) {
     if (constant_pool_allowed()) {
       const int32_t offset = Array::element_offset(FindImmediate(value));
-      LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, cond);
+      LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
     } else {
       LoadPatchableImmediate(rd, value, cond);
     }
@@ -3306,19 +3353,9 @@
 
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   ASSERT(!constant_pool_allowed());
-  const intptr_t offset = CodeSize();
 
-  // Save PC in frame for fast identification of corresponding code.
-  // Note that callee-saved registers can be added to the register list.
-  EnterFrame((1 << PP) | (1 << FP) | (1 << LR) | (1 << PC), 0);
-
-  if (offset != 0) {
-    // Adjust saved PC for any intrinsic code that could have been generated
-    // before a frame is created. Use PP as temp register.
-    ldr(PP, Address(FP, 2 * kWordSize));
-    AddImmediate(PP, PP, -offset);
-    str(PP, Address(FP, 2 * kWordSize));
-  }
+  // Registers are pushed in descending order: R9 | R10 | R11 | R14.
+  EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << LR), 0);
 
   // Setup pool pointer for this dart function.
   LoadPoolPointer();
@@ -3335,41 +3372,26 @@
 // allocate. We must also set up the pool pointer for the function.
 void Assembler::EnterOsrFrame(intptr_t extra_size) {
   ASSERT(!constant_pool_allowed());
-  // mov(IP, Operand(PC)) loads PC + Instr::kPCReadOffset (8). This may be
-  // different from EntryPointToPcMarkerOffset().
-  const intptr_t offset =
-      CodeSize() + Instr::kPCReadOffset - EntryPointToPcMarkerOffset();
-
   Comment("EnterOsrFrame");
-  mov(IP, Operand(PC));
-
-  AddImmediate(IP, -offset);
-  str(IP, Address(FP, kPcMarkerSlotFromFp * kWordSize));
-
-  // Setup pool pointer for this dart function.
+  RestoreCodePointer();
   LoadPoolPointer();
 
   AddImmediate(SP, -extra_size);
 }
 
 
-void Assembler::LeaveDartFrame() {
-  set_constant_pool_allowed(false);
-  LeaveFrame((1 << PP) | (1 << FP) | (1 << LR));
-  // Adjust SP for PC pushed in EnterDartFrame.
-  AddImmediate(SP, kWordSize);
+void Assembler::LeaveDartFrame(RestorePP restore_pp) {
+  if (restore_pp == kRestoreCallerPP) {
+    ldr(PP, Address(FP, kSavedCallerPpSlotFromFp * kWordSize));
+    set_constant_pool_allowed(false);
+  }
+  Drop(2);  // Drop saved PP, PC marker.
+  LeaveFrame((1 << FP) | (1 << LR));
 }
 
 
 void Assembler::EnterStubFrame() {
-  set_constant_pool_allowed(false);
-  // Push 0 as saved PC for stub frames.
-  mov(IP, Operand(LR));
-  mov(LR, Operand(0));
-  RegList regs = (1 << PP) | (1 << FP) | (1 << IP) | (1 << LR);
-  EnterFrame(regs, 0);
-  // Setup pool pointer for this stub.
-  LoadPoolPointer();
+  EnterDartFrame(0);
 }
 
 
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 6fb2da7..38dcedc 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -606,19 +606,18 @@
   void bx(Register rm, Condition cond = AL);
   void blx(Register rm, Condition cond = AL);
 
-  // Macros.
-  // Branch to an entry address. Call sequence is never patched.
-  void Branch(const StubEntry& stub_entry, Condition cond = AL);
-
-  // Branch to an entry address. Call sequence can be patched or even replaced.
-  void BranchPatchable(const StubEntry& stub_entry);
+  void Branch(const StubEntry& stub_entry,
+              Patchability patchable = kNotPatchable,
+              Register pp = PP,
+              Condition cond = AL);
 
   void BranchLink(const StubEntry& stub_entry,
                   Patchability patchable = kNotPatchable);
-  void BranchLink(const ExternalLabel* label, Patchability patchable);
+  void BranchLink(const Code& code, Patchability patchable);
 
   // Branch and link to an entry address. Call sequence can be patched.
   void BranchLinkPatchable(const StubEntry& stub_entry);
+  void BranchLinkPatchable(const Code& code);
 
   // Branch and link to [base + offset]. Call sequence is never patched.
   void BranchLinkOffset(Register base, int32_t offset);
@@ -661,16 +660,16 @@
 
   void Drop(intptr_t stack_elements);
 
-  void LoadPoolPointer();
+  void RestoreCodePointer();
+  void LoadPoolPointer(Register reg = PP);
 
   void LoadIsolate(Register rd);
 
   void LoadObject(Register rd, const Object& object, Condition cond = AL);
   void LoadUniqueObject(Register rd, const Object& object, Condition cond = AL);
-  void LoadExternalLabel(Register dst,
-                         const ExternalLabel* label,
-                         Patchability patchable,
-                         Condition cond = AL);
+  void LoadFunctionFromCalleePool(Register dst,
+                                  const Function& function,
+                                  Register new_pp);
   void LoadNativeEntry(Register dst,
                        const ExternalLabel* label,
                        Patchability patchable,
@@ -760,6 +759,7 @@
                            Label* miss);
 
   intptr_t FindImmediate(int32_t imm);
+  bool CanLoadFromObjectPool(const Object& object) const;
   void LoadFromOffset(OperandSize type,
                       Register reg,
                       Register base,
@@ -871,6 +871,8 @@
     b(is_smi, CC);
   }
 
+  void CheckCodePointer();
+
   // Function frame setup and tear down.
   void EnterFrame(RegList regs, intptr_t frame_space);
   void LeaveFrame(RegList regs);
@@ -889,7 +891,7 @@
   // enable easy access to the RawInstruction object of code corresponding
   // to this frame.
   void EnterDartFrame(intptr_t frame_size);
-  void LeaveDartFrame();
+  void LeaveDartFrame(RestorePP restore_pp = kRestoreCallerPP);
 
   // Set up a Dart frame for a function compiled for on-stack replacement.
   // The frame layout is a normal Dart frame, but the frame is partially set
@@ -901,13 +903,6 @@
   void EnterStubFrame();
   void LeaveStubFrame();
 
-  // Instruction pattern from entrypoint is used in Dart frame prologs
-  // to set up the frame and save a PC which can be used to figure out the
-  // RawInstruction object corresponding to the code running in the frame.
-  static intptr_t EntryPointToPcMarkerOffset() {
-    return TargetCPUFeatures::store_pc_read_offset();
-  }
-
   // The register into which the allocation stats table is loaded with
   // LoadAllocationStatsAddress should be passed to
   // IncrementAllocationStats(WithSize) as stats_addr_reg to update the
@@ -993,9 +988,12 @@
   void BindARMv6(Label* label);
   void BindARMv7(Label* label);
 
-  void BranchLink(const ExternalLabel* label);
+  void LoadWordFromPoolOffset(Register rd,
+                              int32_t offset,
+                              Register pp,
+                              Condition cond);
 
-  void LoadWordFromPoolOffset(Register rd, int32_t offset, Condition cond);
+  void BranchLink(const ExternalLabel* label);
 
   class CodeComment : public ZoneAllocated {
    public:
@@ -1019,7 +1017,8 @@
   void LoadObjectHelper(Register rd,
                         const Object& object,
                         Condition cond,
-                        bool is_unique);
+                        bool is_unique,
+                        Register pp);
 
   void EmitType01(Condition cond,
                   int type,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index a360a2d..06203d2 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -304,11 +304,8 @@
 
 
 void Assembler::LoadPoolPointer(Register pp) {
-  const intptr_t object_pool_pc_dist =
-    Instructions::HeaderSize() - Instructions::object_pool_offset() +
-    CodeSize();
-  // PP <- Read(PC - object_pool_pc_dist).
-  ldr(pp, Address::PC(-object_pool_pc_dist));
+  CheckCodePointer();
+  ldr(pp, FieldAddress(CODE_REG, Code::object_pool_offset()));
 
   // When in the PP register, the pool pointer is untagged. When we
   // push it on the stack with TagAndPushPP it is tagged again. PopAndUntagPP
@@ -321,18 +318,20 @@
 }
 
 
-void Assembler::LoadWordFromPoolOffset(Register dst, uint32_t offset) {
-  ASSERT(constant_pool_allowed());
-  ASSERT(dst != PP);
+void Assembler::LoadWordFromPoolOffset(Register dst,
+                                       uint32_t offset,
+                                       Register pp) {
+  ASSERT((pp != PP) || constant_pool_allowed());
+  ASSERT(dst != pp);
   Operand op;
   const uint32_t upper20 = offset & 0xfffff000;
   if (Address::CanHoldOffset(offset)) {
-    ldr(dst, Address(PP, offset));
+    ldr(dst, Address(pp, offset));
   } else if (Operand::CanHold(upper20, kXRegSizeInBits, &op) ==
              Operand::Immediate) {
     const uint32_t lower12 = offset & 0x00000fff;
     ASSERT(Address::CanHoldOffset(lower12));
-    add(dst, PP, op);
+    add(dst, pp, op);
     ldr(dst, Address(dst, lower12));
   } else {
     const uint16_t offset_low = Utils::Low16Bits(offset);
@@ -341,7 +340,7 @@
     if (offset_high != 0) {
       movk(dst, Immediate(offset_high), 1);
     }
-    ldr(dst, Address(PP, dst));
+    ldr(dst, Address(pp, dst));
   }
 }
 
@@ -385,18 +384,6 @@
 }
 
 
-void Assembler::LoadExternalLabel(Register dst, const ExternalLabel* label) {
-  if (constant_pool_allowed()) {
-    const int32_t offset = ObjectPool::element_offset(
-        object_pool_wrapper_.FindExternalLabel(label, kNotPatchable));
-    LoadWordFromPoolOffset(dst, offset);
-  } else {
-    const int64_t target = static_cast<int64_t>(label->address());
-    LoadImmediate(dst, target);
-  }
-}
-
-
 void Assembler::LoadNativeEntry(Register dst,
                                 const ExternalLabel* label) {
   const int32_t offset = ObjectPool::element_offset(
@@ -405,15 +392,6 @@
 }
 
 
-void Assembler::LoadExternalLabelFixed(Register dst,
-                                       const ExternalLabel* label,
-                                       Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffsetFixed(dst, offset);
-}
-
-
 void Assembler::LoadIsolate(Register dst) {
   ldr(dst, Address(THR, Thread::isolate_offset()));
 }
@@ -595,48 +573,35 @@
 }
 
 
-void Assembler::Branch(const ExternalLabel* label) {
-  LoadExternalLabel(TMP, label);
-  br(TMP);
-}
-
-
-void Assembler::Branch(const StubEntry& stub_entry) {
-  const ExternalLabel label(stub_entry.EntryPoint());
-  Branch(&label);
-}
-
-
-void Assembler::BranchPatchable(const ExternalLabel* label) {
-  // TODO(zra): Use LoadExternalLabelFixed if possible.
-  LoadImmediateFixed(TMP, label->address());
+void Assembler::Branch(const StubEntry& stub_entry,
+                       Register pp,
+                       Patchability patchable) {
+  const Code& target = Code::Handle(stub_entry.code());
+  const int32_t offset = ObjectPool::element_offset(
+      object_pool_wrapper_.FindObject(target, patchable));
+  LoadWordFromPoolOffset(CODE_REG, offset, pp);
+  ldr(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
   br(TMP);
 }
 
 void Assembler::BranchPatchable(const StubEntry& stub_entry) {
-  BranchPatchable(&stub_entry.label());
+  Branch(stub_entry, PP, kPatchable);
 }
 
 
-void Assembler::BranchLink(const ExternalLabel* label) {
-  LoadExternalLabel(TMP, label);
-  blr(TMP);
-}
-
-
-void Assembler::BranchLink(const StubEntry& stub_entry) {
-  BranchLink(&stub_entry.label());
-}
-
-
-void Assembler::BranchLinkPatchable(const ExternalLabel* label) {
-  LoadExternalLabelFixed(TMP, label, kPatchable);
+void Assembler::BranchLink(const StubEntry& stub_entry,
+                           Patchability patchable) {
+  const Code& target = Code::Handle(stub_entry.code());
+  const int32_t offset = ObjectPool::element_offset(
+      object_pool_wrapper_.FindObject(target, patchable));
+  LoadWordFromPoolOffset(CODE_REG, offset);
+  ldr(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
   blr(TMP);
 }
 
 
 void Assembler::BranchLinkPatchable(const StubEntry& stub_entry) {
-  BranchLinkPatchable(&stub_entry.label());
+  BranchLink(stub_entry, kPatchable);
 }
 
 
@@ -926,6 +891,7 @@
   if (object != R0) {
     mov(R0, object);
   }
+  ldr(CODE_REG, Address(THR, Thread::update_store_buffer_code_offset()));
   ldr(TMP, Address(THR, Thread::update_store_buffer_entry_point_offset()));
   blr(TMP);
   Pop(LR);
@@ -1102,6 +1068,34 @@
 }
 
 
+void Assembler::RestoreCodePointer() {
+  ldr(CODE_REG, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  CheckCodePointer();
+}
+
+
+void Assembler::CheckCodePointer() {
+#ifdef DEBUG
+  Label cid_ok, instructions_ok;
+  Push(R0);
+  CompareClassId(CODE_REG, kCodeCid);
+  b(&cid_ok, EQ);
+  brk(0);
+  Bind(&cid_ok);
+
+  const intptr_t entry_offset =
+      CodeSize() + Instructions::HeaderSize() - kHeapObjectTag;
+  adr(R0, Immediate(-entry_offset));
+  ldr(TMP, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
+  cmp(R0, Operand(TMP));
+  b(&instructions_ok, EQ);
+  brk(1);
+  Bind(&instructions_ok);
+  Pop(R0);
+#endif
+}
+
+
 void Assembler::EnterFrame(intptr_t frame_size) {
   PushPair(LR, FP);
   mov(FP, SP);
@@ -1121,9 +1115,8 @@
 void Assembler::EnterDartFrame(intptr_t frame_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   // Setup the frame.
-  adr(TMP, Immediate(-CodeSize()));  // TMP gets PC marker.
   EnterFrame(0);
-  TagAndPushPPAndPcMarker(TMP);  // Save PP and PC marker.
+  TagAndPushPPAndPcMarker();  // Save PP and PC marker.
 
   // Load the pool pointer.
   if (new_pp == kNoRegister) {
@@ -1148,17 +1141,8 @@
 void Assembler::EnterOsrFrame(intptr_t extra_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   Comment("EnterOsrFrame");
-  adr(TMP, Immediate(-CodeSize()));
-
-  StoreToOffset(TMP, FP, kPcMarkerSlotFromFp * kWordSize);
-
-  // Setup pool pointer for this dart function.
-  if (new_pp == kNoRegister) {
-    LoadPoolPointer();
-  } else {
-    mov(PP, new_pp);
-    set_constant_pool_allowed(true);
-  }
+  RestoreCodePointer();
+  LoadPoolPointer();
 
   if (extra_size > 0) {
     AddImmediate(SP, SP, -extra_size);
@@ -1166,11 +1150,13 @@
 }
 
 
-void Assembler::LeaveDartFrame() {
-  set_constant_pool_allowed(false);
-  // Restore and untag PP.
-  LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
-  sub(PP, PP, Operand(kHeapObjectTag));
+void Assembler::LeaveDartFrame(RestorePP restore_pp) {
+  if (restore_pp == kRestoreCallerPP) {
+    set_constant_pool_allowed(false);
+    // Restore and untag PP.
+    LoadFromOffset(PP, FP, kSavedCallerPpSlotFromFp * kWordSize);
+    sub(PP, PP, Operand(kHeapObjectTag));
+  }
   LeaveFrame();
 }
 
@@ -1236,11 +1222,7 @@
 
 
 void Assembler::EnterStubFrame() {
-  set_constant_pool_allowed(false);
-  EnterFrame(0);
-  // Save caller's pool pointer. Push 0 in the saved PC area for stub frames.
-  TagAndPushPPAndPcMarker(ZR);
-  LoadPoolPointer();
+  EnterDartFrame(0);
 }
 
 
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 6a70ff8..ff7f93f 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -1152,11 +1152,11 @@
     add(TMP, PP, Operand(kHeapObjectTag));
     str(TMP, Address(SP, -1 * kWordSize, Address::PreIndex));
   }
-  void TagAndPushPPAndPcMarker(Register pc_marker_reg) {
-    ASSERT(pc_marker_reg != TMP2);
+  void TagAndPushPPAndPcMarker() {
+    COMPILE_ASSERT(CODE_REG != TMP2);
     // Add the heap object tag back to PP before putting it on the stack.
     add(TMP2, PP, Operand(kHeapObjectTag));
-    stp(TMP2, pc_marker_reg,
+    stp(TMP2, CODE_REG,
         Address(SP, -2 * kWordSize, Address::PairPreIndex));
   }
   void PopAndUntagPP() {
@@ -1198,14 +1198,14 @@
     LslImmediate(dst, src, kSmiTagSize);
   }
 
-  void Branch(const StubEntry& stub_entry);
+  void Branch(const StubEntry& stub_entry,
+              Register pp,
+              Patchability patchable = kNotPatchable);
   void BranchPatchable(const StubEntry& stub_entry);
 
-  void BranchLink(const ExternalLabel* label);
-  void BranchLink(const StubEntry& stub_entry);
+  void BranchLink(const StubEntry& stub_entry,
+                  Patchability patchable = kNotPatchable);
 
-  // BranchLinkPatchable must be a fixed-length sequence so we can patch it
-  // with the debugger.
   void BranchLinkPatchable(const StubEntry& stub_entry);
 
   // Macros accepting a pp Register argument may attempt to load values from
@@ -1283,15 +1283,9 @@
     constant_pool_allowed_ = b;
   }
 
-  void LoadWordFromPoolOffset(Register dst, uint32_t offset);
-  void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
   intptr_t FindImmediate(int64_t imm);
   bool CanLoadFromObjectPool(const Object& object) const;
-  void LoadExternalLabel(Register dst, const ExternalLabel* label);
   void LoadNativeEntry(Register dst, const ExternalLabel* label);
-  void LoadExternalLabelFixed(Register dst,
-                              const ExternalLabel* label,
-                              Patchability patchable);
   void LoadFunctionFromCalleePool(Register dst,
                                   const Function& function,
                                   Register new_pp);
@@ -1340,9 +1334,12 @@
     sub(CSP, CSP, Operand(reserved_space));
   }
 
+  void CheckCodePointer();
+  void RestoreCodePointer();
+
   void EnterDartFrame(intptr_t frame_size, Register new_pp = kNoRegister);
   void EnterOsrFrame(intptr_t extra_size, Register new_pp);
-  void LeaveDartFrame();
+  void LeaveDartFrame(RestorePP restore_pp = kRestoreCallerPP);
 
   void EnterCallRuntimeFrame(intptr_t frame_size);
   void LeaveCallRuntimeFrame();
@@ -1426,9 +1423,8 @@
 
   bool constant_pool_allowed_;
 
-  void Branch(const ExternalLabel* label);
-  void BranchPatchable(const ExternalLabel* label);
-  void BranchLinkPatchable(const ExternalLabel* label);
+  void LoadWordFromPoolOffset(Register dst, uint32_t offset, Register pp = PP);
+  void LoadWordFromPoolOffsetFixed(Register dst, uint32_t offset);
 
   void LoadObjectHelper(Register dst, const Object& obj, bool is_unique);
 
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 7204371..a187ee8 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -1622,81 +1622,100 @@
 }
 
 
+static void EnterTestFrame(Assembler* assembler) {
+  __ EnterFrame(0);
+  __ Push(CODE_REG);
+  __ TagAndPushPP();
+  __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle));
+  __ LoadPoolPointer(PP);
+}
+
+
+static void LeaveTestFrame(Assembler* assembler) {
+  __ PopAndUntagPP();
+  __ Pop(CODE_REG);
+  __ LeaveFrame();
+}
+
+
+
+
 // Loading immediate values with the object pool.
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPSmall, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadImmediate(R0, 42);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(LoadImmediatePPSmall, test) {
-  EXPECT_EQ(42, test->Invoke<int64_t>());
+  EXPECT_EQ(42, test->InvokeWithCode<int64_t>());
 }
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0xf1234123);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(LoadImmediatePPMed, test) {
-  EXPECT_EQ(0xf1234123, test->Invoke<int64_t>());
+  EXPECT_EQ(0xf1234123, test->InvokeWithCode<int64_t>());
 }
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPMed2, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0x4321f1234124);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(LoadImmediatePPMed2, test) {
-  EXPECT_EQ(0x4321f1234124, test->Invoke<int64_t>());
+  EXPECT_EQ(0x4321f1234124, test->InvokeWithCode<int64_t>());
 }
 
 
 ASSEMBLER_TEST_GENERATE(LoadImmediatePPLarge, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadImmediate(R0, 0x9287436598237465);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(LoadImmediatePPLarge, test) {
-  EXPECT_EQ(static_cast<int64_t>(0x9287436598237465), test->Invoke<int64_t>());
+  EXPECT_EQ(static_cast<int64_t>(0x9287436598237465),
+            test->InvokeWithCode<int64_t>());
 }
 
 
 #define ASSEMBLER_TEST_RUN_WITH_THREAD(result_type, var_name) \
   Thread* thread = Thread::Current(); \
-  result_type var_name = test->Invoke<result_type>(thread);
+  result_type var_name = test->InvokeWithCode<result_type>(thread);
 
 
 // LoadObject null.
 ASSEMBLER_TEST_GENERATE(LoadObjectNull, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ Push(THR);
-  __ mov(THR, R0);
+  __ mov(THR, R1);
   __ LoadObject(R0, Object::null_object());
   __ Pop(THR);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
@@ -1710,12 +1729,12 @@
 
 ASSEMBLER_TEST_GENERATE(LoadObjectTrue, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ Push(THR);
-  __ mov(THR, R0);
+  __ mov(THR, R1);
   __ LoadObject(R0, Bool::True());
   __ Pop(THR);
-  __ LeaveDartFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
@@ -1729,12 +1748,12 @@
 
 ASSEMBLER_TEST_GENERATE(LoadObjectFalse, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ Push(THR);
-  __ mov(THR, R0);
+  __ mov(THR, R1);
   __ LoadObject(R0, Bool::False());
   __ Pop(THR);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
@@ -3553,6 +3572,7 @@
 // R2: current thread.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
   __ SetupDartSP(kTestStackSpace);
+  __ Push(CODE_REG);
   __ Push(THR);
   __ Push(LR);
   __ mov(THR, R2);
@@ -3561,6 +3581,7 @@
                      R0);
   __ Pop(LR);
   __ Pop(THR);
+  __ Pop(CODE_REG);
   __ mov(CSP, SP);
   __ ret();
 }
@@ -3568,9 +3589,8 @@
 
 ASSEMBLER_TEST_GENERATE(ComputeRange, assembler) {
   __ SetupDartSP(kTestStackSpace);
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   Label miss, done;
-  __ mov(R1, R0);
   __ ComputeRange(R0, R1, R2, &miss);
   __ b(&done);
 
@@ -3578,14 +3598,14 @@
   __ LoadImmediate(R0, -1);
 
   __ Bind(&done);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ mov(CSP, SP);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(ComputeRange, test) {
-#define RANGE_OF(arg_type, v) test->Invoke<intptr_t, arg_type>(v)
+#define RANGE_OF(arg_type, v) test->InvokeWithCode<intptr_t, arg_type>(v)
 
   EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(0)));
   EXPECT_EQ(ICData::kInt32RangeBit, RANGE_OF(RawSmi*, Smi::New(1)));
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index c6c8da8..2da0383 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2366,7 +2366,7 @@
   if (object != EDX) {
     movl(EDX, object);
   }
-  Call(*StubCode::UpdateStoreBuffer_entry());
+  call(Address(THR, Thread::update_store_buffer_entry_point_offset()));
   if (value != EDX) {
     popl(EDX);  // Restore EDX.
   }
@@ -2622,8 +2622,9 @@
 
 
 void Assembler::Call(const StubEntry& stub_entry) {
-  const ExternalLabel label(stub_entry.EntryPoint());
-  call(&label);
+  const Code& target = Code::ZoneHandle(stub_entry.code());
+  LoadObject(CODE_REG, target);
+  call(FieldAddress(CODE_REG, Code::entry_point_offset()));
 }
 
 
@@ -2869,18 +2870,19 @@
 }
 
 
+void Assembler::PushCodeObject() {
+  ASSERT(code_.IsNotTemporaryScopedHandle());
+  AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+  EmitUint8(0x68);
+  buffer_.EmitObject(code_);
+}
+
+
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   EnterFrame(0);
-  Label dart_entry;
-  call(&dart_entry);
-  Bind(&dart_entry);
-  // The runtime system assumes that the code marker address is
-  // kEntryPointToPcMarkerOffset bytes from the entry.  If there is any code
-  // generated before entering the frame, the address needs to be adjusted.
-  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
-  if (offset != 0) {
-    addl(Address(ESP, 0), Immediate(offset));
-  }
+
+  PushCodeObject();
+
   if (frame_size != 0) {
     subl(ESP, Immediate(frame_size));
   }
@@ -2889,8 +2891,7 @@
 
 // On entry to a function compiled for OSR, the caller's frame pointer, the
 // stack locals, and any copied parameters are already in place.  The frame
-// pointer is already set up.  The PC marker is not correct for the
-// optimized function and there may be extra space for spill slots to
+// pointer is already set up. There may be extra space for spill slots to
 // allocate.
 void Assembler::EnterOsrFrame(intptr_t extra_size) {
   Comment("EnterOsrFrame");
@@ -2898,17 +2899,7 @@
     Comment("PrologueOffset = %" Pd "", CodeSize());
     prologue_offset_ = CodeSize();
   }
-  Label dart_entry;
-  call(&dart_entry);
-  Bind(&dart_entry);
-  // The runtime system assumes that the code marker address is
-  // kEntryPointToPcMarkerOffset bytes from the entry.  Since there is no
-  // code to set up the frame pointer, the address needs to be adjusted.
-  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
-  if (offset != 0) {
-    addl(Address(ESP, 0), Immediate(offset));
-  }
-  popl(Address(EBP, kPcMarkerSlotFromFp * kWordSize));
+
   if (extra_size != 0) {
     subl(ESP, Immediate(extra_size));
   }
@@ -2916,8 +2907,7 @@
 
 
 void Assembler::EnterStubFrame() {
-  EnterFrame(0);
-  pushl(Immediate(0));  // Push 0 in the saved PC area for stub frames.
+  EnterDartFrame(0);
 }
 
 
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index bac86c4..44ba10e 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -305,7 +305,8 @@
       : buffer_(),
         prologue_offset_(-1),
         jit_cookie_(0),
-        comments_() {
+        comments_(),
+        code_(Code::ZoneHandle()) {
     // This mode is only needed and implemented for MIPS and ARM.
     ASSERT(!use_far_branches);
   }
@@ -957,6 +958,12 @@
     return !object.IsSmi() || IsSafeSmi(object);
   }
 
+  void set_code_object(const Code& code) {
+    code_ ^= code.raw();
+  }
+
+  void PushCodeObject();
+
  private:
   class CodeComment : public ZoneAllocated {
    public:
@@ -1017,6 +1024,7 @@
   intptr_t prologue_offset_;
   int32_t jit_cookie_;
   GrowableArray<CodeComment*> comments_;
+  Code& code_;
 
   DISALLOW_ALLOCATION();
   DISALLOW_COPY_AND_ASSIGN(Assembler);
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index 4bdc206..90a010a 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -355,22 +355,24 @@
 }
 
 
-void Assembler::LoadWordFromPoolOffset(Register rd, int32_t offset) {
-  ASSERT(constant_pool_allowed());
+void Assembler::LoadWordFromPoolOffset(Register rd,
+                                       int32_t offset,
+                                       Register pp) {
+  ASSERT((pp != PP) || constant_pool_allowed());
   ASSERT(!in_delay_slot_);
-  ASSERT(rd != PP);
+  ASSERT(rd != pp);
   if (Address::CanHoldOffset(offset)) {
-    lw(rd, Address(PP, offset));
+    lw(rd, Address(pp, offset));
   } else {
     const int16_t offset_low = Utils::Low16Bits(offset);  // Signed.
     offset -= offset_low;
     const uint16_t offset_high = Utils::High16Bits(offset);  // Unsigned.
     if (offset_high != 0) {
       lui(rd, Immediate(offset_high));
-      addu(rd, rd, PP);
+      addu(rd, rd, pp);
       lw(rd, Address(rd, offset_low));
     } else {
-      lw(rd, Address(PP, offset_low));
+      lw(rd, Address(pp, offset_low));
     }
   }
 }
@@ -457,22 +459,43 @@
 }
 
 
-void Assembler::Branch(const StubEntry& stub_entry) {
-  ASSERT(!in_delay_slot_);
-  LoadImmediate(TMP, stub_entry.label().address());
-  jr(TMP);
+void Assembler::CheckCodePointer() {
+#ifdef DEBUG
+  Label cid_ok, instructions_ok;
+  Push(CMPRES1);
+  Push(CMPRES2);
+  LoadClassId(CMPRES1, CODE_REG);
+  BranchEqual(CMPRES1, Immediate(kCodeCid), &cid_ok);
+  break_(0);
+  Bind(&cid_ok);
+  GetNextPC(CMPRES1, TMP);
+  const intptr_t entry_offset = CodeSize() - Instr::kInstrSize +
+      Instructions::HeaderSize() - kHeapObjectTag;
+  AddImmediate(CMPRES1, CMPRES1, -entry_offset);
+  lw(CMPRES2, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
+  BranchEqual(CMPRES1, CMPRES2, &instructions_ok);
+  break_(1);
+  Bind(&instructions_ok);
+  Pop(CMPRES2);
+  Pop(CMPRES1);
+#endif
 }
 
 
-void Assembler::BranchPatchable(const StubEntry& stub_entry) {
+void Assembler::RestoreCodePointer() {
+  lw(CODE_REG, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  CheckCodePointer();
+}
+
+
+void Assembler::Branch(const StubEntry& stub_entry, Register pp) {
   ASSERT(!in_delay_slot_);
-  const ExternalLabel& label = stub_entry.label();
-  const uint16_t low = Utils::Low16Bits(label.address());
-  const uint16_t high = Utils::High16Bits(label.address());
-  lui(T9, Immediate(high));
-  ori(T9, T9, Immediate(low));
-  jr(T9);
-  delay_slot_available_ = false;  // CodePatcher expects a nop.
+  const Code& target_code = Code::Handle(stub_entry.code());
+  const int32_t offset = ObjectPool::element_offset(
+      object_pool_wrapper_.FindObject(target_code, kPatchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp);
+  lw(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  jr(TMP);
 }
 
 
@@ -483,11 +506,12 @@
 }
 
 
-void Assembler::BranchLink(const ExternalLabel* label, Patchability patchable) {
+void Assembler::BranchLink(const Code& target, Patchability patchable) {
   ASSERT(!in_delay_slot_);
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(T9, offset - kHeapObjectTag);
+      object_pool_wrapper_.FindObject(target, patchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  lw(T9, FieldAddress(CODE_REG, Code::entry_point_offset()));
   jalr(T9);
   if (patchable == kPatchable) {
     delay_slot_available_ = false;  // CodePatcher expects a nop.
@@ -497,43 +521,54 @@
 
 void Assembler::BranchLink(const StubEntry& stub_entry,
                            Patchability patchable) {
-  BranchLink(&stub_entry.label(), patchable);
+  BranchLink(Code::Handle(stub_entry.code()), patchable);
 }
 
 
 void Assembler::BranchLinkPatchable(const StubEntry& stub_entry) {
-  BranchLink(&stub_entry.label(), kPatchable);
+  BranchLink(Code::Handle(stub_entry.code()), kPatchable);
+}
+
+
+bool Assembler::CanLoadFromObjectPool(const Object& object) const {
+  ASSERT(!Thread::CanLoadFromThread(object));
+  if (!constant_pool_allowed()) {
+    return false;
+  }
+
+  ASSERT(object.IsNotTemporaryScopedHandle());
+  ASSERT(object.IsOld());
+  return true;
 }
 
 
 void Assembler::LoadObjectHelper(Register rd,
                                  const Object& object,
                                  bool is_unique) {
-  // Load common VM constants from the thread. This works also in places where
-  // no constant pool is set up (e.g. intrinsic code).
-  if (Thread::CanLoadFromThread(object)) {
-    lw(rd, Address(THR, Thread::OffsetFromThread(object)));
-    return;
-  }
   ASSERT(!in_delay_slot_);
-  // Smis and VM heap objects are never relocated; do not use object pool.
-  if (object.IsSmi()) {
+  if (Thread::CanLoadFromThread(object)) {
+    // Load common VM constants from the thread. This works also in places where
+    // no constant pool is set up (e.g. intrinsic code).
+    lw(rd, Address(THR, Thread::OffsetFromThread(object)));
+  } else if (object.IsSmi()) {
+    // Relocation doesn't apply to Smis.
     LoadImmediate(rd, reinterpret_cast<int32_t>(object.raw()));
-  } else if (object.InVMHeap() || !constant_pool_allowed()) {
-    ASSERT(FLAG_allow_absolute_addresses);
-    // Make sure that class CallPattern is able to decode this load immediate.
-    int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
-    const uint16_t object_low = Utils::Low16Bits(object_raw);
-    const uint16_t object_high = Utils::High16Bits(object_raw);
-    lui(rd, Immediate(object_high));
-    ori(rd, rd, Immediate(object_low));
-  } else {
+  } else if (CanLoadFromObjectPool(object)) {
     // Make sure that class CallPattern is able to decode this load from the
     // object pool.
     const int32_t offset = ObjectPool::element_offset(
         is_unique ? object_pool_wrapper_.AddObject(object)
                   : object_pool_wrapper_.FindObject(object));
     LoadWordFromPoolOffset(rd, offset - kHeapObjectTag);
+  } else {
+    ASSERT(FLAG_allow_absolute_addresses);
+    ASSERT(object.IsOld());
+    // Make sure that class CallPattern is able to decode this load immediate.
+    int32_t object_raw = reinterpret_cast<int32_t>(object.raw());
+    const uint16_t object_low = Utils::Low16Bits(object_raw);
+    const uint16_t object_high = Utils::High16Bits(object_raw);
+    lui(rd, Immediate(object_high));
+    ori(rd, rd, Immediate(object_low));
   }
 }
 
@@ -548,12 +583,12 @@
 }
 
 
-void Assembler::LoadExternalLabel(Register rd,
-                                  const ExternalLabel* label,
-                                  Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(rd, offset - kHeapObjectTag);
+void Assembler::LoadFunctionFromCalleePool(Register dst,
+                                           const Function& function,
+                                           Register new_pp) {
+  const int32_t offset =
+      ObjectPool::element_offset(object_pool_wrapper_.FindObject(function));
+  LoadWordFromPoolOffset(dst, offset - kHeapObjectTag, new_pp);
 }
 
 
@@ -634,6 +669,7 @@
   if (object != T0) {
     mov(T0, object);
   }
+  lw(CODE_REG, Address(THR, Thread::update_store_buffer_code_offset()));
   lw(T9, Address(THR, Thread::update_store_buffer_entry_point_offset()));
   jalr(T9);
   lw(RA, Address(SP, 0 * kWordSize));
@@ -828,17 +864,8 @@
 }
 
 
-void Assembler::EnterStubFrame() {
-  ASSERT(!in_delay_slot_);
-  SetPrologueOffset();
-  addiu(SP, SP, Immediate(-4 * kWordSize));
-  sw(ZR, Address(SP, 3 * kWordSize));  // PC marker is 0 in stubs.
-  sw(RA, Address(SP, 2 * kWordSize));
-  sw(FP, Address(SP, 1 * kWordSize));
-  sw(PP, Address(SP, 0 * kWordSize));
-  addiu(FP, SP, Immediate(1 * kWordSize));
-  // Setup pool pointer for this stub.
-  LoadPoolPointer();
+void Assembler::EnterStubFrame(intptr_t frame_size) {
+  EnterDartFrame(frame_size);
 }
 
 
@@ -848,13 +875,7 @@
 
 
 void Assembler::LeaveStubFrameAndReturn(Register ra) {
-  ASSERT(!in_delay_slot_);
-  addiu(SP, FP, Immediate(-1 * kWordSize));
-  lw(RA, Address(SP, 2 * kWordSize));
-  lw(FP, Address(SP, 1 * kWordSize));
-  lw(PP, Address(SP, 0 * kWordSize));
-  jr(ra);
-  delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize));
+  LeaveDartFrameAndReturn(ra);
 }
 
 
@@ -1027,7 +1048,7 @@
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
-    MaybeTraceAllocation(cid, temp1, failure);
+    MaybeTraceAllocation(cid, temp1, failure, /* inline_isolate = */ false);
     Isolate* isolate = Isolate::Current();
     Heap* heap = isolate->heap();
     Heap::Space space = heap->SpaceForAllocation(cid);
@@ -1074,31 +1095,19 @@
 
 void Assembler::EnterDartFrame(intptr_t frame_size) {
   ASSERT(!in_delay_slot_);
-  const intptr_t offset = CodeSize();
 
   SetPrologueOffset();
 
   addiu(SP, SP, Immediate(-4 * kWordSize));
-  sw(RA, Address(SP, 2 * kWordSize));
-  sw(FP, Address(SP, 1 * kWordSize));
+  sw(RA, Address(SP, 3 * kWordSize));
+  sw(FP, Address(SP, 2 * kWordSize));
+  sw(CODE_REG, Address(SP, 1 * kWordSize));
   sw(PP, Address(SP, 0 * kWordSize));
 
-  GetNextPC(TMP);  // TMP gets the address of the next instruction.
-
-  // Calculate the offset of the pool pointer from the PC.
-  const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset() +
-      CodeSize();
-
-  // Save PC in frame for fast identification of corresponding code.
-  AddImmediate(TMP, -offset);
-  sw(TMP, Address(SP, 3 * kWordSize));
-
   // Set FP to the saved previous FP.
-  addiu(FP, SP, Immediate(kWordSize));
+  addiu(FP, SP, Immediate(2 * kWordSize));
 
-  // Load the pool pointer. offset has already been subtracted from TMP.
-  lw(PP, Address(TMP, -object_pool_pc_dist + offset));
+  LoadPoolPointer();
 
   // Reserve space for locals.
   AddImmediate(SP, -frame_size);
@@ -1114,55 +1123,43 @@
   ASSERT(!in_delay_slot_);
   Comment("EnterOsrFrame");
 
-  GetNextPC(TMP);  // TMP gets the address of the next instruction.
-
-  // The runtime system assumes that the code marker address is
-  // kEntryPointToPcMarkerOffset bytes from the entry.  Since there is no
-  // code to set up the frame pointer, etc., the address needs to be adjusted.
-  const intptr_t offset = EntryPointToPcMarkerOffset() - CodeSize();
-  // Calculate the offset of the pool pointer from the PC.
-  const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset() +
-      CodeSize();
-
-  // Adjust PC by the offset, and store it in the stack frame.
-  AddImmediate(TMP, TMP, offset);
-  sw(TMP, Address(FP, kPcMarkerSlotFromFp * kWordSize));
-
   // Restore return address.
   lw(RA, Address(FP, 1 * kWordSize));
 
   // Load the pool pointer. offset has already been subtracted from temp.
-  lw(PP, Address(TMP, -object_pool_pc_dist - offset));
+  RestoreCodePointer();
+  LoadPoolPointer();
 
   // Reserve space for locals.
   AddImmediate(SP, -extra_size);
 }
 
 
-void Assembler::LeaveDartFrame() {
+void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   ASSERT(!in_delay_slot_);
-  addiu(SP, FP, Immediate(-kWordSize));
+  addiu(SP, FP, Immediate(-2 * kWordSize));
 
-  lw(RA, Address(SP, 2 * kWordSize));
-  lw(FP, Address(SP, 1 * kWordSize));
-  lw(PP, Address(SP, 0 * kWordSize));
+  lw(RA, Address(SP, 3 * kWordSize));
+  lw(FP, Address(SP, 2 * kWordSize));
+  if (restore_pp == kRestoreCallerPP) {
+    lw(PP, Address(SP, 0 * kWordSize));
+  }
 
   // Adjust SP for PC, RA, FP, PP pushed in EnterDartFrame.
   addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
 
-void Assembler::LeaveDartFrameAndReturn() {
+void Assembler::LeaveDartFrameAndReturn(Register ra) {
   ASSERT(!in_delay_slot_);
-  addiu(SP, FP, Immediate(-kWordSize));
+  addiu(SP, FP, Immediate(-2 * kWordSize));
 
-  lw(RA, Address(SP, 2 * kWordSize));
-  lw(FP, Address(SP, 1 * kWordSize));
+  lw(RA, Address(SP, 3 * kWordSize));
+  lw(FP, Address(SP, 2 * kWordSize));
   lw(PP, Address(SP, 0 * kWordSize));
 
   // Adjust SP for PC, RA, FP, PP pushed in EnterDartFrame, and return.
-  Ret();
+  jr(ra);
   delay_slot()->addiu(SP, SP, Immediate(4 * kWordSize));
 }
 
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index 2ae9456..4368707 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -288,21 +288,12 @@
 
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
-  void EnterStubFrame();
+  void EnterStubFrame(intptr_t frame_size = 0);
   void LeaveStubFrame();
   // A separate macro for when a Ret immediately follows, so that we can use
   // the branch delay slot.
   void LeaveStubFrameAndReturn(Register ra = RA);
 
-  // Instruction pattern from entrypoint is used in dart frame prologs
-  // to set up the frame and save a PC which can be used to figure out the
-  // RawInstruction object corresponding to the code running in the frame.
-  // See EnterDartFrame. There are 6 instructions before we know the PC.
-  static const intptr_t kEntryPointToPcMarkerOffset = 6 * Instr::kInstrSize;
-  static intptr_t EntryPointToPcMarkerOffset() {
-    return kEntryPointToPcMarkerOffset;
-  }
-
   void UpdateAllocationStats(intptr_t cid,
                              Register temp_reg,
                              Heap::Space space,
@@ -912,11 +903,8 @@
     SubuDetectOverflow(rd, rs, rd, ro);
   }
 
-  void Branch(const StubEntry& stub_entry);
+  void Branch(const StubEntry& stub_entry, Register pp = PP);
 
-  void BranchPatchable(const StubEntry& stub_entry);
-
-  void BranchLink(const ExternalLabel* label, Patchability patchable);
   void BranchLink(const StubEntry& stub_entry,
                   Patchability patchable = kNotPatchable);
 
@@ -929,15 +917,17 @@
     }
   }
 
-  void LoadPoolPointer() {
+  void LoadPoolPointer(Register reg = PP) {
     ASSERT(!in_delay_slot_);
-    GetNextPC(TMP);  // TMP gets the address of the next instruction.
-    const intptr_t object_pool_pc_dist =
-        Instructions::HeaderSize() - Instructions::object_pool_offset() +
-        CodeSize();
-    lw(PP, Address(TMP, -object_pool_pc_dist));
+    CheckCodePointer();
+    lw(reg, FieldAddress(CODE_REG, Code::object_pool_offset()));
+    set_constant_pool_allowed(reg == PP);
   }
 
+  void CheckCodePointer();
+
+  void RestoreCodePointer();
+
   void LoadImmediate(Register rd, int32_t value) {
     ASSERT(!in_delay_slot_);
     if (Utils::IsInt(kImmBits, value)) {
@@ -1518,12 +1508,11 @@
   void EnterCallRuntimeFrame(intptr_t frame_space);
   void LeaveCallRuntimeFrame();
 
-  void LoadWordFromPoolOffset(Register rd, int32_t offset);
   void LoadObject(Register rd, const Object& object);
   void LoadUniqueObject(Register rd, const Object& object);
-  void LoadExternalLabel(Register rd,
-                         const ExternalLabel* label,
-                         Patchability patchable);
+  void LoadFunctionFromCalleePool(Register dst,
+                                  const Function& function,
+                                  Register new_pp);
   void LoadNativeEntry(Register rd,
                        const ExternalLabel* label,
                        Patchability patchable);
@@ -1575,8 +1564,8 @@
   // enable easy access to the RawInstruction object of code corresponding
   // to this frame.
   void EnterDartFrame(intptr_t frame_size);
-  void LeaveDartFrame();
-  void LeaveDartFrameAndReturn();
+  void LeaveDartFrame(RestorePP restore_pp = kRestoreCallerPP);
+  void LeaveDartFrameAndReturn(Register ra = RA);
 
   // Set up a Dart frame for a function compiled for on-stack replacement.
   // The frame layout is a normal Dart frame, but the frame is partially set
@@ -1637,7 +1626,11 @@
   bool constant_pool_allowed_;
 
   void BranchLink(const ExternalLabel* label);
+  void BranchLink(const Code& code, Patchability patchable);
 
+  bool CanLoadFromObjectPool(const Object& object) const;
+
+  void LoadWordFromPoolOffset(Register rd, int32_t offset, Register pp = PP);
   void LoadObjectHelper(Register rd, const Object& object, bool is_unique);
 
   void Emit(int32_t value) {
diff --git a/runtime/vm/assembler_mips_test.cc b/runtime/vm/assembler_mips_test.cc
index ec94350..552aa60 100644
--- a/runtime/vm/assembler_mips_test.cc
+++ b/runtime/vm/assembler_mips_test.cc
@@ -2087,7 +2087,8 @@
 // A1: growable array.
 // A2: current thread.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
-  __ addiu(SP, SP, Immediate(-2 * kWordSize));
+  __ addiu(SP, SP, Immediate(-3 * kWordSize));
+  __ sw(CODE_REG, Address(SP, 2 * kWordSize));
   __ sw(THR, Address(SP, 1 * kWordSize));
   __ sw(RA, Address(SP, 0 * kWordSize));
   __ mov(THR, A2);
@@ -2096,7 +2097,8 @@
                      A0);
   __ lw(RA, Address(SP, 0 * kWordSize));
   __ lw(THR, Address(SP, 1 * kWordSize));
-  __ addiu(SP, SP, Immediate(2 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 2 * kWordSize));
+  __ addiu(SP, SP, Immediate(3 * kWordSize));
   __ Ret();
 }
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index 523f29f..87c1f31 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -62,15 +62,6 @@
 }
 
 
-void Assembler::LoadExternalLabel(Register dst,
-                                  const ExternalLabel* label,
-                                  Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(label, patchable));
-  LoadWordFromPoolOffset(dst, offset - kHeapObjectTag);
-}
-
-
 void Assembler::LoadNativeEntry(Register dst,
                                 const ExternalLabel* label,
                                 Patchability patchable) {
@@ -93,20 +84,25 @@
 
 void Assembler::CallPatchable(const StubEntry& stub_entry) {
   ASSERT(constant_pool_allowed());
+  const Code& target = Code::Handle(stub_entry.code());
   intptr_t call_start = buffer_.GetPosition();
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(&stub_entry.label(), kPatchable));
-  call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag));
+      object_pool_wrapper_.FindObject(target, kPatchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  call(TMP);
   ASSERT((buffer_.GetPosition() - call_start) == kCallExternalLabelSize);
 }
 
 
 void Assembler::Call(const StubEntry& stub_entry) {
   ASSERT(constant_pool_allowed());
+  const Code& target = Code::Handle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(&stub_entry.label(),
-                                             kNotPatchable));
-  call(Address::AddressBaseImm32(PP, offset - kHeapObjectTag));
+      object_pool_wrapper_.FindObject(target, kNotPatchable));
+  LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag);
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  call(TMP);
 }
 
 
@@ -2543,11 +2539,12 @@
 }
 
 
-void Assembler::J(Condition condition, const StubEntry& stub_entry,
+void Assembler::J(Condition condition,
+                  const StubEntry& stub_entry,
                   Register pp) {
   Label no_jump;
   // Negate condition.
-  j(static_cast<Condition>(condition ^ 1), &no_jump, Assembler::kNearJump);
+  j(static_cast<Condition>(condition ^ 1), &no_jump, kNearJump);
   Jmp(stub_entry, pp);
   Bind(&no_jump);
 }
@@ -2608,28 +2605,25 @@
 }
 
 
-void Assembler::jmp(const StubEntry& stub_entry) {
-  jmp(&stub_entry.label());
-}
-
-
 void Assembler::JmpPatchable(const StubEntry& stub_entry, Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
-  intptr_t call_start = buffer_.GetPosition();
+  const Code& target = Code::Handle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(&stub_entry.label(), kPatchable));
-  // Patchable jumps always use a 32-bit immediate encoding.
-  jmp(Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
-  ASSERT((buffer_.GetPosition() - call_start) == JumpPattern::kLengthInBytes);
+      object_pool_wrapper_.FindObject(target, kPatchable));
+  movq(CODE_REG, Address::AddressBaseImm32(pp, offset - kHeapObjectTag));
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  jmp(TMP);
 }
 
 
 void Assembler::Jmp(const StubEntry& stub_entry, Register pp) {
   ASSERT((pp != PP) || constant_pool_allowed());
+  const Code& target = Code::Handle(stub_entry.code());
   const int32_t offset = ObjectPool::element_offset(
-      object_pool_wrapper_.FindExternalLabel(&stub_entry.label(),
-                                             kNotPatchable));
-  jmp(Address(pp, offset - kHeapObjectTag));
+      object_pool_wrapper_.FindObject(target, kNotPatchable));
+  movq(CODE_REG, FieldAddress(pp, offset));
+  movq(TMP, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  jmp(TMP);
 }
 
 
@@ -3077,8 +3071,12 @@
   if (object != RDX) {
     movq(RDX, object);
   }
+  pushq(CODE_REG);
+  movq(CODE_REG, Address(THR, Thread::update_store_buffer_code_offset()));
   movq(TMP, Address(THR, Thread::update_store_buffer_entry_point_offset()));
   call(TMP);
+
+  popq(CODE_REG);
   if (value != RDX) popq(RDX);
   Bind(&done);
 }
@@ -3379,27 +3377,29 @@
 }
 
 
+void Assembler::RestoreCodePointer() {
+  movq(CODE_REG, Address(RBP, kPcMarkerSlotFromFp * kWordSize));
+}
+
+
 void Assembler::LoadPoolPointer(Register pp) {
   // Load new pool pointer.
-  const intptr_t kRIPRelativeMovqSize = 7;
-  const intptr_t entry_to_rip_offset = CodeSize() + kRIPRelativeMovqSize;
-  const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset();
-  movq(pp, Address::AddressRIPRelative(
-      -entry_to_rip_offset - object_pool_pc_dist));
-  ASSERT(CodeSize() == entry_to_rip_offset);
+  CheckCodePointer();
+  movq(pp, FieldAddress(CODE_REG, Code::object_pool_offset()));
   set_constant_pool_allowed(pp == PP);
 }
 
 
-void Assembler::EnterDartFrame(intptr_t frame_size,
-                               Register new_pp,
-                               Register pc_marker_override) {
+void Assembler::EnterDartFrame(intptr_t frame_size, Register new_pp) {
   ASSERT(!constant_pool_allowed());
   EnterFrame(0);
-  pushq(pc_marker_override);
+  pushq(CODE_REG);
   pushq(PP);
-  movq(PP, new_pp);
+  if (new_pp == kNoRegister) {
+    LoadPoolPointer(PP);
+  } else {
+    movq(PP, new_pp);
+  }
   set_constant_pool_allowed(true);
   if (frame_size != 0) {
     subq(RSP, Immediate(frame_size));
@@ -3407,30 +3407,57 @@
 }
 
 
-void Assembler::LeaveDartFrame() {
-  set_constant_pool_allowed(false);
+void Assembler::LeaveDartFrame(RestorePP restore_pp) {
   // Restore caller's PP register that was pushed in EnterDartFrame.
-  movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize)));
+  if (restore_pp == kRestoreCallerPP) {
+    movq(PP, Address(RBP, (kSavedCallerPpSlotFromFp * kWordSize)));
+    set_constant_pool_allowed(false);
+  }
   LeaveFrame();
 }
 
 
+void Assembler::CheckCodePointer() {
+#ifdef DEBUG
+  Label cid_ok, instructions_ok;
+  pushq(RAX);
+  LoadClassId(RAX, CODE_REG);
+  cmpq(RAX, Immediate(kCodeCid));
+  j(EQUAL, &cid_ok);
+  int3();
+  Bind(&cid_ok);
+  {
+    const intptr_t kRIPRelativeLeaqSize = 7;
+    const intptr_t header_to_entry_offset =
+        (Instructions::HeaderSize() - kHeapObjectTag);
+    const intptr_t header_to_rip_offset =
+        CodeSize() + kRIPRelativeLeaqSize + header_to_entry_offset;
+    leaq(RAX, Address::AddressRIPRelative(-header_to_rip_offset));
+    ASSERT(CodeSize() == (header_to_rip_offset - header_to_entry_offset));
+  }
+  cmpq(RAX, FieldAddress(CODE_REG, Code::saved_instructions_offset()));
+  j(EQUAL, &instructions_ok);
+  int3();
+  Bind(&instructions_ok);
+  popq(RAX);
+#endif
+}
+
+
 // On entry to a function compiled for OSR, the caller's frame pointer, the
 // stack locals, and any copied parameters are already in place.  The frame
 // pointer is already set up.  The PC marker is not correct for the
 // optimized function and there may be extra space for spill slots to
 // allocate.
-void Assembler::EnterOsrFrame(intptr_t extra_size,
-                              Register new_pp,
-                              Register pc_marker_override) {
+void Assembler::EnterOsrFrame(intptr_t extra_size) {
   ASSERT(!constant_pool_allowed());
   if (prologue_offset_ == -1) {
     Comment("PrologueOffset = %" Pd "", CodeSize());
     prologue_offset_ = CodeSize();
   }
-  movq(Address(RBP, kPcMarkerSlotFromFp * kWordSize), pc_marker_override);
-  movq(PP, new_pp);
-  set_constant_pool_allowed(true);
+  RestoreCodePointer();
+  LoadPoolPointer();
+
   if (extra_size != 0) {
     subq(RSP, Immediate(extra_size));
   }
@@ -3438,11 +3465,7 @@
 
 
 void Assembler::EnterStubFrame() {
-  set_constant_pool_allowed(false);
-  EnterFrame(0);
-  pushq(Immediate(0));  // Push 0 in the saved PC area for stub frames.
-  pushq(PP);  // Save caller's pool pointer
-  LoadPoolPointer();
+  EnterDartFrame(0, kNoRegister);
 }
 
 
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index a6d64db0..e0ac23f 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -366,7 +366,7 @@
   void call(Label* label);
   void call(const ExternalLabel* label);
 
-  static const intptr_t kCallExternalLabelSize = 7;
+  static const intptr_t kCallExternalLabelSize = 15;
 
   void pushq(Register reg);
   void pushq(const Address& address);
@@ -760,9 +760,6 @@
   void LoadIsolate(Register dst);
   void LoadObject(Register dst, const Object& obj);
   void LoadUniqueObject(Register dst, const Object& obj);
-  void LoadExternalLabel(Register dst,
-                         const ExternalLabel* label,
-                         Patchability patchable);
   void LoadNativeEntry(Register dst,
                        const ExternalLabel* label,
                        Patchability patchable);
@@ -770,7 +767,7 @@
                                   const Function& function,
                                   Register new_pp);
   void JmpPatchable(const StubEntry& stub_entry, Register pp);
-  void Jmp(const StubEntry& stub_entry, Register pp);
+  void Jmp(const StubEntry& stub_entry, Register pp = PP);
   void J(Condition condition, const StubEntry& stub_entry, Register pp);
   void CallPatchable(const StubEntry& stub_entry);
   void Call(const StubEntry& stub_entry);
@@ -832,6 +829,8 @@
   void PushRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
   void PopRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
 
+  void CheckCodePointer();
+
   void EnterFrame(intptr_t frame_space);
   void LeaveFrame();
   void ReserveAlignedFrameSpace(intptr_t frame_space);
@@ -922,6 +921,7 @@
     buffer_.FinalizeInstructions(region);
   }
 
+  void RestoreCodePointer();
   void LoadPoolPointer(Register pp = PP);
 
   // Set up a Dart frame on entry with a frame pointer and PC information to
@@ -943,16 +943,13 @@
   //   ...
   //   pushq r15
   //   .....
-  void EnterDartFrame(intptr_t frame_size,
-                      Register new_pp,
-                      Register pc_marker_override);
-  void LeaveDartFrame();
+  void EnterDartFrame(intptr_t frame_size, Register new_pp);
+  void LeaveDartFrame(RestorePP restore_pp = kRestoreCallerPP);
 
   // Set up a Dart frame for a function compiled for on-stack replacement.
   // The frame layout is a normal Dart frame, but the frame is partially set
   // up on entry (it is the frame of the unoptimized code).
-  void EnterOsrFrame(intptr_t extra_size,
-                     Register new_pp, Register pc_marker_override);
+  void EnterOsrFrame(intptr_t extra_size);
 
   // Set up a stub frame so that the stack traversal code can easily identify
   // a stub frame.
@@ -970,19 +967,6 @@
   void EnterStubFrame();
   void LeaveStubFrame();
 
-  // Instruction pattern from entrypoint is used in dart frame prologues
-  // to set up the frame and save a PC which can be used to figure out the
-  // RawInstruction object corresponding to the code running in the frame.
-  // entrypoint:
-  //   pushq rbp          (size is 1 byte)
-  //   movq rbp, rsp      (size is 3 bytes)
-  //   call L             (size is 5 bytes)
-  //   L:
-  static const intptr_t kEntryPointToPcMarkerOffset = 0;
-  static intptr_t EntryPointToPcMarkerOffset() {
-    return kEntryPointToPcMarkerOffset;
-  }
-
   void UpdateAllocationStats(intptr_t cid,
                              Heap::Space space,
                              bool inline_isolate = true);
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index eaa9ce0..e404b89 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -2020,23 +2020,40 @@
 }
 
 
+static void EnterTestFrame(Assembler* assembler) {
+  __ EnterFrame(0);
+  __ pushq(CODE_REG);
+  __ pushq(PP);
+  __ movq(CODE_REG, Address(CallingConventions::kArg1Reg,
+                            VMHandles::kOffsetOfRawPtrInHandle));
+  __ LoadPoolPointer(PP);
+}
+
+
+static void LeaveTestFrame(Assembler* assembler) {
+  __ popq(PP);
+  __ popq(CODE_REG);
+  __ LeaveFrame();
+}
+
+
 ASSEMBLER_TEST_GENERATE(PackedDoubleNegate, assembler) {
   static const struct ALIGN16 {
     double a;
     double b;
   } constant0 = { 1.0, 2.0 };
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ negatepd(XMM10);
   __ movaps(XMM0, XMM10);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedDoubleNegate, test) {
-  double res = test->Invoke<double>();
+  double res = test->InvokeWithCode<double>();
   EXPECT_FLOAT_EQ(-1.0, res, 0.000001f);
 }
 
@@ -2046,18 +2063,18 @@
     double a;
     double b;
   } constant0 = { -1.0, 2.0 };
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ movq(RAX, Immediate(reinterpret_cast<uword>(&constant0)));
   __ movups(XMM10, Address(RAX, 0));
   __ abspd(XMM10);
   __ movaps(XMM0, XMM10);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedDoubleAbsolute, test) {
-  double res = test->Invoke<double>();
+  double res = test->InvokeWithCode<double>();
   EXPECT_FLOAT_EQ(1.0, res, 0.000001f);
 }
 
@@ -2491,53 +2508,53 @@
 
 
 ASSEMBLER_TEST_GENERATE(PackedNegate, assembler) {
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
   __ negateps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedNegate, test) {
-  float res = test->Invoke<float>();
+  float res = test->InvokeWithCode<float>();
   EXPECT_FLOAT_EQ(-12.3f, res, 0.001f);
 }
 
 
 ASSEMBLER_TEST_GENERATE(PackedAbsolute, assembler) {
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ movl(RAX, Immediate(bit_cast<int32_t, float>(-15.3f)));
   __ movd(XMM0, RAX);
   __ shufps(XMM0, XMM0, Immediate(0x0));
   __ absps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xAA));  // Copy third lane into all 4 lanes.
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedAbsolute, test) {
-  float res = test->Invoke<float>();
+  float res = test->InvokeWithCode<float>();
   EXPECT_FLOAT_EQ(15.3f, res, 0.001f);
 }
 
 
 ASSEMBLER_TEST_GENERATE(PackedSetWZero, assembler) {
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ set1ps(XMM0, RAX, Immediate(bit_cast<int32_t, float>(12.3f)));
   __ zerowps(XMM0);
   __ shufps(XMM0, XMM0, Immediate(0xFF));  // Copy the W lane which is now 0.0.
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedSetWZero, test) {
-  float res = test->Invoke<float>();
+  float res = test->InvokeWithCode<float>();
   EXPECT_FLOAT_EQ(0.0f, res, 0.001f);
 }
 
@@ -2647,7 +2664,7 @@
     uint32_t d;
   } constant1 =
       { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF };
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadImmediate(RAX, Immediate(reinterpret_cast<intptr_t>(&constant1)));
   __ movups(XMM9, Address(RAX, 0));
   __ notps(XMM9);
@@ -2655,13 +2672,13 @@
   __ pushq(RAX);
   __ movss(Address(RSP, 0), XMM0);
   __ popq(RAX);
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(PackedLogicalNot, test) {
-  uint32_t res = test->Invoke<uint32_t>();
+  uint32_t res = test->InvokeWithCode<uint32_t>();
   EXPECT_EQ(static_cast<uword>(0x0), res);
 }
 
@@ -3053,7 +3070,7 @@
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Object& obj = Object::ZoneHandle(object_store->smi_class());
   Label fail;
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
   __ LoadObject(RAX, obj);
   __ CompareObject(RAX, obj);
   __ j(NOT_EQUAL, &fail);
@@ -3080,13 +3097,13 @@
   __ ret();
   __ Bind(&fail);
   __ movl(RAX, Immediate(0));  // Fail.
-  __ LeaveStubFrame();
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(TestObjectCompare, test) {
-  bool res = test->Invoke<bool>();
+  bool res = test->InvokeWithCode<bool>();
   EXPECT_EQ(true, res);
 }
 
@@ -3290,6 +3307,7 @@
 
 // Called from assembler_test.cc.
 ASSEMBLER_TEST_GENERATE(StoreIntoObject, assembler) {
+  __ pushq(CODE_REG);
   __ pushq(THR);
   __ movq(THR, CallingConventions::kArg3Reg);
   __ StoreIntoObject(CallingConventions::kArg2Reg,
@@ -3297,6 +3315,7 @@
                                   GrowableObjectArray::data_offset()),
                      CallingConventions::kArg1Reg);
   __ popq(THR);
+  __ popq(CODE_REG);
   __ ret();
 }
 
@@ -3410,19 +3429,25 @@
 
 
 ASSEMBLER_TEST_GENERATE(DoubleAbs, assembler) {
-  __ EnterStubFrame();
+  EnterTestFrame(assembler);
+#if defined(TARGET_OS_WINDOWS)
+  // First argument is code object, MSVC passes second argument in XMM1.
+  __ DoubleAbs(XMM1);
+  __ movaps(XMM0, XMM1);
+#else
   __ DoubleAbs(XMM0);
-  __ LeaveStubFrame();
+#endif
+  LeaveTestFrame(assembler);
   __ ret();
 }
 
 
 ASSEMBLER_TEST_RUN(DoubleAbs, test) {
   double val = -12.45;
-  double res =  test->Invoke<double, double>(val);
+  double res =  test->InvokeWithCode<double, double>(val);
   EXPECT_FLOAT_EQ(-val, res, 0.001);
   val = 12.45;
-  res = test->Invoke<double, double>(val);
+  res = test->InvokeWithCode<double, double>(val);
   EXPECT_FLOAT_EQ(val, res, 0.001);
 }
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index 36dfae2..900a689 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -10,6 +10,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 
+#include "vm/compiler_stats.h"
 #include "vm/dart_api_impl.h"
 #include "vm/stack_frame.h"
 #include "vm/unit_test.h"
@@ -46,7 +47,26 @@
     OS::PrintErr("Unexpected error in CorelibCompileAll benchmark:\n%s",
                  error.ToErrorCString());
   }
-  EXPECT(error.IsNull());
+  timer.Stop();
+  int64_t elapsed_time = timer.TotalElapsedTime();
+  benchmark->set_score(elapsed_time);
+}
+
+
+BENCHMARK(CorelibCompilerStats) {
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
+  CompilerStats* stats = Isolate::Current()->compiler_stats();
+  ASSERT(stats != NULL);
+  stats->EnableBenchmark();
+  Timer timer(true, "Compiler stats compiling all of Core lib");
+  timer.Start();
+  const Error& error = Error::Handle(benchmark->isolate(),
+                                     Library::CompileAll());
+  if (!error.IsNull()) {
+    OS::PrintErr("Unexpected error in CorelibCompileAll benchmark:\n%s",
+                 error.ToErrorCString());
+  }
   timer.Stop();
   int64_t elapsed_time = timer.TotalElapsedTime();
   benchmark->set_score(elapsed_time);
@@ -378,6 +398,41 @@
 }
 
 
+BENCHMARK(Dart2JSCompilerStats) {
+  bin::Builtin::SetNativeResolver(bin::Builtin::kBuiltinLibrary);
+  bin::Builtin::SetNativeResolver(bin::Builtin::kIOLibrary);
+  SetupDart2JSPackagePath();
+  char* dart_root = ComputeDart2JSPath(Benchmark::Executable());
+  char* script = NULL;
+  if (dart_root != NULL) {
+    HANDLESCOPE(thread);
+    script = OS::SCreate(NULL,
+        "import '%s/pkg/compiler/lib/compiler.dart';", dart_root);
+    Dart_Handle lib = TestCase::LoadTestScript(
+        script,
+        reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
+    EXPECT_VALID(lib);
+  } else {
+    Dart_Handle lib = TestCase::LoadTestScript(
+        "import 'pkg/compiler/lib/compiler.dart';",
+        reinterpret_cast<Dart_NativeEntryResolver>(NativeResolver));
+    EXPECT_VALID(lib);
+  }
+  CompilerStats* stats = Isolate::Current()->compiler_stats();
+  ASSERT(stats != NULL);
+  stats->EnableBenchmark();
+  Timer timer(true, "Compile all of dart2js benchmark");
+  timer.Start();
+  Dart_Handle result = Dart_CompileAll();
+  EXPECT_VALID(result);
+  timer.Stop();
+  int64_t elapsed_time = timer.TotalElapsedTime();
+  benchmark->set_score(elapsed_time);
+  free(dart_root);
+  free(script);
+}
+
+
 //
 // Measure frame lookup during stack traversal.
 //
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index e8d950c..7d6cfc5 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -90,7 +90,8 @@
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(unoptimized_code.pc_descriptors());
   PcDescriptors::Iterator iter(descriptors, RawPcDescriptors::kDeopt);
-  uword entry = unoptimized_code.EntryPoint();
+  uword entry =
+      Instructions::Handle(unoptimized_code.instructions()).EntryPoint();
   while (iter.MoveNext()) {
     intptr_t deopt_id = iter.DeoptId();
     ASSERT(deopt_id != Isolate::kNoDeoptId);
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index e57178c..ea37920 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -520,11 +520,12 @@
 }
 
 
-void ClassTable::UpdateLiveOld(intptr_t cid, intptr_t size) {
+void ClassTable::UpdateLiveOld(intptr_t cid, intptr_t size, intptr_t count) {
   ClassHeapStats* stats = PreliminaryStatsAt(cid);
   ASSERT(stats != NULL);
   ASSERT(size >= 0);
-  stats->post_gc.AddOld(size);
+  ASSERT(count >= 0);
+  stats->post_gc.AddOld(size, count);
 }
 
 
diff --git a/runtime/vm/class_table.h b/runtime/vm/class_table.h
index d7917de..aaabdf4 100644
--- a/runtime/vm/class_table.h
+++ b/runtime/vm/class_table.h
@@ -43,8 +43,8 @@
     old_size = 0;
   }
 
-  void AddOld(T size) {
-    old_count++;
+  void AddOld(T size, T count = 1) {
+    old_count += count;
     old_size += size;
   }
 
@@ -222,7 +222,7 @@
   bool TraceAllocationFor(intptr_t cid);
 
  private:
-  friend class MarkingVisitor;
+  friend class GCMarker;
   friend class ScavengerVisitor;
   friend class ClassHeapStatsTestHelper;
   static const int initial_capacity_ = 512;
@@ -243,7 +243,7 @@
 
   // May not have updated size for variable size classes.
   ClassHeapStats* PreliminaryStatsAt(intptr_t cid);
-  void UpdateLiveOld(intptr_t cid, intptr_t size);
+  void UpdateLiveOld(intptr_t cid, intptr_t size, intptr_t count = 1);
   void UpdateLiveNew(intptr_t cid, intptr_t size);
 
   DISALLOW_COPY_AND_ASSIGN(ClassTable);
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 53ee195..e8b1f6f 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -674,16 +674,12 @@
   const Code& target_code = Code::Handle(target_function.CurrentCode());
   // Before patching verify that we are not repeatedly patching to the same
   // target.
-  ASSERT(target_code.EntryPoint() !=
+  ASSERT(target_code.raw() !=
          CodePatcher::GetStaticCallTargetAt(caller_frame->pc(), caller_code));
-  const Instructions& instrs =
-      Instructions::Handle(caller_code.instructions());
-  {
-    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
-    CodePatcher::PatchStaticCallAt(caller_frame->pc(), caller_code,
-                                   target_code.EntryPoint());
-    caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
-  }
+  CodePatcher::PatchStaticCallAt(caller_frame->pc(),
+                                 caller_code,
+                                 target_code);
+  caller_code.SetStaticCallTargetCodeAt(caller_frame->pc(), target_code);
   if (FLAG_trace_patching) {
     OS::PrintErr("PatchStaticCall: patching caller pc %#" Px ""
         " to '%s' new entry point %#" Px " (%s)\n",
@@ -711,11 +707,10 @@
   DartFrameIterator iterator;
   StackFrame* caller_frame = iterator.NextFrame();
   ASSERT(caller_frame != NULL);
-  uword orig_stub =
-      isolate->debugger()->GetPatchedStubAddress(caller_frame->pc());
+  const Code& orig_stub = Code::Handle(
+      isolate->debugger()->GetPatchedStubAddress(caller_frame->pc()));
   isolate->debugger()->SignalBpReached();
-  ASSERT((orig_stub & kSmiTagMask) == kSmiTag);
-  arguments.SetReturn(Smi::Handle(reinterpret_cast<RawSmi*>(orig_stub)));
+  arguments.SetReturn(orig_stub);
 }
 
 
@@ -1440,6 +1435,7 @@
           Instructions::Handle(optimized_code.instructions()).EntryPoint();
       function.AttachCode(original_code);
       frame->set_pc(optimized_entry);
+      frame->set_pc_marker(optimized_code.raw());
     }
   }
 }
@@ -1527,14 +1523,10 @@
 
   const Code& current_target_code = Code::Handle(
       isolate, target_function.CurrentCode());
-  const Instructions& instrs = Instructions::Handle(
-      isolate, caller_code.instructions());
-  {
-    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
-    CodePatcher::PatchStaticCallAt(frame->pc(), caller_code,
-                                   current_target_code.EntryPoint());
-    caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
-  }
+  CodePatcher::PatchStaticCallAt(frame->pc(),
+                                 caller_code,
+                                 current_target_code);
+  caller_code.SetStaticCallTargetCodeAt(frame->pc(), current_target_code);
   if (FLAG_trace_patching) {
     OS::PrintErr("FixCallersTarget: caller %#" Px " "
         "target '%s' %#" Px " -> %#" Px "\n",
@@ -1564,9 +1556,8 @@
   ASSERT(frame->IsDartFrame());
   const Code& caller_code = Code::Handle(isolate, frame->LookupDartCode());
   ASSERT(!caller_code.IsNull());
-  const uword target =
-      CodePatcher::GetStaticCallTargetAt(frame->pc(), caller_code);
-  const Code& stub = Code::Handle(isolate, Code::LookupCode(target));
+  const Code& stub = Code::Handle(
+      CodePatcher::GetStaticCallTargetAt(frame->pc(), caller_code));
   Class& alloc_class = Class::ZoneHandle(zone);
   alloc_class ^= stub.owner();
   Code& alloc_stub = Code::Handle(isolate, alloc_class.allocation_stub());
@@ -1574,15 +1565,10 @@
     alloc_stub = StubCode::GetAllocationStubForClass(alloc_class);
     ASSERT(!CodePatcher::IsEntryPatched(alloc_stub));
   }
-  const Instructions& instrs =
-      Instructions::Handle(isolate, caller_code.instructions());
-  {
-    WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
-    CodePatcher::PatchStaticCallAt(frame->pc(),
-                                   caller_code,
-                                   alloc_stub.EntryPoint());
-    caller_code.SetStubCallTargetCodeAt(frame->pc(), alloc_stub);
-  }
+  CodePatcher::PatchStaticCallAt(frame->pc(),
+                                 caller_code,
+                                 alloc_stub);
+  caller_code.SetStubCallTargetCodeAt(frame->pc(), alloc_stub);
   if (FLAG_trace_patching) {
     OS::PrintErr("FixAllocationStubTarget: caller %#" Px " alloc-class %s "
         " -> %#" Px "\n",
@@ -1636,11 +1622,11 @@
       Instructions::Handle(zone, optimized_code.instructions());
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
-    CodePatcher::InsertCallAt(pc, lazy_deopt_jump);
+    CodePatcher::InsertDeoptimizationCallAt(pc, lazy_deopt_jump);
   }
   if (FLAG_trace_patching) {
     const String& name = String::Handle(function.name());
-    OS::PrintErr("InsertCallAt: %" Px " to %" Px " for %s\n", pc,
+    OS::PrintErr("InsertDeoptimizationCallAt: %" Px " to %" Px " for %s\n", pc,
                  lazy_deopt_jump, name.ToCString());
   }
   // Mark code as dead (do not GC its embedded objects).
@@ -1693,7 +1679,9 @@
 // Copies saved registers and caller's frame into temporary buffers.
 // Returns the stack size of unoptimized frame.
 DEFINE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame,
-                          1, uword saved_registers_address) {
+                          2,
+                          uword saved_registers_address,
+                          uword is_lazy_deopt) {
   Thread* thread = Thread::Current();
   Isolate* isolate = thread->isolate();
   StackZone zone(thread);
@@ -1719,9 +1707,12 @@
 
   // Create the DeoptContext.
   DeoptContext* deopt_context =
-      new DeoptContext(caller_frame, optimized_code,
+      new DeoptContext(caller_frame,
+                       optimized_code,
                        DeoptContext::kDestIsOriginalFrame,
-                       fpu_registers, cpu_registers);
+                       fpu_registers,
+                       cpu_registers,
+                       is_lazy_deopt != 0);
   isolate->set_deopt_context(deopt_context);
 
   // Stack size (FP - SP) in bytes.
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index d579577..c1fe9f7 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -35,42 +35,11 @@
 }
 
 
-static void SwapCode(intptr_t num_bytes, char* code, char* buffer) {
-  uword code_address = reinterpret_cast<uword>(code);
-  for (intptr_t i = 0; i < num_bytes; i++) {
-    char tmp = *code;
-    *code = *buffer;
-    *buffer = tmp;
-    code++;
-    buffer++;
-  }
-  CPU::FlushICache(code_address, num_bytes);
-  // The buffer is not executed. No need to flush.
-}
-
-
 // The patch code buffer contains the jmp code which will be inserted at
 // entry point.
-void CodePatcher::PatchEntry(const Code& code) {
-  ASSERT(!IsEntryPatched(code));
-  const uword patch_addr = code.GetEntryPatchPc();
-  ASSERT(patch_addr != 0);
-  JumpPattern jmp_entry(patch_addr, code);
-  ASSERT(!jmp_entry.IsValid());
-  const uword patch_buffer = code.GetPatchCodePc();
-  ASSERT(patch_buffer != 0);
-  JumpPattern jmp_patch(patch_buffer, code);
-  ASSERT(jmp_patch.IsValid());
-  const uword jump_target = jmp_patch.TargetAddress();
-  intptr_t length = jmp_patch.pattern_length_in_bytes();
-  {
-    WritableInstructionsScope writable_code(patch_addr, length);
-    WritableInstructionsScope writable_buffer(patch_buffer, length);
-    SwapCode(jmp_patch.pattern_length_in_bytes(),
-             reinterpret_cast<char*>(patch_addr),
-             reinterpret_cast<char*>(patch_buffer));
-    jmp_entry.SetTargetAddress(jump_target);
-  }
+void CodePatcher::PatchEntry(const Code& code, const Code& new_code) {
+  ASSERT(code.instructions() == code.active_instructions());
+  code.set_active_instructions(new_code.instructions());
 }
 
 
@@ -78,59 +47,13 @@
 // original code, the entry point contains the jump instruction.
 void CodePatcher::RestoreEntry(const Code& code) {
   if (!IsEntryPatched(code)) return;
-  const uword patch_addr = code.GetEntryPatchPc();
-  ASSERT(patch_addr != 0);
-  JumpPattern jmp_entry(patch_addr, code);
-  ASSERT(jmp_entry.IsValid());
-  const uword jump_target = jmp_entry.TargetAddress();
-  const uword patch_buffer = code.GetPatchCodePc();
-  ASSERT(patch_buffer != 0);
-  // 'patch_buffer' contains original entry code.
-  JumpPattern jmp_patch(patch_buffer, code);
-  ASSERT(!jmp_patch.IsValid());
-  intptr_t length = jmp_patch.pattern_length_in_bytes();
-  {
-    WritableInstructionsScope writable_code(patch_addr, length);
-    WritableInstructionsScope writable_buffer(patch_buffer, length);
-    SwapCode(jmp_patch.pattern_length_in_bytes(),
-             reinterpret_cast<char*>(patch_addr),
-             reinterpret_cast<char*>(patch_buffer));
-    ASSERT(jmp_patch.IsValid());
-    jmp_patch.SetTargetAddress(jump_target);
-  }
+  ASSERT(code.instructions() != code.active_instructions());
+  code.set_active_instructions(code.instructions());
 }
 
 
 bool CodePatcher::IsEntryPatched(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
-  if (patch_addr == 0) {
-    return false;
-  }
-  JumpPattern jmp_entry(patch_addr, code);
-  return jmp_entry.IsValid();
-}
-
-
-bool CodePatcher::CodeIsPatchable(const Code& code) {
-  const uword patch_addr = code.GetEntryPatchPc();
-  // Zero means means that the function is not patchable.
-  if (patch_addr == 0) {
-    return false;
-  }
-  JumpPattern jmp_entry(patch_addr, code);
-  if (code.Size() < (jmp_entry.pattern_length_in_bytes() * 2)) {
-    return false;
-  }
-  const uword limit = patch_addr + jmp_entry.pattern_length_in_bytes();
-  // Check no object stored between patch_addr .. limit.
-  for (intptr_t i = 0; i < code.pointer_offsets_length(); i++) {
-    const uword obj_start = code.GetPointerOffsetAt(i) + code.EntryPoint();
-    const uword obj_end  = obj_start + kWordSize;
-    if ((obj_start < limit) && (obj_end > patch_addr)) {
-      return false;
-    }
-  }
-  return true;
+  return code.instructions() != code.active_instructions();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/code_patcher.h b/runtime/vm/code_patcher.h
index 57ee46a..3c0236d 100644
--- a/runtime/vm/code_patcher.h
+++ b/runtime/vm/code_patcher.h
@@ -18,6 +18,7 @@
 class Function;
 class ICData;
 class RawArray;
+class RawCode;
 class RawFunction;
 class RawICData;
 class RawObject;
@@ -46,15 +47,10 @@
   // Patch static call before return_address in given code to the new target.
   static void PatchStaticCallAt(uword return_address,
                                 const Code& code,
-                                uword new_target_address);
-
-  // Patch instance call before return_address in given code to the new target.
-  static void PatchInstanceCallAt(uword return_address,
-                                  const Code& code,
-                                  uword new_target_address);
+                                const Code& new_target);
 
   // Patch entry point with a jump as specified in the code's patch region.
-  static void PatchEntry(const Code& code);
+  static void PatchEntry(const Code& code, const Code& new_code);
 
   // Restore entry point with original code (i.e., before patching).
   static void RestoreEntry(const Code& code);
@@ -62,20 +58,16 @@
   // Has the entry been patched?
   static bool IsEntryPatched(const Code& code);
 
-  // Returns true if the code can be patched with a jump at beginning (checks
-  // that there are no conflicts with object pointers). Used in ASSERTs.
-  static bool CodeIsPatchable(const Code& code);
-
   // Return the target address of the static call before return_address
   // in given code.
-  static uword GetStaticCallTargetAt(uword return_address, const Code& code);
+  static RawCode* GetStaticCallTargetAt(uword return_address, const Code& code);
 
   // Get instance call information.  Returns the call target and sets each
   // of the output parameters ic_data and arguments_descriptor if they are
   // non-NULL.
-  static uword GetInstanceCallAt(uword return_address,
-                                 const Code& code,
-                                 ICData* ic_data);
+  static RawCode* GetInstanceCallAt(uword return_address,
+                                    const Code& code,
+                                    ICData* ic_data);
 
   // Return target of an unoptimized static call and its ICData object
   // (calls target via a stub).
@@ -85,17 +77,17 @@
 
   static intptr_t InstanceCallSizeInBytes();
 
-  static void InsertCallAt(uword start, uword target);
+  static void InsertDeoptimizationCallAt(uword start, uword target);
 
   static RawObject* GetEdgeCounterAt(uword pc, const Code& code);
 
   static void PatchPoolPointerCallAt(uword return_address,
                                      const Code& code,
-                                     uword new_target);
+                                     const Code& new_target);
 
-  static uword GetNativeCallAt(uword return_address,
-                               const Code& code,
-                               NativeFunction* target);
+  static RawCode* GetNativeCallAt(uword return_address,
+                                  const Code& code,
+                                  NativeFunction* target);
 
   static void PatchNativeCallAt(uword return_address,
                                 const Code& code,
diff --git a/runtime/vm/code_patcher_arm.cc b/runtime/vm/code_patcher_arm.cc
index 49477c9..6c31af9 100644
--- a/runtime/vm/code_patcher_arm.cc
+++ b/runtime/vm/code_patcher_arm.cc
@@ -13,48 +13,39 @@
 
 namespace dart {
 
-uword CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                         const Code& code) {
+RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                            const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
-  return call.TargetAddress();
+  return call.TargetCode();
 }
 
 
 void CodePatcher::PatchStaticCallAt(uword return_address,
                                     const Code& code,
-                                    uword new_target) {
+                                    const Code& new_target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
-  call.SetTargetAddress(new_target);
+  call.SetTargetCode(new_target);
 }
 
 
-void CodePatcher::PatchInstanceCallAt(uword return_address,
-                                      const Code& code,
-                                      uword new_target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  call.SetTargetAddress(new_target);
-}
-
-
-void CodePatcher::InsertCallAt(uword start, uword target) {
+void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
-  ASSERT(start + CallPattern::LengthInBytes() <= target);
-  CallPattern::InsertAt(start, target);
+  ASSERT(start + CallPattern::DeoptCallPatternLengthInBytes() <= target);
+  CallPattern::InsertDeoptCallAt(start, target);
 }
 
 
-uword CodePatcher::GetInstanceCallAt(uword return_address,
-                                     const Code& code,
-                                     ICData* ic_data) {
+RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
+                                        const Code& code,
+                                        ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
   if (ic_data != NULL) {
     *ic_data = call.IcData();
   }
-  return call.TargetAddress();
+  return call.TargetCode();
 }
 
 
@@ -84,14 +75,14 @@
                                     const Code& trampoline) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
-  call.set_target(trampoline.EntryPoint());
+  call.set_target(trampoline);
   call.set_native_function(target);
 }
 
 
-uword CodePatcher::GetNativeCallAt(uword return_address,
-                                   const Code& code,
-                                   NativeFunction* target) {
+RawCode* CodePatcher::GetNativeCallAt(uword return_address,
+                                     const Code& code,
+                                     NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_arm64.cc b/runtime/vm/code_patcher_arm64.cc
index 3e10b5a..3aa2982 100644
--- a/runtime/vm/code_patcher_arm64.cc
+++ b/runtime/vm/code_patcher_arm64.cc
@@ -12,15 +12,6 @@
 
 namespace dart {
 
-void CodePatcher::PatchInstanceCallAt(uword return_address,
-                                      const Code& code,
-                                      uword new_target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  call.SetTargetAddress(new_target);
-}
-
-
 class PoolPointerCall : public ValueObject {
  public:
   PoolPointerCall(uword pc, const Code& code)
@@ -29,19 +20,19 @@
     // Last instruction: blr ip0.
     ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
     InstructionPattern::DecodeLoadWordFromPool(
-        end_ - Instr::kInstrSize, &reg_, &index_);
+        end_ - 2 * Instr::kInstrSize, &reg_, &index_);
   }
 
   intptr_t pp_index() const {
     return index_;
   }
 
-  uword Target() const {
-    return object_pool_.RawValueAt(pp_index());
+  RawCode* Target() const {
+    return reinterpret_cast<RawCode*>(object_pool_.ObjectAt(pp_index()));
   }
 
-  void SetTarget(uword target) const {
-    object_pool_.SetRawValueAt(pp_index(), target);
+  void SetTarget(const Code& target) const {
+    object_pool_.SetObjectAt(pp_index(), target);
     // No need to flush the instruction cache, since the code is not modified.
   }
 
@@ -55,8 +46,8 @@
 };
 
 
-uword CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                         const Code& code) {
+RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                            const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   return call.Target();
@@ -65,36 +56,36 @@
 
 void CodePatcher::PatchStaticCallAt(uword return_address,
                                     const Code& code,
-                                    uword new_target) {
+                                    const Code& new_target) {
   PatchPoolPointerCallAt(return_address, code, new_target);
 }
 
 
 void CodePatcher::PatchPoolPointerCallAt(uword return_address,
                                          const Code& code,
-                                         uword new_target) {
+                                         const Code& new_target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   call.SetTarget(new_target);
 }
 
 
-void CodePatcher::InsertCallAt(uword start, uword target) {
+void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
-  ASSERT(start + CallPattern::kLengthInBytes <= target);
-  CallPattern::InsertAt(start, target);
+  ASSERT(start + CallPattern::kDeoptCallLengthInBytes <= target);
+  CallPattern::InsertDeoptCallAt(start, target);
 }
 
 
-uword CodePatcher::GetInstanceCallAt(uword return_address,
-                                     const Code& code,
-                                     ICData* ic_data) {
+RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
+                                        const Code& code,
+                                        ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
   if (ic_data != NULL) {
     *ic_data = call.IcData();
   }
-  return call.TargetAddress();
+  return call.TargetCode();
 }
 
 
@@ -124,14 +115,14 @@
                                     const Code& trampoline) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
-  call.set_target(trampoline.EntryPoint());
+  call.set_target(trampoline);
   call.set_native_function(target);
 }
 
 
-uword CodePatcher::GetNativeCallAt(uword return_address,
-                                   const Code& code,
-                                   NativeFunction* target) {
+RawCode* CodePatcher::GetNativeCallAt(uword return_address,
+                                      const Code& code,
+                                      NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_ia32.cc b/runtime/vm/code_patcher_ia32.cc
index 95d64e0..e1f5483 100644
--- a/runtime/vm/code_patcher_ia32.cc
+++ b/runtime/vm/code_patcher_ia32.cc
@@ -18,52 +18,38 @@
 
 // The expected pattern of a Dart unoptimized call (static and instance):
 //  mov ECX, ic-data
+//  mov EDI, target-code-object
 //  call target_address (stub)
 //  <- return address
 class UnoptimizedCall : public ValueObject {
  public:
   explicit UnoptimizedCall(uword return_address)
-      : start_(return_address - (kNumInstructions * kInstructionSize)) {
-    ASSERT(IsValid(return_address));
-    ASSERT(kInstructionSize == Assembler::kCallExternalLabelSize);
-  }
-
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(
-            return_address - (kNumInstructions * kInstructionSize));
-    return (code_bytes[0] == 0xB9) &&
-           (code_bytes[1 * kInstructionSize] == 0xE8);
-  }
-
-  uword target() const {
-    const uword offset = *reinterpret_cast<uword*>(call_address() + 1);
-    return return_address() + offset;
-  }
-
-  void set_target(uword target) const {
-    uword* target_addr = reinterpret_cast<uword*>(call_address() + 1);
-    uword offset = target - return_address();
-    WritableInstructionsScope writable(reinterpret_cast<uword>(target_addr),
-                                       sizeof(offset));
-    *target_addr = offset;
-    CPU::FlushICache(call_address(), kInstructionSize);
+      : start_(return_address - kPatternSize) {
+    ASSERT(IsValid());
   }
 
   RawObject* ic_data() const {
     return *reinterpret_cast<RawObject**>(start_ + 1);
   }
 
-  static const int kNumInstructions = 2;
-  static const int kInstructionSize = 5;  // All instructions have same length.
+  static const int kMovInstructionSize = 5;
+  static const int kCallInstructionSize = 3;
+  static const int kPatternSize =
+      2 * kMovInstructionSize + kCallInstructionSize;
 
  private:
+  bool IsValid() {
+    uint8_t* code_bytes = reinterpret_cast<uint8_t*>(start_);
+    return (code_bytes[0] == 0xB9) &&
+           (code_bytes[2 * kMovInstructionSize] == 0xFF);
+  }
+
   uword return_address() const {
-    return start_ + kNumInstructions * kInstructionSize;
+    return start_ + kPatternSize;
   }
 
   uword call_address() const {
-    return start_ + 1 * kInstructionSize;
+    return start_ + 2 * kMovInstructionSize;
   }
 
  protected:
@@ -127,45 +113,43 @@
 
 // The expected pattern of a dart static call:
 //  mov EDX, arguments_descriptor_array (optional in polymorphic calls)
-//  call target_address
+//  mov EDI, Immediate(code_object)
+//  call [EDI + entry_point_offset]
 //  <- return address
 class StaticCall : public ValueObject {
  public:
   explicit StaticCall(uword return_address)
-      : start_(return_address - (kNumInstructions * kInstructionSize)) {
-    ASSERT(IsValid(return_address));
-    ASSERT(kInstructionSize == Assembler::kCallExternalLabelSize);
+      : start_(return_address - (kMovInstructionSize + kCallInstructionSize)) {
+    ASSERT(IsValid());
   }
 
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(
-            return_address - (kNumInstructions * kInstructionSize));
-    return (code_bytes[0] == 0xE8);
+  bool IsValid() {
+    uint8_t* code_bytes = reinterpret_cast<uint8_t*>(start_);
+    return (code_bytes[0] == 0xBF) && (code_bytes[5] == 0xFF);
   }
 
-  uword target() const {
-    const uword offset = *reinterpret_cast<uword*>(call_address() + 1);
-    return return_address() + offset;
+  RawCode* target() const {
+    const uword imm = *reinterpret_cast<uword*>(start_ + 1);
+    return reinterpret_cast<RawCode*>(imm);
   }
 
-  void set_target(uword target) const {
-    uword* target_addr = reinterpret_cast<uword*>(call_address() + 1);
-    uword offset = target - return_address();
-    *target_addr = offset;
-    CPU::FlushICache(call_address(), kInstructionSize);
+  void set_target(const Code& target) const {
+    uword* target_addr = reinterpret_cast<uword*>(start_ + 1);
+    uword imm = reinterpret_cast<uword>(target.raw());
+    *target_addr = imm;
+    CPU::FlushICache(start_ + 1, sizeof(imm));
   }
 
-  static const int kNumInstructions = 1;
-  static const int kInstructionSize = 5;  // All instructions have same length.
+  static const int kMovInstructionSize = 5;
+  static const int kCallInstructionSize = 3;
 
  private:
   uword return_address() const {
-    return start_ + kNumInstructions * kInstructionSize;
+    return start_ + kMovInstructionSize +  kCallInstructionSize;
   }
 
   uword call_address() const {
-    return start_;
+    return start_ + kMovInstructionSize;
   }
 
   uword start_;
@@ -174,8 +158,8 @@
 };
 
 
-uword CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                         const Code& code) {
+RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                            const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   StaticCall call(return_address);
   return call.target();
@@ -184,23 +168,16 @@
 
 void CodePatcher::PatchStaticCallAt(uword return_address,
                                     const Code& code,
-                                    uword new_target) {
+                                    const Code& new_target) {
+  const Instructions& instrs = Instructions::Handle(code.instructions());
+  WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
   ASSERT(code.ContainsInstructionAt(return_address));
   StaticCall call(return_address);
   call.set_target(new_target);
 }
 
 
-void CodePatcher::PatchInstanceCallAt(uword return_address,
-                                      const Code& code,
-                                      uword new_target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  InstanceCall call(return_address);
-  call.set_target(new_target);
-}
-
-
-void CodePatcher::InsertCallAt(uword start, uword target) {
+void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
   ASSERT(start + CallPattern::pattern_length_in_bytes() <= target);
   *reinterpret_cast<uint8_t*>(start) = 0xE8;
@@ -210,14 +187,14 @@
 }
 
 
-uword CodePatcher::GetInstanceCallAt(
+RawCode* CodePatcher::GetInstanceCallAt(
     uword return_address, const Code& code, ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   InstanceCall call(return_address);
   if (ic_data != NULL) {
     *ic_data ^= call.ic_data();
   }
-  return call.target();
+  return Code::null();
 }
 
 
@@ -238,26 +215,21 @@
                                     const Code& code,
                                     NativeFunction target,
                                     const Code& trampoline) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  NativeCall call(return_address);
-  call.set_target(trampoline.EntryPoint());
-  call.set_native_function(target);
+  UNREACHABLE();
 }
 
 
-uword CodePatcher::GetNativeCallAt(uword return_address,
-                                   const Code& code,
-                                   NativeFunction* target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  NativeCall call(return_address);
-  *target = call.native_function();
-  return call.target();
+RawCode* CodePatcher::GetNativeCallAt(uword return_address,
+                                      const Code& code,
+                                      NativeFunction* target) {
+  UNREACHABLE();
+  return NULL;
 }
 
 
 
 intptr_t CodePatcher::InstanceCallSizeInBytes() {
-  return InstanceCall::kNumInstructions * InstanceCall::kInstructionSize;
+  return InstanceCall::kPatternSize;
 }
 
 
diff --git a/runtime/vm/code_patcher_mips.cc b/runtime/vm/code_patcher_mips.cc
index 1014aed..aad4413 100644
--- a/runtime/vm/code_patcher_mips.cc
+++ b/runtime/vm/code_patcher_mips.cc
@@ -12,48 +12,39 @@
 
 namespace dart {
 
-uword CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                         const Code& code) {
+RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                            const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
-  return call.TargetAddress();
+  return call.TargetCode();
 }
 
 
 void CodePatcher::PatchStaticCallAt(uword return_address,
                                     const Code& code,
-                                    uword new_target) {
+                                    const Code& new_target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
-  call.SetTargetAddress(new_target);
+  call.SetTargetCode(new_target);
 }
 
 
-void CodePatcher::PatchInstanceCallAt(uword return_address,
-                                      const Code& code,
-                                      uword new_target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  CallPattern call(return_address, code);
-  call.SetTargetAddress(new_target);
-}
-
-
-void CodePatcher::InsertCallAt(uword start, uword target) {
+void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
-  ASSERT(start + CallPattern::kFixedLengthInBytes <= target);
-  CallPattern::InsertAt(start, target);
+  ASSERT(start + CallPattern::kDeoptCallLengthInBytes <= target);
+  CallPattern::InsertDeoptCallAt(start, target);
 }
 
 
-uword CodePatcher::GetInstanceCallAt(uword return_address,
-                                     const Code& code,
-                                     ICData* ic_data) {
+RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
+                                        const Code& code,
+                                        ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   CallPattern call(return_address, code);
   if (ic_data != NULL) {
     *ic_data = call.IcData();
   }
-  return call.TargetAddress();
+  return call.TargetCode();
 }
 
 
@@ -83,14 +74,14 @@
                                     const Code& trampoline) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
-  call.set_target(trampoline.EntryPoint());
+  call.set_target(trampoline);
   call.set_native_function(target);
 }
 
 
-uword CodePatcher::GetNativeCallAt(uword return_address,
-                                   const Code& code,
-                                   NativeFunction* target) {
+RawCode* CodePatcher::GetNativeCallAt(uword return_address,
+                                      const Code& code,
+                                      NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCallPattern call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/code_patcher_x64.cc b/runtime/vm/code_patcher_x64.cc
index e9e678d..416e150 100644
--- a/runtime/vm/code_patcher_x64.cc
+++ b/runtime/vm/code_patcher_x64.cc
@@ -16,28 +16,44 @@
 
 namespace dart {
 
-// The expected pattern of a Dart unoptimized call (static and instance):
-//   0: 49 8b 9f imm32  mov RBX, [PP + off]
-//   7: 41 ff 97 imm32  call [PP + off]
-//  14 <- return address
+
+static bool MatchesPattern(uword addr, int16_t* pattern, intptr_t size) {
+  uint8_t* bytes = reinterpret_cast<uint8_t*>(addr);
+  for (intptr_t i = 0; i < size; i++) {
+    int16_t val = pattern[i];
+    if ((val >= 0) && (val != bytes[i])) {
+      return false;
+    }
+  }
+  return true;
+}
+
+
+intptr_t IndexFromPPLoad(uword start) {
+  int32_t offset = *reinterpret_cast<int32_t*>(start);
+  return ObjectPool::IndexFromOffset(offset);
+}
+
+
 class UnoptimizedCall : public ValueObject {
  public:
   UnoptimizedCall(uword return_address, const Code& code)
       : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
         start_(return_address - kCallPatternSize) {
-    ASSERT(IsValid(return_address));
     ASSERT((kCallPatternSize - 7) == Assembler::kCallExternalLabelSize);
+    ASSERT(IsValid());
   }
 
-  static const int kCallPatternSize = 14;
+  static const int kCallPatternSize = 22;
 
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
-    return (code_bytes[0] == 0x49) && (code_bytes[1] == 0x8B) &&
-           (code_bytes[2] == 0x9F) &&
-           (code_bytes[7] == 0x41) && (code_bytes[8] == 0xFF) &&
-           (code_bytes[9] == 0x97);
+  bool IsValid() const {
+    static int16_t pattern[kCallPatternSize] = {
+      0x49, 0x8b, 0x9f, -1, -1, -1, -1,  // movq RBX, [PP + offs]
+      0x4d, 0x8b, 0xa7, -1, -1, -1, -1,  // movq CR, [PP + offs]
+      0x4d, 0x8b, 0x5c, 0x24, 0x07,      // movq TMP, [CR + entry_point_offs]
+      0x41, 0xff, 0xd3                   // callq TMP
+    };
+    return MatchesPattern(start_, pattern, kCallPatternSize);
   }
 
   intptr_t argument_index() const {
@@ -48,14 +64,16 @@
     return object_pool_.ObjectAt(argument_index());
   }
 
-  uword target() const {
+  RawCode* target() const {
     intptr_t index = IndexFromPPLoad(start_ + 10);
-    return object_pool_.RawValueAt(index);
+    Code& code = Code::Handle();
+    code ^= object_pool_.ObjectAt(index);
+    return code.raw();
   }
 
-  void set_target(uword target) const {
+  void set_target(const Code& target) const {
     intptr_t index = IndexFromPPLoad(start_ + 10);
-    object_pool_.SetRawValueAt(index, target);
+    object_pool_.SetObjectAt(index, target);
     // No need to flush the instruction cache, since the code is not modified.
   }
 
@@ -122,36 +140,38 @@
 
 
 // The expected pattern of a call where the target is loaded from
-// the object pool:
-//   0: 41 ff 97 imm32  call [PP + off]
-//   7: <- return address
+// the object pool.
 class PoolPointerCall : public ValueObject {
  public:
   explicit PoolPointerCall(uword return_address, const Code& code)
       : start_(return_address - kCallPatternSize),
         object_pool_(ObjectPool::Handle(code.GetObjectPool())) {
-    ASSERT(IsValid(return_address));
+    ASSERT(IsValid());
   }
 
-  static const int kCallPatternSize = 7;
+  static const int kCallPatternSize = 15;
 
-  static bool IsValid(uword return_address) {
-    uint8_t* code_bytes =
-        reinterpret_cast<uint8_t*>(return_address - kCallPatternSize);
-    return (code_bytes[0] == 0x41) && (code_bytes[1] == 0xFF) &&
-           (code_bytes[2] == 0x97);
+  bool IsValid() const {
+    static int16_t pattern[kCallPatternSize] = {
+      0x4d, 0x8b, 0xa7,   -1,   -1, -1, -1,  // movq CR, [PP + offs]
+      0x4d, 0x8b, 0x5c, 0x24, 0x07,          // movq TMP, [CR + entry_point_off]
+      0x41, 0xff, 0xd3                       // callq TMP
+    };
+    return MatchesPattern(start_, pattern, kCallPatternSize);
   }
 
   intptr_t pp_index() const {
     return IndexFromPPLoad(start_ + 3);
   }
 
-  uword Target() const {
-    return object_pool_.RawValueAt(pp_index());
+  RawCode* Target() const {
+    Code& code = Code::Handle();
+    code ^= object_pool_.ObjectAt(pp_index());
+    return code.raw();
   }
 
-  void SetTarget(uword target) const {
-    object_pool_.SetRawValueAt(pp_index(), target);
+  void SetTarget(const Code& target) const {
+    object_pool_.SetObjectAt(pp_index(), target);
     // No need to flush the instruction cache, since the code is not modified.
   }
 
@@ -164,8 +184,8 @@
 };
 
 
-uword CodePatcher::GetStaticCallTargetAt(uword return_address,
-                                         const Code& code) {
+RawCode* CodePatcher::GetStaticCallTargetAt(uword return_address,
+                                            const Code& code) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   return call.Target();
@@ -174,32 +194,23 @@
 
 void CodePatcher::PatchStaticCallAt(uword return_address,
                                     const Code& code,
-                                    uword new_target) {
+                                    const Code& new_target) {
   PatchPoolPointerCallAt(return_address, code, new_target);
 }
 
 
 void CodePatcher::PatchPoolPointerCallAt(uword return_address,
                                          const Code& code,
-                                         uword new_target) {
+                                         const Code& new_target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   PoolPointerCall call(return_address, code);
   call.SetTarget(new_target);
 }
 
 
-void CodePatcher::PatchInstanceCallAt(uword return_address,
-                                      const Code& code,
-                                      uword new_target) {
-  ASSERT(code.ContainsInstructionAt(return_address));
-  InstanceCall call(return_address, code);
-  call.set_target(new_target);
-}
-
-
-uword CodePatcher::GetInstanceCallAt(uword return_address,
-                                     const Code& code,
-                                     ICData* ic_data) {
+RawCode* CodePatcher::GetInstanceCallAt(uword return_address,
+                                        const Code& code,
+                                        ICData* ic_data) {
   ASSERT(code.ContainsInstructionAt(return_address));
   InstanceCall call(return_address, code);
   if (ic_data != NULL) {
@@ -214,7 +225,7 @@
 }
 
 
-void CodePatcher::InsertCallAt(uword start, uword target) {
+void CodePatcher::InsertDeoptimizationCallAt(uword start, uword target) {
   // The inserted call should not overlap the lazy deopt jump code.
   ASSERT(start + ShortCallPattern::pattern_length_in_bytes() <= target);
   *reinterpret_cast<uint8_t*>(start) = 0xE8;
@@ -243,14 +254,14 @@
                                     const Code& trampoline) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCall call(return_address, code);
-  call.set_target(trampoline.EntryPoint());
+  call.set_target(trampoline);
   call.set_native_function(target);
 }
 
 
-uword CodePatcher::GetNativeCallAt(uword return_address,
-                                   const Code& code,
-                                   NativeFunction* target) {
+RawCode* CodePatcher::GetNativeCallAt(uword return_address,
+                                      const Code& code,
+                                      NativeFunction* target) {
   ASSERT(code.ContainsInstructionAt(return_address));
   NativeCall call(return_address, code);
   *target = call.native_function();
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index fe4fc64..85568b8 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -758,7 +758,9 @@
         if (optimized) {
           // We may not have previous code if 'always_optimize' is set.
           if ((osr_id == Isolate::kNoDeoptId) && function.HasCode()) {
-            CodePatcher::PatchEntry(Code::Handle(function.CurrentCode()));
+            CodePatcher::PatchEntry(
+                Code::Handle(function.CurrentCode()),
+                Code::Handle(StubCode::FixCallersTarget_entry()->code()));
             if (FLAG_trace_compiler || FLAG_trace_patching) {
               if (FLAG_trace_compiler) {
                 THR_Print("  ");
@@ -790,7 +792,6 @@
           }
           function.set_unoptimized_code(code);
           function.AttachCode(code);
-          ASSERT(CodePatcher::CodeIsPatchable(code));
         }
         if (parsed_function->HasDeferredPrefixes()) {
           ASSERT(!FLAG_load_deferred_eagerly);
diff --git a/runtime/vm/compiler_stats.cc b/runtime/vm/compiler_stats.cc
index 86da700..d3e4b02 100644
--- a/runtime/vm/compiler_stats.cc
+++ b/runtime/vm/compiler_stats.cc
@@ -13,6 +13,8 @@
 namespace dart {
 
 DEFINE_FLAG(bool, compiler_stats, false, "Compiler stat counters.");
+DEFINE_FLAG(bool, compiler_benchmark, false,
+            "Compiler stat counters for benchmark.");
 
 
 class TokenStreamVisitor : public ObjectVisitor {
@@ -71,6 +73,7 @@
       num_tokens_total(0),
       num_literal_tokens_total(0),
       num_ident_tokens_total(0),
+      num_tokens_scanned(0),
       num_tokens_consumed(0),
       num_cached_consts(0),
       num_const_cache_hits(0),
@@ -87,7 +90,8 @@
       total_instr_size(0),
       pc_desc_size(0),
       vardesc_size(0),
-      text(NULL) {
+      text(NULL),
+      use_benchmark_output(false) {
 }
 
 
@@ -109,11 +113,7 @@
 }
 
 
-char* CompilerStats::PrintToZone() {
-  if (!FLAG_compiler_stats) {
-    return NULL;
-  }
-
+void CompilerStats::Update() {
   // Traverse the heap and compute number of tokens in all
   // TokenStream objects.
   num_tokens_total = 0;
@@ -122,6 +122,76 @@
   TokenStreamVisitor visitor(isolate_, this);
   isolate_->heap()->IterateObjects(&visitor);
   Dart::vm_isolate()->heap()->IterateObjects(&visitor);
+}
+
+
+void CompilerStats::EnableBenchmark() {
+  FLAG_compiler_stats = true;
+  use_benchmark_output = true;
+}
+
+
+// Generate output for Golem benchmark harness. If the output format
+// changes, the parsing function in Golem must be updated.
+char* CompilerStats::BenchmarkOutput() {
+  Update();
+  Log log(PrintToStats);
+  LogBlock lb(Thread::Current(), &log);
+  log.Print("==== Compiler Stats for isolate '%s' ====\n",
+            isolate_->debugger_name());
+
+  log.Print("NumberOfTokens: %" Pd64 "\n", num_tokens_total);
+  log.Print("NumClassesParsed: %" Pd64 "\n", num_classes_parsed);
+  log.Print("NumFunctionsCompiled: %" Pd64 "\n", num_functions_compiled);
+  log.Print("NumFunctionsOptimized: %" Pd64 "\n", num_functions_optimized);
+  log.Print("NumFunctionsParsed: %" Pd64 "\n", num_functions_parsed);
+
+  // Scanner stats.
+  int64_t scan_usecs = scanner_timer.TotalElapsedTime();
+  int64_t scan_speed =
+      scan_usecs > 0 ? 1000 * num_tokens_scanned / scan_usecs : 0;
+  log.Print("NumTokensScanned: %" Pd64 " tokens\n", num_tokens_scanned);
+  log.Print("ScannerTime: %" Pd64 " ms\n", scan_usecs / 1000);
+  log.Print("ScannerSpeed: %" Pd64 " tokens/ms\n", scan_speed);
+
+  // Parser stats.
+  int64_t parse_usecs = parser_timer.TotalElapsedTime();
+  int64_t parse_speed =
+      parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0;
+  log.Print("NumTokensParsed: %" Pd64 " tokens\n", num_tokens_consumed);
+  log.Print("ParserTime: %" Pd64 " ms\n", parse_usecs / 1000);
+  log.Print("ParserSpeed: %" Pd64 " tokens/ms\n", parse_speed);
+
+  // Compiler stats.
+  int64_t codegen_usecs = codegen_timer.TotalElapsedTime();
+  int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs;
+  int64_t compile_speed =
+      compile_usecs > 0 ? (1000 * num_func_tokens_compiled / compile_usecs) : 0;
+  log.Print("NumTokensCompiled: %" Pd64 " tokens\n", num_func_tokens_compiled);
+  log.Print("CompilerTime: %" Pd64 " ms\n", compile_usecs / 1000);
+
+  log.Print("CompilerSpeed: %" Pd64 " tokens/ms\n", compile_speed);
+  log.Print("CodeSize: %" Pd64 " KB\n", total_code_size / 1024);
+  int64_t code_density = total_instr_size > 0 ?
+      (num_func_tokens_compiled * 1024) / total_instr_size : 0;
+
+  log.Print("CodeDensity: %" Pd64 " tokens/KB\n", code_density);
+  log.Print("InstrSize: %" Pd64 " KB\n", total_instr_size / 1024);
+  log.Flush();
+  char* benchmark_text = text;
+  text = NULL;
+  return benchmark_text;
+}
+
+
+char* CompilerStats::PrintToZone() {
+  if (!FLAG_compiler_stats) {
+    return NULL;
+  } else if (use_benchmark_output) {
+    return BenchmarkOutput();
+  }
+
+  Update();
 
   Log log(PrintToStats);
   LogBlock lb(Thread::Current(), &log);
@@ -132,6 +202,7 @@
   log.Print("  Literal tokens:        %" Pd64 "\n", num_literal_tokens_total);
   log.Print("  Ident tokens:          %" Pd64 "\n", num_ident_tokens_total);
   log.Print("Source length:           %" Pd64 " characters\n", src_length);
+  log.Print("Number of source tokens: %" Pd64 "\n", num_tokens_scanned);
 
   log.Print("==== Parser stats:\n");
   log.Print("Total tokens consumed:   %" Pd64 "\n", num_tokens_consumed);
@@ -145,62 +216,71 @@
   log.Print("Consts cache hits:       %" Pd64 "\n", num_const_cache_hits);
 
   int64_t scan_usecs = scanner_timer.TotalElapsedTime();
-  log.Print("Scanner time:            %" Pd64 " msecs\n", scan_usecs / 1000);
+  log.Print("Scanner time:            %" Pd64 " ms\n", scan_usecs / 1000);
+  int64_t scan_speed =
+      scan_usecs > 0 ? 1000 * num_tokens_consumed / scan_usecs : 0;
+  log.Print("Scanner speed:           %" Pd64 " tokens/ms\n", scan_speed);
   int64_t parse_usecs = parser_timer.TotalElapsedTime();
-  log.Print("Parser time:             %" Pd64 " msecs\n", parse_usecs / 1000);
-  log.Print("Parser speed:            %" Pd64 " tokens per msec\n",
-            1000 * num_tokens_consumed / parse_usecs);
+  int64_t parse_speed =
+      parse_usecs > 0 ? 1000 * num_tokens_consumed / parse_usecs : 0;
+  log.Print("Parser time:             %" Pd64 " ms\n", parse_usecs / 1000);
+  log.Print("Parser speed:            %" Pd64 " tokens/ms\n",
+             parse_speed);
+
   int64_t codegen_usecs = codegen_timer.TotalElapsedTime();
 
   log.Print("==== Backend stats:\n");
-  log.Print("Code gen. time:          %" Pd64 " msecs\n",
-            codegen_usecs / 1000);
+  log.Print("Code gen. time:          %" Pd64 " ms\n", codegen_usecs / 1000);
   int64_t graphbuilder_usecs = graphbuilder_timer.TotalElapsedTime();
-  log.Print("  Graph builder:         %" Pd64 " msecs\n",
+  log.Print("  Graph builder:         %" Pd64 " ms\n",
             graphbuilder_usecs / 1000);
   int64_t ssa_usecs = ssa_timer.TotalElapsedTime();
-  log.Print("  Graph SSA:             %" Pd64 " msecs\n", ssa_usecs / 1000);
+  log.Print("  Graph SSA:             %" Pd64 " ms\n", ssa_usecs / 1000);
 
   int64_t graphinliner_usecs = graphinliner_timer.TotalElapsedTime();
-  log.Print("  Graph inliner:         %" Pd64 " msecs\n",
+  log.Print("  Graph inliner:         %" Pd64 " ms\n",
             graphinliner_usecs / 1000);
   int64_t graphinliner_parse_usecs =
       graphinliner_parse_timer.TotalElapsedTime();
-  log.Print("    Parsing:             %" Pd64 " msecs\n",
+  log.Print("    Parsing:             %" Pd64 " ms\n",
             graphinliner_parse_usecs / 1000);
   int64_t graphinliner_build_usecs =
       graphinliner_build_timer.TotalElapsedTime();
-  log.Print("    Building:            %" Pd64 " msecs\n",
+  log.Print("    Building:            %" Pd64 " ms\n",
             graphinliner_build_usecs / 1000);
   int64_t graphinliner_ssa_usecs = graphinliner_ssa_timer.TotalElapsedTime();
-  log.Print("    SSA:                 %" Pd64 " msecs\n",
+  log.Print("    SSA:                 %" Pd64 " ms\n",
             graphinliner_ssa_usecs / 1000);
   int64_t graphinliner_opt_usecs = graphinliner_opt_timer.TotalElapsedTime();
-  log.Print("    Optimization:        %" Pd64 " msecs\n",
+  log.Print("    Optimization:        %" Pd64 " ms\n",
             graphinliner_opt_usecs / 1000);
   int64_t graphinliner_subst_usecs =
       graphinliner_subst_timer.TotalElapsedTime();
-  log.Print("    Substitution:        %" Pd64 " msecs\n",
+  log.Print("    Substitution:        %" Pd64 " ms\n",
             graphinliner_subst_usecs / 1000);
   int64_t graphoptimizer_usecs = graphoptimizer_timer.TotalElapsedTime();
-  log.Print("  Graph optimizer:       %" Pd64 " msecs\n",
+  log.Print("  Graph optimizer:       %" Pd64 " ms\n",
             (graphoptimizer_usecs - graphinliner_usecs) / 1000);
   int64_t graphcompiler_usecs = graphcompiler_timer.TotalElapsedTime();
-  log.Print("  Graph compiler:        %" Pd64 " msecs\n",
+  log.Print("  Graph compiler:        %" Pd64 " ms\n",
             graphcompiler_usecs / 1000);
   int64_t codefinalizer_usecs = codefinalizer_timer.TotalElapsedTime();
-  log.Print("  Code finalizer:        %" Pd64 " msecs\n",
+  log.Print("  Code finalizer:        %" Pd64 " ms\n",
             codefinalizer_usecs / 1000);
 
   log.Print("==== Compiled code stats:\n");
+  int64_t compile_usecs = scan_usecs + parse_usecs + codegen_usecs;
+  int64_t compile_speed = compile_usecs > 0 ?
+      (1000 * num_func_tokens_compiled / compile_usecs) : 0;
   log.Print("Functions parsed:        %" Pd64 "\n", num_functions_parsed);
   log.Print("Functions compiled:      %" Pd64 "\n", num_functions_compiled);
   log.Print("  optimized:             %" Pd64 "\n", num_functions_optimized);
+  log.Print("Compiler time:           %" Pd64 " ms\n", compile_usecs / 1000);
   log.Print("Tokens compiled:         %" Pd64 "\n", num_func_tokens_compiled);
-  log.Print("Compilation speed:       %" Pd64 " tokens per msec\n",
-            (1000 * num_func_tokens_compiled) / (parse_usecs + codegen_usecs));
-  log.Print("Code density:            %" Pd64 " tokens per KB\n",
-            (num_func_tokens_compiled * 1024) / total_instr_size);
+  log.Print("Compilation speed:       %" Pd64 " tokens/ms\n", compile_speed);
+  int64_t code_density = total_instr_size > 0 ?
+      (num_func_tokens_compiled * 1024) / total_instr_size : 0;
+  log.Print("Code density:            %" Pd64 " tokens per KB\n", code_density);
   log.Print("Code size:               %" Pd64 " KB\n", total_code_size / 1024);
   log.Print("  Instr size:            %" Pd64 " KB\n",
             total_instr_size / 1024);
diff --git a/runtime/vm/compiler_stats.h b/runtime/vm/compiler_stats.h
index f0b47f4..4487991 100644
--- a/runtime/vm/compiler_stats.h
+++ b/runtime/vm/compiler_stats.h
@@ -15,6 +15,7 @@
 
 
 DECLARE_FLAG(bool, compiler_stats);
+DECLARE_FLAG(bool, compiler_benchmark);
 
 class CompilerStats {
  public:
@@ -23,8 +24,6 @@
 
   Isolate* isolate_;
 
-  // TODO(hausner): add these timers to the timer list maintained
-  // in the isolate?
   Timer parser_timer;         // Cumulative runtime of parser.
   Timer scanner_timer;        // Cumulative runtime of scanner.
   Timer codegen_timer;        // Cumulative runtime of code generator.
@@ -44,6 +43,7 @@
   int64_t num_tokens_total;    // Isolate + VM isolate
   int64_t num_literal_tokens_total;
   int64_t num_ident_tokens_total;
+  int64_t num_tokens_scanned;
   int64_t num_tokens_consumed;
   int64_t num_cached_consts;
   int64_t num_const_cache_hits;
@@ -63,7 +63,13 @@
   int64_t pc_desc_size;
   int64_t vardesc_size;
   char* text;
+  bool use_benchmark_output;
 
+  // Update stats that are computed, e.g. token count.
+  void Update();
+
+  void EnableBenchmark();
+  char* BenchmarkOutput();
   char* PrintToZone();
 };
 
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index c4487b6..9bd7640 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -45,11 +45,11 @@
   R14 = 14,
   kLastFreeCpuRegister = 14,
   R15 = 15,
-  FP  = 11,
-  IP  = 12,
-  SP  = 13,
-  LR  = 14,
-  PC  = 15,
+  FP  = R11,
+  IP  = R12,
+  SP  = R13,
+  LR  = R14,
+  PC  = R15,
   kNumberOfCpuRegisters = 16,
 };
 
@@ -231,13 +231,14 @@
 // Register aliases.
 const Register TMP = IP;  // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // There is no second assembler temporary.
-const Register CTX = R9;  // Location of current context at method entry.
-const Register PP = R10;  // Caches object pool pointer in generated code.
+const Register CTX = R10;  // Location of current context at method entry.
+const Register PP = R9;  // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
 const Register LRREG = LR;  // Link register.
 const Register ICREG = R5;  // IC data register.
 const Register ARGS_DESC_REG = R4;
+const Register CODE_REG = R10;
 const Register THR = R8;  // Caches current thread in generated code.
 
 // R15 encodes APSR in the vmrs instruction.
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index f84cf68..ab76fd1 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -111,6 +111,7 @@
 const Register TMP2 = R17;
 const Register CTX = R28;  // Location of current context at method entry.
 const Register PP = R27;  // Caches object pool pointer in generated code.
+const Register CODE_REG = R24;
 const Register FPREG = FP;  // Frame pointer register.
 const Register SPREG = R18;  // Stack pointer register.
 const Register LRREG = LR;  // Link register.
diff --git a/runtime/vm/constants_ia32.h b/runtime/vm/constants_ia32.h
index f1edc35..0950639 100644
--- a/runtime/vm/constants_ia32.h
+++ b/runtime/vm/constants_ia32.h
@@ -63,6 +63,7 @@
 const Register TMP = kNoRegister;  // No scratch register used by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
 const Register CTX = EDI;  // Location of current context at method entry.
+const Register CODE_REG = EDI;
 const Register PP = kNoRegister;  // No object pool pointer.
 const Register SPREG = ESP;  // Stack pointer register.
 const Register FPREG = EBP;  // Frame pointer register.
diff --git a/runtime/vm/constants_mips.h b/runtime/vm/constants_mips.h
index 5c721b3..fed178f 100644
--- a/runtime/vm/constants_mips.h
+++ b/runtime/vm/constants_mips.h
@@ -179,6 +179,7 @@
 const Register TMP = AT;  // Used as scratch register by assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
 const Register CTX = S6;  // Location of current context at method entry.
+const Register CODE_REG = S6;
 const Register PP = S7;  // Caches object pool pointer in generated code.
 const Register SPREG = SP;  // Stack pointer register.
 const Register FPREG = FP;  // Frame pointer register.
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index fdded5f..c2b48c5 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -86,13 +86,14 @@
 // Register aliases.
 const Register TMP = R11;  // Used as scratch register by the assembler.
 const Register TMP2 = kNoRegister;  // No second assembler scratch register.
-const Register CTX = R9;  // Location of current context at method entry.
+const Register CTX = R12;  // Location of current context at method entry.
 // Caches object pool pointer in generated code.
 const Register PP = R15;
 const Register SPREG = RSP;  // Stack pointer register.
 const Register FPREG = RBP;  // Frame pointer register.
 const Register ICREG = RBX;  // IC data register.
 const Register ARGS_DESC_REG = R10;  // Arguments descriptor register.
+const Register CODE_REG = R12;
 const Register THR = R14;  // Caches current thread in generated code.
 
 // Exception object is passed in this register to the catch handlers when an
diff --git a/runtime/vm/counters.cc b/runtime/vm/counters.cc
deleted file mode 100644
index 7e43d9a..0000000
--- a/runtime/vm/counters.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "vm/counters.h"
-
-#include <string.h>
-#include <map>  // TODO(koda): Remove STL dependencies.
-
-#include "platform/globals.h"
-#include "vm/os.h"
-
-namespace dart {
-
-struct CStrLess {
-  bool operator()(const char* a, const char* b) const {
-    return strcmp(a, b) < 0;
-  }
-};
-
-
-Counters::~Counters() {
-  if (collision_) {
-    OS::PrintErr("Counters table collision; increase Counters::kSize.");
-    return;
-  }
-  typedef std::map<const char*, int64_t, CStrLess> TotalsMap;
-  TotalsMap totals;
-  for (int i = 0; i < kSize; ++i) {
-    const Counter& counter = counters_[i];
-    if (counter.name != NULL) {
-      totals[counter.name] += counter.value;
-    }
-  }
-  for (TotalsMap::iterator it = totals.begin(); it != totals.end(); ++it) {
-    OS::PrintErr("%s: %" Pd64 "\n", it->first, it->second);
-  }
-}
-
-}  // namespace dart
diff --git a/runtime/vm/counters.h b/runtime/vm/counters.h
deleted file mode 100644
index ee79b69..0000000
--- a/runtime/vm/counters.h
+++ /dev/null
@@ -1,51 +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.
-
-#ifndef VM_COUNTERS_H_
-#define VM_COUNTERS_H_
-
-#include "platform/assert.h"
-
-namespace dart {
-
-struct Counter {
-  Counter() : name(NULL), value(0) {}
-  const char* name;
-  int64_t value;
-};
-
-
-// Light-weight stats counters for temporary experiments/debugging.
-// A single statement is enough to add a counter:
-//   ...
-//   Isolate::Current()->counters()->Increment("allocated", size_in_bytes);
-//   ...
-class Counters {
- public:
-  Counters() : collision_(false) {}
-
-  // Adds 'delta' to the named counter. 'name' must be a literal string.
-  void Increment(const char* name, int64_t delta) {
-    Counter& counter =
-      counters_[reinterpret_cast<uword>(name) & (kSize - 1)];
-    if (counter.name != name && counter.name != NULL) {
-      collision_ = true;
-    }
-    counter.name = name;
-    counter.value += delta;
-  }
-
-  // Prints all counters to stderr.
-  ~Counters();
-
- private:
-  enum { kSize = 1024 };
-  COMPILE_ASSERT((0 == (kSize & (kSize - 1))));  // kSize is a power of 2.
-  Counter counters_[kSize];
-  bool collision_;
-};
-
-}  // namespace dart
-
-#endif  // VM_COUNTERS_H_
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 8d2a7da..fcb7dbc 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -44,6 +44,7 @@
 ThreadPool* Dart::thread_pool_ = NULL;
 DebugInfo* Dart::pprof_symbol_generator_ = NULL;
 ReadOnlyHandles* Dart::predefined_handles_ = NULL;
+const uint8_t* Dart::instructions_snapshot_buffer_ = NULL;
 
 // Structure for managing read-only global handles allocation used for
 // creating global read-only handles that are pre created and initialized
@@ -103,6 +104,7 @@
   SemiSpace::InitOnce();
   Metric::InitOnce();
   StoreBuffer::InitOnce();
+  MarkingStack::InitOnce();
   Thread::EnsureInit();
 
 #if defined(USING_SIMULATOR)
@@ -144,6 +146,9 @@
       StubCode::InitOnce();
     }
     if (vm_isolate_snapshot != NULL) {
+      if (instructions_snapshot != NULL) {
+        vm_isolate_->SetupInstructionsSnapshotPage(instructions_snapshot);
+      }
       const Snapshot* snapshot = Snapshot::SetupFromBuffer(vm_isolate_snapshot);
       if (snapshot == NULL) {
         return "Invalid vm isolate snapshot seen.";
@@ -313,7 +318,7 @@
     }
     IsolateSnapshotReader reader(snapshot->content(),
                                  snapshot->length(),
-                                 Object::instructions_snapshot_buffer(),
+                                 Dart::instructions_snapshot_buffer(),
                                  T);
     const Error& error = Error::Handle(reader.ReadFullSnapshot());
     if (!error.IsNull()) {
@@ -332,13 +337,20 @@
   }
 
   Object::VerifyBuiltinVtables();
+#if defined(DEBUG)
+  I->heap()->Verify(kForbidMarked);
+#endif
 
   {
     TimelineDurationScope tds(I, I->GetIsolateStream(), "StubCode::Init");
     StubCode::Init(I);
   }
 
-  MegamorphicCacheTable::InitMissHandler(I);
+  // When running precompiled, the megamorphic miss function/code comes from the
+  // snapshot.
+  if (!Dart::IsRunningPrecompiledCode()) {
+    MegamorphicCacheTable::InitMissHandler(I);
+  }
   if (snapshot_buffer == NULL) {
     if (!I->object_store()->PreallocateObjects()) {
       return I->object_store()->sticky_error();
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index c0203cc..5ae0550 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -54,6 +54,16 @@
   static uword AllocateReadOnlyHandle();
   static bool IsReadOnlyHandle(uword address);
 
+  static const uint8_t* instructions_snapshot_buffer() {
+    return instructions_snapshot_buffer_;
+  }
+  static void set_instructions_snapshot_buffer(const uint8_t* buffer) {
+    instructions_snapshot_buffer_ = buffer;
+  }
+  static bool IsRunningPrecompiledCode() {
+    return instructions_snapshot_buffer_ != NULL;
+  }
+
  private:
   static void WaitForIsolateShutdown();
 
@@ -61,6 +71,7 @@
   static ThreadPool* thread_pool_;
   static DebugInfo* pprof_symbol_generator_;
   static ReadOnlyHandles* predefined_handles_;
+  static const uint8_t* instructions_snapshot_buffer_;
 };
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 5e1105a..e47d14e 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -5692,34 +5692,32 @@
 }
 
 
-DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer,
-                                       void* user_data) {
-  Isolate* isolate = Isolate::Current();
-  CHECK_ISOLATE(isolate);
-  if (consumer == NULL) {
-    return false;
-  }
-  TimelineEventRecorder* timeline_recorder = Timeline::recorder();
-  if (timeline_recorder == NULL) {
-    // Nothing has been recorded.
-    return false;
-  }
-  // Suspend execution of other threads while serializing to JSON.
-  isolate->thread_registry()->SafepointThreads();
-  JSONStream js;
-  IsolateTimelineEventFilter filter(isolate);
-  timeline_recorder->PrintJSON(&js, &filter);
-  // Resume execution of other threads.
-  isolate->thread_registry()->ResumeAllThreads();
+DART_EXPORT void Dart_GlobalTimelineSetRecordedStreams(int64_t stream_mask) {
+  // Per isolate overrides.
+  const bool api_enabled = (stream_mask & DART_TIMELINE_STREAM_API) != 0;
+  const bool compiler_enabled =
+      (stream_mask & DART_TIMELINE_STREAM_COMPILER) != 0;
+  const bool embedder_enabled =
+      (stream_mask & DART_TIMELINE_STREAM_EMBEDDER) != 0;
+  const bool gc_enabled = (stream_mask & DART_TIMELINE_STREAM_GC) != 0;
+  const bool isolate_enabled =
+      (stream_mask & DART_TIMELINE_STREAM_ISOLATE) != 0;
+  Timeline::SetStreamAPIEnabled(api_enabled);
+  Timeline::SetStreamCompilerEnabled(compiler_enabled);
+  Timeline::SetStreamEmbedderEnabled(embedder_enabled);
+  Timeline::SetStreamGCEnabled(gc_enabled);
+  Timeline::SetStreamIsolateEnabled(isolate_enabled);
+  // VM wide.
+  const bool vm_enabled =
+      (stream_mask & DART_TIMELINE_STREAM_VM) != 0;
+  Timeline::GetVMStream()->set_enabled(vm_enabled);
+}
 
-  // Copy output.
-  char* output = NULL;
-  intptr_t output_length = 0;
-  js.Steal(const_cast<const char**>(&output), &output_length);
-  if (output != NULL) {
-    // Add one for the '\0' character.
-    output_length++;
-  }
+
+static void StreamToConsumer(Dart_StreamConsumer consumer,
+                             void* user_data,
+                             char* output,
+                             intptr_t output_length) {
   // Start stream.
   const char* kStreamName = "timeline";
   const intptr_t kDataSize = 64 * KB;
@@ -5753,8 +5751,6 @@
   }
   ASSERT(cursor == output_length);
   ASSERT(remaining == 0);
-  // We stole the JSONStream's output buffer, free it.
-  free(output);
 
   // Finish stream.
   consumer(Dart_StreamConsumer_kFinish,
@@ -5762,6 +5758,76 @@
            NULL,
            0,
            user_data);
+}
+
+
+DART_EXPORT bool Dart_TimelineGetTrace(Dart_StreamConsumer consumer,
+                                       void* user_data) {
+  Isolate* isolate = Isolate::Current();
+  CHECK_ISOLATE(isolate);
+  if (consumer == NULL) {
+    return false;
+  }
+  TimelineEventRecorder* timeline_recorder = Timeline::recorder();
+  if (timeline_recorder == NULL) {
+    // Nothing has been recorded.
+    return false;
+  }
+  // Suspend execution of other threads while serializing to JSON.
+  isolate->thread_registry()->SafepointThreads();
+  // TODO(johnmccutchan): Reclaim open blocks from isolate so we have a complete
+  // timeline.
+  JSONStream js;
+  IsolateTimelineEventFilter filter(isolate);
+  timeline_recorder->PrintJSON(&js, &filter);
+  // Resume execution of other threads.
+  isolate->thread_registry()->ResumeAllThreads();
+
+  // Copy output.
+  char* output = NULL;
+  intptr_t output_length = 0;
+  js.Steal(const_cast<const char**>(&output), &output_length);
+  if (output != NULL) {
+    // Add one for the '\0' character.
+    output_length++;
+  }
+  StreamToConsumer(consumer, user_data, output, output_length);
+
+  // We stole the JSONStream's output buffer, free it.
+  free(output);
+  return true;
+}
+
+
+DART_EXPORT bool Dart_GlobalTimelineGetTrace(Dart_StreamConsumer consumer,
+                                             void* user_data) {
+  if (consumer == NULL) {
+    return false;
+  }
+  TimelineEventRecorder* timeline_recorder = Timeline::recorder();
+  if (timeline_recorder == NULL) {
+    // Nothing has been recorded.
+    return false;
+  }
+
+  // TODO(johnmccutchan): Reclaim all open blocks from the system so we have
+  // a complete timeline.
+  JSONStream js;
+  TimelineEventFilter filter;
+  timeline_recorder->PrintJSON(&js, &filter);
+
+  // Copy output.
+  char* output = NULL;
+  intptr_t output_length = 0;
+  js.Steal(const_cast<const char**>(&output), &output_length);
+  if (output != NULL) {
+    // Add one for the '\0' character.
+    output_length++;
+  }
+  StreamToConsumer(consumer, user_data, output, output_length);
+
+  // We stole the JSONStream's output buffer, free it.
+  free(output);
   return true;
 }
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index bf4ec2a..39a7f3e 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -9441,4 +9441,100 @@
   free(data.buffer);
 }
 
+
+TEST_CASE(Timeline_Dart_TimelineGetTraceGlobalOverride) {
+  const char* kScriptChars =
+    "foo() => 'a';\n"
+    "main() => foo();\n";
+
+  Dart_Handle lib =
+      TestCase::LoadTestScript(kScriptChars, NULL);
+
+  const char* buffer = NULL;
+  intptr_t buffer_length = 0;
+  bool success = false;
+
+  // Enable recording of all streams across the entire vm.
+  Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL);
+
+  // Invoke main, which will be compiled resulting in a compiler event in
+  // the timeline.
+  Dart_Handle result = Dart_Invoke(lib,
+                                   NewString("main"),
+                                   0,
+                                   NULL);
+  EXPECT_VALID(result);
+
+  // Grab the trace.
+  AppendData data;
+  success = Dart_TimelineGetTrace(AppendStreamConsumer, &data);
+  EXPECT(success);
+  buffer = reinterpret_cast<char*>(data.buffer);
+  buffer_length = data.buffer_length;
+  EXPECT(buffer_length > 0);
+  EXPECT(buffer != NULL);
+
+  // Heartbeat test.
+  EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
+  EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
+  EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
+
+  // Free buffer allocated by AppendStreamConsumer
+  free(data.buffer);
+}
+
+
+UNIT_TEST_CASE(Timeline_Dart_GlobalTimelineGetTrace) {
+  const char* buffer = NULL;
+  intptr_t buffer_length = 0;
+  bool success = false;
+
+  // Enable all streams.
+  Dart_GlobalTimelineSetRecordedStreams(DART_TIMELINE_STREAM_ALL |
+                                        DART_TIMELINE_STREAM_VM);
+  {
+    // Create isolate.
+    TestIsolateScope __test_isolate__;
+    Thread* __thread__ = Thread::Current();
+    ASSERT(__thread__->isolate() == __test_isolate__.isolate());
+    StackZone __zone__(__thread__);
+    HandleScope __hs__(__thread__);
+
+    // Load test script.
+    const char* kScriptChars =
+      "foo() => 'a';\n"
+      "main() => foo();\n";
+
+    Dart_Handle lib =
+        TestCase::LoadTestScript(kScriptChars, NULL);
+
+    // Invoke main, which will be compiled resulting in a compiler event in
+    // the timeline.
+    Dart_Handle result = Dart_Invoke(lib,
+                                     NewString("main"),
+                                     0,
+                                     NULL);
+    EXPECT_VALID(result);
+  }
+
+  // Isolate is shutdown now.
+  // Grab the global trace.
+  AppendData data;
+  success = Dart_GlobalTimelineGetTrace(AppendStreamConsumer, &data);
+  EXPECT(success);
+  buffer = reinterpret_cast<char*>(data.buffer);
+  buffer_length = data.buffer_length;
+  EXPECT(buffer_length > 0);
+  EXPECT(buffer != NULL);
+
+  // Heartbeat test.
+  EXPECT_SUBSTRING("\"name\":\"InitializeIsolate\"", buffer);
+  EXPECT_SUBSTRING("\"cat\":\"Compiler\"", buffer);
+  EXPECT_SUBSTRING("\"name\":\"CompileFunction\"", buffer);
+  EXPECT_SUBSTRING("\"function\":\"::_main\"", buffer);
+
+  // Free buffer allocated by AppendStreamConsumer
+  free(data.buffer);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 1053404..82055bb 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -100,27 +100,17 @@
   ScopedIsolateStackLimits stack_limit(isolate);
   SuspendLongJumpScope suspend_long_jump_scope(thread);
 #if defined(USING_SIMULATOR)
-#if defined(ARCH_IS_64_BIT)
-  // TODO(zra): Change to intptr_t so we have only one case.
-    return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
-        reinterpret_cast<int64_t>(entrypoint),
-        static_cast<int64_t>(code.EntryPoint()),
-        reinterpret_cast<int64_t>(&arguments_descriptor),
-        reinterpret_cast<int64_t>(&arguments),
-        reinterpret_cast<int64_t>(thread)));
+  return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
+      reinterpret_cast<intptr_t>(entrypoint),
+      reinterpret_cast<intptr_t>(&code),
+      reinterpret_cast<intptr_t>(&arguments_descriptor),
+      reinterpret_cast<intptr_t>(&arguments),
+      reinterpret_cast<intptr_t>(thread)));
 #else
-    return bit_copy<RawObject*, int64_t>(Simulator::Current()->Call(
-        reinterpret_cast<int32_t>(entrypoint),
-        static_cast<int32_t>(code.EntryPoint()),
-        reinterpret_cast<int32_t>(&arguments_descriptor),
-        reinterpret_cast<int32_t>(&arguments),
-        reinterpret_cast<int32_t>(thread)));
-#endif
-#else
-    return entrypoint(code.EntryPoint(),
-                      arguments_descriptor,
-                      arguments,
-                      thread);
+  return entrypoint(code,
+                    arguments_descriptor,
+                    arguments,
+                    thread);
 #endif
 }
 
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 016f3ce..0f9597f 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -102,7 +102,7 @@
 class DartEntry : public AllStatic {
  public:
   // On success, returns a RawInstance.  On failure, a RawError.
-  typedef RawObject* (*invokestub)(uword entry_point,
+  typedef RawObject* (*invokestub)(const Code& target_code,
                                    const Array& arguments_descriptor,
                                    const Array& arguments,
                                    Thread* thread);
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index e0dd4a9..ca49376 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -220,6 +220,7 @@
 
 void CodeBreakpoint::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&code_));
+  visitor->VisitPointer(reinterpret_cast<RawObject**>(&saved_value_));
 }
 
 
@@ -1113,7 +1114,7 @@
       bpt_location_(NULL),
       next_(NULL),
       breakpoint_kind_(kind),
-      saved_value_(0) {
+      saved_value_(Code::null()) {
   ASSERT(!code.IsNull());
   ASSERT(token_pos_ > 0);
   ASSERT(pc_ != 0);
@@ -1397,7 +1398,9 @@
   DeoptContext* deopt_context =
       new DeoptContext(frame, code,
                        DeoptContext::kDestIsAllocated,
-                       NULL, NULL);
+                       NULL,
+                       NULL,
+                       true);
   isolate->set_deopt_context(deopt_context);
 
   deopt_context->FillDestFrame();
@@ -3006,13 +3009,13 @@
 }
 
 
-uword Debugger::GetPatchedStubAddress(uword breakpoint_address) {
+RawCode* Debugger::GetPatchedStubAddress(uword breakpoint_address) {
   CodeBreakpoint* bpt = GetCodeBreakpoint(breakpoint_address);
   if (bpt != NULL) {
     return bpt->OrigStubAddress();
   }
   UNREACHABLE();
-  return 0L;
+  return Code::null();
 }
 
 
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 685e5b5..cf6562a 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -191,7 +191,7 @@
   void Disable();
   bool IsEnabled() const { return is_enabled_; }
 
-  uword OrigStubAddress() const;
+  RawCode* OrigStubAddress() const;
 
  private:
   void VisitObjectPointers(ObjectPointerVisitor* visitor);
@@ -215,7 +215,7 @@
   CodeBreakpoint* next_;
 
   RawPcDescriptors::Kind breakpoint_kind_;
-  uword saved_value_;
+  RawCode* saved_value_;
 
   friend class Debugger;
   DISALLOW_COPY_AND_ASSIGN(CodeBreakpoint);
@@ -565,7 +565,7 @@
   void SignalIsolateEvent(DebuggerEvent::EventType type);
   static void SignalIsolateInterrupted();
 
-  uword GetPatchedStubAddress(uword breakpoint_address);
+  RawCode* GetPatchedStubAddress(uword breakpoint_address);
 
   void PrintBreakpointsToJSONArray(JSONArray* jsarr) const;
   void PrintSettingsToJSONObject(JSONObject* jsobj) const;
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index e0a366d..1322b8d 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -13,21 +13,21 @@
 
 namespace dart {
 
-uword CodeBreakpoint::OrigStubAddress() const {
+RawCode* CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
 
 void CodeBreakpoint::PatchCode() {
   ASSERT(!is_enabled_);
-  uword stub_target = 0;
+  Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::ICCallBreakpoint_entry()->code();
       break;
     case RawPcDescriptors::kRuntimeCall:
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
       break;
     default:
       UNREACHABLE();
@@ -46,7 +46,7 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
+      CodePatcher::PatchStaticCallAt(pc_, code, Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 8c59d24..bf6423a 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -13,21 +13,21 @@
 
 namespace dart {
 
-uword CodeBreakpoint::OrigStubAddress() const {
+RawCode* CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
 
 void CodeBreakpoint::PatchCode() {
   ASSERT(!is_enabled_);
-  uword stub_target = 0;
+  Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::ICCallBreakpoint_entry()->code();
       break;
     case RawPcDescriptors::kRuntimeCall: {
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
       break;
     }
     default:
@@ -47,7 +47,8 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchPoolPointerCallAt(pc_, code, saved_value_);
+      CodePatcher::PatchPoolPointerCallAt(
+          pc_, code, Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 408c838..cc1c63d 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -17,7 +17,7 @@
 
 namespace dart {
 
-uword CodeBreakpoint::OrigStubAddress() const {
+RawCode* CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
@@ -26,25 +26,25 @@
   ASSERT(!is_enabled_);
   const Code& code = Code::Handle(code_);
   const Instructions& instrs = Instructions::Handle(code.instructions());
+  Code& stub_target = Code::Handle();
   {
     WritableInstructionsScope writable(instrs.EntryPoint(), instrs.size());
     switch (breakpoint_kind_) {
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall: {
-        saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::ICCallBreakpoint_entry()->EntryPoint());
+        stub_target = StubCode::ICCallBreakpoint_entry()->code();
         break;
       }
       case RawPcDescriptors::kRuntimeCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
-        CodePatcher::PatchStaticCallAt(
-            pc_, code, StubCode::RuntimeCallBreakpoint_entry()->EntryPoint());
+        stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
         break;
       }
       default:
         UNREACHABLE();
     }
+    saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
+    CodePatcher::PatchStaticCallAt(pc_, code, stub_target);
   }
   is_enabled_ = true;
 }
@@ -60,7 +60,7 @@
       case RawPcDescriptors::kIcCall:
       case RawPcDescriptors::kUnoptStaticCall:
       case RawPcDescriptors::kRuntimeCall: {
-        CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
+        CodePatcher::PatchStaticCallAt(pc_, code, Code::Handle(saved_value_));
         break;
       }
       default:
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index 651714b..8a02ca8 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -13,21 +13,21 @@
 
 namespace dart {
 
-uword CodeBreakpoint::OrigStubAddress() const {
+RawCode* CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
 
 void CodeBreakpoint::PatchCode() {
   ASSERT(!is_enabled_);
-  uword stub_target = 0;
+  Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::ICCallBreakpoint_entry()->code();
       break;
     case RawPcDescriptors::kRuntimeCall:
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
       break;
     default:
       UNREACHABLE();
@@ -46,7 +46,7 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
+      CodePatcher::PatchStaticCallAt(pc_, code, Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 531876d..4fe2e6a 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -15,21 +15,21 @@
 
 namespace dart {
 
-uword CodeBreakpoint::OrigStubAddress() const {
+RawCode* CodeBreakpoint::OrigStubAddress() const {
   return saved_value_;
 }
 
 
 void CodeBreakpoint::PatchCode() {
   ASSERT(!is_enabled_);
-  uword stub_target = 0;
+  Code& stub_target = Code::Handle();
   switch (breakpoint_kind_) {
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
-      stub_target = StubCode::ICCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::ICCallBreakpoint_entry()->code();
       break;
     case RawPcDescriptors::kRuntimeCall:
-      stub_target = StubCode::RuntimeCallBreakpoint_entry()->EntryPoint();
+      stub_target = StubCode::RuntimeCallBreakpoint_entry()->code();
       break;
     default:
       UNREACHABLE();
@@ -48,7 +48,8 @@
     case RawPcDescriptors::kIcCall:
     case RawPcDescriptors::kUnoptStaticCall:
     case RawPcDescriptors::kRuntimeCall: {
-      CodePatcher::PatchPoolPointerCallAt(pc_, code, saved_value_);
+      CodePatcher::PatchPoolPointerCallAt(
+          pc_, code, Code::Handle(saved_value_));
       break;
     }
     default:
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index a647af1..6aac45a 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -161,11 +161,7 @@
   uword* dest_addr = reinterpret_cast<uword*>(slot());
   Function& function = Function::Handle(zone);
   function ^= deopt_context->ObjectAt(index_);
-  if (function.IsNull()) {
-    // Callee's PC marker is not used (pc of Deoptimize stub). Set to 0.
-    *dest_addr = 0;
-    return;
-  }
+  ASSERT(!function.IsNull());
   const Error& error = Error::Handle(zone,
       Compiler::EnsureUnoptimizedCode(thread, function));
   if (!error.IsNull()) {
@@ -174,9 +170,7 @@
   const Code& code = Code::Handle(zone, function.unoptimized_code());
   ASSERT(!code.IsNull());
   ASSERT(function.HasCode());
-  const intptr_t pc_marker =
-      code.EntryPoint() + Assembler::EntryPointToPcMarkerOffset();
-  *dest_addr = pc_marker;
+  *reinterpret_cast<RawObject**>(dest_addr) = code.raw();
 
   if (FLAG_trace_deoptimization_verbose) {
     OS::PrintErr("materializing pc marker at 0x%" Px ": %s, %s\n",
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index d6e2568..79f08d8 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -26,7 +26,8 @@
                            const Code& code,
                            DestFrameOptions dest_options,
                            fpu_register_t* fpu_registers,
-                           intptr_t* cpu_registers)
+                           intptr_t* cpu_registers,
+                           bool is_lazy_deopt)
     : code_(code.raw()),
       object_pool_(code.GetObjectPool()),
       deopt_info_(TypedData::null()),
@@ -45,7 +46,8 @@
       timeline_event_(NULL),
       deferred_slots_(NULL),
       deferred_objects_count_(0),
-      deferred_objects_(NULL) {
+      deferred_objects_(NULL),
+      is_lazy_deopt_(is_lazy_deopt) {
   const TypedData& deopt_info = TypedData::Handle(
       code.GetDeoptInfoAtPc(frame->pc(), &deopt_reason_, &deopt_flags_));
   ASSERT(!deopt_info.IsNull());
@@ -651,7 +653,16 @@
   }
 
   void Execute(DeoptContext* deopt_context, intptr_t* dest_addr) {
-    *dest_addr = Smi::RawValue(0);
+    Function& function = Function::Handle(deopt_context->zone());
+    function ^= deopt_context->ObjectAt(object_table_index_);
+    if (function.IsNull()) {
+      *reinterpret_cast<RawObject**>(dest_addr) = deopt_context->is_lazy_deopt()
+          ? StubCode::DeoptimizeLazy_entry()->code()
+          : StubCode::Deoptimize_entry()->code();
+      return;
+    }
+
+    *dest_addr = reinterpret_cast<intptr_t>(Object::null());
     deopt_context->DeferPcMarkerMaterialization(
         object_table_index_, dest_addr);
   }
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 188e95c..cf357d0 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -34,7 +34,8 @@
                const Code& code,
                DestFrameOptions dest_options,
                fpu_register_t* fpu_registers,
-               intptr_t* cpu_registers);
+               intptr_t* cpu_registers,
+               bool is_lazy_deopt);
   virtual ~DeoptContext();
 
   // Returns the offset of the dest fp from the dest sp.  Used in
@@ -94,6 +95,8 @@
 
   RawCode* code() const { return code_; }
 
+  bool is_lazy_deopt() const { return is_lazy_deopt_; }
+
   ICData::DeoptReasonId deopt_reason() const { return deopt_reason_; }
   bool HasDeoptFlag(ICData::DeoptFlags flag) {
     return (deopt_flags_ & flag) != 0;
@@ -228,6 +231,8 @@
   intptr_t deferred_objects_count_;
   DeferredObject** deferred_objects_;
 
+  const bool is_lazy_deopt_;
+
   DISALLOW_COPY_AND_ASSIGN(DeoptContext);
 };
 
diff --git a/runtime/vm/disassembler.cc b/runtime/vm/disassembler.cc
index c63d459..986b9b2 100644
--- a/runtime/vm/disassembler.cc
+++ b/runtime/vm/disassembler.cc
@@ -104,7 +104,8 @@
 bool Disassembler::CanFindOldObject(uword addr) {
   FindAddrVisitor visitor(addr);
   NoSafepointScope no_safepoint;
-  return Isolate::Current()->heap()->FindOldObject(&visitor) != Object::null();
+  return Dart::vm_isolate()->heap()->FindOldObject(&visitor) != Object::null()
+      || Isolate::Current()->heap()->FindOldObject(&visitor) != Object::null();
 }
 
 
diff --git a/runtime/vm/disassembler_arm.cc b/runtime/vm/disassembler_arm.cc
index 63f759b..93ff293 100644
--- a/runtime/vm/disassembler_arm.cc
+++ b/runtime/vm/disassembler_arm.cc
@@ -109,11 +109,11 @@
 
 
 // These register names are defined in a way to match the native disassembler
-// formatting, except for register aliases ctx (r9) and pp (r10).
+// formatting, except for register alias pp (r9).
 // See for example the command "objdump -d <binary file>".
 static const char* reg_names[kNumberOfCpuRegisters] = {
   "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
-  "r8", "ctx", "pp", "fp", "ip", "sp", "lr", "pc",
+  "r8", "pp", "r10", "fp", "ip", "sp", "lr", "pc",
 };
 
 
diff --git a/runtime/vm/disassembler_ia32.cc b/runtime/vm/disassembler_ia32.cc
index 036f5d0..0f6dc74 100644
--- a/runtime/vm/disassembler_ia32.cc
+++ b/runtime/vm/disassembler_ia32.cc
@@ -473,7 +473,8 @@
       obj.IsClass() ||
       obj.IsFunction() ||
       obj.IsICData() ||
-      obj.IsField()) {
+      obj.IsField() ||
+      obj.IsCode()) {
     return obj.ToCString();
   }
 
@@ -493,6 +494,7 @@
       reinterpret_cast<RawObject*>(addr)->IsWellFormed() &&
       reinterpret_cast<RawObject*>(addr)->IsOldObject() &&
       !Isolate::Current()->heap()->CodeContains(addr) &&
+      !Dart::vm_isolate()->heap()->CodeContains(addr) &&
       Disassembler::CanFindOldObject(addr)) {
     NoSafepointScope no_safepoint;
     const Object& obj = Object::Handle(reinterpret_cast<RawObject*>(addr));
@@ -523,16 +525,6 @@
       Print("  [stub: ");
       Print(name_of_stub);
       Print("]");
-    } else {
-      // Print only if jumping to entry point.
-      const Code& code = Code::Handle(Code::LookupCode(addr));
-      if (!code.IsNull() && (code.EntryPoint() == addr)) {
-        const String& name = String::Handle(code.PrettyName());
-        const char* name_c = name.ToCString();
-        Print(" [");
-        Print(name_c);
-        Print("]");
-      }
     }
   }
 }
diff --git a/runtime/vm/disassembler_x64.cc b/runtime/vm/disassembler_x64.cc
index ffd6108..4778695 100644
--- a/runtime/vm/disassembler_x64.cc
+++ b/runtime/vm/disassembler_x64.cc
@@ -790,7 +790,8 @@
       obj.IsClass() ||
       obj.IsFunction() ||
       obj.IsICData() ||
-      obj.IsField()) {
+      obj.IsField() ||
+      obj.IsCode()) {
     return obj.ToCString();
   }
 
@@ -808,6 +809,7 @@
   if (((addr & kSmiTagMask) == kHeapObjectTag) &&
       reinterpret_cast<RawObject*>(addr)->IsWellFormed() &&
       reinterpret_cast<RawObject*>(addr)->IsOldObject() &&
+      !Dart::vm_isolate()->heap()->CodeContains(addr) &&
       !Isolate::Current()->heap()->CodeContains(addr) &&
       Disassembler::CanFindOldObject(addr)) {
     NoSafepointScope no_safepoint;
@@ -835,14 +837,6 @@
     const char* name_of_stub = StubCode::NameOfStub(addr);
     if (name_of_stub != NULL) {
       AppendToBuffer("  [stub: %s]", name_of_stub);
-    } else {
-      // Print only if jumping to entry point.
-      const Code& code = Code::Handle(Code::LookupCode(addr));
-      if (!code.IsNull() && (code.EntryPoint() == addr)) {
-        const String& name = String::Handle(code.PrettyName());
-        const char* name_c = name.ToCString();
-        AppendToBuffer(" [%s]", name_c);
-      }
     }
   }
 }
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 54f18c1..9616d63 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -202,8 +202,6 @@
                 LookupClass(Symbols::List()))),
         parallel_move_resolver_(this),
         pending_deoptimization_env_(NULL),
-        entry_patch_pc_offset_(Code::kInvalidPc),
-        patch_code_pc_offset_(Code::kInvalidPc),
         lazy_deopt_pc_offset_(Code::kInvalidPc),
         deopt_id_to_ic_data_(NULL),
         inlined_code_intervals_(Array::ZoneHandle(Object::empty_array().raw())),
@@ -922,8 +920,6 @@
       pc_descriptors_list_->FinalizePcDescriptors(code.EntryPoint()));
   if (!is_optimizing_) descriptors.Verify(parsed_function_.function());
   code.set_pc_descriptors(descriptors);
-  code.set_entry_patch_pc_offset(entry_patch_pc_offset_);
-  code.set_patch_code_pc_offset(patch_code_pc_offset_);
   code.set_lazy_deopt_pc_offset(lazy_deopt_pc_offset_);
 }
 
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 2b61c46..783c851 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -727,8 +727,6 @@
   // In future AddDeoptStub should be moved out of the instruction template.
   Environment* pending_deoptimization_env_;
 
-  intptr_t entry_patch_pc_offset_;
-  intptr_t patch_code_pc_offset_;
   intptr_t lazy_deopt_pc_offset_;
 
   ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_;
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 5781c29..3c3b1ea 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -13,6 +13,7 @@
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
 #include "vm/il_printer.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -100,14 +101,11 @@
 
   Zone* zone = compiler->zone();
 
-  // Current PP, FP, and PC.
   builder->AddPp(current->function(), slot_ix++);
+  builder->AddPcMarker(Function::Handle(zone), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
-  // Callee's PC marker is not used anymore. Pass Function::null() to set to 0.
-  builder->AddPcMarker(Function::Handle(zone), slot_ix++);
-
   // Emit all values that are needed for materialization as a part of the
   // expression stack for the bottom-most frame. This guarantees that GC
   // will be able to find them during materialization.
@@ -123,8 +121,8 @@
   Environment* previous = current;
   current = current->outer();
   while (current != NULL) {
-    // PP, FP, and PC.
     builder->AddPp(current->function(), slot_ix++);
+    builder->AddPcMarker(previous->function(), slot_ix++);
     builder->AddCallerFp(slot_ix++);
 
     // For any outer environment the deopt id is that of the call instruction
@@ -134,9 +132,6 @@
         Isolate::ToDeoptAfter(current->deopt_id()),
         slot_ix++);
 
-    // PC marker.
-    builder->AddPcMarker(previous->function(), slot_ix++);
-
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
@@ -161,14 +156,12 @@
   // The previous pointer is now the outermost environment.
   ASSERT(previous != NULL);
 
-  // For the outermost environment, set caller PC, caller PP, and caller FP.
+  // Set slots for the outermost environment.
   builder->AddCallerPp(slot_ix++);
+  builder->AddPcMarker(previous->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddCallerPc(slot_ix++);
 
-  // PC marker.
-  builder->AddPcMarker(previous->function(), slot_ix++);
-
   // For the outermost environment, set the incoming arguments.
   for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
@@ -195,6 +188,7 @@
   // LR may be live. It will be clobbered by BranchLink, so cache it in IP.
   // It will be restored at the top of the deoptimization stub, specifically in
   // GenerateDeoptimizationSequence in stub_code_arm.cc.
+  __ Push(CODE_REG);
   __ mov(IP, Operand(LR));
   __ BranchLink(*StubCode::Deoptimize_entry());
   set_pc_offset(assem->CodeSize());
@@ -759,13 +753,13 @@
   const int min_num_pos_args = num_fixed_params;
   const int max_num_pos_args = num_fixed_params + num_opt_pos_params;
 
-  __ ldr(R9, FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
+  __ ldr(R10, FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
   // Check that min_num_pos_args <= num_pos_args.
   Label wrong_num_arguments;
-  __ CompareImmediate(R9, Smi::RawValue(min_num_pos_args));
+  __ CompareImmediate(R10, Smi::RawValue(min_num_pos_args));
   __ b(&wrong_num_arguments, LT);
   // Check that num_pos_args <= max_num_pos_args.
-  __ CompareImmediate(R9, Smi::RawValue(max_num_pos_args));
+  __ CompareImmediate(R10, Smi::RawValue(max_num_pos_args));
   __ b(&wrong_num_arguments, GT);
 
   // Copy positional arguments.
@@ -773,30 +767,30 @@
   // to fp[kFirstLocalSlotFromFp - i].
 
   __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  // Since R7 and R9 are Smi, use LSL 1 instead of LSL 2.
+  // Since R7 and R10 are Smi, use LSL 1 instead of LSL 2.
   // Let R7 point to the last passed positional argument, i.e. to
   // fp[kParamEndSlotFromFp + num_args - (num_pos_args - 1)].
-  __ sub(R7, R7, Operand(R9));
+  __ sub(R7, R7, Operand(R10));
   __ add(R7, FP, Operand(R7, LSL, 1));
   __ add(R7, R7, Operand((kParamEndSlotFromFp + 1) * kWordSize));
 
   // Let R6 point to the last copied positional argument, i.e. to
   // fp[kFirstLocalSlotFromFp - (num_pos_args - 1)].
   __ AddImmediate(R6, FP, (kFirstLocalSlotFromFp + 1) * kWordSize);
-  __ sub(R6, R6, Operand(R9, LSL, 1));  // R9 is a Smi.
-  __ SmiUntag(R9);
+  __ sub(R6, R6, Operand(R10, LSL, 1));  // R10 is a Smi.
+  __ SmiUntag(R10);
   Label loop, loop_condition;
   __ b(&loop_condition);
   // We do not use the final allocation index of the variable here, i.e.
   // scope->VariableAt(i)->index(), because captured variables still need
   // to be copied to the context that is not yet allocated.
-  const Address argument_addr(R7, R9, LSL, 2);
-  const Address copy_addr(R6, R9, LSL, 2);
+  const Address argument_addr(R7, R10, LSL, 2);
+  const Address copy_addr(R6, R10, LSL, 2);
   __ Bind(&loop);
   __ ldr(IP, argument_addr);
   __ str(IP, copy_addr);
   __ Bind(&loop_condition);
-  __ subs(R9, R9, Operand(1));
+  __ subs(R10, R10, Operand(1));
   __ b(&loop, PL);
 
   // Copy or initialize optional named arguments.
@@ -827,9 +821,9 @@
     }
     // Generate code handling each optional parameter in alphabetical order.
     __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-    __ ldr(R9,
+    __ ldr(R10,
            FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
-    __ SmiUntag(R9);
+    __ SmiUntag(R10);
     // Let R7 point to the first passed argument, i.e. to
     // fp[kParamEndSlotFromFp + num_args - 0]; num_args (R7) is Smi.
     __ add(R7, FP, Operand(R7, LSL, 1));
@@ -881,16 +875,16 @@
     }
   } else {
     ASSERT(num_opt_pos_params > 0);
-    __ ldr(R9,
+    __ ldr(R10,
            FieldAddress(R4, ArgumentsDescriptor::positional_count_offset()));
-    __ SmiUntag(R9);
+    __ SmiUntag(R10);
     for (int i = 0; i < num_opt_pos_params; i++) {
       Label next_parameter;
       // Handle this optional positional parameter only if k or fewer positional
       // arguments have been passed, where k is param_pos, the position of this
       // optional parameter in the formal parameter list.
       const int param_pos = num_fixed_params + i;
-      __ CompareImmediate(R9, param_pos);
+      __ CompareImmediate(R10, param_pos);
       __ b(&next_parameter, GT);
       // Load R5 with default argument.
       const Object& value = parsed_function().DefaultParameterValueAt(i);
@@ -907,20 +901,16 @@
     if (check_correct_named_args) {
       __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
       __ SmiUntag(R7);
-      // Check that R9 equals R7, i.e. no named arguments passed.
-      __ cmp(R9, Operand(R7));
+      // Check that R10 equals R7, i.e. no named arguments passed.
+      __ cmp(R10, Operand(R7));
       __ b(&all_arguments_processed, EQ);
     }
   }
 
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    __ LeaveDartFrame();  // The arguments are still on the stack.
-    // Do not use caller's pool ptr in branch.
-    ASSERT(!assembler()->constant_pool_allowed());
+    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
     __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
-    __ set_constant_pool_allowed(true);
     // The noSuchMethod call may return to the caller, but not here.
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
@@ -934,17 +924,17 @@
   // an issue anymore.
 
   // R4 : arguments descriptor array.
-  __ ldr(R9, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
-  __ SmiUntag(R9);
+  __ ldr(R10, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
+  __ SmiUntag(R10);
   __ add(R7, FP, Operand((kParamEndSlotFromFp + 1) * kWordSize));
-  const Address original_argument_addr(R7, R9, LSL, 2);
+  const Address original_argument_addr(R7, R10, LSL, 2);
   __ LoadObject(IP, Object::null_object());
   Label null_args_loop, null_args_loop_condition;
   __ b(&null_args_loop_condition);
   __ Bind(&null_args_loop);
   __ str(IP, original_argument_addr);
   __ Bind(&null_args_loop_condition);
-  __ subs(R9, R9, Operand(1));
+  __ subs(R10, R10, Operand(1));
   __ b(&null_args_loop, PL);
 }
 
@@ -974,6 +964,9 @@
 }
 
 
+static const Register new_pp = R7;
+
+
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   if (CanOptimizeFunction() &&
@@ -982,33 +975,23 @@
     const Register function_reg = R6;
 
     // The pool pointer is not setup before entering the Dart frame.
-    // Preserve PP of caller.
-    __ mov(R7, Operand(PP));
     // Temporarily setup pool pointer for this dart function.
-    __ LoadPoolPointer();
+    __ LoadPoolPointer(new_pp);
     // Load function object from object pool.
-    __ LoadObject(function_reg, function);  // Uses PP.
-    // Restore PP of caller.
-    __ mov(PP, Operand(R7));
-    __ set_constant_pool_allowed(false);
+    __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
-    // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
-    __ ldr(R7, FieldAddress(function_reg,
+    __ ldr(R3, FieldAddress(function_reg,
                             Function::usage_counter_offset()));
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
-      __ add(R7, R7, Operand(1));
-      __ str(R7, FieldAddress(function_reg,
+      __ add(R3, R3, Operand(1));
+      __ str(R3, FieldAddress(function_reg,
                               Function::usage_counter_offset()));
     }
-    __ CompareImmediate(R7, GetOptimizationThreshold());
+    __ CompareImmediate(R3, GetOptimizationThreshold());
     ASSERT(function_reg == R6);
-    __ Branch(*StubCode::OptimizeFunction_entry(), GE);
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    __ Branch(*StubCode::OptimizeFunction_entry(), kNotPatchable, new_pp, GE);
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1071,11 +1054,8 @@
       __ Bind(&wrong_num_arguments);
       if (function.IsClosureFunction()) {
         ASSERT(assembler()->constant_pool_allowed());
-        __ LeaveDartFrame();  // The arguments are still on the stack.
-        // Do not use caller's pool ptr in branch.
-        ASSERT(!assembler()->constant_pool_allowed());
+        __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
         __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
-        __ set_constant_pool_allowed(true);
         // The noSuchMethod call may return to the caller, but not here.
       } else {
         __ Stop("Wrong number of arguments");
@@ -1128,12 +1108,15 @@
   __ bkpt(0);
   ASSERT(assembler()->constant_pool_allowed());
   GenerateDeferredCode();
-  // Emit function patching code. This will be swapped with the first 3
-  // instructions at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(*StubCode::FixCallersTarget_entry());
 
   if (is_optimizing()) {
+    // Leave enough space for patching in case of lazy deoptimization from
+    // deferred code.
+    for (intptr_t i = 0;
+         i < CallPattern::DeoptCallPatternLengthInInstructions();
+         ++i) {
+      __ nop();
+    }
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
     __ Branch(*StubCode::DeoptimizeLazy_entry());
   }
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index f7ce841..d1e5a71 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -13,6 +13,7 @@
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
 #include "vm/il_printer.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -97,7 +98,6 @@
 
   Zone* zone = compiler->zone();
 
-  // Current PP, FP, and PC.
   builder->AddPp(current->function(), slot_ix++);
   builder->AddPcMarker(Function::Handle(zone), slot_ix++);
   builder->AddCallerFp(slot_ix++);
@@ -118,7 +118,6 @@
   Environment* previous = current;
   current = current->outer();
   while (current != NULL) {
-    // PP, FP, and PC.
     builder->AddPp(current->function(), slot_ix++);
     builder->AddPcMarker(previous->function(), slot_ix++);
     builder->AddCallerFp(slot_ix++);
@@ -154,9 +153,8 @@
   // The previous pointer is now the outermost environment.
   ASSERT(previous != NULL);
 
-  // For the outermost environment, set caller PC, caller PP, and caller FP.
+  // Add slots for the outermost environment.
   builder->AddCallerPp(slot_ix++);
-  // PC marker.
   builder->AddPcMarker(previous->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddCallerPc(slot_ix++);
@@ -183,7 +181,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-
+  __ Push(CODE_REG);
   __ BranchLink(*StubCode::Deoptimize_entry());
   set_pc_offset(assem->CodeSize());
 #undef __
@@ -911,12 +909,8 @@
 
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    __ LeaveDartFrame();  // The arguments are still on the stack.
-    // Do not use caller's pool ptr in branch.
-    ASSERT(!assembler()->constant_pool_allowed());
+    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
     __ BranchPatchable(*StubCode::CallClosureNoSuchMethod_entry());
-    __ set_constant_pool_allowed(true);
     // The noSuchMethod call may return to the caller, but not here.
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
@@ -985,9 +979,6 @@
     // Load function object using the callee's pool pointer.
     __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
-    // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
     __ LoadFieldFromOffset(
         R7, function_reg, Function::usage_counter_offset(), kWord);
     // Reoptimization of an optimized function is triggered by counting in
@@ -1001,10 +992,8 @@
     ASSERT(function_reg == R6);
     Label dont_optimize;
     __ b(&dont_optimize, LT);
-    __ Branch(*StubCode::OptimizeFunction_entry());
+    __ Branch(*StubCode::OptimizeFunction_entry(), new_pp);
     __ Bind(&dont_optimize);
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1066,12 +1055,8 @@
       __ b(&correct_num_arguments, EQ);
       __ Bind(&wrong_num_arguments);
       if (function.IsClosureFunction()) {
-        ASSERT(assembler()->constant_pool_allowed());
-        __ LeaveDartFrame();  // The arguments are still on the stack.
-        // Do not use caller's pool ptr in branch.
-        ASSERT(!assembler()->constant_pool_allowed());
+        __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
         __ BranchPatchable(*StubCode::CallClosureNoSuchMethod_entry());
-        __ set_constant_pool_allowed(true);
         // The noSuchMethod call may return to the caller, but not here.
       } else {
         __ Stop("Wrong number of arguments");
@@ -1125,12 +1110,14 @@
   ASSERT(assembler()->constant_pool_allowed());
   GenerateDeferredCode();
 
-  // Emit function patching code. This will be swapped with the first 3
-  // instructions at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(*StubCode::FixCallersTarget_entry());
-
   if (is_optimizing()) {
+    // Leave enough space for patching in case of lazy deoptimization from
+    // deferred code.
+    for (intptr_t i = 0;
+      i < CallPattern::kDeoptCallLengthInInstructions;
+      ++i) {
+      __ orr(R0, ZR, Operand(R0));  // nop
+    }
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
   __ BranchPatchable(*StubCode::DeoptimizeLazy_entry());
   }
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 81befda..a8e9da5 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -15,6 +15,7 @@
 #include "vm/deopt_instructions.h"
 #include "vm/flow_graph_builder.h"
 #include "vm/il_printer.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -102,10 +103,7 @@
 
   Zone* zone = compiler->zone();
 
-  // Callee's PC marker is not used anymore. Pass Code::null() to set to 0.
   builder->AddPcMarker(Function::Handle(zone), slot_ix++);
-
-  // Current FP and PC.
   builder->AddCallerFp(slot_ix++);
   builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
@@ -121,7 +119,6 @@
     builder->AddCopy(current->ValueAt(i), current->LocationAt(i), slot_ix++);
   }
 
-  // Current PC marker and caller FP.
   builder->AddPcMarker(current->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
 
@@ -152,7 +149,6 @@
                        slot_ix++);
     }
 
-    // PC marker and caller FP.
     builder->AddPcMarker(current->function(), slot_ix++);
     builder->AddCallerFp(slot_ix++);
 
@@ -188,7 +184,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-
+  __ pushl(CODE_REG);
   __ Call(*StubCode::Deoptimize_entry());
   set_pc_offset(assem->CodeSize());
   __ int3();
@@ -999,12 +995,9 @@
   if (CanOptimizeFunction() &&
       function.IsOptimizable() &&
       (!is_optimizing() || may_reoptimize())) {
-    const Register function_reg = EDI;
+    const Register function_reg = EBX;
     __ LoadObject(function_reg, function);
 
-    // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
-
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
@@ -1012,10 +1005,8 @@
     }
     __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
             Immediate(GetOptimizationThreshold()));
-    ASSERT(function_reg == EDI);
+    ASSERT(function_reg == EBX);
     __ J(GREATER_EQUAL, *StubCode::OptimizeFunction_entry());
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1136,12 +1127,11 @@
 
   __ int3();
   GenerateDeferredCode();
-  // Emit function patching code. This will be swapped with the first 5 bytes
-  // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
-  __ Jmp(*StubCode::FixCallersTarget_entry());
 
   if (is_optimizing()) {
+    // Leave enough space for patching in case of lazy deoptimization from
+    // deferred code.
+    __ nop(CallPattern::pattern_length_in_bytes());
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
     __ Jmp(*StubCode::DeoptimizeLazy_entry());
   }
@@ -1262,7 +1252,7 @@
   // top-level function (parsed_function().function()) which could be
   // reoptimized and which counter needs to be incremented.
   // Pass the function explicitly, it is used in IC stub.
-  __ LoadObject(EDI, parsed_function().function());
+  __ LoadObject(EBX, parsed_function().function());
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id,
                    token_pos,
@@ -1302,7 +1292,7 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache = MegamorphicCache::ZoneHandle(zone(),
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
-  const Register receiverR = EDI;
+  const Register receiverR = ECX;
   const Register cacheR = EBX;
   const Register targetR = EBX;
   __ movl(receiverR, Address(ESP, (argument_count - 1) * kWordSize));
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index f9dea83..120795c 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -12,6 +12,7 @@
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
 #include "vm/il_printer.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -96,13 +97,11 @@
 
   Zone* zone = compiler->zone();
 
-  // Current PP, FP, and PC.
   builder->AddPp(current->function(), slot_ix++);
+  builder->AddPcMarker(Function::Handle(zone), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddReturnAddress(current->function(), deopt_id(), slot_ix++);
 
-  // Callee's PC marker is not used anymore. Pass Code::null() to set to 0.
-  builder->AddPcMarker(Function::Handle(zone), slot_ix++);
 
   // Emit all values that are needed for materialization as a part of the
   // expression stack for the bottom-most frame. This guarantees that GC
@@ -119,8 +118,8 @@
   Environment* previous = current;
   current = current->outer();
   while (current != NULL) {
-    // PP, FP, and PC.
     builder->AddPp(current->function(), slot_ix++);
+    builder->AddPcMarker(previous->function(), slot_ix++);
     builder->AddCallerFp(slot_ix++);
 
     // For any outer environment the deopt id is that of the call instruction
@@ -130,9 +129,6 @@
         Isolate::ToDeoptAfter(current->deopt_id()),
         slot_ix++);
 
-    // PC marker.
-    builder->AddPcMarker(previous->function(), slot_ix++);
-
     // The values of outgoing arguments can be changed from the inlined call so
     // we must read them from the previous environment.
     for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
@@ -157,14 +153,12 @@
   // The previous pointer is now the outermost environment.
   ASSERT(previous != NULL);
 
-  // For the outermost environment, set caller PC, caller PP, and caller FP.
+  // Set slots for the outermost environment.
   builder->AddCallerPp(slot_ix++);
+  builder->AddPcMarker(previous->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddCallerPc(slot_ix++);
 
-  // PC marker.
-  builder->AddPcMarker(previous->function(), slot_ix++);
-
   // For the outermost environment, set the incoming arguments.
   for (intptr_t i = previous->fixed_parameter_count() - 1; i >= 0; i--) {
     builder->AddCopy(previous->ValueAt(i), previous->LocationAt(i), slot_ix++);
@@ -187,7 +181,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-
+  __ Push(CODE_REG);
   __ BranchLink(*StubCode::Deoptimize_entry());
   set_pc_offset(assem->CodeSize());
 #undef __
@@ -928,7 +922,7 @@
 
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
-    __ LeaveDartFrame();  // The arguments are still on the stack.
+    __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
     __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
     // The noSuchMethod call may return to the caller, but not here.
   } else if (check_correct_named_args) {
@@ -986,6 +980,9 @@
 }
 
 
+static const Register new_pp = T7;
+
+
 void FlowGraphCompiler::EmitFrameEntry() {
   const Function& function = parsed_function().function();
   if (CanOptimizeFunction() &&
@@ -993,24 +990,10 @@
       (!is_optimizing() || may_reoptimize())) {
     const Register function_reg = T0;
 
-    __ GetNextPC(T2, TMP);
-
-    // Calculate offset of pool pointer from the PC.
-    const intptr_t object_pool_pc_dist =
-       Instructions::HeaderSize() - Instructions::object_pool_offset() +
-       assembler()->CodeSize() - 1 * Instr::kInstrSize;
-
-    // Preserve PP of caller.
-    __ mov(T1, PP);
     // Temporarily setup pool pointer for this dart function.
-    __ lw(PP, Address(T2, -object_pool_pc_dist));
+    __ LoadPoolPointer(new_pp);
     // Load function object from object pool.
-    __ LoadObject(function_reg, function);  // Uses PP.
-    // Restore PP of caller.
-    __ mov(PP, T1);
-
-    // Patch point is after the eventually inlined function object.
-    entry_patch_pc_offset_ = assembler()->CodeSize();
+    __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
     __ lw(T1, FieldAddress(function_reg, Function::usage_counter_offset()));
     // Reoptimization of an optimized function is triggered by counting in
@@ -1026,12 +1009,9 @@
         T1, Immediate(GetOptimizationThreshold()), &dont_branch);
 
     ASSERT(function_reg == T0);
-    __ Branch(*StubCode::OptimizeFunction_entry());
+    __ Branch(*StubCode::OptimizeFunction_entry(), new_pp);
 
     __ Bind(&dont_branch);
-
-  } else if (!flow_graph().IsCompiledForOsr()) {
-    entry_patch_pc_offset_ = assembler()->CodeSize();
   }
   __ Comment("Enter frame");
   if (flow_graph().IsCompiledForOsr()) {
@@ -1092,7 +1072,7 @@
       __ beq(T0, T1, &correct_num_arguments);
       __ Bind(&wrong_num_arguments);
       if (function.IsClosureFunction()) {
-        __ LeaveDartFrame();  // The arguments are still on the stack.
+        __ LeaveDartFrame(kKeepCalleePP);  // Arguments are still on the stack.
         __ Branch(*StubCode::CallClosureNoSuchMethod_entry());
         // The noSuchMethod call may return to the caller, but not here.
       } else {
@@ -1145,12 +1125,15 @@
 
   __ break_(0);
   GenerateDeferredCode();
-  // Emit function patching code. This will be swapped with the first 5 bytes
-  // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
-  __ BranchPatchable(*StubCode::FixCallersTarget_entry());
 
   if (is_optimizing()) {
+    // Leave enough space for patching in case of lazy deoptimization from
+    // deferred code.
+    for (intptr_t i = 0;
+      i < CallPattern::kDeoptCallLengthInInstructions;
+      ++i) {
+      __ nop();
+    }
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
     __ Branch(*StubCode::DeoptimizeLazy_entry());
   }
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 59934cd..de1b944 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -12,6 +12,7 @@
 #include "vm/dart_entry.h"
 #include "vm/deopt_instructions.h"
 #include "vm/il_printer.h"
+#include "vm/instructions.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
@@ -100,7 +101,6 @@
 
   Zone* zone = compiler->zone();
 
-  // Current PP, FP, and PC.
   builder->AddPp(current->function(), slot_ix++);
   builder->AddPcMarker(Function::Handle(zone), slot_ix++);
   builder->AddCallerFp(slot_ix++);
@@ -121,7 +121,6 @@
   Environment* previous = current;
   current = current->outer();
   while (current != NULL) {
-    // PP, FP, and PC.
     builder->AddPp(current->function(), slot_ix++);
     builder->AddPcMarker(previous->function(), slot_ix++);
     builder->AddCallerFp(slot_ix++);
@@ -157,9 +156,8 @@
   // The previous pointer is now the outermost environment.
   ASSERT(previous != NULL);
 
-  // For the outermost environment, set caller PC, caller PP, and caller FP.
+  // Set slots for the outermost environment.
   builder->AddCallerPp(slot_ix++);
-  // PC marker.
   builder->AddPcMarker(previous->function(), slot_ix++);
   builder->AddCallerFp(slot_ix++);
   builder->AddCallerPc(slot_ix++);
@@ -187,6 +185,7 @@
 
   ASSERT(deopt_env() != NULL);
 
+  __ pushq(CODE_REG);
   __ Call(*StubCode::Deoptimize_entry());
   set_pc_offset(assem->CodeSize());
   __ int3();
@@ -925,11 +924,8 @@
 
   __ Bind(&wrong_num_arguments);
   if (function.IsClosureFunction()) {
-    ASSERT(assembler()->constant_pool_allowed());
-    __ LeaveDartFrame();  // The arguments are still on the stack.
-    ASSERT(!assembler()->constant_pool_allowed());
-    __ jmp(*StubCode::CallClosureNoSuchMethod_entry());
-    __ set_constant_pool_allowed(true);
+    __ LeaveDartFrame(kKeepCalleePP);  // The arguments are still on the stack.
+    __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
     // The noSuchMethod call may return to the caller, but not here.
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
@@ -986,30 +982,19 @@
 // NOTE: If the entry code shape changes, ReturnAddressLocator in profiler.cc
 // needs to be updated to match.
 void FlowGraphCompiler::EmitFrameEntry() {
-  ASSERT(Assembler::EntryPointToPcMarkerOffset() == 0);
-
   const Function& function = parsed_function().function();
-  const Register new_pp = R13;
-  const Register new_pc = R12;
-
-  // Load PC marker.
-  const intptr_t kRIPRelativeLeaqSize = 7;
-  const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
-  __ leaq(new_pc, Address::AddressRIPRelative(-entry_to_rip_offset));
-  ASSERT(__ CodeSize() == entry_to_rip_offset);
-
   // Load pool pointer.
-  const intptr_t object_pool_pc_dist =
-      Instructions::HeaderSize() - Instructions::object_pool_offset();
-  __ movq(new_pp, Address(new_pc, -object_pool_pc_dist));
 
   if (flow_graph().IsCompiledForOsr()) {
     intptr_t extra_slots = StackSize()
         - flow_graph().num_stack_locals()
         - flow_graph().num_copied_params();
     ASSERT(extra_slots >= 0);
-    __ EnterOsrFrame(extra_slots * kWordSize, new_pp, new_pc);
+    __ EnterOsrFrame(extra_slots * kWordSize);
   } else {
+    const Register new_pp = R13;
+    __ LoadPoolPointer(new_pp);
+
     if (CanOptimizeFunction() &&
         function.IsOptimizable() &&
         (!is_optimizing() || may_reoptimize())) {
@@ -1017,9 +1002,6 @@
       // Load function object using the callee's pool pointer.
       __ LoadFunctionFromCalleePool(function_reg, function, new_pp);
 
-      // Patch point is after the eventually inlined function object.
-      entry_patch_pc_offset_ = assembler()->CodeSize();
-
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
       if (!is_optimizing()) {
@@ -1032,12 +1014,10 @@
       __ J(GREATER_EQUAL,
            *StubCode::OptimizeFunction_entry(),
            new_pp);
-    } else {
-      entry_patch_pc_offset_ = assembler()->CodeSize();
     }
     ASSERT(StackSize() >= 0);
     __ Comment("Enter frame");
-    __ EnterDartFrame(StackSize() * kWordSize, new_pp, new_pc);
+    __ EnterDartFrame(StackSize() * kWordSize, new_pp);
   }
 }
 
@@ -1082,11 +1062,8 @@
 
       __ Bind(&wrong_num_arguments);
       if (function.IsClosureFunction()) {
-        ASSERT(assembler()->constant_pool_allowed());
-        __ LeaveDartFrame();  // The arguments are still on the stack.
-        ASSERT(!assembler()->constant_pool_allowed());
-        __ jmp(*StubCode::CallClosureNoSuchMethod_entry());
-        __ set_constant_pool_allowed(true);
+        __ LeaveDartFrame(kKeepCalleePP);  // Leave arguments on the stack.
+        __ Jmp(*StubCode::CallClosureNoSuchMethod_entry());
         // The noSuchMethod call may return to the caller, but not here.
       } else {
         __ Stop("Wrong number of arguments");
@@ -1150,12 +1127,11 @@
   GenerateDeferredCode();
   // Emit function patching code. This will be swapped with the first 13 bytes
   // at entry point.
-  patch_code_pc_offset_ = assembler()->CodeSize();
-  // This is patched up to a point in FrameEntry where the PP for the
-  // current function is in R13 instead of PP.
-  __ JmpPatchable(*StubCode::FixCallersTarget_entry(), R13);
 
   if (is_optimizing()) {
+    // Leave enough space for patching in case of lazy deoptimization from
+    // deferred code.
+    __ nop(ShortCallPattern::pattern_length_in_bytes());
     lazy_deopt_pc_offset_ = assembler()->CodeSize();
     __ Jmp(*StubCode::DeoptimizeLazy_entry(), PP);
   }
diff --git a/runtime/vm/gc_marker.cc b/runtime/vm/gc_marker.cc
index 1d151d0..42ee7fe 100644
--- a/runtime/vm/gc_marker.cc
+++ b/runtime/vm/gc_marker.cc
@@ -16,6 +16,7 @@
 #include "vm/raw_object.h"
 #include "vm/stack_frame.h"
 #include "vm/store_buffer.h"
+#include "vm/thread_barrier.h"
 #include "vm/thread_pool.h"
 #include "vm/visitor.h"
 #include "vm/object_id_ring.h"
@@ -26,9 +27,6 @@
             "The number of tasks to spawn during old gen GC marking (0 means "
             "perform all marking on main thread).");
 
-typedef StoreBufferBlock PointerBlock;  // TODO(koda): Rename to PointerBlock.
-typedef StoreBuffer MarkingStack;  // TODO(koda): Create shared base class.
-
 class DelaySet {
  private:
   typedef std::multimap<RawObject*, RawWeakProperty*> Map;
@@ -91,14 +89,14 @@
     intptr_t current_code_count = 0;
     for (int i = 0; i < skipped_code_functions_.length(); i++) {
       RawFunction* func = skipped_code_functions_[i];
-      RawCode* code = func->ptr()->instructions_->ptr()->code_;
+      RawCode* code = func->ptr()->code_;
       if (!code->IsMarked()) {
         // 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.
         func->StorePointer(
-            &(func->ptr()->instructions_),
-            StubCode::LazyCompile_entry()->code()->ptr()->instructions_);
+            &(func->ptr()->code_),
+            StubCode::LazyCompile_entry()->code());
         uword entry_point = StubCode::LazyCompile_entry()->EntryPoint();
         func->ptr()->entry_point_ = entry_point;
         if (FLAG_log_code_drop) {
@@ -154,7 +152,8 @@
         thread_(Thread::Current()),
         heap_(heap),
         vm_heap_(Dart::vm_isolate()->heap()),
-        class_table_(isolate->class_table()),
+        class_stats_count_(isolate->class_table()->NumCids()),
+        class_stats_size_(isolate->class_table()->NumCids()),
         page_space_(page_space),
         work_list_(marking_stack),
         delay_set_(delay_set),
@@ -163,10 +162,24 @@
         marked_bytes_(0) {
     ASSERT(heap_ != vm_heap_);
     ASSERT(thread_->isolate() == isolate);
+    class_stats_count_.SetLength(isolate->class_table()->NumCids());
+    class_stats_size_.SetLength(isolate->class_table()->NumCids());
+    for (intptr_t i = 0; i < class_stats_count_.length(); ++i) {
+      class_stats_count_[i] = 0;
+      class_stats_size_[i] = 0;
+    }
   }
 
   uintptr_t marked_bytes() const { return marked_bytes_; }
 
+  intptr_t live_count(intptr_t class_id) {
+    return class_stats_count_[class_id];
+  }
+
+  intptr_t live_size(intptr_t class_id) {
+    return class_stats_size_[class_id];
+  }
+
   // Returns true if some non-zero amount of work was performed.
   bool DrainMarkingStack() {
     RawObject* raw_obj = work_list_.Pop();
@@ -272,11 +285,11 @@
       if (work_->IsEmpty()) {
         // TODO(koda): Track over/underflow events and use in heuristics to
         // distribute work and prevent degenerate flip-flopping.
-        PointerBlock* new_work = marking_stack_->PopNonEmptyBlock();
+        MarkingStack::Block* new_work = marking_stack_->PopNonEmptyBlock();
         if (new_work == NULL) {
           return NULL;
         }
-        marking_stack_->PushBlock(work_, false);
+        marking_stack_->PushBlock(work_);
         work_ = new_work;
       }
       return work_->Pop();
@@ -286,7 +299,7 @@
       if (work_->IsFull()) {
         // TODO(koda): Track over/underflow events and use in heuristics to
         // distribute work and prevent degenerate flip-flopping.
-        marking_stack_->PushBlock(work_, false);
+        marking_stack_->PushBlock(work_);
         work_ = marking_stack_->PopEmptyBlock();
       }
       work_->Push(raw_obj);
@@ -294,14 +307,14 @@
 
     void Finalize() {
       ASSERT(work_->IsEmpty());
-      marking_stack_->PushBlock(work_, false);
+      marking_stack_->PushBlock(work_);
       work_ = NULL;
       // Fail fast on attempts to mark after finalizing.
       marking_stack_ = NULL;
     }
 
    private:
-    PointerBlock* work_;
+    MarkingStack::Block* work_;
     MarkingStack* marking_stack_;
   };
 
@@ -346,18 +359,26 @@
       return;
     }
     if (RawObject::IsVariableSizeClassId(raw_obj->GetClassId())) {
-      class_table_->UpdateLiveOld(raw_obj->GetClassId(), raw_obj->Size());
+      UpdateLiveOld(raw_obj->GetClassId(), raw_obj->Size());
     } else {
-      class_table_->UpdateLiveOld(raw_obj->GetClassId(), 0);
+      UpdateLiveOld(raw_obj->GetClassId(), 0);
     }
 
     MarkAndPush(raw_obj);
   }
 
+  void UpdateLiveOld(intptr_t class_id, intptr_t size) {
+    // TODO(koda): Support growing the array once mutator runs concurrently.
+    ASSERT(class_id < class_stats_count_.length());
+    class_stats_count_[class_id] += 1;
+    class_stats_size_[class_id] += size;
+  }
+
   Thread* thread_;
   Heap* heap_;
   Heap* vm_heap_;
-  ClassTable* class_table_;
+  GrowableArray<intptr_t> class_stats_count_;
+  GrowableArray<intptr_t> class_stats_size_;
   PageSpace* page_space_;
   WorkList work_list_;
   DelaySet* delay_set_;
@@ -553,6 +574,7 @@
            PageSpace* page_space,
            MarkingStack* marking_stack,
            DelaySet* delay_set,
+           ThreadBarrier* barrier,
            bool collect_code,
            bool visit_prologue_weak_persistent_handles)
       : marker_(marker),
@@ -561,6 +583,7 @@
         page_space_(page_space),
         marking_stack_(marking_stack),
         delay_set_(delay_set),
+        barrier_(barrier),
         collect_code_(collect_code),
         visit_prologue_weak_persistent_handles_(
             visit_prologue_weak_persistent_handles) {
@@ -580,15 +603,15 @@
       marker_->IterateRoots(isolate_, &visitor,
                             visit_prologue_weak_persistent_handles_);
       visitor.DrainMarkingStack();
-      marker_->TaskSync();
+      barrier_->Sync();
       // Phase 2: Weak processing and follow-up marking on main thread.
-      marker_->TaskSync();
+      barrier_->Sync();
       // Phase 3: Finalize results from all markers (detach code, etc.).
       marker_->FinalizeResultsFrom(&visitor);
     }
     Thread::ExitIsolateAsHelper(true);
     // This task is done. Notify the original thread.
-    marker_->TaskNotifyDone();
+    barrier_->Exit();
   }
 
  private:
@@ -598,6 +621,7 @@
   PageSpace* page_space_;
   MarkingStack* marking_stack_;
   DelaySet* delay_set_;
+  ThreadBarrier* barrier_;
   bool collect_code_;
   bool visit_prologue_weak_persistent_handles_;
 
@@ -605,43 +629,20 @@
 };
 
 
-void GCMarker::MainSync(intptr_t num_tasks) {
-  MonitorLocker ml(&monitor_);
-  while (done_count_ < num_tasks) {
-    ml.Wait();
-  }
-  done_count_ = 0;  // Tasks may now resume.
-  // TODO(koda): Add barrier utility with two condition variables to allow for
-  // Notify rather than NotifyAll. Also use it for safepoints.
-  ml.NotifyAll();
-}
-
-
-void GCMarker::TaskNotifyDone() {
-  MonitorLocker ml(&monitor_);
-  ++done_count_;
-  // TODO(koda): Add barrier utility with two condition variables to allow for
-  // Notify rather than NotifyAll. Also use it for safepoints.
-  ml.NotifyAll();
-}
-
-
-void GCMarker::TaskSync() {
-  MonitorLocker ml(&monitor_);
-  ++done_count_;
-  ml.NotifyAll();  // Notify controller that this thread reached end of phase.
-  ASSERT(done_count_ > 0);
-  while (done_count_ > 0) {
-    // Wait for the controller to release into next phase.
-    ml.Wait();
-  }
-}
-
-
 void GCMarker::FinalizeResultsFrom(MarkingVisitor* visitor) {
   {
-    MonitorLocker ml(&monitor_);
+    MutexLocker ml(&stats_mutex_);
     marked_bytes_ += visitor->marked_bytes();
+    // Class heap stats are not themselves thread-safe yet, so we update the
+    // stats while holding stats_mutex_.
+    ClassTable* table = heap_->isolate()->class_table();
+    for (intptr_t i = 0; i < table->NumCids(); ++i) {
+      const intptr_t count = visitor->live_count(i);
+      if (count > 0) {
+        const intptr_t size = visitor->live_size(i);
+        table->UpdateLiveOld(i, size, count);
+      }
+    }
   }
   visitor->Finalize();
 }
@@ -683,14 +684,15 @@
         // 2. concurrent tasks, after synchronizing headers.
         FATAL("Multiple marking tasks not yet supported");
       }
+      ThreadBarrier barrier(num_tasks + 1);  // +1 for the main thread.
       // Phase 1: Populate and drain marking stack in task.
       MarkTask* mark_task =
           new MarkTask(this, isolate, heap_, page_space, &marking_stack,
-                       &delay_set, collect_code,
+                       &delay_set, &barrier, collect_code,
                        visit_prologue_weak_persistent_handles);
       ThreadPool* pool = Dart::thread_pool();
       pool->Run(mark_task);
-      MainSync(num_tasks);
+      barrier.Sync();
       // Phase 2: Weak processing and follow-up marking on main thread.
       SkippedCodeFunctions* skipped_code_functions =
           collect_code ? new(zone) SkippedCodeFunctions() : NULL;
@@ -700,11 +702,10 @@
       MarkingWeakVisitor mark_weak;
       IterateWeakRoots(isolate, &mark_weak,
                        !visit_prologue_weak_persistent_handles);
-      MainSync(num_tasks);
+      barrier.Sync();
       // Phase 3: Finalize results from all markers (detach code, etc.).
       FinalizeResultsFrom(&mark);
-      MainSync(num_tasks);
-      // Finalization complete and all tasks exited.
+      barrier.Exit();
     }
     delay_set.ClearReferences();
     ProcessWeakTables(page_space);
diff --git a/runtime/vm/gc_marker.h b/runtime/vm/gc_marker.h
index 87fed84..c01a6e8 100644
--- a/runtime/vm/gc_marker.h
+++ b/runtime/vm/gc_marker.h
@@ -23,7 +23,7 @@
 class GCMarker : public ValueObject {
  public:
   explicit GCMarker(Heap* heap)
-      : heap_(heap), marked_bytes_(0), done_count_(0) { }
+      : heap_(heap), marked_bytes_(0) { }
   ~GCMarker() { }
 
   void MarkObjects(Isolate* isolate,
@@ -46,20 +46,14 @@
   void ProcessWeakTables(PageSpace* page_space);
   void ProcessObjectIdTable(Isolate* isolate);
 
-  // Synchronization between GCMarker's main thread and its marking tasks.
-  // Called by main thread: wait for 'num_tasks' tasks, then let them resume.
-  void MainSync(intptr_t num_tasks);
-  // Called by tasks: notify main thread; wait until it lets us continue.
-  void TaskSync();
-  // Called by tasks: notify main thread, but don't wait (used for exiting).
-  void TaskNotifyDone();
   // Called by anyone: finalize and accumulate stats from 'visitor'.
   void FinalizeResultsFrom(MarkingVisitor* visitor);
 
-  Monitor monitor_;  // Protects marked_bytes_ and done_count_.
   Heap* heap_;
+
+  Mutex stats_mutex_;
+  // TODO(koda): Remove after verifying it's redundant w.r.t. ClassHeapStats.
   uintptr_t marked_bytes_;
-  intptr_t done_count_;
 
   friend class MarkTask;
   DISALLOW_IMPLICIT_CONSTRUCTORS(GCMarker);
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 1a5f2b6..8feb555 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -236,6 +236,10 @@
 
   bool ShouldPretenure(intptr_t class_id) const;
 
+  void SetupInstructionsSnapshotPage(void* pointer, uword size) {
+    old_space_.SetupInstructionsSnapshotPage(pointer, size);
+  }
+
  private:
   class GCStats : public ValueObject {
    public:
diff --git a/runtime/vm/instructions_arm.cc b/runtime/vm/instructions_arm.cc
index 9002d50..eec6cfe 100644
--- a/runtime/vm/instructions_arm.cc
+++ b/runtime/vm/instructions_arm.cc
@@ -17,7 +17,7 @@
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       ic_data_load_end_(0),
-      target_address_pool_index_(-1),
+      target_code_pool_index_(-1),
       ic_data_(ICData::Handle()) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blx lr.
@@ -25,39 +25,43 @@
 
   Register reg;
   ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - Instr::kInstrSize,
+      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == LR);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
 }
 
 
-int CallPattern::LengthInBytes() {
+int CallPattern::DeoptCallPatternLengthInInstructions() {
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
-    return 5 * Instr::kInstrSize;
+    return 5;
   } else {
     ASSERT(version == ARMv7);
-    return 3 * Instr::kInstrSize;
+    return 3;
   }
 }
 
+int CallPattern::DeoptCallPatternLengthInBytes() {
+  return DeoptCallPatternLengthInInstructions() * Instr::kInstrSize;
+}
+
 
 NativeCallPattern::NativeCallPattern(uword pc, const Code& code)
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       native_function_pool_index_(-1),
-      target_address_pool_index_(-1) {
+      target_code_pool_index_(-1) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blx lr.
   ASSERT(*(reinterpret_cast<uword*>(end_) - 1) == 0xe12fff3e);
 
   Register reg;
   uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - Instr::kInstrSize,
+      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == LR);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
   InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
                                              &reg,
                                              &native_function_pool_index_);
@@ -65,13 +69,14 @@
 }
 
 
-uword NativeCallPattern::target() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* NativeCallPattern::target() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void NativeCallPattern::set_target(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
+void NativeCallPattern::set_target(const Code& new_target) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, new_target);
   // No need to flush the instruction cache, since the code is not modified.
 }
 
@@ -175,7 +180,7 @@
   uword start = end - Instr::kInstrSize;
   int32_t instr = Instr::At(start)->InstructionBits();
   intptr_t offset = 0;
-  if ((instr & 0xffff0000) == 0xe59a0000) {  // ldr reg, [pp, #+offset]
+  if ((instr & 0xffff0000) == 0xe5990000) {  // ldr reg, [pp, #+offset]
     offset = instr & 0xfff;
     *reg = static_cast<Register>((instr & 0xf000) >> 12);
   } else {
@@ -183,13 +188,13 @@
     offset = instr & 0xfff;
     start -= Instr::kInstrSize;
     instr = Instr::At(start)->InstructionBits();
-    if ((instr & 0xffff0000) == 0xe28a0000) {  // add reg, pp, operand
+    if ((instr & 0xffff0000) == 0xe2890000) {  // add reg, pp, operand
       const intptr_t rot = (instr & 0xf00) >> 7;
       const intptr_t imm8 = instr & 0xff;
       offset += (imm8 >> rot) | (imm8 << (32 - rot));
       *reg = static_cast<Register>((instr & 0xf000) >> 12);
     } else {
-      ASSERT((instr & 0xffff0000) == 0xe08a0000);  // add reg, pp, reg
+      ASSERT((instr & 0xffff0000) == 0xe0890000);  // add reg, pp, reg
       end = DecodeLoadWordImmediate(end, reg, &offset);
     }
   }
@@ -211,18 +216,18 @@
 }
 
 
-uword CallPattern::TargetAddress() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* CallPattern::TargetCode() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void CallPattern::SetTargetAddress(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
-  // No need to flush the instruction cache, since the code is not modified.
+void CallPattern::SetTargetCode(const Code& target_code) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, target_code);
 }
 
 
-void CallPattern::InsertAt(uword pc, uword target_address) {
+void CallPattern::InsertDeoptCallAt(uword pc, uword target_address) {
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
     const uint32_t byte0 = (target_address & 0x000000ff);
@@ -242,8 +247,8 @@
     *reinterpret_cast<uword*>(pc + (3 * Instr::kInstrSize)) = or3_ip;
     *reinterpret_cast<uword*>(pc + (4 * Instr::kInstrSize)) = blx_ip;
 
-    ASSERT(LengthInBytes() == 5 * Instr::kInstrSize);
-    CPU::FlushICache(pc, LengthInBytes());
+    ASSERT(DeoptCallPatternLengthInBytes() == 5 * Instr::kInstrSize);
+    CPU::FlushICache(pc, DeoptCallPatternLengthInBytes());
   } else {
     ASSERT(version == ARMv7);
     const uint16_t target_lo = target_address & 0xffff;
@@ -259,106 +264,8 @@
     *reinterpret_cast<uword*>(pc + (1 * Instr::kInstrSize)) = movt_ip;
     *reinterpret_cast<uword*>(pc + (2 * Instr::kInstrSize)) = blx_ip;
 
-    ASSERT(LengthInBytes() == 3 * Instr::kInstrSize);
-    CPU::FlushICache(pc, LengthInBytes());
-  }
-}
-
-
-JumpPattern::JumpPattern(uword pc, const Code& code) : pc_(pc) { }
-
-
-int JumpPattern::pattern_length_in_bytes() {
-  const ARMVersion version = TargetCPUFeatures::arm_version();
-  if ((version == ARMv5TE) || (version == ARMv6)) {
-    return 5 * Instr::kInstrSize;
-  } else {
-    ASSERT(version == ARMv7);
-    return 3 * Instr::kInstrSize;
-  }
-}
-
-
-bool JumpPattern::IsValid() const {
-  const ARMVersion version = TargetCPUFeatures::arm_version();
-  if ((version == ARMv5TE) || (version == ARMv6)) {
-    Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
-    Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
-    Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
-    Instr* or3_ip = Instr::At(pc_ + (3 * Instr::kInstrSize));
-    Instr* bx_ip = Instr::At(pc_ + (4 * Instr::kInstrSize));
-    return ((mov_ip->InstructionBits() & 0xffffff00) == 0xe3a0c400) &&
-           ((or1_ip->InstructionBits() & 0xffffff00) == 0xe38cc800) &&
-           ((or2_ip->InstructionBits() & 0xffffff00) == 0xe38ccc00) &&
-           ((or3_ip->InstructionBits() & 0xffffff00) == 0xe38cc000) &&
-           ((bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c);
-  } else {
-    ASSERT(version == ARMv7);
-    Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
-    Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
-    Instr* bx_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
-    return (movw_ip->InstructionBits() & 0xfff0f000) == 0xe300c000 &&
-           (movt_ip->InstructionBits() & 0xfff0f000) == 0xe340c000 &&
-           (bx_ip->InstructionBits() & 0xffffffff) == 0xe12fff1c;
-  }
-}
-
-
-uword JumpPattern::TargetAddress() const {
-  const ARMVersion version = TargetCPUFeatures::arm_version();
-  if ((version == ARMv5TE) || (version == ARMv6)) {
-    Instr* mov_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));
-    Instr* or1_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));
-    Instr* or2_ip = Instr::At(pc_ + (2 * Instr::kInstrSize));
-    Instr* or3_ip = Instr::At(pc_ + (3 * Instr::kInstrSize));
-    uword imm = 0;
-    imm |= or3_ip->Immed8Field();
-    imm |= or2_ip->Immed8Field() << 8;
-    imm |= or1_ip->Immed8Field() << 16;
-    imm |= mov_ip->Immed8Field() << 24;
-    return imm;
-  } else {
-    ASSERT(version == ARMv7);
-    Instr* movw_ip = Instr::At(pc_ + (0 * Instr::kInstrSize));  // target_lo
-    Instr* movt_ip = Instr::At(pc_ + (1 * Instr::kInstrSize));  // target_hi
-    uint16_t target_lo = movw_ip->MovwField();
-    uint16_t target_hi = movt_ip->MovwField();
-    return (target_hi << 16) | target_lo;
-  }
-}
-
-
-void JumpPattern::SetTargetAddress(uword target_address) const {
-  const ARMVersion version = TargetCPUFeatures::arm_version();
-  if ((version == ARMv5TE) || (version == ARMv6)) {
-    const uint32_t byte0 = (target_address & 0x000000ff);
-    const uint32_t byte1 = (target_address & 0x0000ff00) >> 8;
-    const uint32_t byte2 = (target_address & 0x00ff0000) >> 16;
-    const uint32_t byte3 = (target_address & 0xff000000) >> 24;
-
-    const uword mov_ip = 0xe3a0c400 | byte3;  // mov ip, (byte3 rot 4)
-    const uword or1_ip = 0xe38cc800 | byte2;  // orr ip, ip, (byte2 rot 8)
-    const uword or2_ip = 0xe38ccc00 | byte1;  // orr ip, ip, (byte1 rot 12)
-    const uword or3_ip = 0xe38cc000 | byte0;  // orr ip, ip, byte0
-
-    *reinterpret_cast<uword*>(pc_ + (0 * Instr::kInstrSize)) = mov_ip;
-    *reinterpret_cast<uword*>(pc_ + (1 * Instr::kInstrSize)) = or1_ip;
-    *reinterpret_cast<uword*>(pc_ + (2 * Instr::kInstrSize)) = or2_ip;
-    *reinterpret_cast<uword*>(pc_ + (3 * Instr::kInstrSize)) = or3_ip;
-    CPU::FlushICache(pc_, 4 * Instr::kInstrSize);
-  } else {
-    ASSERT(version == ARMv7);
-    const uint16_t target_lo = target_address & 0xffff;
-    const uint16_t target_hi = target_address >> 16;
-
-    const uword movw_ip =
-        0xe300c000 | ((target_lo >> 12) << 16) | (target_lo & 0xfff);
-    const uword movt_ip =
-        0xe340c000 | ((target_hi >> 12) << 16) | (target_hi & 0xfff);
-
-    *reinterpret_cast<uword*>(pc_ + (0 * Instr::kInstrSize)) = movw_ip;
-    *reinterpret_cast<uword*>(pc_ + (1 * Instr::kInstrSize)) = movt_ip;
-    CPU::FlushICache(pc_, 2 * Instr::kInstrSize);
+    ASSERT(DeoptCallPatternLengthInBytes() == 3 * Instr::kInstrSize);
+    CPU::FlushICache(pc, DeoptCallPatternLengthInBytes());
   }
 }
 
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index 991b2b3..ad82da1 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -54,14 +54,15 @@
 
   RawICData* IcData();
 
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
+  RawCode* TargetCode() const;
+  void SetTargetCode(const Code& code) const;
 
   // This constant length is only valid for inserted call patterns used for
   // lazy deoptimization. Regular call pattern may vary in length.
-  static int LengthInBytes();
+  static int DeoptCallPatternLengthInBytes();
+  static int DeoptCallPatternLengthInInstructions();
 
-  static void InsertAt(uword pc, uword target_address);
+  static void InsertDeoptCallAt(uword pc, uword target_address);
 
  private:
   const ObjectPool& object_pool_;
@@ -69,7 +70,7 @@
   uword end_;
   uword ic_data_load_end_;
 
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
   ICData& ic_data_;
 
   DISALLOW_COPY_AND_ASSIGN(CallPattern);
@@ -80,8 +81,8 @@
  public:
   NativeCallPattern(uword pc, const Code& code);
 
-  uword target() const;
-  void set_target(uword target_address) const;
+  RawCode* target() const;
+  void set_target(const Code& target) const;
 
   NativeFunction native_function() const;
   void set_native_function(NativeFunction target) const;
@@ -91,31 +92,12 @@
 
   uword end_;
   intptr_t native_function_pool_index_;
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeCallPattern);
 };
 
 
-class JumpPattern : public ValueObject {
- public:
-  JumpPattern(uword pc, const Code& code);
-
-  static const int kLengthInBytes = 3 * Instr::kInstrSize;
-
-  static int pattern_length_in_bytes();
-
-  bool IsValid() const;
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
-
- private:
-  const uword pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
-};
-
-
 class ReturnPattern : public ValueObject {
  public:
   explicit ReturnPattern(uword pc);
diff --git a/runtime/vm/instructions_arm64.cc b/runtime/vm/instructions_arm64.cc
index 59da8d5..62b3ff2 100644
--- a/runtime/vm/instructions_arm64.cc
+++ b/runtime/vm/instructions_arm64.cc
@@ -17,7 +17,7 @@
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       ic_data_load_end_(0),
-      target_address_pool_index_(-1),
+      target_code_pool_index_(-1),
       ic_data_(ICData::Handle()) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blr ip0.
@@ -25,10 +25,10 @@
 
   Register reg;
   ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - Instr::kInstrSize,
+      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == IP0);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
 }
 
 
@@ -36,17 +36,17 @@
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       native_function_pool_index_(-1),
-      target_address_pool_index_(-1) {
+      target_code_pool_index_(-1) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: blr ip0.
   ASSERT(*(reinterpret_cast<uint32_t*>(end_) - 1) == 0xd63f0200);
 
   Register reg;
   uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - Instr::kInstrSize,
+      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == IP0);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
   InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
                                              &reg,
                                              &native_function_pool_index_);
@@ -54,13 +54,14 @@
 }
 
 
-uword NativeCallPattern::target() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* NativeCallPattern::target() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void NativeCallPattern::set_target(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
+void NativeCallPattern::set_target(const Code& target) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, target);
   // No need to flush the instruction cache, since the code is not modified.
 }
 
@@ -292,18 +293,19 @@
 }
 
 
-uword CallPattern::TargetAddress() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* CallPattern::TargetCode() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void CallPattern::SetTargetAddress(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
+void CallPattern::SetTargetCode(const Code& target) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, target);
   // No need to flush the instruction cache, since the code is not modified.
 }
 
 
-void CallPattern::InsertAt(uword pc, uword target_address) {
+void CallPattern::InsertDeoptCallAt(uword pc, uword target_address) {
   Instr* movz0 = Instr::At(pc + (0 * Instr::kInstrSize));
   Instr* movk1 = Instr::At(pc + (1 * Instr::kInstrSize));
   Instr* movk2 = Instr::At(pc + (2 * Instr::kInstrSize));
@@ -322,68 +324,8 @@
   movk3->SetMoveWideBits(MOVK, IP0, h3, 3, kDoubleWord);
   blr->SetUnconditionalBranchRegBits(BLR, IP0);
 
-  ASSERT(kLengthInBytes == 5 * Instr::kInstrSize);
-  CPU::FlushICache(pc, kLengthInBytes);
-}
-
-
-JumpPattern::JumpPattern(uword pc, const Code& code) : pc_(pc) { }
-
-
-bool JumpPattern::IsValid() const {
-  Instr* movz0 = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* movk1 = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  Instr* movk2 = Instr::At(pc_ + (2 * Instr::kInstrSize));
-  Instr* movk3 = Instr::At(pc_ + (3 * Instr::kInstrSize));
-  Instr* br = Instr::At(pc_ + (4 * Instr::kInstrSize));
-  return (movz0->IsMoveWideOp()) && (movz0->Bits(29, 2) == 2) &&
-         (movk1->IsMoveWideOp()) && (movk1->Bits(29, 2) == 3) &&
-         (movk2->IsMoveWideOp()) && (movk2->Bits(29, 2) == 3) &&
-         (movk3->IsMoveWideOp()) && (movk3->Bits(29, 2) == 3) &&
-         (br->IsUnconditionalBranchRegOp()) && (br->Bits(16, 5) == 31);
-}
-
-
-uword JumpPattern::TargetAddress() const {
-  Instr* movz0 = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* movk1 = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  Instr* movk2 = Instr::At(pc_ + (2 * Instr::kInstrSize));
-  Instr* movk3 = Instr::At(pc_ + (3 * Instr::kInstrSize));
-  const uint16_t imm0 = movz0->Imm16Field();
-  const uint16_t imm1 = movk1->Imm16Field();
-  const uint16_t imm2 = movk2->Imm16Field();
-  const uint16_t imm3 = movk3->Imm16Field();
-  const int64_t target =
-      (static_cast<int64_t>(imm0)) |
-      (static_cast<int64_t>(imm1) << 16) |
-      (static_cast<int64_t>(imm2) << 32) |
-      (static_cast<int64_t>(imm3) << 48);
-  return target;
-}
-
-
-void JumpPattern::SetTargetAddress(uword target_address) const {
-  Instr* movz0 = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* movk1 = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  Instr* movk2 = Instr::At(pc_ + (2 * Instr::kInstrSize));
-  Instr* movk3 = Instr::At(pc_ + (3 * Instr::kInstrSize));
-  const int32_t movz0_bits = movz0->InstructionBits();
-  const int32_t movk1_bits = movk1->InstructionBits();
-  const int32_t movk2_bits = movk2->InstructionBits();
-  const int32_t movk3_bits = movk3->InstructionBits();
-
-  const uint32_t w0 = Utils::Low32Bits(target_address);
-  const uint32_t w1 = Utils::High32Bits(target_address);
-  const uint16_t h0 = Utils::Low16Bits(w0);
-  const uint16_t h1 = Utils::High16Bits(w0);
-  const uint16_t h2 = Utils::Low16Bits(w1);
-  const uint16_t h3 = Utils::High16Bits(w1);
-
-  movz0->SetInstructionBits((movz0_bits & ~kImm16Mask) | (h0 << kImm16Shift));
-  movk1->SetInstructionBits((movk1_bits & ~kImm16Mask) | (h1 << kImm16Shift));
-  movk2->SetInstructionBits((movk2_bits & ~kImm16Mask) | (h2 << kImm16Shift));
-  movk3->SetInstructionBits((movk3_bits & ~kImm16Mask) | (h3 << kImm16Shift));
-  CPU::FlushICache(pc_, 4 * Instr::kInstrSize);
+  ASSERT(kDeoptCallLengthInBytes == 5 * Instr::kInstrSize);
+  CPU::FlushICache(pc, kDeoptCallLengthInBytes);
 }
 
 
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index 430be0f..0d2c96d 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -61,14 +61,16 @@
 
   RawICData* IcData();
 
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
+  RawCode* TargetCode() const;
+  void SetTargetCode(const Code& target) const;
 
   // This constant length is only valid for inserted call patterns used for
   // lazy deoptimization. Regular call pattern may vary in length.
-  static const int kLengthInBytes = 5 * Instr::kInstrSize;
+  static const int kDeoptCallLengthInInstructions = 5;
+  static const int kDeoptCallLengthInBytes =
+      kDeoptCallLengthInInstructions * Instr::kInstrSize;
 
-  static void InsertAt(uword pc, uword target_address);
+  static void InsertDeoptCallAt(uword pc, uword target_address);
 
  private:
   const ObjectPool& object_pool_;
@@ -76,7 +78,7 @@
   uword end_;
   uword ic_data_load_end_;
 
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
   ICData& ic_data_;
 
   DISALLOW_COPY_AND_ASSIGN(CallPattern);
@@ -87,8 +89,8 @@
  public:
   NativeCallPattern(uword pc, const Code& code);
 
-  uword target() const;
-  void set_target(uword target_address) const;
+  RawCode* target() const;
+  void set_target(const Code& target) const;
 
   NativeFunction native_function() const;
   void set_native_function(NativeFunction target) const;
@@ -98,33 +100,12 @@
 
   uword end_;
   intptr_t native_function_pool_index_;
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeCallPattern);
 };
 
 
-class JumpPattern : public ValueObject {
- public:
-  JumpPattern(uword pc, const Code& code);
-
-  static const int kLengthInBytes = 5 * Instr::kInstrSize;
-
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
-
-  bool IsValid() const;
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
-
- private:
-  const uword pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
-};
-
-
 class ReturnPattern : public ValueObject {
  public:
   explicit ReturnPattern(uword pc);
diff --git a/runtime/vm/instructions_arm64_test.cc b/runtime/vm/instructions_arm64_test.cc
index 924d495..970d271 100644
--- a/runtime/vm/instructions_arm64_test.cc
+++ b/runtime/vm/instructions_arm64_test.cc
@@ -29,42 +29,11 @@
   // before the end of the code buffer.
   CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            call.TargetAddress());
+  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(),
+            call.TargetCode());
 }
 
 
-ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(*StubCode::InvokeDartCode_entry());
-  __ BranchPatchable(*StubCode::AllocateArray_entry());
-}
-
-
-ASSEMBLER_TEST_RUN(Jump, test) {
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump2.TargetAddress());
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM64
diff --git a/runtime/vm/instructions_arm_test.cc b/runtime/vm/instructions_arm_test.cc
index 540fd5f..de3ff6f 100644
--- a/runtime/vm/instructions_arm_test.cc
+++ b/runtime/vm/instructions_arm_test.cc
@@ -29,81 +29,9 @@
   // before the end of the code buffer.
   CallPattern call(test->entry() + test->code().Size() - Instr::kInstrSize,
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            call.TargetAddress());
+  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode());
 }
 
-
-ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(*StubCode::InvokeDartCode_entry());
-  __ BranchPatchable(*StubCode::AllocateArray_entry());
-}
-
-
-ASSEMBLER_TEST_RUN(Jump, test) {
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump2.TargetAddress());
-}
-
-
-#if defined(USING_SIMULATOR)
-ASSEMBLER_TEST_GENERATE(JumpARMv6, assembler) {
-  // ARMv7 is the default.
-  HostCPUFeatures::set_arm_version(ARMv6);
-  __ BranchPatchable(*StubCode::InvokeDartCode_entry());
-  __ BranchPatchable(*StubCode::AllocateArray_entry());
-  HostCPUFeatures::set_arm_version(ARMv7);
-}
-
-
-ASSEMBLER_TEST_RUN(JumpARMv6, test) {
-  HostCPUFeatures::set_arm_version(ARMv6);
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump2.TargetAddress());
-  HostCPUFeatures::set_arm_version(ARMv7);
-}
-#endif
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_ARM
diff --git a/runtime/vm/instructions_ia32.h b/runtime/vm/instructions_ia32.h
index 1a839c8..9cf5243 100644
--- a/runtime/vm/instructions_ia32.h
+++ b/runtime/vm/instructions_ia32.h
@@ -104,23 +104,6 @@
 };
 
 
-class JumpPattern : public CallOrJumpPattern<JumpPattern> {
- public:
-  JumpPattern(uword pc, const Code& code) : CallOrJumpPattern(pc) {}
-
-  static int pattern_length_in_bytes() { return kLengthInBytes; }
-  static const int* pattern() {
-    static const int kJumpPattern[kLengthInBytes] = {0xE9, -1, -1, -1, -1};
-    return kJumpPattern;
-  }
-
- private:
-  static const int kLengthInBytes = 5;
-
-  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
-};
-
-
 class ReturnPattern : public InstructionPattern<ReturnPattern> {
  public:
   explicit ReturnPattern(uword pc) : InstructionPattern(pc) {}
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc
index cace229..6b01cdb 100644
--- a/runtime/vm/instructions_ia32_test.cc
+++ b/runtime/vm/instructions_ia32_test.cc
@@ -17,7 +17,7 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  __ Call(*StubCode::InvokeDartCode_entry());
+  __ call(&StubCode::InvokeDartCode_entry()->label());
   __ ret();
 }
 
@@ -29,41 +29,6 @@
 }
 
 
-ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ Jmp(*StubCode::InvokeDartCode_entry());
-  const ExternalLabel label(StubCode::AllocateArray_entry()->EntryPoint());
-  __ jmp(&label);
-  __ ret();
-}
-
-
-ASSEMBLER_TEST_RUN(Jump, test) {
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->EntryPoint(),
-            jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(),
-            jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(),
-            jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->EntryPoint(),
-            jump2.TargetAddress());
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_IA32
diff --git a/runtime/vm/instructions_mips.cc b/runtime/vm/instructions_mips.cc
index fc758cd..dcca54f 100644
--- a/runtime/vm/instructions_mips.cc
+++ b/runtime/vm/instructions_mips.cc
@@ -16,7 +16,7 @@
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       ic_data_load_end_(0),
-      target_address_pool_index_(-1),
+      target_code_pool_index_(-1),
       ic_data_(ICData::Handle()) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: jalr RA, T9(=R25).
@@ -24,10 +24,10 @@
   Register reg;
   // The end of the pattern is the instruction after the delay slot of the jalr.
   ic_data_load_end_ =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - (2 * Instr::kInstrSize),
+      InstructionPattern::DecodeLoadWordFromPool(end_ - (3 * Instr::kInstrSize),
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == T9);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
 }
 
 
@@ -134,13 +134,14 @@
 }
 
 
-uword CallPattern::TargetAddress() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* CallPattern::TargetCode() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void CallPattern::SetTargetAddress(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
+void CallPattern::SetTargetCode(const Code& target) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, target);
   // No need to flush the instruction cache, since the code is not modified.
 }
 
@@ -149,17 +150,17 @@
     : object_pool_(ObjectPool::Handle(code.GetObjectPool())),
       end_(pc),
       native_function_pool_index_(-1),
-      target_address_pool_index_(-1) {
+      target_code_pool_index_(-1) {
   ASSERT(code.ContainsInstructionAt(pc));
   // Last instruction: jalr RA, T9(=R25).
   ASSERT(*(reinterpret_cast<uword*>(end_) - 2) == 0x0320f809);
 
   Register reg;
   uword native_function_load_end =
-      InstructionPattern::DecodeLoadWordFromPool(end_ - 2 * Instr::kInstrSize,
+      InstructionPattern::DecodeLoadWordFromPool(end_ - 3 * Instr::kInstrSize,
                                                  &reg,
-                                                 &target_address_pool_index_);
-  ASSERT(reg == T9);
+                                                 &target_code_pool_index_);
+  ASSERT(reg == CODE_REG);
   InstructionPattern::DecodeLoadWordFromPool(native_function_load_end,
                                              &reg,
                                              &native_function_pool_index_);
@@ -167,13 +168,14 @@
 }
 
 
-uword NativeCallPattern::target() const {
-  return object_pool_.RawValueAt(target_address_pool_index_);
+RawCode* NativeCallPattern::target() const {
+  return reinterpret_cast<RawCode*>(
+      object_pool_.ObjectAt(target_code_pool_index_));
 }
 
 
-void NativeCallPattern::set_target(uword target_address) const {
-  object_pool_.SetRawValueAt(target_address_pool_index_, target_address);
+void NativeCallPattern::set_target(const Code& target) const {
+  object_pool_.SetObjectAt(target_code_pool_index_, target);
   // No need to flush the instruction cache, since the code is not modified.
 }
 
@@ -190,7 +192,7 @@
 }
 
 
-void CallPattern::InsertAt(uword pc, uword target_address) {
+void CallPattern::InsertDeoptCallAt(uword pc, uword target_address) {
   Instr* lui = Instr::At(pc + (0 * Instr::kInstrSize));
   Instr* ori = Instr::At(pc + (1 * Instr::kInstrSize));
   Instr* jr = Instr::At(pc + (2 * Instr::kInstrSize));
@@ -203,46 +205,8 @@
   jr->SetSpecialInstrBits(JALR, T9, ZR, RA);
   nop->SetInstructionBits(Instr::kNopInstruction);
 
-  ASSERT(kFixedLengthInBytes == 4 * Instr::kInstrSize);
-  CPU::FlushICache(pc, kFixedLengthInBytes);
-}
-
-
-JumpPattern::JumpPattern(uword pc, const Code& code) : pc_(pc) { }
-
-
-bool JumpPattern::IsValid() const {
-  Instr* lui = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* ori = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  Instr* jr = Instr::At(pc_ + (2 * Instr::kInstrSize));
-  Instr* nop = Instr::At(pc_ + (3 * Instr::kInstrSize));
-  return (lui->OpcodeField() == LUI) &&
-         (ori->OpcodeField() == ORI) &&
-         (jr->OpcodeField() == SPECIAL) &&
-         (jr->FunctionField() == JR) &&
-         (nop->InstructionBits() == Instr::kNopInstruction);
-}
-
-
-uword JumpPattern::TargetAddress() const {
-  Instr* lui = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* ori = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  const uint16_t target_lo = ori->UImmField();
-  const uint16_t target_hi = lui->UImmField();
-  return (target_hi << 16) | target_lo;
-}
-
-
-void JumpPattern::SetTargetAddress(uword target_address) const {
-  Instr* lui = Instr::At(pc_ + (0 * Instr::kInstrSize));
-  Instr* ori = Instr::At(pc_ + (1 * Instr::kInstrSize));
-  const int32_t lui_bits = lui->InstructionBits();
-  const int32_t ori_bits = ori->InstructionBits();
-  const uint16_t target_lo = target_address & 0xffff;
-  const uint16_t target_hi = target_address >> 16;
-
-  lui->SetInstructionBits((lui_bits & 0xffff0000) | target_hi);
-  ori->SetInstructionBits((ori_bits & 0xffff0000) | target_lo);
+  ASSERT(kDeoptCallLengthInBytes == 4 * Instr::kInstrSize);
+  CPU::FlushICache(pc, kDeoptCallLengthInBytes);
 }
 
 
diff --git a/runtime/vm/instructions_mips.h b/runtime/vm/instructions_mips.h
index 51875b5..fb2e22b 100644
--- a/runtime/vm/instructions_mips.h
+++ b/runtime/vm/instructions_mips.h
@@ -54,14 +54,14 @@
 
   RawICData* IcData();
 
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
+  RawCode* TargetCode() const;
+  void SetTargetCode(const Code& target) const;
 
-  // This constant length is only valid for inserted call patterns used for
-  // lazy deoptimization. Regular call pattern may vary in length.
-  static const int kFixedLengthInBytes = 4 * Instr::kInstrSize;
+  static const int kDeoptCallLengthInInstructions = 4;
+  static const int kDeoptCallLengthInBytes =
+      kDeoptCallLengthInInstructions * Instr::kInstrSize;
 
-  static void InsertAt(uword pc, uword target_address);
+  static void InsertDeoptCallAt(uword pc, uword target_address);
 
  private:
   const ObjectPool& object_pool_;
@@ -69,7 +69,7 @@
   uword end_;
   uword ic_data_load_end_;
 
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
   ICData& ic_data_;
 
   DISALLOW_COPY_AND_ASSIGN(CallPattern);
@@ -80,8 +80,8 @@
  public:
   NativeCallPattern(uword pc, const Code& code);
 
-  uword target() const;
-  void set_target(uword target_address) const;
+  RawCode* target() const;
+  void set_target(const Code& target) const;
 
   NativeFunction native_function() const;
   void set_native_function(NativeFunction target) const;
@@ -91,34 +91,12 @@
 
   uword end_;
   intptr_t native_function_pool_index_;
-  intptr_t target_address_pool_index_;
+  intptr_t target_code_pool_index_;
 
   DISALLOW_COPY_AND_ASSIGN(NativeCallPattern);
 };
 
 
-class JumpPattern : public ValueObject {
- public:
-  JumpPattern(uword pc, const Code& code);
-
-  // lui; ori; jr; nop (in delay slot) = 4.
-  static const int kLengthInBytes = 4*Instr::kInstrSize;
-
-  int pattern_length_in_bytes() const {
-    return kLengthInBytes;
-  }
-
-  bool IsValid() const;
-  uword TargetAddress() const;
-  void SetTargetAddress(uword target_address) const;
-
- private:
-  const uword pc_;
-
-  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
-};
-
-
 class ReturnPattern : public ValueObject {
  public:
   explicit ReturnPattern(uword pc);
diff --git a/runtime/vm/instructions_mips_test.cc b/runtime/vm/instructions_mips_test.cc
index a165485..cf2f7f2 100644
--- a/runtime/vm/instructions_mips_test.cc
+++ b/runtime/vm/instructions_mips_test.cc
@@ -27,42 +27,10 @@
   // return jump.
   CallPattern call(test->entry() + test->code().Size() - (2*Instr::kInstrSize),
                    test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            call.TargetAddress());
+  EXPECT_EQ(StubCode::InvokeDartCode_entry()->code(), call.TargetCode());
 }
 
 
-ASSEMBLER_TEST_GENERATE(Jump, assembler) {
-  __ BranchPatchable(*StubCode::InvokeDartCode_entry());
-  __ BranchPatchable(*StubCode::AllocateArray_entry());
-}
-
-
-ASSEMBLER_TEST_RUN(Jump, test) {
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry(), test->code());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump1.TargetAddress());
-  JumpPattern jump2(test->entry() + jump1.pattern_length_in_bytes(),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump2.TargetAddress());
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_MIPS
diff --git a/runtime/vm/instructions_x64.cc b/runtime/vm/instructions_x64.cc
index 83f427d..dc691a4 100644
--- a/runtime/vm/instructions_x64.cc
+++ b/runtime/vm/instructions_x64.cc
@@ -11,27 +11,6 @@
 
 namespace dart {
 
-intptr_t IndexFromPPLoad(uword start) {
-  int32_t offset = *reinterpret_cast<int32_t*>(start);
-  return ObjectPool::IndexFromOffset(offset);
-}
-
-
-uword JumpPattern::TargetAddress() const {
-  ASSERT(IsValid());
-  int index = IndexFromPPLoad(start() + 3);
-  return object_pool_.RawValueAt(index);
-}
-
-
-void JumpPattern::SetTargetAddress(uword target) const {
-  ASSERT(IsValid());
-  int index = IndexFromPPLoad(start() + 3);
-  object_pool_.SetRawValueAt(index, target);
-  // No need to flush the instruction cache, since the code is not modified.
-}
-
-
 void ShortCallPattern::SetTargetAddress(uword target) const {
   ASSERT(IsValid());
   *reinterpret_cast<uint32_t*>(start() + 1) = target - start() - kLengthInBytes;
diff --git a/runtime/vm/instructions_x64.h b/runtime/vm/instructions_x64.h
index 4c4aae8..5d7616d 100644
--- a/runtime/vm/instructions_x64.h
+++ b/runtime/vm/instructions_x64.h
@@ -65,30 +65,6 @@
 };
 
 
-class JumpPattern : public InstructionPattern<JumpPattern> {
- public:
-  JumpPattern(uword pc, const Code& code)
-      : InstructionPattern(pc),
-        object_pool_(ObjectPool::Handle(code.GetObjectPool())) {}
-
-  uword TargetAddress() const;
-  void SetTargetAddress(uword new_target) const;
-
-  static const int kLengthInBytes = 7;
-  static int pattern_length_in_bytes() { return kLengthInBytes; }
-  static const int* pattern() {
-    //  07: 41 ff a7 imm32  jmpq [reg + off]
-    static const int kJumpPattern[kLengthInBytes] =
-        {0x41, 0xFF, -1, -1, -1, -1, -1};
-    return kJumpPattern;
-  }
- private:
-  const ObjectPool& object_pool_;
-
-  DISALLOW_COPY_AND_ASSIGN(JumpPattern);
-};
-
-
 // 5 byte call instruction.
 class ShortCallPattern : public InstructionPattern<ShortCallPattern> {
  public:
diff --git a/runtime/vm/instructions_x64_test.cc b/runtime/vm/instructions_x64_test.cc
index 0ad8294..3e7fb7d 100644
--- a/runtime/vm/instructions_x64_test.cc
+++ b/runtime/vm/instructions_x64_test.cc
@@ -35,34 +35,6 @@
 }
 
 
-ASSEMBLER_TEST_RUN(Jump, test) {
-  ASSERT(prologue_code_size != -1);
-  const Code& code = test->code();
-  const Instructions& instrs = Instructions::Handle(code.instructions());
-  bool status =
-      VirtualMemory::Protect(reinterpret_cast<void*>(instrs.EntryPoint()),
-                             instrs.size(),
-                             VirtualMemory::kReadWrite);
-  EXPECT(status);
-  JumpPattern jump1(test->entry() + prologue_code_size, test->code());
-  jump1.IsValid();
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump1.TargetAddress());
-  JumpPattern jump2((test->entry() +
-                     jump1.pattern_length_in_bytes() + prologue_code_size),
-                    test->code());
-  const Code& array_stub =
-      Code::Handle(StubCode::AllocateArray_entry()->code());
-  EXPECT_EQ(array_stub.EntryPoint(), jump2.TargetAddress());
-  uword target1 = jump1.TargetAddress();
-  uword target2 = jump2.TargetAddress();
-  jump1.SetTargetAddress(target2);
-  jump2.SetTargetAddress(target1);
-  EXPECT_EQ(array_stub.EntryPoint(), jump1.TargetAddress());
-  EXPECT_EQ(StubCode::InvokeDartCode_entry()->label().address(),
-            jump2.TargetAddress());
-}
-
 }  // namespace dart
 
 #endif  // defined TARGET_ARCH_X64
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index b8db54d..a40af6f 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -2769,7 +2769,6 @@
     }
 
     ASSERT(offset > 0);
-    offset -= Assembler::EntryPointToPcMarkerOffset();
     offsets_.SetInt32(i * element_size, offset);
   }
 }
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 45ec027..8fb50b4 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -223,6 +223,7 @@
   // R4: Arguments descriptor.
   // R0: Function.
   ASSERT(locs()->in(0).reg() == R0);
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R2, FieldAddress(R0, Function::entry_point_offset()));
 
   // R2: instructions entry point.
@@ -945,11 +946,7 @@
   const StubEntry* stub_entry;
   if (link_lazily()) {
     stub_entry = StubCode::CallBootstrapCFunction_entry();
-    entry = reinterpret_cast<uword>(&NativeEntry::LinkNativeCall);
-#if defined(USING_SIMULATOR)
-    entry = Simulator::RedirectExternalReference(
-        entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
-#endif
+    entry = NativeEntry::LinkNativeCallEntry();
   } else {
     entry = reinterpret_cast<uword>(native_c_function());
     if (is_bootstrap_native() || is_leaf_call) {
@@ -2329,7 +2326,7 @@
                       R0,  // instance
                       R3,  // end address
                       R6,
-                      R9);
+                      R10);
   // R0: new object start as a tagged pointer.
   // R3: new object end address.
 
@@ -2346,7 +2343,7 @@
   // Initialize all array elements to raw_null.
   // R0: new object start as a tagged pointer.
   // R3: new object end address.
-  // R9: iterator which initially points to the start of the variable
+  // R10: iterator which initially points to the start of the variable
   // data area to be initialized.
   // R6: null
   if (num_elements > 0) {
@@ -2360,12 +2357,12 @@
       __ LoadImmediate(R7, 0x1);
 #endif  // DEBUG
     }
-    __ AddImmediate(R9, R0, sizeof(RawArray) - kHeapObjectTag);
+    __ AddImmediate(R10, R0, sizeof(RawArray) - kHeapObjectTag);
     if (array_size < (kInlineArraySize * kWordSize)) {
-      __ InitializeFieldsNoBarrierUnrolled(R0, R9, 0, num_elements * kWordSize,
+      __ InitializeFieldsNoBarrierUnrolled(R0, R10, 0, num_elements * kWordSize,
                                            R6, R7);
     } else {
-      __ InitializeFieldsNoBarrier(R0, R9, R3, R6, R7);
+      __ InitializeFieldsNoBarrier(R0, R10, R3, R6, R7);
     }
   }
   __ b(done);
@@ -2837,8 +2834,8 @@
                                 compiler->assembler()->CodeSize(),
                                 catch_handler_types_,
                                 needs_stacktrace());
-
   // Restore the pool pointer.
+  __ RestoreCodePointer();
   __ LoadPoolPointer();
 
   if (HasParallelMove()) {
@@ -6686,9 +6683,10 @@
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register target_address_reg = locs()->temp_slot(0)->reg();
 
-  // Load from [current frame pointer] + kPcMarkerSlotFromFp.
-  __ ldr(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize));
-
+  // Offset is relative to entry pc.
+  const intptr_t entry_to_pc_offset = __ CodeSize() + Instr::kPCReadOffset;
+  __ mov(target_address_reg, Operand(PC));
+  __ AddImmediate(target_address_reg, target_address_reg, -entry_to_pc_offset);
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
   Operand offset_opr =
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 7ae62c0..345757c 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -219,11 +219,13 @@
   // R4: Arguments descriptor.
   // R0: Function.
   ASSERT(locs()->in(0).reg() == R0);
+  __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
 
   // R2: instructions.
   // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
   __ LoadImmediate(R5, 0);
+  //??
   __ blr(R2);
   compiler->RecordSafepoint(locs());
   // Marks either the continuation point in unoptimized code or the
@@ -798,11 +800,7 @@
   const StubEntry* stub_entry;
   if (link_lazily()) {
     stub_entry = StubCode::CallBootstrapCFunction_entry();
-    entry = reinterpret_cast<uword>(&NativeEntry::LinkNativeCall);
-#if defined(USING_SIMULATOR)
-    entry = Simulator::RedirectExternalReference(
-        entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
-#endif
+    entry = NativeEntry::LinkNativeCallEntry();
   } else {
     entry = reinterpret_cast<uword>(native_c_function());
     if (is_bootstrap_native() || is_leaf_call) {
@@ -945,14 +943,8 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  static const intptr_t kSmiCidSource =
-      static_cast<intptr_t>(kSmiCid) << RawObject::kClassIdTagPos;
 
-  __ LoadImmediate(TMP, reinterpret_cast<int64_t>(&kSmiCidSource) + 1);
-  __ tsti(object, Immediate(kSmiTagMask));
-  __ csel(TMP, TMP, object, EQ);
-  __ LoadClassId(result, TMP);
-  __ SmiTag(result);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -2555,6 +2547,7 @@
                                 needs_stacktrace());
 
   // Restore the pool pointer.
+  __ RestoreCodePointer();
   __ LoadPoolPointer();
 
   if (HasParallelMove()) {
@@ -5456,8 +5449,14 @@
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register target_address_reg = locs()->temp_slot(0)->reg();
 
-  // Load from [current frame pointer] + kPcMarkerSlotFromFp.
-  __ ldr(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  // Load code entry point.
+  const intptr_t entry_offset = __ CodeSize();
+  if (Utils::IsInt(21, -entry_offset)) {
+    __ adr(target_address_reg, Immediate(-entry_offset));
+  } else {
+    __ adr(target_address_reg, Immediate(0));
+    __ AddImmediate(target_address_reg, target_address_reg, -entry_offset);
+  }
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 35bc942..23c3f21 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -833,7 +833,7 @@
   const StubEntry* stub_entry;
   if (link_lazily()) {
     stub_entry = StubCode::CallBootstrapCFunction_entry();
-    __ movl(ECX, Immediate(NativeEntry::LinkNativeCallLabel().address()));
+    __ movl(ECX, Immediate(NativeEntry::LinkNativeCallEntry()));
   } else {
     stub_entry = (is_bootstrap_native() || is_leaf_call) ?
         StubCode::CallBootstrapCFunction_entry() :
@@ -6581,20 +6581,22 @@
 
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register target_address_reg = locs()->temp_slot(0)->reg();
+  Register target_reg = locs()->temp_slot(0)->reg();
 
-  // Load from [current frame pointer] + kPcMarkerSlotFromFp.
-  __ movl(target_address_reg, Address(EBP, kPcMarkerSlotFromFp * kWordSize));
+  // Load code object from frame.
+  __ movl(target_reg, Address(EBP, kPcMarkerSlotFromFp * kWordSize));
+  // Load instructions entry point.
+  __ movl(target_reg, FieldAddress(target_reg, Code::entry_point_offset()));
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
   if (offset()->definition()->representation() == kTagged) {
     __ SmiUntag(offset_reg);
   }
-  __ addl(target_address_reg, offset_reg);
+  __ addl(target_reg, offset_reg);
 
   // Jump to the absolute address.
-  __ jmp(target_address_reg);
+  __ jmp(target_reg);
 }
 
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index fe30067..1cd334d 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -274,6 +274,7 @@
   ASSERT(locs()->in(0).reg() == T0);
   __ LoadImmediate(S5, 0);
   __ lw(T2, FieldAddress(T0, Function::entry_point_offset()));
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ jalr(T2);
   compiler->RecordSafepoint(locs());
   // Marks either the continuation point in unoptimized code or the
@@ -996,11 +997,7 @@
   const StubEntry* stub_entry;
   if (link_lazily()) {
     stub_entry = StubCode::CallBootstrapCFunction_entry();
-    entry = reinterpret_cast<uword>(&NativeEntry::LinkNativeCall);
-#if defined(USING_SIMULATOR)
-    entry = Simulator::RedirectExternalReference(
-      entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
-#endif
+    entry = NativeEntry::LinkNativeCallEntry();
   } else {
     entry = reinterpret_cast<uword>(native_c_function());
     if (is_bootstrap_native() || is_leaf_call) {
@@ -2666,11 +2663,8 @@
                                 catch_handler_types_,
                                 needs_stacktrace());
   // Restore pool pointer.
-  __ GetNextPC(CMPRES1, TMP);
-  const intptr_t object_pool_pc_dist =
-     Instructions::HeaderSize() - Instructions::object_pool_offset() +
-     compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize;
-  __ LoadFromOffset(PP, CMPRES1, -object_pool_pc_dist);
+  __ RestoreCodePointer();
+  __ LoadPoolPointer();
 
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -5427,20 +5421,22 @@
 
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Register target_address_reg = locs()->temp_slot(0)->reg();
+  Register target_reg = locs()->temp_slot(0)->reg();
 
-  // Load from [current frame pointer] + kPcMarkerSlotFromFp.
-  __ lw(target_address_reg, Address(FP, kPcMarkerSlotFromFp * kWordSize));
+  __ GetNextPC(target_reg, TMP);
+  const intptr_t entry_offset =
+     __ CodeSize() - 1 * Instr::kInstrSize;
+  __ AddImmediate(target_reg, target_reg, -entry_offset);
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
   if (offset()->definition()->representation() == kTagged) {
   __ SmiUntag(offset_reg);
   }
-  __ addu(target_address_reg, target_address_reg, offset_reg);
+  __ addu(target_reg, target_reg, offset_reg);
 
   // Jump to the absolute address.
-  __ jr(target_address_reg);
+  __ jr(target_reg);
 }
 
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 19fc8b3..31476e1 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -786,8 +786,8 @@
   const StubEntry* stub_entry;
   if (link_lazily()) {
     stub_entry = StubCode::CallBootstrapCFunction_entry();
-    __ LoadNativeEntry(
-        RBX, &NativeEntry::LinkNativeCallLabel(), kPatchable);
+    ExternalLabel label(NativeEntry::LinkNativeCallEntry());
+    __ LoadNativeEntry(RBX, &label, kPatchable);
   } else {
     stub_entry = (is_bootstrap_native() || is_leaf_call)
         ? StubCode::CallBootstrapCFunction_entry()
@@ -2555,7 +2555,8 @@
                                 needs_stacktrace());
 
   // Restore the pool pointer.
-  __ LoadPoolPointer();
+  __ RestoreCodePointer();
+  __ LoadPoolPointer(PP);
 
   if (HasParallelMove()) {
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -6221,10 +6222,18 @@
 
 void IndirectGotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register offset_reg = locs()->in(0).reg();
-  Register target_address_reg = locs()->temp_slot(0)->reg();
+  Register target_address_reg = locs()->temp(0).reg();
+
+  {
+    const intptr_t kRIPRelativeLeaqSize = 7;
+    const intptr_t entry_to_rip_offset =
+        __ CodeSize() + kRIPRelativeLeaqSize;
+    __ leaq(target_address_reg,
+            Address::AddressRIPRelative(-entry_to_rip_offset));
+    ASSERT(__ CodeSize() == entry_to_rip_offset);
+  }
 
   // Load from [current frame pointer] + kPcMarkerSlotFromFp.
-  __ movq(target_address_reg, Address(RBP, kPcMarkerSlotFromFp * kWordSize));
 
   // Calculate the final absolute address.
   if (offset()->definition()->representation() == kTagged) {
@@ -6343,6 +6352,7 @@
 
   // Function in RAX.
   ASSERT(locs()->in(0).reg() == RAX);
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
 
   // RAX: Function.
diff --git a/runtime/vm/intrinsifier.cc b/runtime/vm/intrinsifier.cc
index 5e24dd3..76e9b63 100644
--- a/runtime/vm/intrinsifier.cc
+++ b/runtime/vm/intrinsifier.cc
@@ -211,6 +211,19 @@
 }
 
 
+static intptr_t CidForRepresentation(Representation rep) {
+  switch (rep) {
+    case kUnboxedDouble:
+      return kDoubleCid;
+    case kUnboxedFloat32x4:
+      return kFloat32x4Cid;
+    default:
+      UNREACHABLE();
+      return kIllegalCid;
+  }
+}
+
+
 class BlockBuilder : public ValueObject {
  public:
   BlockBuilder(FlowGraph* flow_graph, TargetEntryInstr* entry)
@@ -256,6 +269,16 @@
         new ConstantInstr(Object::ZoneHandle(Object::null())));
   }
 
+  Definition* AddUnboxInstr(Representation rep, Value* value) {
+    Definition* unboxed_value = AddDefinition(
+        UnboxInstr::Create(rep, value, Isolate::kNoDeoptId));
+    // Manually adjust reaching type because there is no type propagation
+    // when building intrinsics.
+    unboxed_value->AsUnbox()->value()->SetReachingType(ZoneCompileType::Wrap(
+        CompileType::FromCid(CidForRepresentation(rep))));
+    return unboxed_value;
+  }
+
  private:
   FlowGraph* flow_graph_;
   BlockEntryInstr* entry_;
@@ -450,14 +473,8 @@
                           Isolate::kNoDeoptId,
                           value_check,
                           builder.TokenPos()));
-  Definition* double_value = builder.AddDefinition(
-      UnboxInstr::Create(kUnboxedDouble,
-                         new Value(value),
-                         Isolate::kNoDeoptId));
-  // Manually adjust reaching type because there is no type propagation
-  // when building intrinsics.
-  double_value->AsUnbox()->value()->SetReachingType(
-      ZoneCompileType::Wrap(CompileType::FromCid(kDoubleCid)));
+  Definition* double_value =
+      builder.AddUnboxInstr(kUnboxedDouble, new Value(value));
 
   builder.AddInstruction(
       new StoreIndexedInstr(new Value(array),
@@ -501,6 +518,111 @@
 }
 
 
+static bool BuildBinaryFloat32x4Op(FlowGraph* flow_graph, Token::Kind kind) {
+  if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false;
+
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* right = builder.AddParameter(1);
+  Definition* left = builder.AddParameter(2);
+
+  const ICData& value_check = ICData::ZoneHandle(ICData::New(
+      flow_graph->function(),
+      String::Handle(flow_graph->function().name()),
+      Object::empty_array(),  // Dummy args. descr.
+      Isolate::kNoDeoptId,
+      1));
+  value_check.AddReceiverCheck(kFloat32x4Cid, flow_graph->function());
+  // Check argument. Receiver (left) is known to be a Float32x4.
+  builder.AddInstruction(
+      new CheckClassInstr(new Value(right),
+                          Isolate::kNoDeoptId,
+                          value_check,
+                          builder.TokenPos()));
+  Definition* left_simd =
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left));
+
+  Definition* right_simd =
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right));
+
+  Definition* unboxed_result = builder.AddDefinition(
+      new BinaryFloat32x4OpInstr(kind,
+                                 new Value(left_simd),
+                                 new Value(right_simd),
+                                 Isolate::kNoDeoptId));
+  Definition* result = builder.AddDefinition(
+      BoxInstr::Create(kUnboxedFloat32x4, new Value(unboxed_result)));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+bool Intrinsifier::Build_Float32x4Mul(FlowGraph* flow_graph) {
+  return BuildBinaryFloat32x4Op(flow_graph, Token::kMUL);
+}
+
+
+bool Intrinsifier::Build_Float32x4Sub(FlowGraph* flow_graph) {
+  return BuildBinaryFloat32x4Op(flow_graph, Token::kSUB);
+}
+
+
+bool Intrinsifier::Build_Float32x4Add(FlowGraph* flow_graph) {
+  return BuildBinaryFloat32x4Op(flow_graph, Token::kADD);
+}
+
+
+static bool BuildFloat32x4Shuffle(FlowGraph* flow_graph,
+                                  MethodRecognizer::Kind kind) {
+  if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false;
+  GraphEntryInstr* graph_entry = flow_graph->graph_entry();
+  TargetEntryInstr* normal_entry = graph_entry->normal_entry();
+  BlockBuilder builder(flow_graph, normal_entry);
+
+  Definition* receiver = builder.AddParameter(1);
+
+  Definition* unboxed_receiver =
+      builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(receiver));
+
+  Definition* unboxed_result = builder.AddDefinition(
+      new Simd32x4ShuffleInstr(kind,
+                               new Value(unboxed_receiver),
+                               0,
+                               Isolate::kNoDeoptId));
+
+  Definition* result = builder.AddDefinition(
+      BoxInstr::Create(kUnboxedDouble, new Value(unboxed_result)));
+  builder.AddIntrinsicReturn(new Value(result));
+  return true;
+}
+
+
+bool Intrinsifier::Build_Float32x4ShuffleX(FlowGraph* flow_graph) {
+  return BuildFloat32x4Shuffle(flow_graph,
+                               MethodRecognizer::kFloat32x4ShuffleX);
+}
+
+
+bool Intrinsifier::Build_Float32x4ShuffleY(FlowGraph* flow_graph) {
+  return BuildFloat32x4Shuffle(flow_graph,
+                               MethodRecognizer::kFloat32x4ShuffleY);
+}
+
+
+bool Intrinsifier::Build_Float32x4ShuffleZ(FlowGraph* flow_graph) {
+  return BuildFloat32x4Shuffle(flow_graph,
+                               MethodRecognizer::kFloat32x4ShuffleZ);
+}
+
+
+bool Intrinsifier::Build_Float32x4ShuffleW(FlowGraph* flow_graph) {
+  return BuildFloat32x4Shuffle(flow_graph,
+                               MethodRecognizer::kFloat32x4ShuffleW);
+}
+
+
 static bool BuildLoadField(FlowGraph* flow_graph, intptr_t offset) {
   GraphEntryInstr* graph_entry = flow_graph->graph_entry();
   TargetEntryInstr* normal_entry = graph_entry->normal_entry();
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 7d3421d..7bc19b9 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -549,7 +549,7 @@
   ASSERT(kSmiTagShift == 1);
   ASSERT(kSmiTag == 0);
   Label fall_through;
-
+  __ Push(R10);
   TestBothArgumentsSmis(assembler, &fall_through);
   __ CompareImmediate(R0, Smi::RawValue(Smi::kBits));
   __ b(&fall_through, HI);
@@ -577,10 +577,10 @@
   __ LoadImmediate(R7, 1);
   __ mov(R7, Operand(R7, LSL, R0));  // R7 <- 1 << R0
   __ sub(R7, R7, Operand(1));  // R7 <- R7 - 1
-  __ rsb(R9, R0, Operand(32));  // R9 <- 32 - R0
-  __ mov(R7, Operand(R7, LSL, R9));  // R7 <- R7 << R9
+  __ rsb(R10, R0, Operand(32));  // R10 <- 32 - R0
+  __ mov(R7, Operand(R7, LSL, R10));  // R7 <- R7 << R10
   __ and_(R7, R1, Operand(R7));  // R7 <- R7 & R1
-  __ mov(R7, Operand(R7, LSR, R9));  // R7 <- R7 >> R9
+  __ mov(R7, Operand(R7, LSR, R10));  // R7 <- R7 >> R10
   // Now R7 has the bits that fall off of R1 on a left shift.
   __ mov(R1, Operand(R1, LSL, R0));  // R1 gets the low bits.
 
@@ -591,8 +591,11 @@
 
   __ str(R1, FieldAddress(R0, Mint::value_offset()));
   __ str(R7, FieldAddress(R0, Mint::value_offset() + kWordSize));
+  __ Pop(R10);
   __ Ret();
   __ Bind(&fall_through);
+  ASSERT(CODE_REG == R10);
+  __ Pop(R10);
 }
 
 
@@ -818,12 +821,12 @@
   __ add(R6, R3, Operand(TypedData::data_offset() - kHeapObjectTag));
   // R7 = &x_digits[x_used]
   __ add(R7, R6, Operand(R2, LSL, 1));
-  // R9 = &r_digits[1]
-  __ add(R9, R4, Operand(TypedData::data_offset() - kHeapObjectTag +
+  // R10 = &r_digits[1]
+  __ add(R10, R4, Operand(TypedData::data_offset() - kHeapObjectTag +
                          Bigint::kBytesPerDigit));
-  // R9 = &r_digits[x_used + n ~/ _DIGIT_BITS + 1]
+  // R10 = &r_digits[x_used + n ~/ _DIGIT_BITS + 1]
   __ add(R0, R0, Operand(R2, ASR, 1));
-  __ add(R9, R9, Operand(R0, LSL, 2));
+  __ add(R10, R10, Operand(R0, LSL, 2));
   // R3 = n % _DIGIT_BITS
   __ and_(R3, R5, Operand(31));
   // R2 = 32 - R3
@@ -833,11 +836,11 @@
   __ Bind(&loop);
   __ ldr(R0, Address(R7, -Bigint::kBytesPerDigit, Address::PreIndex));
   __ orr(R1, R1, Operand(R0, LSR, R2));
-  __ str(R1, Address(R9, -Bigint::kBytesPerDigit, Address::PreIndex));
+  __ str(R1, Address(R10, -Bigint::kBytesPerDigit, Address::PreIndex));
   __ mov(R1, Operand(R0, LSL, R3));
   __ teq(R7, Operand(R6));
   __ b(&loop, NE);
-  __ str(R1, Address(R9, -Bigint::kBytesPerDigit, Address::PreIndex));
+  __ str(R1, Address(R10, -Bigint::kBytesPerDigit, Address::PreIndex));
   // Returning Object::null() is not required, since this method is private.
   __ Ret();
 }
@@ -854,15 +857,15 @@
   __ SmiUntag(R5);
   // R0 = n ~/ _DIGIT_BITS
   __ Asr(R0, R5, Operand(5));
-  // R9 = &r_digits[0]
-  __ add(R9, R4, Operand(TypedData::data_offset() - kHeapObjectTag));
+  // R10 = &r_digits[0]
+  __ add(R10, R4, Operand(TypedData::data_offset() - kHeapObjectTag));
   // R7 = &x_digits[n ~/ _DIGIT_BITS]
   __ add(R7, R3, Operand(TypedData::data_offset() - kHeapObjectTag));
   __ add(R7, R7, Operand(R0, LSL, 2));
   // R6 = &r_digits[x_used - n ~/ _DIGIT_BITS - 1]
   __ add(R0, R0, Operand(1));
   __ rsb(R0, R0, Operand(R2, ASR, 1));
-  __ add(R6, R9, Operand(R0, LSL, 2));
+  __ add(R6, R10, Operand(R0, LSL, 2));
   // R3 = n % _DIGIT_BITS
   __ and_(R3, R5, Operand(31));
   // R2 = 32 - R3
@@ -876,12 +879,12 @@
   __ Bind(&loop);
   __ ldr(R0, Address(R7, Bigint::kBytesPerDigit, Address::PostIndex));
   __ orr(R1, R1, Operand(R0, LSL, R2));
-  __ str(R1, Address(R9, Bigint::kBytesPerDigit, Address::PostIndex));
+  __ str(R1, Address(R10, Bigint::kBytesPerDigit, Address::PostIndex));
   __ mov(R1, Operand(R0, LSR, R3));
   __ Bind(&loop_entry);
-  __ teq(R9, Operand(R6));
+  __ teq(R10, Operand(R6));
   __ b(&loop, NE);
-  __ str(R1, Address(R9, 0));
+  __ str(R1, Address(R10, 0));
   // Returning Object::null() is not required, since this method is private.
   __ Ret();
 }
@@ -910,8 +913,8 @@
   // R7 = &digits[a_used >> 1], a_used is Smi.
   __ add(R7, R3, Operand(R4, LSL, 1));
 
-  // R9 = &digits[used >> 1], used is Smi.
-  __ add(R9, R3, Operand(R2, LSL, 1));
+  // R10 = &digits[used >> 1], used is Smi.
+  __ add(R10, R3, Operand(R2, LSL, 1));
 
   __ adds(R0, R0, Operand(0));  // carry flag = 0
   Label add_loop;
@@ -925,7 +928,7 @@
   __ b(&add_loop, NE);
 
   Label last_carry;
-  __ teq(R3, Operand(R9));  // Does not affect carry flag.
+  __ teq(R3, Operand(R10));  // Does not affect carry flag.
   __ b(&last_carry, EQ);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -933,7 +936,7 @@
   // Loop used - a_used times, used - a_used > 0.
   __ ldr(R0, Address(R3, Bigint::kBytesPerDigit, Address::PostIndex));
   __ adcs(R0, R0, Operand(0));
-  __ teq(R3, Operand(R9));  // Does not affect carry flag.
+  __ teq(R3, Operand(R10));  // Does not affect carry flag.
   __ str(R0, Address(R6, Bigint::kBytesPerDigit, Address::PostIndex));
   __ b(&carry_loop, NE);
 
@@ -970,8 +973,8 @@
   // R7 = &digits[a_used >> 1], a_used is Smi.
   __ add(R7, R3, Operand(R4, LSL, 1));
 
-  // R9 = &digits[used >> 1], used is Smi.
-  __ add(R9, R3, Operand(R2, LSL, 1));
+  // R10 = &digits[used >> 1], used is Smi.
+  __ add(R10, R3, Operand(R2, LSL, 1));
 
   __ subs(R0, R0, Operand(0));  // carry flag = 1
   Label sub_loop;
@@ -985,7 +988,7 @@
   __ b(&sub_loop, NE);
 
   Label done;
-  __ teq(R3, Operand(R9));  // Does not affect carry flag.
+  __ teq(R3, Operand(R10));  // Does not affect carry flag.
   __ b(&done, EQ);  // If used - a_used == 0.
 
   Label carry_loop;
@@ -993,7 +996,7 @@
   // Loop used - a_used times, used - a_used > 0.
   __ ldr(R0, Address(R3, Bigint::kBytesPerDigit, Address::PostIndex));
   __ sbcs(R0, R0, Operand(0));
-  __ teq(R3, Operand(R9));  // Does not affect carry flag.
+  __ teq(R3, Operand(R10));  // Does not affect carry flag.
   __ str(R0, Address(R6, Bigint::kBytesPerDigit, Address::PostIndex));
   __ b(&carry_loop, NE);
 
@@ -1162,9 +1165,9 @@
 
   // int n = used - i - 1; while (--n >= 0) ...
   __ ldr(R0, Address(SP, 0 * kWordSize));  // used is Smi
-  __ sub(R9, R0, Operand(R2));
+  __ sub(R10, R0, Operand(R2));
   __ mov(R0, Operand(2));  // n = used - i - 2; if (n >= 0) ... while (--n >= 0)
-  __ rsbs(R9, R0, Operand(R9, ASR, kSmiTagSize));
+  __ rsbs(R10, R0, Operand(R10, ASR, kSmiTagSize));
 
   Label loop, done;
   __ b(&done, MI);
@@ -1175,7 +1178,7 @@
   // ajp: R5
   // c:   R7:R6
   // t:   R2:R1:R0 (not live at loop entry)
-  // n:   R9
+  // n:   R10
 
   // uint32_t xi = *xip++
   __ ldr(R2, Address(R4, Bigint::kBytesPerDigit, Address::PostIndex));
@@ -1198,7 +1201,7 @@
   __ str(R0, Address(R5, Bigint::kBytesPerDigit, Address::PostIndex));
 
   // while (--n >= 0)
-  __ subs(R9, R9, Operand(1));  // --n
+  __ subs(R10, R10, Operand(1));  // --n
   __ b(&loop, PL);
 
   __ Bind(&done);
@@ -1575,14 +1578,10 @@
 // Return type quickly for simple types (not parameterized and not signature).
 void Intrinsifier::ObjectRuntimeType(Assembler* assembler) {
   Label fall_through;
-  static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
   __ ldr(R0, Address(SP, 0 * kWordSize));
-
-  __ LoadImmediate(TMP, reinterpret_cast<int32_t>(&kSmiCidSource) + 1);
-  __ tst(R0, Operand(kSmiTagMask));
-  __ mov(TMP, Operand(R0), NE);
-  __ LoadClassId(R1, TMP);
+  __ LoadClassIdMayBeSmi(R1, R0);
   __ LoadClassById(R2, R1);
+
   // R2: class of instance (R0).
   __ ldr(R3, FieldAddress(R2, Class::signature_function_offset()));
   __ CompareObject(R3, Object::null_object());
@@ -1760,7 +1759,8 @@
                                      Label* failure) {
   const Register length_reg = R2;
   Label fail;
-  __ MaybeTraceAllocation(kOneByteStringCid, R0, failure);
+  __ MaybeTraceAllocation(kOneByteStringCid, R0, failure,
+                          /* inline_isolate = */ false);
   __ mov(R6, Operand(length_reg));  // Save the length register.
   // TODO(koda): Protect against negative length and overflow here.
   __ SmiUntag(length_reg);
@@ -2013,6 +2013,7 @@
   __ eor(R5, R5, Operand(R5));
 
   // Tail-call the function.
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R1, FieldAddress(R0, Function::entry_point_offset()));
   __ bx(R1);
 }
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index 4524a54..3fd338a 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -2094,6 +2094,7 @@
   __ eor(R5, R5, Operand(R5));
 
   // Tail-call the function.
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R1, FieldAddress(R0, Function::entry_point_offset()));
   __ br(R1);
 }
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 95783b6..85234a3 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -2125,6 +2125,7 @@
   __ mov(S5, ZR);
 
   // Tail-call the function.
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ lw(T3, FieldAddress(T0, Function::entry_point_offset()));
   __ jr(T3);
 }
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index d71abc3..e489012 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1599,11 +1599,11 @@
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Index.
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // String.
   __ testq(RCX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &fall_through, Assembler::kNearJump);  // Non-smi index.
+  __ j(NOT_ZERO, &fall_through);  // Non-smi index.
   // Range check.
   __ cmpq(RCX, FieldAddress(RAX, String::length_offset()));
   // Runtime throws exception.
-  __ j(ABOVE_EQUAL, &fall_through, Assembler::kNearJump);
+  __ j(ABOVE_EQUAL, &fall_through);
   __ CompareClassId(RAX, kOneByteStringCid);
   __ j(NOT_EQUAL, &try_two_byte_string, Assembler::kNearJump);
   __ SmiUntag(RCX);
@@ -1619,7 +1619,7 @@
 
   __ Bind(&try_two_byte_string);
   __ CompareClassId(RAX, kTwoByteStringCid);
-  __ j(NOT_EQUAL, &fall_through, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &fall_through);
   ASSERT(kSmiTagShift == 1);
   __ movzxw(RCX, FieldAddress(RAX, RCX, TIMES_1, OneByteString::data_offset()));
   __ cmpq(RCX, Immediate(Symbols::kNumberOfOneCharCodeSymbols));
@@ -1963,6 +1963,7 @@
   __ xorq(RCX, RCX);
 
   // Tail-call the function.
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(RDI, FieldAddress(RAX, Function::entry_point_offset()));
   __ jmp(RDI);
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 87ab7eb..685e457 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -790,7 +790,8 @@
 #define ISOLATE_TIMELINE_STREAM_INIT(name, enabled_by_default)                 \
   result->stream_##name##_.Init(#name,                                         \
                                 Timeline::EnableStreamByDefault(#name) ||      \
-                                enabled_by_default);
+                                enabled_by_default,                            \
+                                Timeline::Stream##name##EnabledFlag());
   ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_INIT);
 #undef ISOLATE_TIMELINE_STREAM_INIT
 
@@ -845,9 +846,12 @@
                 "\tisolate:    %s\n", result->name());
     }
   }
-  if (FLAG_compiler_stats) {
-    result->compiler_stats_ = new CompilerStats(result);
+
+  result->compiler_stats_ = new CompilerStats(result);
+  if (FLAG_compiler_benchmark) {
+    result->compiler_stats_->EnableBenchmark();
   }
+
   ObjectIdRing::Init(result);
 
   // Add to isolate list. Shutdown and delete the isolate on failure.
@@ -889,6 +893,20 @@
 }
 
 
+void Isolate::SetupInstructionsSnapshotPage(
+    const uint8_t* instructions_snapshot_buffer) {
+  InstructionsSnapshot snapshot(instructions_snapshot_buffer);
+#if defined(DEBUG)
+  OS::Print("Precompiled instructions are at [0x%" Px ", 0x%" Px ")\n",
+            reinterpret_cast<uword>(snapshot.instructions_start()),
+            reinterpret_cast<uword>(snapshot.instructions_start()) +
+            snapshot.instructions_size());
+#endif
+  heap_->SetupInstructionsSnapshotPage(snapshot.instructions_start(),
+                                       snapshot.instructions_size());
+}
+
+
 void Isolate::set_debugger_name(const char* name) {
   free(debugger_name_);
   debugger_name_ = strdup(name);
@@ -1479,10 +1497,6 @@
   HandleScope handle_scope(thread);
   NoSafepointScope no_safepoint_scope;
 
-  if (compiler_stats_ != NULL) {
-    OS::Print("%s", compiler_stats()->PrintToZone());
-  }
-
   // Notify exit listeners that this isolate is shutting down.
   if (object_store() != NULL) {
     NotifyExitListeners();
@@ -1558,6 +1572,13 @@
         !ServiceIsolate::IsServiceIsolateDescendant(this)) {
       CodeCoverage::Write(this);
     }
+
+    // Write compiler stats data if enabled.
+    if (FLAG_compiler_stats
+        && !ServiceIsolate::IsServiceIsolateDescendant(this)
+        && (this != Dart::vm_isolate())) {
+      OS::Print("%s", compiler_stats()->PrintToZone());
+    }
   }
 
   // Remove this isolate from the list *before* we start tearing it down, to
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 5c75c94..fd30317 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -10,7 +10,6 @@
 #include "vm/atomic.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
-#include "vm/counters.h"
 #include "vm/handles.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/metrics.h"
@@ -262,6 +261,9 @@
   // TODO(koda): Move to Thread.
   static uword GetCurrentStackPointer();
 
+  void SetupInstructionsSnapshotPage(
+      const uint8_t* instructions_snapshot_buffer);
+
   // Returns true if any of the interrupts specified by 'interrupt_bits' are
   // currently scheduled for this isolate, but leaves them unchanged.
   //
@@ -664,7 +666,7 @@
   ISOLATE_METRIC_LIST(ISOLATE_METRIC_ACCESSOR);
 #undef ISOLATE_METRIC_ACCESSOR
 
-#define ISOLATE_TIMELINE_STREAM_ACCESSOR(name, enabled_by_default)             \
+#define ISOLATE_TIMELINE_STREAM_ACCESSOR(name, not_used)                       \
   TimelineStream* Get##name##Stream() { return &stream_##name##_; }
   ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_ACCESSOR)
 #undef ISOLATE_TIMELINE_STREAM_ACCESSOR
@@ -736,8 +738,6 @@
 
   static void VisitIsolates(IsolateVisitor* visitor);
 
-  Counters* counters() { return &counters_; }
-
   // Handle service messages until we are told to resume execution.
   void PauseEventHandler();
 
@@ -916,8 +916,6 @@
 
   Metric* metrics_list_head_;
 
-  Counters counters_;
-
   bool compilation_allowed_;
 
   // TODO(23153): Move this out of Isolate/Thread.
@@ -947,7 +945,7 @@
   ISOLATE_METRIC_LIST(ISOLATE_METRIC_VARIABLE);
 #undef ISOLATE_METRIC_VARIABLE
 
-#define ISOLATE_TIMELINE_STREAM_VARIABLE(name, enabled_by_default)             \
+#define ISOLATE_TIMELINE_STREAM_VARIABLE(name, not_used)                       \
   TimelineStream stream_##name##_;
   ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_VARIABLE)
 #undef ISOLATE_TIMELINE_STREAM_VARIABLE
diff --git a/runtime/vm/isolate_test.cc b/runtime/vm/isolate_test.cc
index 6000ee6..8dcc14e 100644
--- a/runtime/vm/isolate_test.cc
+++ b/runtime/vm/isolate_test.cc
@@ -7,6 +7,7 @@
 #include "vm/globals.h"
 #include "vm/isolate.h"
 #include "vm/lockers.h"
+#include "vm/thread_barrier.h"
 #include "vm/thread_pool.h"
 #include "vm/unit_test.h"
 
@@ -89,89 +90,36 @@
   static const intptr_t kIterations;
 
   InterruptChecker(Isolate* isolate,
-                   Monitor* awake_monitor,
-                   bool* awake,
-                   Monitor* round_monitor,
-                   const intptr_t* round)
+                   ThreadBarrier* barrier)
     : isolate_(isolate),
-      awake_monitor_(awake_monitor),
-      awake_(awake),
-      round_monitor_(round_monitor),
-      round_(round) {
+      barrier_(barrier) {
   }
 
   virtual void Run() {
     Thread::EnterIsolateAsHelper(isolate_);
     // Tell main thread that we are ready.
-    {
-      MonitorLocker ml(awake_monitor_);
-      ASSERT(!*awake_);
-      *awake_ = true;
-      ml.Notify();
-    }
+    barrier_->Sync();
     for (intptr_t i = 0; i < kIterations; ++i) {
       // Busy wait for interrupts.
       while (!isolate_->HasInterruptsScheduled(Isolate::kVMInterrupt)) {
         // Do nothing.
       }
       // Tell main thread that we observed the interrupt.
-      {
-        MonitorLocker ml(awake_monitor_);
-        ASSERT(!*awake_);
-        *awake_ = true;
-        ml.Notify();
-      }
-      // Wait for main thread to let us resume, i.e., until all tasks are here.
-      {
-        MonitorLocker ml(round_monitor_);
-        EXPECT(*round_ == i || *round_ == (i + 1));
-        while (*round_ == i) {
-          ml.Wait();
-        }
-        EXPECT(*round_ == i + 1);
-      }
+      barrier_->Sync();
     }
     Thread::ExitIsolateAsHelper();
-    // Use awake also to signal exit.
-    {
-      MonitorLocker ml(awake_monitor_);
-      *awake_ = true;
-      ml.Notify();
-    }
+    barrier_->Exit();
   }
 
  private:
   Isolate* isolate_;
-  Monitor* awake_monitor_;
-  bool* awake_;
-  Monitor* round_monitor_;
-  const intptr_t* round_;
+  ThreadBarrier* barrier_;
 };
 
 
 const intptr_t InterruptChecker::kTaskCount = 5;
 const intptr_t InterruptChecker::kIterations = 10;
 
-
-// Waits for all tasks to set their individual flag, then clears them all.
-static void WaitForAllTasks(bool* flags, Monitor* monitor) {
-  MonitorLocker ml(monitor);
-  while (true) {
-    intptr_t count = 0;
-    for (intptr_t task = 0; task < InterruptChecker::kTaskCount; ++task) {
-      if (flags[task]) {
-        ++count;
-      }
-    }
-    if (count == InterruptChecker::kTaskCount) {
-      memset(flags, 0, sizeof(*flags) * count);
-      break;
-    } else {
-      ml.Wait();
-    }
-  }
-}
-
 // Test and document usage of Isolate::HasInterruptsScheduled.
 //
 // Go through a number of rounds of scheduling interrupts and waiting until all
@@ -182,34 +130,23 @@
 // compiler and/or CPU could reorder operations to make the tasks observe the
 // round update *before* the interrupt is set.
 TEST_CASE(StackLimitInterrupts) {
-  Monitor awake_monitor;  // Synchronizes the 'awake' flags.
-  bool awake[InterruptChecker::kTaskCount];
-  memset(awake, 0, sizeof(awake));
-  Monitor round_monitor;  // Synchronizes the 'round' counter.
-  intptr_t round = 0;
   Isolate* isolate = Thread::Current()->isolate();
+  ThreadBarrier barrier(InterruptChecker::kTaskCount + 1);
   // Start all tasks. They will busy-wait until interrupted in the first round.
   for (intptr_t task = 0; task < InterruptChecker::kTaskCount; task++) {
-    Dart::thread_pool()->Run(new InterruptChecker(
-        isolate, &awake_monitor, &awake[task], &round_monitor, &round));
+    Dart::thread_pool()->Run(new InterruptChecker(isolate, &barrier));
   }
   // Wait for all tasks to get ready for the first round.
-  WaitForAllTasks(awake, &awake_monitor);
+  barrier.Sync();
   for (intptr_t i = 0; i < InterruptChecker::kIterations; ++i) {
     isolate->ScheduleInterrupts(Isolate::kVMInterrupt);
     // Wait for all tasks to observe the interrupt.
-    WaitForAllTasks(awake, &awake_monitor);
+    barrier.Sync();
     // Continue with next round.
     uword interrupts = isolate->GetAndClearInterrupts();
     EXPECT((interrupts & Isolate::kVMInterrupt) != 0);
-    {
-      MonitorLocker ml(&round_monitor);
-      ++round;
-      ml.NotifyAll();
-    }
   }
-  // Wait for tasks to exit cleanly.
-  WaitForAllTasks(awake, &awake_monitor);
+  barrier.Exit();
 }
 
 }  // namespace dart
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index c87be96..154d0e0 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -57,6 +57,10 @@
   const Code& code =
       Code::Handle(StubCode::Generate("_stub_MegamorphicMiss",
                                       StubCode::GenerateMegamorphicMissStub));
+  // When FLAG_lazy_dispatchers=false, this stub can be on the stack during
+  // exceptions, but it has a corresponding function so IsStubCode is false and
+  // it is considered in the search for an exception handler.
+  code.set_exception_handlers(Object::empty_exception_handlers());
   const Class& cls =
       Class::Handle(Type::Handle(Type::Function()).type_class());
   const Function& function =
diff --git a/runtime/vm/method_recognizer.cc b/runtime/vm/method_recognizer.cc
index d0b941e..45a6f59 100644
--- a/runtime/vm/method_recognizer.cc
+++ b/runtime/vm/method_recognizer.cc
@@ -28,7 +28,8 @@
 #define KIND_TO_STRING(class_name, function_name, enum_name, fp)               \
   #enum_name,
 static const char* recognized_list_method_name[] = {
-RECOGNIZED_LIST(KIND_TO_STRING)
+  "Unknown",
+  RECOGNIZED_LIST(KIND_TO_STRING)
 };
 #undef KIND_TO_STRING
 
diff --git a/runtime/vm/method_recognizer.h b/runtime/vm/method_recognizer.h
index eb752f9..a931290 100644
--- a/runtime/vm/method_recognizer.h
+++ b/runtime/vm/method_recognizer.h
@@ -64,10 +64,6 @@
   V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1327692716)    \
   V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139)                         \
   V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 654814229)                    \
-  V(_Float32x4, get:x, Float32x4ShuffleX, 384969722)                           \
-  V(_Float32x4, get:y, Float32x4ShuffleY, 1398121942)                          \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178175605)                          \
-  V(_Float32x4, get:w, Float32x4ShuffleW, 480951003)                           \
   V(_Float32x4, get:signMask, Float32x4GetSignMask, 630880675)                 \
   V(_Float32x4, _cmpequal, Float32x4Equal, 571062952)                          \
   V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295)                      \
@@ -285,6 +281,13 @@
   V(_Float64Array, []=, Float64ArraySetIndexed, 887301703)                     \
   V(_Float64Array, [], Float64ArrayGetIndexed, 1959896670)                     \
   V(_TypedList, get:length, TypedDataLength, 522684521)                        \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 384969722)                           \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 1398121942)                          \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178175605)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 480951003)                           \
+  V(_Float32x4, _mul, Float32x4Mul, 1703784673)                                \
+  V(_Float32x4, _sub, Float32x4Sub, 1302598822)                                \
+  V(_Float32x4, _add, Float32x4Add, 182344215)                                 \
 
 #define GRAPH_CORE_INTRINSICS_LIST(V)                                          \
   V(_List, get:length, ObjectArrayLength, 1181471893)                          \
diff --git a/runtime/vm/native_entry.cc b/runtime/vm/native_entry.cc
index 5f373df..29cb8d7 100644
--- a/runtime/vm/native_entry.cc
+++ b/runtime/vm/native_entry.cc
@@ -23,14 +23,6 @@
             "Trace invocation of natives (debug mode only)");
 
 
-static ExternalLabel native_call_label(
-    reinterpret_cast<uword>(&NativeEntry::NativeCallWrapper));
-
-
-static ExternalLabel link_native_call_label(
-    reinterpret_cast<uword>(&NativeEntry::LinkNativeCall));
-
-
 NativeFunction NativeEntry::ResolveNative(const Library& library,
                                           const String& function_name,
                                           int number_of_arguments,
@@ -84,8 +76,13 @@
 }
 
 
-const ExternalLabel& NativeEntry::NativeCallWrapperLabel() {
-  return native_call_label;
+uword NativeEntry::NativeCallWrapperEntry() {
+  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
+#if defined(USING_SIMULATOR)
+  entry = Simulator::RedirectExternalReference(
+      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
+#endif
+  return entry;
 }
 
 
@@ -167,8 +164,13 @@
 }
 
 
-const ExternalLabel& NativeEntry::LinkNativeCallLabel() {
-  return link_native_call_label;
+uword NativeEntry::LinkNativeCallEntry() {
+  uword entry = reinterpret_cast<uword>(NativeEntry::LinkNativeCall);
+#if defined(USING_SIMULATOR)
+  entry = Simulator::RedirectExternalReference(
+      entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
+#endif
+  return entry;
 }
 
 
@@ -210,10 +212,10 @@
 #if defined(DEBUG)
     {
       NativeFunction current_function = NULL;
-      uword current_trampoline =
+      const Code& current_trampoline = Code::Handle(
           CodePatcher::GetNativeCallAt(caller_frame->pc(),
                                        code,
-                                       &current_function);
+                                       &current_function));
 #if !defined(USING_SIMULATOR)
       ASSERT(current_function ==
              reinterpret_cast<NativeFunction>(LinkNativeCall));
@@ -225,8 +227,8 @@
                      Simulator::kBootstrapNativeCall,
                      NativeEntry::kNumArguments)));
 #endif
-      ASSERT(current_trampoline ==
-             StubCode::CallBootstrapCFunction_entry()->EntryPoint());
+      ASSERT(current_trampoline.raw() ==
+             StubCode::CallBootstrapCFunction_entry()->code());
     }
 #endif
 
diff --git a/runtime/vm/native_entry.h b/runtime/vm/native_entry.h
index 4dd655d..0123b47 100644
--- a/runtime/vm/native_entry.h
+++ b/runtime/vm/native_entry.h
@@ -114,11 +114,11 @@
                                                uword pc);
   static const uint8_t* ResolveSymbol(uword pc);
 
-  static const ExternalLabel& NativeCallWrapperLabel();
+  static uword NativeCallWrapperEntry();
   static void NativeCallWrapper(Dart_NativeArguments args,
                                 Dart_NativeFunction func);
 
-  static const ExternalLabel& LinkNativeCallLabel();
+  static uword LinkNativeCallEntry();
   static void LinkNativeCall(Dart_NativeArguments args);
 };
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d95e73d..2366142 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -115,7 +115,6 @@
 LanguageError* Object::snapshot_writer_error_ = NULL;
 LanguageError* Object::branch_offset_error_ = NULL;
 Array* Object::vm_isolate_snapshot_object_table_ = NULL;
-const uint8_t* Object::instructions_snapshot_buffer_ = NULL;
 
 RawObject* Object::null_ = reinterpret_cast<RawObject*>(RAW_NULL);
 RawClass* Object::class_class_ = reinterpret_cast<RawClass*>(RAW_NULL);
@@ -832,11 +831,16 @@
   explicit PremarkingVisitor(Isolate* isolate) : ObjectVisitor(isolate) {}
 
   void VisitObject(RawObject* obj) {
-    ASSERT(!obj->IsMarked());
     // Free list elements should never be marked.
     if (!obj->IsFreeListElement()) {
       ASSERT(obj->IsVMHeapObject());
-      obj->SetMarkBitUnsynchronized();
+      if (obj->IsMarked()) {
+        // Precompiled instructions are loaded pre-marked.
+        ASSERT(Dart::IsRunningPrecompiledCode());
+        ASSERT(obj->IsInstructions());
+      } else {
+        obj->SetMarkBitUnsynchronized();
+      }
     }
   }
 };
@@ -3707,7 +3711,9 @@
   }
   ASSERT(!CodePatcher::IsEntryPatched(existing_stub));
   // Patch the stub so that the next caller will regenerate the stub.
-  CodePatcher::PatchEntry(existing_stub);
+  CodePatcher::PatchEntry(
+      existing_stub,
+      Code::Handle(StubCode::FixAllocationStubTarget_entry()->code()));
   // Disassociate the existing stub from class.
   StorePointer(&raw_ptr()->allocation_stub_, Code::null());
 }
@@ -5225,7 +5231,7 @@
 
 
 void Function::SetInstructions(const Code& value) const {
-  StorePointer(&raw_ptr()->instructions_, value.instructions());
+  StorePointer(&raw_ptr()->code_, value.raw());
   StoreNonPointer(&raw_ptr()->entry_point_, value.EntryPoint());
 }
 
@@ -5238,9 +5244,8 @@
 
 
 bool Function::HasCode() const {
-  ASSERT(raw_ptr()->instructions_ != Instructions::null());
-  return raw_ptr()->instructions_ !=
-      StubCode::LazyCompile_entry()->code()->ptr()->instructions_;
+  ASSERT(raw_ptr()->code_ != Code::null());
+  return raw_ptr()->code_ != StubCode::LazyCompile_entry()->code();
 }
 
 
@@ -5264,7 +5269,8 @@
       current_code.EntryPoint());
   }
   // Patch entry of the optimized code.
-  CodePatcher::PatchEntry(current_code);
+  CodePatcher::PatchEntry(
+      current_code, Code::Handle(StubCode::FixCallersTarget_entry()->code()));
   const Error& error = Error::Handle(zone,
       Compiler::EnsureUnoptimizedCode(thread, *this));
   if (!error.IsNull()) {
@@ -6728,8 +6734,7 @@
 
 
 bool Function::HasOptimizedCode() const {
-  return HasCode() &&  Code::Handle(Instructions::Handle(
-      raw_ptr()->instructions_).code()).is_optimized();
+  return HasCode() && Code::Handle(CurrentCode()).is_optimized();
 }
 
 
@@ -8584,9 +8589,9 @@
   CSTAT_TIMER_SCOPE(thread, scanner_timer);
   const String& src = String::Handle(zone, Source());
   Scanner scanner(src, private_key);
-  set_tokens(TokenStream::Handle(zone,
-                                 TokenStream::New(scanner.GetStream(),
-                                                  private_key)));
+  const Scanner::GrowableTokenStream& ts = scanner.GetStream();
+  INC_STAT(thread, num_tokens_scanned, ts.length());
+  set_tokens(TokenStream::Handle(zone, TokenStream::New(ts, private_key)));
   INC_STAT(thread, src_length, src.Length());
 }
 
@@ -10920,11 +10925,9 @@
   JSONObject jsobj(stream);
   AddCommonObjectProperties(&jsobj, "Object", ref);
   jsobj.AddServiceId(*this);
-  jsobj.AddProperty("_code", Code::Handle(code()));
   if (ref) {
     return;
   }
-  jsobj.AddProperty("_objectPool", ObjectPool::Handle(object_pool()));
 }
 
 
@@ -11033,7 +11036,6 @@
         imm = RawValueAt(i);
         jsarr.AddValue64(imm);
         break;
-      case ObjectPool::kExternalLabel:
       case ObjectPool::kNativeEntry:
         imm = RawValueAt(i);
         jsarr.AddValueF("0x%" Px, imm);
@@ -11046,16 +11048,6 @@
 }
 
 
-static const char* DescribeExternalLabel(uword addr) {
-  const char* stub_name = StubCode::NameOfStub(addr);
-  if (stub_name != NULL) {
-    return stub_name;
-  }
-
-  return "UNKNOWN";
-}
-
-
 void ObjectPool::DebugPrint() const {
   THR_Print("Object Pool: {\n");
   for (intptr_t i = 0; i < Length(); i++) {
@@ -11066,10 +11058,6 @@
       THR_Print("0x%" Px " %s (obj)\n",
           reinterpret_cast<uword>(obj),
           Object::Handle(obj).ToCString());
-    } else if (InfoAt(i) == kExternalLabel) {
-      uword addr = RawValueAt(i);
-      THR_Print("0x%" Px " (external label: %s)\n",
-                addr, DescribeExternalLabel(addr));
     } else if (InfoAt(i) == kNativeEntry) {
       THR_Print("0x%" Px " (native entry)\n", RawValueAt(i));
     } else {
@@ -12858,13 +12846,6 @@
 
 
 void Code::Disassemble(DisassemblyFormatter* formatter) const {
-  const bool fix_patch = CodePatcher::CodeIsPatchable(*this) &&
-                         CodePatcher::IsEntryPatched(*this);
-  if (fix_patch) {
-    // The disassembler may choke on illegal instructions if the code has been
-    // patched, un-patch the code before disassembling and re-patch after.
-    CodePatcher::RestoreEntry(*this);
-  }
   const Instructions& instr = Instructions::Handle(instructions());
   uword start = instr.EntryPoint();
   if (formatter == NULL) {
@@ -12872,10 +12853,6 @@
   } else {
     Disassembler::Disassemble(start, start + instr.size(), formatter, *this);
   }
-  if (fix_patch) {
-    // Redo the patch.
-    CodePatcher::PatchEntry(*this);
-  }
 }
 
 
@@ -12997,8 +12974,6 @@
     result.set_is_alive(false);
     result.set_comments(Comments::New(0));
     result.set_compile_timestamp(0);
-    result.set_entry_patch_pc_offset(kInvalidPc);
-    result.set_patch_code_pc_offset(kInvalidPc);
     result.set_lazy_deopt_pc_offset(kInvalidPc);
     result.set_pc_descriptors(Object::empty_descriptors());
   }
@@ -13023,6 +12998,9 @@
   // pages read-only.
   intptr_t pointer_offset_count = assembler->CountPointerOffsets();
   Code& code = Code::ZoneHandle(Code::New(pointer_offset_count));
+#ifdef TARGET_ARCH_IA32
+  assembler->set_code_object(code);
+#endif
   Instructions& instrs =
       Instructions::ZoneHandle(Instructions::New(assembler->CodeSize()));
   INC_STAT(Thread::Current(), total_instr_size, assembler->CodeSize());
@@ -13061,14 +13039,14 @@
     }
 
     // Hook up Code and Instructions objects.
-    instrs.set_code(code.raw());
+    code.set_active_instructions(instrs.raw());
     code.set_instructions(instrs.raw());
     code.set_is_alive(true);
 
     // Set object pool in Instructions object.
     INC_STAT(Thread::Current(),
              total_code_size, object_pool.Length() * sizeof(uintptr_t));
-    instrs.set_object_pool(object_pool.raw());
+    code.set_object_pool(object_pool.raw());
 
     if (FLAG_write_protect_code) {
       uword address = RawObject::ToAddr(instrs.raw());
@@ -13110,7 +13088,7 @@
 
 // Check if object matches find condition.
 bool Code::FindRawCodeVisitor::FindObject(RawObject* obj) const {
-  return RawInstructions::ContainsPC(obj, pc_);
+  return RawCode::ContainsPC(obj, pc_);
 }
 
 
@@ -13118,13 +13096,13 @@
   ASSERT((isolate == Isolate::Current()) || (isolate == Dart::vm_isolate()));
   NoSafepointScope no_safepoint;
   FindRawCodeVisitor visitor(pc);
-  RawInstructions* instr;
+  RawObject* instr;
   if (isolate->heap() == NULL) {
     return Code::null();
   }
-  instr = isolate->heap()->FindObjectInCodeSpace(&visitor);
-  if (instr != Instructions::null()) {
-    return instr->ptr()->code_;
+  instr = isolate->heap()->FindOldObject(&visitor);
+  if (instr != Code::null()) {
+    return static_cast<RawCode*>(instr);
   }
   return Code::null();
 }
@@ -13365,18 +13343,6 @@
 }
 
 
-uword Code::GetEntryPatchPc() const {
-  return (entry_patch_pc_offset() != kInvalidPc)
-      ? EntryPoint() + entry_patch_pc_offset() : 0;
-}
-
-
-uword Code::GetPatchCodePc() const {
-  return (patch_code_pc_offset() != kInvalidPc)
-      ? EntryPoint() + patch_code_pc_offset() : 0;
-}
-
-
 uword Code::GetLazyDeoptPc() const {
   return (lazy_deopt_pc_offset() != kInvalidPc)
       ? EntryPoint() + lazy_deopt_pc_offset() : 0;
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 75ec1f4..1b398dd 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -488,12 +488,6 @@
     return *vm_isolate_snapshot_object_table_;
   }
   static void InitVmIsolateSnapshotObjectTable(intptr_t len);
-  static const uint8_t* instructions_snapshot_buffer() {
-    return instructions_snapshot_buffer_;
-  }
-  static void set_instructions_snapshot_buffer(const uint8_t* buffer) {
-    instructions_snapshot_buffer_ = buffer;
-  }
 
   static RawClass* class_class() { return class_class_; }
   static RawClass* dynamic_class() { return dynamic_class_; }
@@ -819,7 +813,6 @@
   static LanguageError* snapshot_writer_error_;
   static LanguageError* branch_offset_error_;
   static Array* vm_isolate_snapshot_object_table_;
-  static const uint8_t* instructions_snapshot_buffer_;
 
   friend void ClassTable::Register(const Class& cls);
   friend void RawObject::Validate(Isolate* isolate) const;
@@ -2170,13 +2163,17 @@
   // Return the most recently compiled and installed code for this function.
   // It is not the only Code object that points to this function.
   RawCode* CurrentCode() const {
-    return raw_ptr()->instructions_->ptr()->code_;
+    return raw_ptr()->code_;
   }
 
   RawCode* unoptimized_code() const { return raw_ptr()->unoptimized_code_; }
   void set_unoptimized_code(const Code& value) const;
   bool HasCode() const;
 
+  static intptr_t code_offset() {
+    return OFFSET_OF(RawFunction, code_);
+  }
+
   static intptr_t entry_point_offset() {
     return OFFSET_OF(RawFunction, entry_point_);
   }
@@ -3609,7 +3606,6 @@
   enum EntryType {
     kTaggedObject,
     kImmediate,
-    kExternalLabel,
     kNativeEntry,
   };
 
@@ -3714,14 +3710,6 @@
 class Instructions : public Object {
  public:
   intptr_t size() const { return raw_ptr()->size_; }  // Excludes HeaderSize().
-  RawCode* code() const { return raw_ptr()->code_; }
-  static intptr_t code_offset() {
-    return OFFSET_OF(RawInstructions, code_);
-  }
-  RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
-  static intptr_t object_pool_offset() {
-    return OFFSET_OF(RawInstructions, object_pool_);
-  }
 
   uword EntryPoint() const {
     return reinterpret_cast<uword>(raw_ptr()) + HeaderSize();
@@ -3760,12 +3748,6 @@
   void set_size(intptr_t size) const {
     StoreNonPointer(&raw_ptr()->size_, size);
   }
-  void set_code(RawCode* code) const {
-    StorePointer(&raw_ptr()->code_, code);
-  }
-  void set_object_pool(RawObjectPool* object_pool) const {
-    StorePointer(&raw_ptr()->object_pool_, object_pool);
-  }
 
   // New is a private method as RawInstruction and RawCode objects should
   // only be created using the Code::FinalizeCode method. This method creates
@@ -3776,6 +3758,7 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Instructions, Object);
   friend class Class;
   friend class Code;
+  friend class InstructionsWriter;
 };
 
 
@@ -4097,12 +4080,25 @@
 
 class Code : public Object {
  public:
+  RawInstructions* active_instructions() const {
+    return raw_ptr()->active_instructions_;
+  }
+
   RawInstructions* instructions() const { return raw_ptr()->instructions_; }
 
+  static intptr_t saved_instructions_offset() {
+    return OFFSET_OF(RawCode, instructions_);
+  }
+
   static intptr_t entry_point_offset() {
     return OFFSET_OF(RawCode, entry_point_);
   }
 
+  RawObjectPool* object_pool() const { return raw_ptr()->object_pool_; }
+  static intptr_t object_pool_offset() {
+    return OFFSET_OF(RawCode, object_pool_);
+  }
+
   intptr_t pointer_offsets_length() const {
     return PtrOffBits::decode(raw_ptr()->state_bits_);
   }
@@ -4117,17 +4113,14 @@
   void set_is_alive(bool value) const;
 
   uword EntryPoint() const {
-    ASSERT(raw_ptr()->entry_point_ ==
-           Instructions::Handle(instructions()).EntryPoint());
-    return raw_ptr()->entry_point_;
+    return Instructions::Handle(instructions()).EntryPoint();
   }
   intptr_t Size() const {
     const Instructions& instr = Instructions::Handle(instructions());
     return instr.size();
   }
   RawObjectPool* GetObjectPool() const {
-    const Instructions& instr = Instructions::Handle(instructions());
-    return instr.object_pool();
+    return object_pool();
   }
   bool ContainsInstructionAt(uword addr) const {
     const Instructions& instr = Instructions::Handle(instructions());
@@ -4322,10 +4315,6 @@
     kInvalidPc = -1
   };
 
-  // Returns 0 if code is not patchable
-  uword GetEntryPatchPc() const;
-  uword GetPatchCodePc() const;
-
   uword GetLazyDeoptPc() const;
 
   // Find pc, return 0 if not found.
@@ -4339,22 +4328,6 @@
     return raw_ptr()->compile_timestamp_;
   }
 
-  intptr_t entry_patch_pc_offset() const {
-    return raw_ptr()->entry_patch_pc_offset_;
-  }
-  void set_entry_patch_pc_offset(intptr_t pc) const {
-    StoreNonPointer(&raw_ptr()->entry_patch_pc_offset_, pc);
-  }
-
-
-  intptr_t patch_code_pc_offset() const {
-    return raw_ptr()->patch_code_pc_offset_;
-  }
-  void set_patch_code_pc_offset(intptr_t pc) const {
-    StoreNonPointer(&raw_ptr()->patch_code_pc_offset_, pc);
-  }
-
-
   intptr_t lazy_deopt_pc_offset() const {
     return raw_ptr()->lazy_deopt_pc_offset_;
   }
@@ -4369,6 +4342,10 @@
  private:
   void set_state_bits(intptr_t bits) const;
 
+  void set_object_pool(RawObjectPool* object_pool) const {
+    StorePointer(&raw_ptr()->object_pool_, object_pool);
+  }
+
   friend class RawObject;  // For RawObject::SizeFromClass().
   friend class RawCode;
   enum {
@@ -4389,8 +4366,6 @@
         : FindObjectVisitor(Isolate::Current()), pc_(pc) { }
     virtual ~FindRawCodeVisitor() { }
 
-    virtual uword filter_addr() const { return pc_; }
-
     // Check if object matches find condition.
     virtual bool FindObject(RawObject* obj) const;
 
@@ -4410,13 +4385,17 @@
     StoreNonPointer(&raw_ptr()->compile_timestamp_, timestamp);
   }
 
-  void set_instructions(RawInstructions* instructions) {
+  void set_active_instructions(RawInstructions* instructions) const {
     // RawInstructions are never allocated in New space and hence a
     // store buffer update is not needed here.
+    StorePointer(&raw_ptr()->active_instructions_, instructions);
+    StoreNonPointer(&raw_ptr()->entry_point_,
+                    reinterpret_cast<uword>(instructions->ptr()) +
+                    Instructions::HeaderSize());
+  }
+
+  void set_instructions(RawInstructions* instructions) const {
     StorePointer(&raw_ptr()->instructions_, instructions);
-    uword entry_point = reinterpret_cast<uword>(instructions->ptr()) +
-        Instructions::HeaderSize();
-    StoreNonPointer(&raw_ptr()->entry_point_, entry_point);
   }
 
   void set_pointer_offsets_length(intptr_t value) {
@@ -4450,7 +4429,7 @@
   FINAL_HEAP_OBJECT_IMPLEMENTATION(Code, Object);
   friend class Class;
   friend class SnapshotWriter;
-
+  friend class CodePatcher;  // for set_instructions
   // So that the RawFunction pointer visitor can determine whether code the
   // function points to is optimized.
   friend class RawFunction;
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 79ea761..40b6c05 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -212,6 +212,10 @@
     }
     pages_tail_ = page;
   } else {
+    // Should not allocate executable pages when running from a precompiled
+    // snapshot.
+    ASSERT(!Dart::IsRunningPrecompiledCode());
+
     if (exec_pages_ == NULL) {
       exec_pages_ = page;
     } else {
@@ -1022,6 +1026,40 @@
 }
 
 
+void PageSpace::SetupInstructionsSnapshotPage(void* pointer, uword size) {
+  // Setup a HeapPage so precompiled Instructions can be traversed.
+  // Instructions are contiguous at [pointer, pointer + size). HeapPage
+  // expects to find objects at [memory->start() + ObjectStartOffset,
+  // memory->end()).
+  uword offset = HeapPage::ObjectStartOffset();
+  pointer = reinterpret_cast<void*>(reinterpret_cast<uword>(pointer) - offset);
+  size += offset;
+
+  ASSERT(Utils::IsAligned(pointer, OS::PreferredCodeAlignment()));
+
+  VirtualMemory* memory = VirtualMemory::ForInstructionsSnapshot(pointer, size);
+  ASSERT(memory != NULL);
+  HeapPage* page = reinterpret_cast<HeapPage*>(malloc(sizeof(HeapPage)));
+  page->memory_ = memory;
+  page->next_ = NULL;
+  page->object_end_ = memory->end();
+  page->executable_ = true;
+
+#if defined(DEBUG)
+  OS::Print("Precompiled instructions page at [0x%" Px ", 0x%" Px ")\n",
+            page->object_start(), page->object_end());
+#endif
+
+  MutexLocker ml(pages_lock_);
+  if (exec_pages_ == NULL) {
+    exec_pages_ = page;
+  } else {
+    exec_pages_tail_->set_next(page);
+  }
+  exec_pages_tail_ = page;
+}
+
+
 PageSpaceController::PageSpaceController(Heap* heap,
                                          int heap_growth_ratio,
                                          int heap_growth_max,
diff --git a/runtime/vm/pages.h b/runtime/vm/pages.h
index cb5c1dc..e67bc81 100644
--- a/runtime/vm/pages.h
+++ b/runtime/vm/pages.h
@@ -42,7 +42,7 @@
   }
 
   uword object_start() const {
-    return (reinterpret_cast<uword>(this) + ObjectStartOffset());
+    return memory_->start() + ObjectStartOffset();
   }
   uword object_end() const {
     return object_end_;
@@ -340,6 +340,8 @@
   static intptr_t top_offset() { return OFFSET_OF(PageSpace, bump_top_); }
   static intptr_t end_offset() { return OFFSET_OF(PageSpace, bump_end_); }
 
+  void SetupInstructionsSnapshotPage(void* pointer, uword size);
+
  private:
   // Ids for time and data records in Heap::GCStats.
   enum {
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index 426aa88..6fb4247 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -211,11 +211,13 @@
     { "dart:_builtin", "::", "_getUriBaseClosure" },
     { "dart:_builtin", "::", "_resolveUri" },
     { "dart:_builtin", "::", "_setWorkingDirectory" },
+    { "dart:_builtin", "::", "_loadDataAsync" },
     { "dart:async", "::", "_setScheduleImmediateClosure" },
     { "dart:core", "_InternalError", "_InternalError." },
     { "dart:core", "_InvocationMirror", "_allocateInvocationMirror" },
     { "dart:io", "::", "_makeUint8ListView" },
     { "dart:io", "::", "_makeDatagram" },
+    { "dart:io", "::", "_setupHooks" },
     { "dart:io", "CertificateException", "CertificateException." },
     { "dart:io", "HandshakeException", "HandshakeException." },
     { "dart:io", "TlsException", "TlsException." },
@@ -228,6 +230,7 @@
     { "dart:io", "_SecureFilterImpl", "get:SIZE" },
     { "dart:isolate", "::", "_getIsolateScheduleImmediateClosure" },
     { "dart:isolate", "::", "_startMainIsolate" },
+    { "dart:isolate", "::", "_setupHooks" },
     { "dart:isolate", "_RawReceivePortImpl", "_handleMessage" },
     { "dart:isolate", "_RawReceivePortImpl", "_lookupHandler" },
     { "dart:vmservice", "::", "_registerIsolate" },
@@ -444,7 +447,7 @@
       if (FLAG_trace_precompiler) {
         THR_Print("Precompiling initializer for %s\n", field.ToCString());
       }
-      ASSERT(Object::instructions_snapshot_buffer() == NULL);
+      ASSERT(!Dart::IsRunningPrecompiledCode());
       field.SetStaticValue(Instance::Handle(field.SavedInitialStaticValue()));
       Compiler::CompileStaticInitializer(field);
 
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index c470b6a..98fd63d 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -759,35 +759,8 @@
 };
 
 
-static void CopyPCMarkerIfSafe(Sample* sample, uword fp_addr, uword sp_addr) {
-  ASSERT(sample != NULL);
-
-  if (sample->vm_tag() != VMTag::kDartTagId) {
-    // We can only trust the stack pointer if we are executing Dart code.
-    // See http://dartbug.com/20421 for details.
-    return;
-  }
-  uword* fp = reinterpret_cast<uword*>(fp_addr);
-  uword* sp = reinterpret_cast<uword*>(sp_addr);
-
-  // If FP == SP, the pc marker hasn't been pushed.
-  if (fp > sp) {
-    uword* pc_marker_ptr = fp + kPcMarkerSlotFromFp;
-    // MSan/ASan are unaware of frames initialized by generated code.
-    MSAN_UNPOISON(pc_marker_ptr, kWordSize);
-    ASAN_UNPOISON(pc_marker_ptr, kWordSize);
-    sample->set_pc_marker(*pc_marker_ptr);
-  }
-}
-
-
 static void CopyStackBuffer(Sample* sample, uword sp_addr) {
   ASSERT(sample != NULL);
-  if (sample->vm_tag() != VMTag::kDartTagId) {
-    // We can only trust the stack pointer if we are executing Dart code.
-    // See http://dartbug.com/20421 for details.
-    return;
-  }
   uword* sp = reinterpret_cast<uword*>(sp_addr);
   uword* buffer = sample->GetStackBuffer();
   if (sp != NULL) {
@@ -834,8 +807,11 @@
   __try {
 #endif
 
-  CopyStackBuffer(sample, sp);
-  CopyPCMarkerIfSafe(sample, fp, sp);
+  if (in_dart_code) {
+    // We can only trust the stack pointer if we are executing Dart code.
+    // See http://dartbug.com/20421 for details.
+    CopyStackBuffer(sample, sp);
+  }
 
   if (FLAG_profile_vm) {
     // Always walk the native stack collecting both native and Dart frames.
diff --git a/runtime/vm/random.cc b/runtime/vm/random.cc
index 18703d0..6f1b6eb 100644
--- a/runtime/vm/random.cc
+++ b/runtime/vm/random.cc
@@ -25,6 +25,12 @@
     // We did not get a seed so far. As a fallback we do use the current time.
     seed = OS::GetCurrentTimeMicros();
   }
+  Initialize(seed);
+}
+
+
+void Random::Initialize(uint64_t seed) {
+  ASSERT(seed != 0);
   // Crank the next state a couple of times.
   _state = seed;
   NextState();
@@ -33,6 +39,12 @@
   NextState();
 }
 
+
+Random::Random(uint64_t seed) {
+  Initialize(seed);
+}
+
+
 Random::~Random() {
   // Nothing to be done here.
 }
diff --git a/runtime/vm/random.h b/runtime/vm/random.h
index cda8dd8..f5614de 100644
--- a/runtime/vm/random.h
+++ b/runtime/vm/random.h
@@ -13,6 +13,8 @@
 class Random {
  public:
   Random();
+  // Seed must be non-zero.
+  explicit Random(uint64_t seed);
   ~Random();
 
   uint32_t NextUInt32();
@@ -23,6 +25,7 @@
 
  private:
   void NextState();
+  void Initialize(uint64_t seed);
 
   uint64_t _state;
 
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 47e9306..74013a6 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -439,9 +439,9 @@
   }
   visitor->VisitPointers(raw_obj->from(), raw_obj->to_no_code());
 
-  if (ShouldVisitCode(raw_obj->ptr()->instructions_->ptr()->code_)) {
+  if (ShouldVisitCode(raw_obj->ptr()->code_)) {
     visitor->VisitPointer(
-        reinterpret_cast<RawObject**>(&raw_obj->ptr()->instructions_));
+        reinterpret_cast<RawObject**>(&raw_obj->ptr()->code_));
   } else {
     visitor->add_skipped_code_function(raw_obj);
   }
@@ -505,6 +505,16 @@
 }
 
 
+bool RawCode::ContainsPC(RawObject* raw_obj, uword pc) {
+  uword tags = raw_obj->ptr()->tags_;
+  if (RawObject::ClassIdTag::decode(tags) == kCodeCid) {
+    RawCode* raw_code = reinterpret_cast<RawCode*>(raw_obj);
+    return RawInstructions::ContainsPC(raw_code->ptr()->instructions_, pc);
+  }
+  return false;
+}
+
+
 intptr_t RawCode::VisitCodePointers(RawCode* raw_obj,
                                     ObjectPointerVisitor* visitor) {
   visitor->VisitPointers(raw_obj->from(), raw_obj->to());
@@ -546,24 +556,16 @@
 intptr_t RawInstructions::VisitInstructionsPointers(
     RawInstructions* raw_obj, ObjectPointerVisitor* visitor) {
   RawInstructions* obj = raw_obj->ptr();
-  visitor->VisitPointers(raw_obj->from(), raw_obj->to());
   return Instructions::InstanceSize(obj->size_);
 }
 
 
-bool RawInstructions::ContainsPC(RawObject* raw_obj, uword pc) {
-  uword tags = raw_obj->ptr()->tags_;
-  if (RawObject::ClassIdTag::decode(tags) == kInstructionsCid) {
-    RawInstructions* raw_instr = reinterpret_cast<RawInstructions*>(raw_obj);
-    uword start_pc =
-        reinterpret_cast<uword>(raw_instr->ptr()) + Instructions::HeaderSize();
-    uword end_pc = start_pc + raw_instr->ptr()->size_;
-    ASSERT(end_pc > start_pc);
-    if ((pc >= start_pc) && (pc < end_pc)) {
-      return true;
-    }
-  }
-  return false;
+bool RawInstructions::ContainsPC(RawInstructions* raw_instr, uword pc) {
+  uword start_pc =
+      reinterpret_cast<uword>(raw_instr->ptr()) + Instructions::HeaderSize();
+  uword end_pc = start_pc + raw_instr->ptr()->size_;
+  ASSERT(end_pc > start_pc);
+  return (pc >= start_pc) && (pc < end_pc);
 }
 
 
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 2110436..73bbfbc 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -410,6 +410,12 @@
   bool IsFunction() {
     return ((GetClassId() == kFunctionCid));
   }
+  bool IsInstructions() {
+    return ((GetClassId() == kInstructionsCid));
+  }
+  bool IsCode() {
+    return ((GetClassId() == kCodeCid));
+  }
 
   intptr_t Size() const {
     uword tags = ptr()->tags_;
@@ -575,6 +581,7 @@
   friend class Mint;
   friend class Object;
   friend class OneByteString;  // StoreSmi
+  friend class RawCode;
   friend class RawExternalTypedData;
   friend class RawInstructions;
   friend class RawInstance;
@@ -585,6 +592,7 @@
   friend class RetainingPathVisitor;  // GetClassId
   friend class SkippedCodeFunctions;  // StorePointer
   friend class InstructionsReader;  // tags_ check
+  friend class InstructionsWriter;
   friend class SnapshotReader;
   friend class SnapshotWriter;
   friend class String;
@@ -592,6 +600,7 @@
   friend class TypedDataView;
   friend class WeakProperty;  // StorePointer
   friend class Instance;  // StorePointer
+  friend class StackFrame;  // GetCodeObject assertion.
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
@@ -770,7 +779,7 @@
   RawObject** to_no_code() {
     return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_);
   }
-  RawInstructions* instructions_;  // Instructions of currently active code.
+  RawCode* code_;  // Currently active code.
   RawCode* unoptimized_code_;  // Unoptimized code, keep it after optimization.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_);
@@ -1000,10 +1009,14 @@
 
   RAW_HEAP_OBJECT_IMPLEMENTATION(Code);
 
+  uword entry_point_;
+
   RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->instructions_);
+    return reinterpret_cast<RawObject**>(&ptr()->active_instructions_);
   }
+  RawInstructions* active_instructions_;
   RawInstructions* instructions_;
+  RawObjectPool* object_pool_;
   // If owner_ is Function::null() the owner is a regular stub.
   // If owner_ is a Class the owner is the allocation stub for that class.
   // Else, owner_ is a regular Dart Function.
@@ -1022,7 +1035,6 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->return_address_metadata_);
   }
-  uword entry_point_;
 
   // Compilation timestamp.
   int64_t compile_timestamp_;
@@ -1034,18 +1046,19 @@
   int32_t state_bits_;
 
   // PC offsets for code patching.
-  int32_t entry_patch_pc_offset_;
-  int32_t patch_code_pc_offset_;
   int32_t lazy_deopt_pc_offset_;
 
   // Variable length data follows here.
   int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
   const int32_t* data() const { OPEN_ARRAY_START(int32_t, int32_t); }
 
+  static bool ContainsPC(RawObject* raw_obj, uword pc);
+
   friend class Function;
   friend class MarkingVisitor;
   friend class SkippedCodeFunctions;
   friend class StackFrame;
+  friend class Profiler;
 };
 
 
@@ -1074,14 +1087,6 @@
 class RawInstructions : public RawObject {
   RAW_HEAP_OBJECT_IMPLEMENTATION(Instructions);
 
-  RawObject** from() {
-    return reinterpret_cast<RawObject**>(&ptr()->code_);
-  }
-  RawCode* code_;
-  RawObjectPool* object_pool_;
-  RawObject** to() {
-    return reinterpret_cast<RawObject**>(&ptr()->object_pool_);
-  }
   int32_t size_;
 
   // Variable length data follows here.
@@ -1090,7 +1095,7 @@
   // Private helper function used while visiting stack frames. The
   // code which iterates over dart frames is also called during GC and
   // is not allowed to create handles.
-  static bool ContainsPC(RawObject* raw_obj, uword pc);
+  static bool ContainsPC(RawInstructions* raw_instr, uword pc);
 
   friend class RawCode;
   friend class RawFunction;
@@ -1100,6 +1105,7 @@
   friend class SkippedCodeFunctions;
   friend class Function;
   friend class InstructionsReader;
+  friend class InstructionsWriter;
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index 051855f..7f20153 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -654,7 +654,7 @@
          func.raw()->to_snapshot());
     READ_OBJECT_FIELDS(func,
                        func.raw()->from(), toobj,
-                       kAsReference);
+                       kAsInlinedObject);
     if (!reader->snapshot_code()) {
       // Initialize all fields that are not part of the snapshot.
       if (!is_optimized) {
@@ -662,7 +662,11 @@
       }
       func.ClearCode();
     } else {
-      // TODO(rmacnak): Fix entry_point_.
+      // Fix entry point.
+      (*reader->CodeHandle()) = func.CurrentCode();
+      uword new_entry = (*reader->CodeHandle()).EntryPoint();
+      ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry));
+      func.StoreNonPointer(&func.raw_ptr()->entry_point_, new_entry);
     }
     return func.raw();
   } else {
@@ -701,7 +705,7 @@
   writer->Write<bool>(is_in_fullsnapshot);
 
   if (kind == Snapshot::kFull || !is_in_fullsnapshot) {
-    bool is_optimized = Code::IsOptimized(ptr()->instructions_->ptr()->code_);
+    bool is_optimized = Code::IsOptimized(ptr()->code_);
 
     // Write out all the non object fields.
     writer->Write<int32_t>(ptr()->token_pos_);
@@ -722,7 +726,7 @@
     RawObject** toobj =
         writer->snapshot_code() ? to() :
         (is_optimized ? to_optimized_snapshot() : to_snapshot());
-    SnapshotWriterVisitor visitor(writer);
+    SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
     visitor.VisitPointers(from(), toobj);
   } else {
     writer->WriteFunctionId(this, owner_is_class);
@@ -1191,16 +1195,17 @@
 
   result.set_compile_timestamp(reader->Read<int64_t>());
   result.set_state_bits(reader->Read<int32_t>());
-  result.set_entry_patch_pc_offset(reader->Read<int32_t>());
-  result.set_patch_code_pc_offset(reader->Read<int32_t>());
   result.set_lazy_deopt_pc_offset(reader->Read<int32_t>());
 
   // Set all the object fields.
   READ_OBJECT_FIELDS(result,
                      result.raw()->from(), result.raw()->to(),
-                     kAsReference);
+                     kAsInlinedObject);
 
-  // TODO(rmacnak): Fix entry_point_.
+  // Fix entry point.
+  uword new_entry = result.EntryPoint();
+  ASSERT(Dart::vm_isolate()->heap()->CodeContains(new_entry));
+  result.StoreNonPointer(&result.raw_ptr()->entry_point_, new_entry);
 
   return result.raw();
 }
@@ -1229,12 +1234,10 @@
   // Write out all the non object fields.
   writer->Write<int64_t>(ptr()->compile_timestamp_);
   writer->Write<int32_t>(ptr()->state_bits_);
-  writer->Write<int32_t>(ptr()->entry_patch_pc_offset_);
-  writer->Write<int32_t>(ptr()->patch_code_pc_offset_);
   writer->Write<int32_t>(ptr()->lazy_deopt_pc_offset_);
 
   // Write out all the object pointer fields.
-  SnapshotWriterVisitor visitor(writer);
+  SnapshotWriterVisitor visitor(writer, kAsInlinedObject);
   visitor.VisitPointers(from(), to());
 
   writer->SetInstructionsCode(ptr()->instructions_, this);
@@ -1255,12 +1258,6 @@
                                reader->GetInstructionsAt(offset, full_tags));
   reader->AddBackRef(object_id, &result, kIsDeserialized);
 
-  {
-    // TODO(rmacnak): Drop after calling convention change.
-    Code::CheckedHandle(reader->ReadObjectImpl(kAsReference));
-    ObjectPool::CheckedHandle(reader->ReadObjectImpl(kAsReference));
-  }
-
   return result.raw();
 }
 
@@ -1271,28 +1268,19 @@
   ASSERT(writer->snapshot_code());
   ASSERT(kind == Snapshot::kFull);
 
-  {
-    // TODO(rmacnak): Drop after calling convention change.
-    writer->WriteInlinedObjectHeader(object_id);
-    writer->WriteVMIsolateObject(kInstructionsCid);
-    writer->WriteTags(writer->GetObjectTags(this));
-  }
+  writer->WriteInlinedObjectHeader(object_id);
+  writer->WriteVMIsolateObject(kInstructionsCid);
+  writer->WriteTags(writer->GetObjectTags(this));
 
-  writer->Write<intptr_t>(writer->GetObjectTags(this));  // For sanity check.
+  // Instructions will be written pre-marked and in the VM heap. Write out
+  // the tags we expect to find when reading the snapshot for a sanity check
+  // that our offsets/alignment didn't get out of sync.
+  uword written_tags = writer->GetObjectTags(this);
+  written_tags = RawObject::VMHeapObjectTag::update(true, written_tags);
+  written_tags = RawObject::MarkBit::update(true, written_tags);
+  writer->Write<intptr_t>(written_tags);
 
-  // Temporarily restore the object header for writing to the text section.
-  // TODO(asiva): Don't mutate object headers during serialization.
-  uword object_tags = writer->GetObjectTags(this);
-  uword snapshot_tags = ptr()->tags_;
-  ptr()->tags_ = object_tags;
   writer->Write<int32_t>(writer->GetInstructionsId(this));
-  ptr()->tags_ = snapshot_tags;
-
-  {
-    // TODO(rmacnak): Drop after calling convention change.
-    writer->WriteObjectImpl(ptr()->code_, kAsReference);
-    writer->WriteObjectImpl(ptr()->object_pool_, kAsReference);
-  }
 }
 
 
@@ -1330,20 +1318,10 @@
         result.SetRawValueAt(i, raw_value);
         break;
       }
-      case ObjectPool::kExternalLabel: {
-        // TODO(rmacnak): Relocate.
-        intptr_t raw_value = reader->Read<intptr_t>();
-        result.SetRawValueAt(i, raw_value);
-        break;
-      }
       case ObjectPool::kNativeEntry: {
         // Read nothing. Initialize with the lazy link entry.
-        uword entry = reinterpret_cast<uword>(&NativeEntry::LinkNativeCall);
-#if defined(USING_SIMULATOR)
-        entry = Simulator::RedirectExternalReference(
-            entry, Simulator::kBootstrapNativeCall, NativeEntry::kNumArguments);
-#endif
-        result.SetRawValueAt(i, entry);
+        uword new_entry = NativeEntry::LinkNativeCallEntry();
+        result.SetRawValueAt(i, static_cast<intptr_t>(new_entry));
         break;
       }
       default:
@@ -1379,19 +1357,18 @@
     writer->Write<int8_t>(entry_type);
     Entry& entry = ptr()->data()[i];
     switch (entry_type) {
-      case ObjectPool::kTaggedObject:
+      case ObjectPool::kTaggedObject: {
         writer->WriteObjectImpl(entry.raw_obj_, kAsReference);
         break;
-      case ObjectPool::kImmediate:
+      }
+      case ObjectPool::kImmediate: {
         writer->Write<intptr_t>(entry.raw_value_);
         break;
-      case ObjectPool::kExternalLabel:
-        // TODO(rmacnak): Write symbolically.
-        writer->Write<intptr_t>(entry.raw_value_);
-        break;
-      case ObjectPool::kNativeEntry:
+      }
+      case ObjectPool::kNativeEntry: {
         // Write nothing. Will initialize with the lazy link entry.
         break;
+      }
       default:
         UNREACHABLE();
     }
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index acdb5bf..e44d0d4 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -46,7 +46,7 @@
 
 #define LEAF_RUNTIME_ENTRY_LIST(V)                                             \
   V(void, PrintStopMessage, const char*)                                       \
-  V(intptr_t, DeoptimizeCopyFrame, uword)                                      \
+  V(intptr_t, DeoptimizeCopyFrame, uword, uword)                               \
   V(void, DeoptimizeFillFrame, uword)                                          \
   V(void, StoreBufferBlockProcess, Thread*)                                    \
   V(intptr_t, BigintCompare, RawBigint*, RawBigint*)                           \
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index fd1256e..e223803 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -526,7 +526,8 @@
       raw_object->VisitPointers(visitor);
     }
     pending->Reset();
-    isolate->store_buffer()->PushBlock(pending);
+    // Return the emptied block for recycling (no need to check threshold).
+    isolate->store_buffer()->PushBlock(pending, StoreBuffer::kIgnoreThreshold);
     pending = next;
   }
   heap_->RecordData(kStoreBufferEntries, total_count);
diff --git a/runtime/vm/service/running_isolates.dart b/runtime/vm/service/running_isolates.dart
index 48ac1f5..b10128c 100644
--- a/runtime/vm/service/running_isolates.dart
+++ b/runtime/vm/service/running_isolates.dart
@@ -47,8 +47,14 @@
     }
     var isolate = isolates[isolateId];
     if (isolate == null) {
-      message.setErrorResponse(
-          kInvalidParams, "invalid 'isolateId' parameter: $isolateParam");
+      // There is some chance that this isolate may have lived before,
+      // so return a sentinel rather than an error.
+      var result = {
+        'type' : 'Sentinel',
+        'kind' : 'Collected',
+        'valueAsString' : '<collected>',
+      };
+      message.setResponse(encodeResult(message, result));
       return message.response;
     }
     return isolate.route(message);
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index b390460..5aeab86 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -478,18 +478,21 @@
 ### getIsolate
 
 ```
-Isolate getIsolate(string isolateId)
+Isolate|Sentinel getIsolate(string isolateId)
 ```
 
 The _getIsolate_ RPC is used to lookup an _Isolate_ object by its _id_.
 
+If _isolateId_ refers to an isolate which has exited, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
 See [Isolate](#isolate).
 
 ### getObject
 
 ```
-Object|Sentinel  getObject(string isolateId,
-                           string objectId)
+Object|Sentinel getObject(string isolateId,
+                          string objectId)
 ```
 
 The _getObject_ RPC is used to lookup an _object_ from some isolate by
@@ -2113,7 +2116,7 @@
 ------- | --------
 1.0 draft 1 | initial revision
 1.1 | Describe protocol version 2.0.
-1.2 | Describe protocol version 3.0.  Added UnresolvedSourceLocation.
+1.2 | Describe protocol version 3.0.  Added UnresolvedSourceLocation.  Added Sentinel return to getIsolate.
 
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/vmservice.dart b/runtime/vm/service/vmservice.dart
index f2210c5..3c66673 100644
--- a/runtime/vm/service/vmservice.dart
+++ b/runtime/vm/service/vmservice.dart
@@ -51,6 +51,16 @@
   return JSON.encode(response);
 }
 
+String encodeResult(Message message, Map result) {
+  var response = {
+    'jsonrpc': '2.0',
+    'id' : message.serial,
+    'result' : result,
+  };
+  return JSON.encode(response);
+}
+
+
 class VMService extends MessageRouter {
   static VMService _instance;
 
@@ -174,15 +184,6 @@
     message.setResponse(JSON.encode(result));
   }
 
-  String _encodeResult(Message message, Map result) {
-    var response = {
-      'jsonrpc': '2.0',
-      'id' : message.serial,
-      'result' : result,
-    };
-    return JSON.encode(response);
-  }
-
   bool _isAnyClientSubscribed(String streamId) {
     for (var client in clients) {
       if (client.streams.contains(streamId)) {
@@ -209,7 +210,7 @@
     client.streams.add(streamId);
 
     var result = { 'type' : 'Success' };
-    return _encodeResult(message, result);
+    return encodeResult(message, result);
   }
 
   Future<String> _streamCancel(Message message) async {
@@ -225,7 +226,7 @@
     }
 
     var result = { 'type' : 'Success' };
-    return _encodeResult(message, result);
+    return encodeResult(message, result);
   }
 
   // TODO(johnmccutchan): Turn this into a command line tool that uses the
@@ -283,7 +284,7 @@
     }
 
     // Encode the entire crash dump.
-    return _encodeResult(message, responses);
+    return encodeResult(message, responses);
   }
 
   Future<String> route(Message message) {
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index decc5a7..515d5a5 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1179,8 +1179,12 @@
 
 
 int32_t InstructionsWriter::GetOffsetFor(RawInstructions* instructions) {
+  // Can't use instructions->Size() because the header was mutated by the
+  // snapshot writer.
+  intptr_t heap_size =
+      Instructions::InstanceSize(instructions->ptr()->size_);
   intptr_t offset = next_offset_;
-  next_offset_ += instructions->Size();
+  next_offset_ += heap_size;
   instructions_.Add(InstructionsData(instructions));
   return offset;
 }
@@ -1212,9 +1216,18 @@
 
   stream_.Print(".text\n");
   stream_.Print(".globl _kInstructionsSnapshot\n");
-  stream_.Print(".balign %" Pd ", 0\n", OS::PreferredCodeAlignment());
+  stream_.Print(".balign %" Pd ", 0\n", OS::kMaxPreferredCodeAlignment);
   stream_.Print("_kInstructionsSnapshot:\n");
 
+  // This head also provides the gap to make the instructions snapshot
+  // look like a HeapPage.
+  intptr_t instructions_length = next_offset_;
+  WriteWordLiteral(instructions_length);
+  intptr_t header_words = InstructionsSnapshot::kHeaderSize / sizeof(uword);
+  for (intptr_t i = 1; i < header_words; i++) {
+    WriteWordLiteral(0);
+  }
+
   Object& owner = Object::Handle(Z);
   String& str = String::Handle(Z);
 
@@ -1227,16 +1240,25 @@
     {
       // 1. Write from the header to the entry point.
       NoSafepointScope no_safepoint;
-      uword beginning = reinterpret_cast<uword>(insns.raw()) - kHeapObjectTag;
+
+      uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
       uword entry = beginning + Instructions::HeaderSize();
 
       ASSERT(Utils::IsAligned(beginning, sizeof(uint64_t)));
       ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
 
-      for (uint64_t* cursor = reinterpret_cast<uint64_t*>(beginning);
-           cursor < reinterpret_cast<uint64_t*>(entry);
+      // Write Instructions with the mark and VM heap bits set.
+      uword marked_tags = insns.raw_ptr()->tags_;
+      marked_tags = RawObject::VMHeapObjectTag::update(true, marked_tags);
+      marked_tags = RawObject::MarkBit::update(true, marked_tags);
+
+      WriteWordLiteral(marked_tags);
+      beginning += sizeof(uword);
+
+      for (uword* cursor = reinterpret_cast<uword*>(beginning);
+           cursor < reinterpret_cast<uword*>(entry);
            cursor++) {
-        stream_.Print(".quad 0x%0.16" Px64 "\n", *cursor);
+        WriteWordLiteral(*cursor);
       }
     }
 
@@ -1269,10 +1291,10 @@
       ASSERT(Utils::IsAligned(entry, sizeof(uint64_t)));
       ASSERT(Utils::IsAligned(end, sizeof(uint64_t)));
 
-      for (uint64_t* cursor = reinterpret_cast<uint64_t*>(entry);
-           cursor < reinterpret_cast<uint64_t*>(end);
+      for (uword* cursor = reinterpret_cast<uword*>(entry);
+           cursor < reinterpret_cast<uword*>(end);
            cursor++) {
-        stream_.Print(".quad 0x%0.16" Px64 "\n", *cursor);
+        WriteWordLiteral(*cursor);
       }
     }
   }
@@ -1294,9 +1316,9 @@
            actual_tags);
   }
 
-  // TODO(rmacnak): The above contains stale pointers to a Code and an
-  // ObjectPool. Return the actual result after calling convention change.
-  return Instructions::null();
+  ASSERT(result->IsMarked());
+
+  return result;
 }
 
 
@@ -1533,7 +1555,7 @@
         i, *(backrefs->At(i).reference()));
   }
   ResetBackwardReferenceTable();
-  Object::set_instructions_snapshot_buffer(instructions_buffer_);
+  Dart::set_instructions_snapshot_buffer(instructions_buffer_);
 }
 
 
@@ -2646,7 +2668,9 @@
 
 
 bool SnapshotWriter::AllowObjectsInDartLibrary(RawLibrary* library) {
-  return library == object_store()->typed_data_library();
+  return (library == object_store()->collection_library() ||
+          library == object_store()->core_library() ||
+          library == object_store()->typed_data_library());
 }
 
 
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index a23e692..4623e9d 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -196,6 +196,32 @@
 };
 
 
+class InstructionsSnapshot : ValueObject {
+ public:
+  explicit InstructionsSnapshot(const void* raw_memory)
+    : raw_memory_(raw_memory) {
+    ASSERT(Utils::IsAligned(raw_memory, OS::kMaxPreferredCodeAlignment));
+  }
+
+  void* instructions_start() {
+    return reinterpret_cast<void*>(
+        reinterpret_cast<uword>(raw_memory_) + kHeaderSize);
+  }
+
+  uword instructions_size() {
+    uword snapshot_size = *reinterpret_cast<const uword*>(raw_memory_);
+    return snapshot_size - kHeaderSize;
+  }
+
+  static const intptr_t kHeaderSize = OS::kMaxPreferredCodeAlignment;
+
+ private:
+  const void* raw_memory_;  // The symbol kInstructionsSnapshot.
+
+  DISALLOW_COPY_AND_ASSIGN(InstructionsSnapshot);
+};
+
+
 class BaseReader {
  public:
   BaseReader(const uint8_t* buffer, intptr_t size) : stream_(buffer, size) {}
@@ -786,7 +812,7 @@
                      ReAlloc alloc,
                      intptr_t initial_size)
     : stream_(buffer, alloc, initial_size),
-      next_offset_(0),
+      next_offset_(InstructionsSnapshot::kHeaderSize),
       instructions_() {
     ASSERT(buffer != NULL);
     ASSERT(alloc != NULL);
@@ -824,6 +850,14 @@
     };
   };
 
+  void WriteWordLiteral(uword value) {
+    // Padding is helpful for comparing the .S with --disassemble.
+#if defined(ARCH_IS_64_BIT)
+    stream_.Print(".quad 0x%0.16" Px "\n", value);
+#else
+    stream_.Print(".long 0x%0.8" Px "\n", value);
+#endif
+  }
 
   WriteStream stream_;
   intptr_t next_offset_;
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index bf5a05d..ff5f8a3 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -22,9 +22,15 @@
 
 bool StackFrame::IsStubFrame() const {
   ASSERT(!(IsEntryFrame() || IsExitFrame()));
-  uword saved_pc =
-      *(reinterpret_cast<uword*>(fp() + (kPcMarkerSlotFromFp * kWordSize)));
-  return (saved_pc == 0);
+#if !defined(TARGET_OS_WINDOWS)
+  // On Windows, the profiler calls this from a separate thread where
+  // Thread::Current() is NULL, so we cannot create a NoSafepointScope.
+  NoSafepointScope no_safepoint;
+#endif
+  RawCode* code = GetCodeObject();
+  intptr_t cid = code->ptr()->owner_->GetClassId();
+  ASSERT(cid == kNullCid || cid == kClassCid || cid == kFunctionCid);
+  return cid == kNullCid || cid == kClassCid;
 }
 
 
@@ -173,29 +179,27 @@
   // We add a no gc scope to ensure that the code below does not trigger
   // a GC as we are handling raw object references here. It is possible
   // that the code is called while a GC is in progress, that is ok.
+#if !defined(TARGET_OS_WINDOWS)
+  // On Windows, the profiler calls this from a separate thread where
+  // Thread::Current() is NULL, so we cannot create a NoSafepointScope.
   NoSafepointScope no_safepoint;
+#endif
   RawCode* code = GetCodeObject();
-  ASSERT(code == Code::null() || code->ptr()->owner_ != Function::null());
-  return code;
+  if ((code != Code::null()) &&
+      (code->ptr()->owner_->GetClassId() == kFunctionCid)) {
+    return code;
+  }
+  return Code::null();
 }
 
 
 RawCode* StackFrame::GetCodeObject() const {
-  // We add a no gc scope to ensure that the code below does not trigger
-  // a GC as we are handling raw object references here. It is possible
-  // that the code is called while a GC is in progress, that is ok.
-  NoSafepointScope no_safepoint;
   const uword pc_marker =
       *(reinterpret_cast<uword*>(fp() + (kPcMarkerSlotFromFp * kWordSize)));
-  if (pc_marker != 0) {
-    const uword entry_point =
-        (pc_marker - Assembler::EntryPointToPcMarkerOffset());
-    RawInstructions* instr = Instructions::FromEntryPoint(entry_point);
-    if (instr != Instructions::null()) {
-      return instr->ptr()->code_;
-    }
-  }
-  return Code::null();
+  ASSERT(pc_marker != 0);
+  ASSERT(reinterpret_cast<RawObject*>(pc_marker)->GetClassId() == kCodeCid ||
+         reinterpret_cast<RawObject*>(pc_marker) == Object::null());
+  return reinterpret_cast<RawCode*>(pc_marker);
 }
 
 
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 94ba9d3..5dd0f14 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -50,7 +50,12 @@
   }
 
   void set_pc(uword value) {
-    *reinterpret_cast<uword*>(sp_ + (kSavedPcSlotFromSp * kWordSize)) = value;
+    *reinterpret_cast<uword*>(sp() + (kSavedPcSlotFromSp * kWordSize)) = value;
+  }
+
+  void set_pc_marker(RawCode* code) {
+    *reinterpret_cast<RawCode**>(fp() + (kPcMarkerSlotFromFp * kWordSize)) =
+        code;
   }
 
   // Visit objects in the frame.
diff --git a/runtime/vm/stack_frame_arm.h b/runtime/vm/stack_frame_arm.h
index e391334..8f22815 100644
--- a/runtime/vm/stack_frame_arm.h
+++ b/runtime/vm/stack_frame_arm.h
@@ -12,16 +12,16 @@
                |                    | <- TOS
 Callee frame   | ...                |
                | saved PP           |    (PP of current frame)
+               | code object        |
                | saved FP           |    (FP of current frame)
                | saved LR           |    (PC of current frame)
-               | callee's PC marker |
                +--------------------+
 Current frame  | ...               T| <- SP of current frame
                | first local       T|
                | caller's PP       T|
+               | code object       T|    (current frame's code object)
                | caller's FP        | <- FP of current frame
                | caller's LR        |    (PC of caller frame)
-               | PC marker          |    (current frame's code entry + offset)
                +--------------------+
 Caller frame   | last parameter     | <- SP of caller frame
                |  ...               |
@@ -30,20 +30,20 @@
 */
 
 static const int kDartFrameFixedSize = 4;  // PP, FP, LR, PC marker.
-static const int kSavedPcSlotFromSp = -2;
+static const int kSavedPcSlotFromSp = -1;
 
 static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
 
-static const int kFirstLocalSlotFromFp = -2;
-static const int kSavedCallerPpSlotFromFp = -1;
+static const int kFirstLocalSlotFromFp = -3;
+static const int kSavedCallerPpSlotFromFp = -2;
+static const int kPcMarkerSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
 static const int kSavedCallerPcSlotFromFp = 1;
-static const int kPcMarkerSlotFromFp = 2;
-static const int kParamEndSlotFromFp = 2;  // One slot past last parameter.
-static const int kCallerSpSlotFromFp = 3;
+static const int kParamEndSlotFromFp = 1;  // One slot past last parameter.
+static const int kCallerSpSlotFromFp = 2;
 
 // Entry and exit frame layout.
-static const int kExitLinkSlotFromEntryFp = -26;
+static const int kExitLinkSlotFromEntryFp = -27;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_arm64.h b/runtime/vm/stack_frame_arm64.h
index f252897..6733724 100644
--- a/runtime/vm/stack_frame_arm64.h
+++ b/runtime/vm/stack_frame_arm64.h
@@ -11,14 +11,14 @@
                |                    | <- TOS
 Callee frame   | ...                |
                | saved PP           |
-               | callee's PC marker |
+               | code object        |
                | saved FP           |    (FP of current frame)
                | saved PC           |    (PC of current frame)
                +--------------------+
 Current frame  | ...               T| <- SP of current frame
                | first local       T|
                | caller's PP       T|
-               | PC marker          |    (current frame's code entry + offset)
+               | code object       T|    (current frame's code object)
                | caller's FP        | <- FP of current frame
                | caller's LR        |    (PC of caller frame)
                +--------------------+
@@ -31,7 +31,7 @@
 static const int kDartFrameFixedSize = 4;  // PP, FP, LR, PC marker.
 static const int kSavedPcSlotFromSp = -1;
 
-static const int kFirstObjectSlotFromFp = -2;  // Used by GC to traverse stack.
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
 
 static const int kFirstLocalSlotFromFp = -3;
 static const int kSavedCallerPpSlotFromFp = -2;
@@ -44,7 +44,7 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
-static const int kExitLinkSlotFromEntryFp = -21;
+static const int kExitLinkSlotFromEntryFp = -22;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_ia32.h b/runtime/vm/stack_frame_ia32.h
index f1a379b..a331aef 100644
--- a/runtime/vm/stack_frame_ia32.h
+++ b/runtime/vm/stack_frame_ia32.h
@@ -16,7 +16,7 @@
                +--------------------+
 Current frame  | ...               T| <- ESP of current frame
                | first local       T|
-               | PC marker          |    (current frame's code entry + offset)
+               | code object       T|    (current frame's code object)
                | caller's EBP       | <- EBP of current frame
                | caller's ret addr  |    (PC of caller frame)
                +--------------------+
@@ -29,7 +29,7 @@
 static const int kDartFrameFixedSize = 3;  // PC marker, EBP, PC.
 static const int kSavedPcSlotFromSp = -1;
 
-static const int kFirstObjectSlotFromFp = -2;  // Used by GC to traverse stack.
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
 
 static const int kFirstLocalSlotFromFp = -2;
 static const int kPcMarkerSlotFromFp = -1;
@@ -42,7 +42,7 @@
 static const int kSavedCallerPpSlotFromFp = kSavedCallerFpSlotFromFp;
 
 // Entry and exit frame layout.
-static const int kExitLinkSlotFromEntryFp = -6;
+static const int kExitLinkSlotFromEntryFp = -7;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_mips.h b/runtime/vm/stack_frame_mips.h
index 142ed61..3f7c7e5 100644
--- a/runtime/vm/stack_frame_mips.h
+++ b/runtime/vm/stack_frame_mips.h
@@ -17,9 +17,9 @@
 Current frame  | ...               T| <- SP of current frame
                | first local       T|
                | caller's PP       T|
+               | CODE_REG          T|    (current frame's code object)
                | caller's FP        | <- FP of current frame
                | caller's RA        |    (PC of caller frame)
-               | PC marker          |    (current frame's code entry + offset)
                +--------------------+
 Caller frame   | last parameter     | <- SP of caller frame
                |  ...               |
@@ -28,20 +28,20 @@
 */
 
 static const int kDartFrameFixedSize = 4;  // PP, FP, RA, PC marker.
-static const int kSavedPcSlotFromSp = -2;
+static const int kSavedPcSlotFromSp = -1;
 
 static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
 
-static const int kFirstLocalSlotFromFp = -2;
-static const int kSavedCallerPpSlotFromFp = -1;
+static const int kFirstLocalSlotFromFp = -3;
+static const int kSavedCallerPpSlotFromFp = -2;
+static const int kPcMarkerSlotFromFp = -1;
 static const int kSavedCallerFpSlotFromFp = 0;
 static const int kSavedCallerPcSlotFromFp = 1;
-static const int kPcMarkerSlotFromFp = 2;
-static const int kParamEndSlotFromFp = 2;  // One slot past last parameter.
-static const int kCallerSpSlotFromFp = 3;
+static const int kParamEndSlotFromFp = 1;  // One slot past last parameter.
+static const int kCallerSpSlotFromFp = 2;
 
 // Entry and exit frame layout.
-static const int kExitLinkSlotFromEntryFp = -23;
+static const int kExitLinkSlotFromEntryFp = -24;
 
 }  // namespace dart
 
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index 3d87d27..8fc20a4 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -12,14 +12,14 @@
                |                    | <- TOS
 Callee frame   | ...                |
                | saved PP           |
-               | callee's PC marker |
+               | code object        |
                | saved RBP          |    (RBP of current frame)
                | saved PC           |    (PC of current frame)
                +--------------------+
 Current frame  | ...               T| <- RSP of current frame
                | first local       T|
                | caller's PP       T|
-               | PC marker          |    (current frame's code entry + offset)
+               | code object       T|    (current frame's code object)
                | caller's RBP       | <- RBP of current frame
                | caller's ret addr  |    (PC of caller frame)
                +--------------------+
@@ -32,7 +32,7 @@
 static const int kDartFrameFixedSize = 4;  // PC marker, RBP, PP, PC.
 static const int kSavedPcSlotFromSp = -1;
 
-static const int kFirstObjectSlotFromFp = -2;  // Used by GC to traverse stack.
+static const int kFirstObjectSlotFromFp = -1;  // Used by GC to traverse stack.
 
 static const int kFirstLocalSlotFromFp = -3;
 static const int kSavedCallerPpSlotFromFp = -2;
@@ -46,9 +46,9 @@
 
 // Entry and exit frame layout.
 #if defined(_WIN64)
-static const int kExitLinkSlotFromEntryFp = -31;
+static const int kExitLinkSlotFromEntryFp = -32;
 #else
-static const int kExitLinkSlotFromEntryFp = -9;
+static const int kExitLinkSlotFromEntryFp = -10;
 #endif  // defined(_WIN64)
 
 }  // namespace dart
diff --git a/runtime/vm/store_buffer.cc b/runtime/vm/store_buffer.cc
index ca1ff21..cc0a816 100644
--- a/runtime/vm/store_buffer.cc
+++ b/runtime/vm/store_buffer.cc
@@ -11,49 +11,56 @@
 namespace dart {
 
 DEFINE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, 1, Thread* thread) {
-  thread->StoreBufferBlockProcess(true);
+  thread->StoreBufferBlockProcess(StoreBuffer::kCheckThreshold);
 }
 END_LEAF_RUNTIME_ENTRY
 
-
-StoreBuffer::List* StoreBuffer::global_empty_ = NULL;
-Mutex* StoreBuffer::global_mutex_ = NULL;
+template<int BlockSize>
+typename BlockStack<BlockSize>::List*
+BlockStack<BlockSize>::global_empty_ = NULL;
+template<int BlockSize>
+Mutex* BlockStack<BlockSize>::global_mutex_ = NULL;
 
 
-void StoreBuffer::InitOnce() {
+template<int BlockSize>
+void BlockStack<BlockSize>::InitOnce() {
   global_empty_ = new List();
   global_mutex_ = new Mutex();
 }
 
 
-void StoreBuffer::ShutDown() {
+template<int BlockSize>
+void BlockStack<BlockSize>::ShutDown() {
   delete global_empty_;
   delete global_mutex_;
 }
 
 
-StoreBuffer::StoreBuffer() : mutex_(new Mutex()) {
+template<int BlockSize>
+BlockStack<BlockSize>::BlockStack() : mutex_(new Mutex()) {
 }
 
 
-StoreBuffer::~StoreBuffer() {
+template<int BlockSize>
+BlockStack<BlockSize>::~BlockStack() {
   Reset();
   delete mutex_;
 }
 
 
-void StoreBuffer::Reset() {
+template<int BlockSize>
+void BlockStack<BlockSize>::Reset() {
   MutexLocker local_mutex_locker(mutex_);
   {
     // Empty all blocks and move them to the global cache.
     MutexLocker global_mutex_locker(global_mutex_);
     while (!full_.IsEmpty()) {
-      StoreBufferBlock* block = full_.Pop();
+      Block* block = full_.Pop();
       block->Reset();
       global_empty_->Push(block);
     }
     while (!partial_.IsEmpty()) {
-      StoreBufferBlock* block = partial_.Pop();
+      Block* block = partial_.Pop();
       block->Reset();
       global_empty_->Push(block);
     }
@@ -62,7 +69,8 @@
 }
 
 
-StoreBufferBlock* StoreBuffer::Blocks() {
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::Blocks() {
   MutexLocker ml(mutex_);
   while (!partial_.IsEmpty()) {
     full_.Push(partial_.Pop());
@@ -71,7 +79,8 @@
 }
 
 
-void StoreBuffer::PushBlock(StoreBufferBlock* block, bool check_threshold) {
+template<int BlockSize>
+void BlockStack<BlockSize>::PushBlockImpl(Block* block) {
   ASSERT(block->next() == NULL);  // Should be just a single block.
   if (block->IsFull()) {
     MutexLocker ml(mutex_);
@@ -84,7 +93,12 @@
     MutexLocker ml(mutex_);
     partial_.Push(block);
   }
-  if (check_threshold && Overflowed()) {
+}
+
+
+void StoreBuffer::PushBlock(Block* block, ThresholdPolicy policy) {
+  BlockStack<Block::kSize>::PushBlockImpl(block);
+  if ((policy == kCheckThreshold) && Overflowed()) {
     MutexLocker ml(mutex_);
     Isolate* isolate = Isolate::Current();
     // Sanity check: it makes no sense to schedule the GC in another isolate.
@@ -96,7 +110,9 @@
 }
 
 
-StoreBufferBlock* StoreBuffer::PopNonFullBlock() {
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block*
+BlockStack<BlockSize>::PopNonFullBlock() {
   {
     MutexLocker ml(mutex_);
     if (!partial_.IsEmpty()) {
@@ -107,18 +123,21 @@
 }
 
 
-StoreBufferBlock* StoreBuffer::PopEmptyBlock() {
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::PopEmptyBlock() {
   {
     MutexLocker ml(global_mutex_);
     if (!global_empty_->IsEmpty()) {
       return global_empty_->Pop();
     }
   }
-  return new StoreBufferBlock();
+  return new Block();
 }
 
 
-StoreBufferBlock* StoreBuffer::PopNonEmptyBlock() {
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block*
+BlockStack<BlockSize>::PopNonEmptyBlock() {
   MutexLocker ml(mutex_);
   if (!full_.IsEmpty()) {
     return full_.Pop();
@@ -130,21 +149,24 @@
 }
 
 
-bool StoreBuffer::IsEmpty() {
-  MutexLocker ml(global_mutex_);
+template<int BlockSize>
+bool BlockStack<BlockSize>::IsEmpty() {
+  MutexLocker ml(mutex_);
   return full_.IsEmpty() && partial_.IsEmpty();
 }
 
 
-StoreBuffer::List::~List() {
+template<int BlockSize>
+BlockStack<BlockSize>::List::~List() {
   while (!IsEmpty()) {
     delete Pop();
   }
 }
 
 
-StoreBufferBlock* StoreBuffer::List::Pop() {
-  StoreBufferBlock* result = head_;
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::List::Pop() {
+  Block* result = head_;
   head_ = head_->next_;
   --length_;
   result->next_ = NULL;
@@ -152,15 +174,17 @@
 }
 
 
-StoreBufferBlock* StoreBuffer::List::PopAll() {
-  StoreBufferBlock* result = head_;
+template<int BlockSize>
+typename BlockStack<BlockSize>::Block* BlockStack<BlockSize>::List::PopAll() {
+  Block* result = head_;
   head_ = NULL;
   length_ = 0;
   return result;
 }
 
 
-void StoreBuffer::List::Push(StoreBufferBlock* block) {
+template<int BlockSize>
+void BlockStack<BlockSize>::List::Push(Block* block) {
   ASSERT(block->next_ == NULL);
   block->next_ = head_;
   head_ = block;
@@ -174,11 +198,16 @@
 }
 
 
-void StoreBuffer::TrimGlobalEmpty() {
+template<int BlockSize>
+void BlockStack<BlockSize>::TrimGlobalEmpty() {
   DEBUG_ASSERT(global_mutex_->IsOwnedByCurrentThread());
   while (global_empty_->length() > kMaxGlobalEmpty) {
     delete global_empty_->Pop();
   }
 }
 
+
+template class BlockStack<kStoreBufferBlockSize>;
+template class BlockStack<kMarkingStackBlockSize>;
+
 }  // namespace dart
diff --git a/runtime/vm/store_buffer.h b/runtime/vm/store_buffer.h
index d6fcb7d..36f17bc 100644
--- a/runtime/vm/store_buffer.h
+++ b/runtime/vm/store_buffer.h
@@ -16,17 +16,17 @@
 class RawObject;
 
 // A set of RawObject*. Must be emptied before destruction (using Pop/Reset).
-class StoreBufferBlock {
+template<int Size>
+class PointerBlock {
  public:
-  // Each full block contains kSize pointers.
-  static const int32_t kSize = 1024;
+  enum { kSize = Size };
 
   void Reset() {
     top_ = 0;
     next_ = NULL;
   }
 
-  StoreBufferBlock* next() const { return next_; }
+  PointerBlock<Size>* next() const { return next_; }
 
   intptr_t Count() const { return top_; }
   bool IsFull() const { return Count() == kSize; }
@@ -53,73 +53,74 @@
   }
 #endif  // TESTING
 
-  static intptr_t top_offset() { return OFFSET_OF(StoreBufferBlock, top_); }
+  static intptr_t top_offset() { return OFFSET_OF(PointerBlock<Size>, top_); }
   static intptr_t pointers_offset() {
-    return OFFSET_OF(StoreBufferBlock, pointers_);
+    return OFFSET_OF(PointerBlock<Size>, pointers_);
   }
 
  private:
-  StoreBufferBlock() : next_(NULL), top_(0) {}
-  ~StoreBufferBlock() {
+  PointerBlock() : next_(NULL), top_(0) {}
+  ~PointerBlock() {
     ASSERT(IsEmpty());  // Guard against unintentionally discarding pointers.
   }
 
-  StoreBufferBlock* next_;
+  PointerBlock<Size>* next_;
   int32_t top_;
   RawObject* pointers_[kSize];
 
-  friend class StoreBuffer;
+  template<int> friend class BlockStack;
 
-  DISALLOW_COPY_AND_ASSIGN(StoreBufferBlock);
+  DISALLOW_COPY_AND_ASSIGN(PointerBlock);
 };
 
 
-class StoreBuffer {
+// A synchronized collection of pointer blocks of a particular size.
+// This class is meant to be used as a base (note PushBlockImpl is protected).
+// The global list of cached empty blocks is currently per-size.
+template<int BlockSize>
+class BlockStack {
  public:
-  StoreBuffer();
-  ~StoreBuffer();
+  typedef PointerBlock<BlockSize> Block;
+
+  BlockStack();
+  ~BlockStack();
   static void InitOnce();
   static void ShutDown();
 
-  // Interrupt when crossing this threshold of non-empty blocks in the buffer.
-  static const intptr_t kMaxNonEmpty = 100;
-
-  // Adds and transfers ownership of the block to the buffer.
-  void PushBlock(StoreBufferBlock* block, bool check_threshold = true);
   // Partially filled blocks can be reused, and there is an "inifite" supply
   // of empty blocks (reused or newly allocated). In any case, the caller
   // takes ownership of the returned block.
-  StoreBufferBlock* PopNonFullBlock();
-  StoreBufferBlock* PopEmptyBlock();
-  StoreBufferBlock* PopNonEmptyBlock();
+  Block* PopNonFullBlock();
+  Block* PopEmptyBlock();
+  Block* PopNonEmptyBlock();
 
   // Pops and returns all non-empty blocks as a linked list (owned by caller).
-  StoreBufferBlock* Blocks();
+  Block* Blocks();
 
-  // Discards the contents of this store buffer.
+  // Discards the contents of all non-empty blocks.
   void Reset();
 
-  // Check whether non-empty blocks have exceeded kMaxNonEmpty.
-  bool Overflowed();
-
   bool IsEmpty();
 
- private:
+ protected:
   class List {
    public:
     List() : head_(NULL), length_(0) {}
     ~List();
-    void Push(StoreBufferBlock* block);
-    StoreBufferBlock* Pop();
+    void Push(Block* block);
+    Block* Pop();
     intptr_t length() const { return length_; }
     bool IsEmpty() const { return head_ == NULL; }
-    StoreBufferBlock* PopAll();
+    Block* PopAll();
    private:
-    StoreBufferBlock* head_;
+    Block* head_;
     intptr_t length_;
     DISALLOW_COPY_AND_ASSIGN(List);
   };
 
+  // Adds and transfers ownership of the block to the buffer.
+  void PushBlockImpl(Block* block);
+
   // If needed, trims the the global cache of empty blocks.
   static void TrimGlobalEmpty();
 
@@ -127,13 +128,51 @@
   List partial_;
   Mutex* mutex_;
 
+  // Note: This is shared on the basis of block size.
   static const intptr_t kMaxGlobalEmpty = 100;
   static List* global_empty_;
   static Mutex* global_mutex_;
 
-  DISALLOW_COPY_AND_ASSIGN(StoreBuffer);
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BlockStack);
 };
 
+
+static const int kStoreBufferBlockSize = 1024;
+class StoreBuffer : public BlockStack<kStoreBufferBlockSize> {
+ public:
+  // Interrupt when crossing this threshold of non-empty blocks in the buffer.
+  static const intptr_t kMaxNonEmpty = 100;
+
+  enum ThresholdPolicy {
+    kCheckThreshold,
+    kIgnoreThreshold
+  };
+
+  // Adds and transfers ownership of the block to the buffer. Optionally
+  // checks the number of non-empty blocks for overflow, and schedules an
+  // interrupt on the current isolate if so.
+  void PushBlock(Block* block, ThresholdPolicy policy);
+
+  // Check whether non-empty blocks have exceeded kMaxNonEmpty (but takes no
+  // action).
+  bool Overflowed();
+};
+
+
+typedef StoreBuffer::Block StoreBufferBlock;
+
+
+static const int kMarkingStackBlockSize = 64;
+class MarkingStack : public BlockStack<kMarkingStackBlockSize> {
+ public:
+  // Adds and transfers ownership of the block to the buffer.
+  void PushBlock(Block* block) {
+    BlockStack<Block::kSize>::PushBlockImpl(block);
+  }
+};
+
+
 }  // namespace dart
 
 #endif  // VM_STORE_BUFFER_H_
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 65a4966..df7773d 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -104,10 +104,7 @@
   if (stub.IsNull()) {
     Assembler assembler;
     const char* name = cls.ToCString();
-    uword patch_code_offset = 0;
-    uword entry_patch_offset = 0;
-    StubCode::GenerateAllocationStubForClass(
-        &assembler, cls, &entry_patch_offset, &patch_code_offset);
+    StubCode::GenerateAllocationStubForClass(&assembler, cls);
     stub ^= Code::FinalizeCode(name, &assembler);
     stub.set_owner(cls);
     cls.set_allocation_stub(stub);
@@ -117,12 +114,9 @@
       DisassembleToStdout formatter;
       stub.Disassemble(&formatter);
       THR_Print("}\n");
-      const ObjectPool& object_pool = ObjectPool::Handle(
-          Instructions::Handle(stub.instructions()).object_pool());
+      const ObjectPool& object_pool = ObjectPool::Handle(stub.object_pool());
       object_pool.DebugPrint();
     }
-    stub.set_entry_patch_pc_offset(entry_patch_offset);
-    stub.set_patch_code_pc_offset(patch_code_offset);
   }
   return stub.raw();
 }
@@ -155,8 +149,7 @@
     DisassembleToStdout formatter;
     code.Disassemble(&formatter);
     THR_Print("}\n");
-    const ObjectPool& object_pool = ObjectPool::Handle(
-        Instructions::Handle(code.instructions()).object_pool());
+    const ObjectPool& object_pool = ObjectPool::Handle(code.object_pool());
     object_pool.DebugPrint();
   }
   return code.raw();
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 3d3c016..e7da564 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -165,9 +165,8 @@
                            void (*GenerateStub)(Assembler* assembler));
 
   static void GenerateMegamorphicMissStub(Assembler* assembler);
-  static void GenerateAllocationStubForClass(
-      Assembler* assembler, const Class& cls,
-      uword* entry_patch_offset, uword* patch_code_pc_offset);
+  static void GenerateAllocationStubForClass(Assembler* assembler,
+                                             const Class& cls);
   static void GenerateNArgsCheckInlineCacheStub(
       Assembler* assembler,
       intptr_t num_args,
@@ -180,6 +179,12 @@
   static void GenerateOptimizedUsageCounterIncrement(Assembler* assembler);
 };
 
+
+enum DeoptStubKind {
+  kLazyDeopt,
+  kEagerDeopt
+};
+
 }  // namespace dart
 
 #endif  // VM_STUB_CODE_H_
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 9d2883b..6c6f283 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -42,12 +42,11 @@
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
-  const intptr_t exitframe_last_param_slot_from_fp = 2;
 
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
-  __ LoadIsolate(R9);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R7)) != 0);
+  __ LoadIsolate(R7);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -56,7 +55,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R7, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -65,7 +64,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R7, Isolate::vm_tag_offset());
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -87,7 +86,7 @@
   ASSERT(argv_offset == 2 * kWordSize);
   __ add(R2, FP, Operand(R4, LSL, 2));  // Compute argv.
   // Set argv in NativeArguments.
-  __ AddImmediate(R2, exitframe_last_param_slot_from_fp * kWordSize);
+  __ AddImmediate(R2, kParamEndSlotFromFp * kWordSize);
 
   ASSERT(retval_offset == 3 * kWordSize);
   __ add(R3, R2, Operand(kWordSize));  // Retval is next to 1st argument.
@@ -97,7 +96,7 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R7, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
@@ -141,8 +140,8 @@
 
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
-  __ LoadIsolate(R9);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R7)) != 0);
+  __ LoadIsolate(R7);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -151,7 +150,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R7, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -160,7 +159,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R7, Isolate::vm_tag_offset());
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -183,7 +182,8 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, Operand(3 * kWordSize));  // Set retval in NativeArgs.
+  // Set retval in NativeArgs.
+  __ add(R3, FP, Operand(kCallerSpSlotFromFp * kWordSize));
 
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
@@ -192,20 +192,14 @@
   __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
   __ mov(R1, Operand(R5));  // Pass the function entrypoint to call.
+
   // Call native function invocation wrapper or redirection via simulator.
-#if defined(USING_SIMULATOR)
-  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
-  entry = Simulator::RedirectExternalReference(
-      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
-  __ LoadImmediate(R2, entry);
-  __ blx(R2);
-#else
-  __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNotPatchable);
-#endif
+  __ ldr(LR, Address(THR, Thread::native_call_wrapper_entry_point_offset()));
+  __ blx(LR);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R7, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
@@ -230,8 +224,8 @@
 
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R9)) != 0);
-  __ LoadIsolate(R9);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R7)) != 0);
+  __ LoadIsolate(R7);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -240,7 +234,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ LoadFromOffset(kWord, R6, R9, Isolate::vm_tag_offset());
+    __ LoadFromOffset(kWord, R6, R7, Isolate::vm_tag_offset());
     __ CompareImmediate(R6, VMTag::kDartTagId);
     __ b(&ok, EQ);
     __ Stop("Not coming from Dart code.");
@@ -249,7 +243,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R7, Isolate::vm_tag_offset());
 
   // Reserve space for the native arguments structure passed on the stack (the
   // outgoing pointer parameter to the native arguments structure is passed in
@@ -272,7 +266,8 @@
   // Set argv in NativeArguments: R2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ add(R3, FP, Operand(3 * kWordSize));  // Set retval in NativeArgs.
+  // Set retval in NativeArgs.
+  __ add(R3, FP, Operand(kCallerSpSlotFromFp * kWordSize));
 
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
@@ -285,7 +280,7 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R2, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R2, R7, Isolate::vm_tag_offset());
 
   // Reset exit frame information in Isolate structure.
   __ LoadImmediate(R2, 0);
@@ -311,6 +306,7 @@
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
+  __ mov(CODE_REG, Operand(R0));
   __ ldr(R0, FieldAddress(R0, Code::entry_point_offset()));
   __ bx(R0);
 }
@@ -320,6 +316,10 @@
 // (invalid because its function was optimized or deoptimized).
 // R4: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ ldr(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset()));
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -332,6 +332,7 @@
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
+  __ mov(CODE_REG, Operand(R0));
   __ ldr(R0, FieldAddress(R0, Code::entry_point_offset()));
   __ bx(R0);
 }
@@ -340,6 +341,10 @@
 // Called from object allocate instruction when the allocation stub has been
 // disabled.
 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ ldr(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset()));
   __ EnterStubFrame();
   // Setup space on stack for return value.
   __ LoadObject(R0, Object::null_object());
@@ -350,6 +355,7 @@
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
+  __ mov(CODE_REG, Operand(R0));
   __ ldr(R0, FieldAddress(R0, Code::entry_point_offset()));
   __ bx(R0);
 }
@@ -403,13 +409,15 @@
 //   +------------------+
 //   | Saved LR         |  (deoptimization point)
 //   +------------------+
-//   | PC marker        |
+//   | pc marker        |
+//   +------------------+
+//   | Saved CODE_REG   |
 //   +------------------+
 //   | ...              | <- SP of optimized frame
 //
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
-                                           bool preserve_result) {
+                                           DeoptStubKind kind) {
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
 
@@ -419,21 +427,10 @@
   __ eor(LR, IP, Operand(LR));
   __ eor(IP, IP, Operand(LR));
 
-  // Set up the frame manually. We can't use EnterFrame because we can't
-  // clobber LR (or any other register) with 0, yet.
-  __ sub(SP, SP, Operand(kWordSize));  // Make room for PC marker of 0.
-  __ Push(IP);  // Push return address.
-  __ Push(FP);
-  __ mov(FP, Operand(SP));
-  __ Push(PP);
-
+  // Set up the frame manually with return address now stored in IP.
+  __ EnterFrame((1 << PP) | (1 << CODE_REG) | (1 << FP) | (1 << IP), 0);
   __ LoadPoolPointer();
 
-  // Now that IP holding the return address has been written to the stack,
-  // we can clobber it with 0 to write the null PC marker.
-  __ mov(IP, Operand(0));
-  __ str(IP, Address(SP, +3 * kWordSize));
-
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
@@ -442,7 +439,17 @@
 
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
-  __ PushList(kAllCpuRegistersList);
+  for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; --i) {
+    if (i == CODE_REG) {
+      // Save the original value of CODE_REG pushed before invoking this stub
+      // instead of the value used to call this stub.
+      COMPILE_ASSERT(IP > CODE_REG);  // Assert IP is pushed first.
+      __ ldr(IP, Address(FP, kCallerSpSlotFromFp * kWordSize));
+      __ Push(IP);
+    } else {
+      __ Push(static_cast<Register>(i));
+    }
+  }
 
   if (TargetCPUFeatures::vfp_supported()) {
     ASSERT(kFpuRegisterSize == 4 * kWordSize);
@@ -457,15 +464,18 @@
   }
 
   __ mov(R0, Operand(SP));  // Pass address of saved registers block.
+  __ mov(R1, Operand(kind == kLazyDeopt ? 1 : 0));
   __ ReserveAlignedFrameSpace(0);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (R0) is stack-size (FP - SP) in bytes.
 
+  const bool preserve_result = (kind == kLazyDeopt);
   if (preserve_result) {
     // Restore result into R1 temporarily.
     __ ldr(R1, Address(FP, saved_result_slot_from_fp * kWordSize));
   }
 
+  __ RestoreCodePointer();
   __ LeaveDartFrame();
   __ sub(SP, FP, Operand(R0));
 
@@ -483,6 +493,7 @@
     __ ldr(R1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
   }
   // Code above cannot cause GC.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   // Frame is fully rewritten at this point and it is safe to perform a GC.
@@ -511,13 +522,16 @@
 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
   // Correct return address to point just after the call that is being
   // deoptimized.
-  __ AddImmediate(LR, -CallPattern::LengthInBytes());
-  GenerateDeoptimizationSequence(assembler, true);  // Preserve R0.
+  __ AddImmediate(LR, -CallPattern::DeoptCallPatternLengthInBytes());
+  // Push zap value instead of CODE_REG for lazy deopt.
+  __ LoadImmediate(IP, 0xf1f1f1f1);
+  __ Push(IP);
+  GenerateDeoptimizationSequence(assembler, kLazyDeopt);
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve R0.
+  GenerateDeoptimizationSequence(assembler, kEagerDeopt);
 }
 
 
@@ -573,6 +587,7 @@
   // Restore IC data and arguments descriptor.
   __ PopList((1 << R4) | (1 << R5));
 
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   if (!FLAG_lazy_dispatchers) {
@@ -582,6 +597,7 @@
   }
 
   // Tail-call to target function.
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R2, FieldAddress(R0, Function::entry_point_offset()));
   __ bx(R2);
 }
@@ -620,24 +636,24 @@
                           /* inline_isolate = */ false);
 
   const intptr_t fixed_size = sizeof(RawArray) + kObjectAlignment - 1;
-  __ LoadImmediate(R9, fixed_size);
-  __ add(R9, R9, Operand(R3, LSL, 1));  // R3 is  a Smi.
+  __ LoadImmediate(R5, fixed_size);
+  __ add(R5, R5, Operand(R3, LSL, 1));  // R3 is  a Smi.
   ASSERT(kSmiTagShift == 1);
-  __ bic(R9, R9, Operand(kObjectAlignment - 1));
+  __ bic(R5, R5, Operand(kObjectAlignment - 1));
 
-  // R9: Allocation size.
+  // R5: Allocation size.
   Heap::Space space = Heap::SpaceForAllocation(cid);
   __ LoadIsolate(R6);
   __ ldr(R6, Address(R6, Isolate::heap_offset()));
   // Potential new object start.
   __ ldr(R0, Address(R6, Heap::TopOffset(space)));
-  __ adds(R7, R0, Operand(R9));  // Potential next object start.
+  __ adds(R7, R0, Operand(R5));  // Potential next object start.
   __ b(&slow_case, CS);  // Branch if unsigned overflow.
 
   // Check if the allocation fits into the remaining space.
   // R0: potential new object start.
   // R7: potential next object start.
-  // R9: allocation size.
+  // R5: allocation size.
   __ ldr(R3, Address(R6, Heap::EndOffset(space)));
   __ cmp(R7, Operand(R3));
   __ b(&slow_case, CS);
@@ -652,12 +668,12 @@
   // R0: new object start as a tagged pointer.
   // R3: allocation stats address.
   // R7: new object end address.
-  // R9: allocation size.
+  // R5: allocation size.
   {
     const intptr_t shift = RawObject::kSizeTagPos - kObjectAlignmentLog2;
 
-    __ CompareImmediate(R9, RawObject::SizeTag::kMaxSizeTag);
-    __ mov(R6, Operand(R9, LSL, shift), LS);
+    __ CompareImmediate(R5, RawObject::SizeTag::kMaxSizeTag);
+    __ mov(R6, Operand(R5, LSL, shift), LS);
     __ mov(R6, Operand(0), HI);
 
     // Get the class index and insert it into the tags.
@@ -686,13 +702,13 @@
   // R6: iterator which initially points to the start of the variable
   // data area to be initialized.
   // R7: new object end address.
-  // R9: allocation size.
+  // R5: allocation size.
+  __ IncrementAllocationStatsWithSize(R3, R5, space);
 
   __ LoadObject(R4, Object::null_object());
   __ mov(R5, Operand(R4));
   __ AddImmediate(R6, R0, sizeof(RawArray) - kHeapObjectTag);
   __ InitializeFieldsNoBarrier(R0, R6, R7, R4, R5);
-  __ IncrementAllocationStatsWithSize(R3, R9, space);
   __ Ret();  // Returns the newly allocated object in R0.
   // Unable to allocate the array using the fast inline code, just call
   // into the runtime.
@@ -717,7 +733,7 @@
 // Called when invoking Dart code from C++ (VM code).
 // Input parameters:
 //   LR : points to return address.
-//   R0 : entrypoint of the Dart function to call.
+//   R0 : code object of the Dart function to call.
 //   R1 : arguments descriptor array.
 //   R2 : arguments array.
 //   R3 : current thread.
@@ -725,6 +741,10 @@
   // Save frame pointer coming in.
   __ EnterFrame((1 << FP) | (1 << LR), 0);
 
+  // Push code object to PC marker slot.
+  __ ldr(IP, Address(R3, Thread::invoke_dart_code_stub_offset()));
+  __ Push(IP);
+
   // Save new context and C++ ABI callee-saved registers.
   __ PushList(kAbiPreservedCpuRegs);
 
@@ -737,24 +757,19 @@
     __ sub(SP, SP, Operand(kAbiPreservedFpuRegCount * kFpuRegisterSize));
   }
 
-  // We now load the pool pointer(PP) as we are about to invoke dart code and we
-  // could potentially invoke some intrinsic functions which need the PP to be
-  // set up.
-  __ LoadPoolPointer();
-
   // Set up THR, which caches the current thread in Dart code.
   if (THR != R3) {
     __ mov(THR, Operand(R3));
   }
-  __ LoadIsolate(R9);
+  __ LoadIsolate(R7);
 
   // Save the current VMTag on the stack.
-  __ LoadFromOffset(kWord, R5, R9, Isolate::vm_tag_offset());
+  __ LoadFromOffset(kWord, R5, R7, Isolate::vm_tag_offset());
   __ Push(R5);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R5, VMTag::kDartTagId);
-  __ StoreToOffset(kWord, R5, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R5, R7, Isolate::vm_tag_offset());
 
   // Save top resource and top exit frame info. Use R4-6 as temporary registers.
   // StackFrameIterator reads the top exit frame info saved in this frame.
@@ -766,7 +781,7 @@
 
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
   __ Push(R4);
-  ASSERT(kExitLinkSlotFromEntryFp == -26);
+  ASSERT(kExitLinkSlotFromEntryFp == -27);
   __ Push(R5);
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -796,12 +811,15 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
+  __ LoadImmediate(PP, 0);  // GC safe value into PP.
+  __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle));
+  __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ blx(R0);  // R4 is the arguments descriptor array.
 
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
 
-  __ LoadIsolate(R9);
+  __ LoadIsolate(R7);
   // Restore the saved top exit frame info and top resource back into the
   // Isolate structure. Uses R5 as a temporary register for this.
   __ Pop(R5);
@@ -811,7 +829,7 @@
 
   // Restore the current VMTag from the stack.
   __ Pop(R4);
-  __ StoreToOffset(kWord, R4, R9, Isolate::vm_tag_offset());
+  __ StoreToOffset(kWord, R4, R7, Isolate::vm_tag_offset());
 
   // Restore C++ ABI callee-saved registers.
   if (TargetCPUFeatures::vfp_supported()) {
@@ -1030,12 +1048,11 @@
 // Input parameters:
 //   LR : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-// Returns patch_code_pc offset where patching code for disabling the stub
-// has been generated (similar to regularly generated Dart code).
-void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls,
-    uword* entry_patch_offset, uword* patch_code_pc_offset) {
-  *entry_patch_offset = assembler->CodeSize();
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
+  // Must load pool pointer before being able to patch.
+  Register new_pp = R7;
+  __ LoadPoolPointer(new_pp);
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1161,8 +1178,6 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ Ret();
-  *patch_code_pc_offset = assembler->CodeSize();
-  __ BranchPatchable(*StubCode::FixAllocationStubTarget_entry());
 }
 
 
@@ -1317,6 +1332,7 @@
     Token::Kind kind,
     RangeCollectionMode range_collection_mode,
     bool optimized) {
+  __ CheckCodePointer();
   ASSERT(num_args > 0);
 #if defined(DEBUG)
   { Label ok;
@@ -1441,6 +1457,9 @@
   // Pop returned function object into R0.
   // Restore arguments descriptor array and IC data array.
   __ PopList((1 << R0) | (1 << R4) | (1 << R5));
+  if (range_collection_mode == kCollectRanges) {
+    __ RestoreCodePointer();
+  }
   __ LeaveStubFrame();
   Label call_target_function;
   if (!FLAG_lazy_dispatchers) {
@@ -1478,15 +1497,18 @@
     } else {
       __ PushList((1 << R1) | (1 << R5));
     }
+    __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
     __ blx(R2);
 
     Label done;
     __ ldr(R5, Address(FP, kFirstLocalSlotFromFp * kWordSize));
     __ UpdateRangeFeedback(R0, 2, R5, R1, R4, &done);
     __ Bind(&done);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ Ret();
   } else {
+    __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
     __ bx(R2);
   }
 
@@ -1496,6 +1518,7 @@
     __ Push(R5);  // Preserve IC data.
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ Pop(R5);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1646,6 +1669,7 @@
 
   // Get function and call it, if possible.
   __ LoadFromOffset(kWord, R0, R6, target_offset);
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R2, FieldAddress(R0, Function::entry_point_offset()));
   __ bx(R2);
 
@@ -1655,6 +1679,7 @@
     __ Push(R5);  // Preserve IC data.
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ Pop(R5);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1691,6 +1716,7 @@
   __ PopList((1 << R4) | (1 << R5));  // Restore arg desc. and IC data.
   __ LeaveStubFrame();
 
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(R2, FieldAddress(R0, Function::entry_point_offset()));
   __ bx(R2);
 }
@@ -1705,6 +1731,8 @@
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
   __ PopList((1 << R0) | (1 << R5));
   __ LeaveStubFrame();
+  __ mov(CODE_REG, Operand(R0));
+  __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ bx(R0);
 }
 
@@ -1715,8 +1743,9 @@
   // Make room for result.
   __ PushList((1 << R0));
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ PopList((1 << R0));
+  __ PopList((1 << CODE_REG));
   __ LeaveStubFrame();
+  __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ bx(R0);
 }
 
@@ -1896,8 +1925,9 @@
   __ Pop(R0);  // Discard argument.
   __ Pop(R0);  // Get Code object
   __ Pop(R4);  // Restore argument descriptor.
-  __ ldr(R0, FieldAddress(R0, Code::entry_point_offset()));
   __ LeaveStubFrame();
+  __ mov(CODE_REG, Operand(R0));
+  __ ldr(R0, FieldAddress(R0, Code::entry_point_offset()));
   __ bx(R0);
   __ bkpt(0);
 }
@@ -1999,6 +2029,7 @@
     __ Bind(&stepping);
     __ EnterStubFrame();
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -2058,6 +2089,7 @@
   // be invoked as a normal Dart function.
   __ add(IP, R2, Operand(R3, LSL, 2));
   __ ldr(R0, FieldAddress(IP, base + kWordSize));
+  __ ldr(CODE_REG, FieldAddress(R0, Function::code_offset()));
   __ ldr(target, FieldAddress(R0, Function::entry_point_offset()));
 }
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 4148925..41d4544 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -41,7 +41,6 @@
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
-  const intptr_t exitframe_last_param_slot_from_fp = 1;
 
   __ SetPrologueOffset();
   __ Comment("CallToRuntimeStub");
@@ -91,7 +90,7 @@
   __ add(R2, ZR, Operand(R4, LSL, 3));
   __ add(R2, FP, Operand(R2));  // Compute argv.
   // Set argv in NativeArguments.
-  __ AddImmediate(R2, R2, exitframe_last_param_slot_from_fp * kWordSize);
+  __ AddImmediate(R2, R2, kParamEndSlotFromFp * kWordSize);
 
     ASSERT(retval_offset == 3 * kWordSize);
   __ AddImmediate(R3, R2, kWordSize);
@@ -215,16 +214,10 @@
   __ mov(CSP, SP);
 
   __ mov(R1, R5);  // Pass the function entrypoint to call.
+
   // Call native function invocation wrapper or redirection via simulator.
-#if defined(USING_SIMULATOR)
-  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
-  entry = Simulator::RedirectExternalReference(
-      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
-  __ LoadImmediate(R2, entry);
-  __ blr(R2);
-#else
-  __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
-#endif
+  __ ldr(LR, Address(THR, Thread::native_call_wrapper_entry_point_offset()));
+  __ blr(LR);
 
   // Restore SP and CSP.
   __ mov(SP, CSP);
@@ -346,12 +339,12 @@
   __ PushObject(Object::null_object());
   __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
-  __ Pop(R0);
+  __ Pop(CODE_REG);
   __ Pop(R4);
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
-  __ LoadFieldFromOffset(R0, R0, Code::entry_point_offset());
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ br(R0);
 }
 
@@ -360,6 +353,10 @@
 // (invalid because its function was optimized or deoptimized).
 // R4: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ ldr(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset()));
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
   __ EnterStubFrame();
@@ -368,12 +365,12 @@
   __ PushObject(Object::null_object());
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
-  __ Pop(R0);
+  __ Pop(CODE_REG);
   __ Pop(R4);
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
-  __ LoadFieldFromOffset(R0, R0, Code::entry_point_offset());
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ br(R0);
 }
 
@@ -381,16 +378,20 @@
 // Called from object allocate instruction when the allocation stub has been
 // disabled.
 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ ldr(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset()));
   __ EnterStubFrame();
   // Setup space on stack for return value.
   __ PushObject(Object::null_object());
   __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
   // Get Code object result.
-  __ Pop(R0);
+  __ Pop(CODE_REG);
   // Remove the stub frame.
   __ LeaveStubFrame();
   // Jump to the dart function.
-  __ LoadFieldFromOffset(R0, R0, Code::entry_point_offset());
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ br(R0);
 }
 
@@ -448,11 +449,13 @@
 //   +------------------+
 //   | return-address   |  (deoptimization point)
 //   +------------------+
+//   | Saved CODE_REG   |
+//   +------------------+
 //   | ...              | <- SP of optimized frame
 //
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
-                                           bool preserve_result) {
+                                           DeoptStubKind kind) {
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
   __ EnterStubFrame();
@@ -467,7 +470,15 @@
   // lowest address.
   for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) {
     const Register r = static_cast<Register>(i);
-    __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
+    if (r == CODE_REG) {
+      // Save the original value of CODE_REG pushed before invoking this stub
+      // instead of the value used to call this stub.
+      COMPILE_ASSERT(R25 > CODE_REG);
+      __ ldr(R25, Address(FP, 2 * kWordSize));
+      __ str(R25, Address(SP, -1 * kWordSize, Address::PreIndex));
+    } else {
+      __ str(r, Address(SP, -1 * kWordSize, Address::PreIndex));
+    }
   }
 
   for (intptr_t reg_idx = kNumberOfVRegisters - 1; reg_idx >= 0; reg_idx--) {
@@ -476,16 +487,19 @@
   }
 
   __ mov(R0, SP);  // Pass address of saved registers block.
+  __ LoadImmediate(R1, kind == kLazyDeopt ? 1 : 0);
   __ ReserveAlignedFrameSpace(0);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (R0) is stack-size (FP - SP) in bytes.
 
+  const bool preserve_result = (kind == kLazyDeopt);
   if (preserve_result) {
     // Restore result into R1 temporarily.
     __ LoadFromOffset(R1, FP, saved_result_slot_from_fp * kWordSize);
   }
 
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
   __ sub(SP, FP, Operand(R0));
 
@@ -505,6 +519,7 @@
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   // Frame is fully rewritten at this point and it is safe to perform a GC.
@@ -534,13 +549,16 @@
 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
   // Correct return address to point just after the call that is being
   // deoptimized.
-  __ AddImmediate(LR, LR, -CallPattern::kLengthInBytes);
-  GenerateDeoptimizationSequence(assembler, true);  // Preserve R0.
+  __ AddImmediate(LR, LR, -CallPattern::kDeoptCallLengthInBytes);
+  // Push zap value instead of CODE_REG for lazy deopt.
+  __ LoadImmediate(TMP, 0xf1f1f1f1);
+  __ Push(TMP);
+  GenerateDeoptimizationSequence(assembler, kLazyDeopt);
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve R0.
+  GenerateDeoptimizationSequence(assembler, kEagerDeopt);
 }
 
 
@@ -601,6 +619,7 @@
   __ Pop(R4);
   __ Pop(R5);
 
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   if (!FLAG_lazy_dispatchers) {
@@ -610,6 +629,7 @@
   }
 
   // Tail-call to target function.
+  __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
   __ br(R2);
 }
@@ -766,7 +786,7 @@
 // Called when invoking Dart code from C++ (VM code).
 // Input parameters:
 //   LR : points to return address.
-//   R0 : entrypoint of the Dart function to call.
+//   R0 : code object of the Dart function to call.
 //   R1 : arguments descriptor array.
 //   R2 : arguments array.
 //   R3 : current thread.
@@ -778,6 +798,10 @@
   __ SetupDartSP(Isolate::GetSpecifiedStackSize());
   __ EnterFrame(0);
 
+  // Push code object to PC marker slot.
+  __ ldr(TMP, Address(R3, Thread::invoke_dart_code_stub_offset()));
+  __ Push(TMP);
+
   // Save the callee-saved registers.
   for (int i = kAbiFirstPreservedCpuReg; i <= kAbiLastPreservedCpuReg; i++) {
     const Register r = static_cast<Register>(i);
@@ -793,11 +817,6 @@
     __ PushDouble(r);
   }
 
-  // We now load the pool pointer(PP) as we are about to invoke dart code and we
-  // could potentially invoke some intrinsic functions which need the PP to be
-  // set up.
-  __ LoadPoolPointer();
-
   // Set up THR, which caches the current thread in Dart code.
   if (THR != R3) {
     __ mov(THR, R3);
@@ -821,7 +840,7 @@
   __ LoadFromOffset(R6, THR, Thread::top_exit_frame_info_offset());
   __ StoreToOffset(ZR, THR, Thread::top_exit_frame_info_offset());
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -21);
+  ASSERT(kExitLinkSlotFromEntryFp == -22);
   __ Push(R6);
 
   // Load arguments descriptor array into R4, which is passed to Dart code.
@@ -850,13 +869,17 @@
   __ b(&push_arguments, LT);
   __ Bind(&done_push_arguments);
 
+  // We now load the pool pointer(PP) with a GC safe value as we are about to
+  // invoke dart code. We don't need a real object pool here.
+  // Smi zero does not work because ARM64 assumes PP to be untagged.
+  __ LoadObject(PP, Object::null_object());
+
   // Call the Dart code entrypoint.
+  __ ldr(CODE_REG, Address(R0, VMHandles::kOffsetOfRawPtrInHandle));
+  __ ldr(R0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ blr(R0);  // R4 is the arguments descriptor array.
   __ Comment("InvokeDartCodeStub return");
 
-  // Restore constant pool pointer after return.
-  __ LoadPoolPointer();
-
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
 
@@ -888,7 +911,6 @@
     // using it as the stack pointer.
     __ ldr(r, Address(SP, 1 * kWordSize, Address::PostIndex));
   }
-  __ set_constant_pool_allowed(false);
 
   // Restore the frame pointer and C stack pointer and return.
   __ LeaveFrame();
@@ -1074,10 +1096,8 @@
 // Input parameters:
 //   LR : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls,
-    uword* entry_patch_offset, uword* patch_code_pc_offset) {
-  *entry_patch_offset = assembler->CodeSize();
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1197,8 +1217,6 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
-  *patch_code_pc_offset = assembler->CodeSize();
-  __ BranchPatchable(*StubCode::FixAllocationStubTarget_entry());
 }
 
 
@@ -1515,6 +1533,9 @@
   __ Pop(R0);  // Pop returned function object into R0.
   __ Pop(R5);  // Restore IC Data.
   __ Pop(R4);  // Restore arguments descriptor array.
+  if (range_collection_mode == kCollectRanges) {
+    __ RestoreCodePointer();
+  }
   __ LeaveStubFrame();
   Label call_target_function;
   if (!FLAG_lazy_dispatchers) {
@@ -1542,8 +1563,8 @@
   __ Comment("Call target");
   __ Bind(&call_target_function);
   // R0: target function.
-  __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
   if (range_collection_mode == kCollectRanges) {
+    __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
     __ ldr(R1, Address(SP, 0 * kWordSize));
     if (num_args == 2) {
       __ ldr(R3, Address(SP, 1 * kWordSize));
@@ -1554,6 +1575,7 @@
       __ Push(R3);
     }
     __ Push(R1);
+    __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
     __ blr(R2);
 
     Label done;
@@ -1563,6 +1585,8 @@
     __ LeaveStubFrame();
     __ ret();
   } else {
+    __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
+    __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
     __ br(R2);
   }
 
@@ -1572,6 +1596,7 @@
     __ Push(R5);  // Preserve IC data.
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ Pop(R5);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1716,6 +1741,7 @@
 
   // Get function and call it, if possible.
   __ LoadFromOffset(R0, R6, target_offset);
+  __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
   __ br(R2);
 
@@ -1725,6 +1751,7 @@
     __ Push(R5);  // Preserve IC data.
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ Pop(R5);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1763,6 +1790,7 @@
   __ Pop(R5);  // Restore IC Data.
   __ LeaveStubFrame();
 
+  __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R2, R0, Function::entry_point_offset());
   __ br(R2);
 }
@@ -1774,9 +1802,10 @@
   __ Push(R5);
   __ PushObject(Object::null_object());  // Space for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ Pop(R0);
+  __ Pop(CODE_REG);
   __ Pop(R5);
   __ LeaveStubFrame();
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ br(R0);
 }
 
@@ -1785,8 +1814,9 @@
   __ EnterStubFrame();
   __ PushObject(Object::null_object());  // Space for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ Pop(R0);
+  __ Pop(CODE_REG);
   __ LeaveStubFrame();
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ br(R0);
 }
 
@@ -1964,9 +1994,9 @@
   __ Push(R6);
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ Pop(R0);  // Discard argument.
-  __ Pop(R0);  // Get Code object
+  __ Pop(CODE_REG);  // Get Code object
   __ Pop(R4);  // Restore argument descriptor.
-  __ LoadFieldFromOffset(R0, R0, Code::entry_point_offset());
+  __ LoadFieldFromOffset(R0, CODE_REG, Code::entry_point_offset());
   __ LeaveStubFrame();
   __ br(R0);
   __ brk(0);
@@ -2059,6 +2089,7 @@
     __ Bind(&stepping);
     __ EnterStubFrame();
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -2117,6 +2148,7 @@
   // be invoked as a normal Dart function.
   __ add(TMP, R2, Operand(R3, LSL, 3));
   __ LoadFieldFromOffset(R0, TMP, base + kWordSize);
+  __ LoadFieldFromOffset(CODE_REG, R0, Function::code_offset());
   __ LoadFieldFromOffset(R1, R0, Function::entry_point_offset());
 }
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 669c874..f070b1b 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -80,7 +80,8 @@
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
   __ movl(Address(ESP, argc_tag_offset), EDX);  // Set argc in NativeArguments.
-  __ leal(EAX, Address(EBP, EDX, TIMES_4, 1 * kWordSize));  // Compute argv.
+  // Compute argv.
+  __ leal(EAX, Address(EBP, EDX, TIMES_4, kParamEndSlotFromFp * kWordSize));
   __ movl(Address(ESP, argv_offset), EAX);  // Set argv in NativeArguments.
   __ addl(EAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
   __ movl(Address(ESP, retval_offset), EAX);  // Set retval in NativeArguments.
@@ -178,7 +179,8 @@
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
 
   __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
-  __ call(&NativeEntry::NativeCallWrapperLabel());
+  ExternalLabel label(NativeEntry::NativeCallWrapperEntry());
+  __ call(&label);
 
   // Mark that the isolate is executing Dart code. EDI is callee saved.
   __ movl(Address(EDI, Isolate::vm_tag_offset()),
@@ -369,11 +371,13 @@
 //   +------------------+
 //   | return-address   |  (deoptimization point)
 //   +------------------+
+//   | Saved CODE_REG   |
+//   +------------------+
 //   | ...              | <- SP of optimized frame
 //
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
-                                           bool preserve_result) {
+                                           DeoptStubKind kind) {
   // Leaf runtime function DeoptimizeCopyFrame expects a Dart frame.
   __ EnterDartFrame(0);
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
@@ -385,7 +389,13 @@
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) {
-    __ pushl(static_cast<Register>(i));
+    if (i == CODE_REG) {
+      // Save the original value of CODE_REG pushed before invoking this stub
+      // instead of the value used to call this stub.
+      __ pushl(Address(EBP, 2 * kWordSize));
+    } else {
+      __ pushl(static_cast<Register>(i));
+    }
   }
   __ subl(ESP, Immediate(kNumberOfXmmRegisters * kFpuRegisterSize));
   intptr_t offset = 0;
@@ -396,11 +406,13 @@
   }
 
   __ movl(ECX, ESP);  // Preserve saved registers block.
-  __ ReserveAlignedFrameSpace(1 * kWordSize);
-  __ movl(Address(ESP, 0), ECX);  // Start of register block.
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  __ ReserveAlignedFrameSpace(2 * kWordSize);
+  __ movl(Address(ESP, 0 * kWordSize), ECX);  // Start of register block.
+  __ movl(Address(ESP, 1 * kWordSize), Immediate(kind == kLazyDeopt ? 1 : 0));
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (EAX) is stack-size (FP - SP) in bytes.
 
+  const bool preserve_result = (kind == kLazyDeopt);
   if (preserve_result) {
     // Restore result into EBX temporarily.
     __ movl(EBX, Address(EBP, saved_result_slot_from_fp * kWordSize));
@@ -460,12 +472,12 @@
   __ popl(EBX);
   __ subl(EBX, Immediate(CallPattern::pattern_length_in_bytes()));
   __ pushl(EBX);
-  GenerateDeoptimizationSequence(assembler, true);  // Preserve EAX.
+  GenerateDeoptimizationSequence(assembler, kLazyDeopt);
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve EAX.
+  GenerateDeoptimizationSequence(assembler, kEagerDeopt);
 }
 
 
@@ -684,13 +696,13 @@
 // Called when invoking dart code from C++ (VM code).
 // Input parameters:
 //   ESP : points to return address.
-//   ESP + 4 : entrypoint of the dart function to call.
+//   ESP + 4 : code object of the dart function to call.
 //   ESP + 8 : arguments descriptor array.
 //   ESP + 12 : arguments array.
 //   ESP + 16 : current thread.
 // Uses EAX, EDX, ECX, EDI as temporary registers.
 void StubCode::GenerateInvokeDartCodeStub(Assembler* assembler) {
-  const intptr_t kEntryPointOffset = 2 * kWordSize;
+  const intptr_t kTargetCodeOffset = 2 * kWordSize;
   const intptr_t kArgumentsDescOffset = 3 * kWordSize;
   const intptr_t kArgumentsOffset = 4 * kWordSize;
   const intptr_t kThreadOffset = 5 * kWordSize;
@@ -698,13 +710,17 @@
   // Save frame pointer coming in.
   __ EnterFrame(0);
 
+  // Push code object to PC marker slot.
+  __ movl(EAX, Address(EBP, kThreadOffset));
+  __ pushl(Address(EAX, Thread::invoke_dart_code_stub_offset()));
+
   // Save C++ ABI callee-saved registers.
   __ pushl(EBX);
   __ pushl(ESI);
   __ pushl(EDI);
 
   // Set up THR, which caches the current thread in Dart code.
-  __ movl(THR, Address(EBP, kThreadOffset));
+  __ movl(THR, EAX);
   __ LoadIsolate(EDI);
 
   // Save the current VMTag on the stack.
@@ -722,7 +738,7 @@
   __ movl(Address(THR, Thread::top_resource_offset()), Immediate(0));
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -6);
+  ASSERT(kExitLinkSlotFromEntryFp == -7);
   __ movl(EDX, Address(THR, Thread::top_exit_frame_info_offset()));
   __ pushl(EDX);
   __ movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
@@ -756,7 +772,9 @@
   __ Bind(&done_push_arguments);
 
   // Call the dart code entrypoint.
-  __ call(Address(EBP, kEntryPointOffset));
+  __ movl(EAX, Address(EBP, kTargetCodeOffset));
+  __ movl(EAX, Address(EAX, VMHandles::kOffsetOfRawPtrInHandle));
+  __ call(FieldAddress(EAX, Code::entry_point_offset()));
 
   // Reread the arguments descriptor array to obtain the number of passed
   // arguments.
@@ -1001,9 +1019,7 @@
 // Returns patch_code_pc offset where patching code for disabling the stub
 // has been generated (similar to regularly generated Dart code).
 void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls,
-    uword* entry_patch_offset, uword* patch_code_pc_offset) {
-  *entry_patch_offset = assembler->CodeSize();
+    Assembler* assembler, const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   const Immediate& raw_null =
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
@@ -1125,10 +1141,6 @@
   // Restore the frame pointer.
   __ LeaveFrame();
   __ ret();
-  // Emit function patching code. This will be swapped with the first 5 bytes
-  // at entry point.
-  *patch_code_pc_offset = assembler->CodeSize();
-  __ Jmp(*StubCode::FixAllocationStubTarget_entry());
 }
 
 
@@ -1168,7 +1180,7 @@
 // function and not the top-scope function.
 void StubCode::GenerateOptimizedUsageCounterIncrement(Assembler* assembler) {
   Register ic_reg = ECX;
-  Register func_reg = EDI;
+  Register func_reg = EBX;
   if (FLAG_trace_optimized_ic_calls) {
     __ EnterStubFrame();
     __ pushl(func_reg);     // Preserve
@@ -1704,10 +1716,12 @@
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ popl(EAX);  // Address of original stub.
+  __ popl(EAX);  // Code of original stub.
   __ popl(ECX);  // Restore IC data.
   __ LeaveFrame();
-  __ jmp(EAX);   // Jump to original stub.
+  // Jump to original stub.
+  __ movl(EAX, FieldAddress(EAX, Code::entry_point_offset()));
+  __ jmp(EAX);
 }
 
 
@@ -1719,9 +1733,11 @@
       Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ pushl(raw_null);  // Room for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ popl(EAX);  // Address of original stub.
+  __ popl(EAX);  // Code of the original stub
   __ LeaveFrame();
-  __ jmp(EAX);   // Jump to original stub.
+  // Jump to original stub.
+  __ movl(EAX, FieldAddress(EAX, Code::entry_point_offset()));
+  __ jmp(EAX);
 }
 
 
@@ -1893,7 +1909,7 @@
 
 
 // Calls to the runtime to optimize the given function.
-// EDI: function to be reoptimized.
+// EBX: function to be reoptimized.
 // EDX: argument descriptor (preserved).
 void StubCode::GenerateOptimizeFunctionStub(Assembler* assembler) {
   const Immediate& raw_null =
@@ -1901,7 +1917,7 @@
   __ EnterStubFrame();
   __ pushl(EDX);
   __ pushl(raw_null);  // Setup space on stack for return value.
-  __ pushl(EDI);
+  __ pushl(EBX);
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ popl(EAX);  // Discard argument.
   __ popl(EAX);  // Get Code object
@@ -2068,12 +2084,12 @@
 
 
 // Called from megamorphic calls.
-//  EDI: receiver.
+//  ECX: receiver.
 //  EBX: lookup cache.
 // Result:
 //  EBX: entry point.
 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) {
-  EmitMegamorphicLookup(assembler, EDI, EBX, EBX);
+  EmitMegamorphicLookup(assembler, ECX, EBX, EBX);
   __ ret();
 }
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index d6b55f8..36f73f7 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -41,14 +41,13 @@
   const intptr_t argc_tag_offset = NativeArguments::argc_tag_offset();
   const intptr_t argv_offset = NativeArguments::argv_offset();
   const intptr_t retval_offset = NativeArguments::retval_offset();
-  const intptr_t exitframe_last_param_slot_from_fp = 2;
 
   __ SetPrologueOffset();
   __ Comment("CallToRuntimeStub");
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
-  __ LoadIsolate(S6);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S2)) != 0);
+  __ LoadIsolate(S2);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to Dart VM C++ code.
@@ -57,7 +56,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S2, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -65,7 +64,7 @@
 #endif
 
   // Mark that the isolate is executing VM code.
-  __ sw(S5, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(S5, Address(S2, Isolate::vm_tag_offset()));
 
   // Reserve space for arguments and align frame before entering C++ world.
   // NativeArguments are passed in registers.
@@ -88,7 +87,7 @@
   __ sll(A2, S4, 2);
   __ addu(A2, FP, A2);  // Compute argv.
   // Set argv in NativeArguments.
-  __ addiu(A2, A2, Immediate(exitframe_last_param_slot_from_fp * kWordSize));
+  __ addiu(A2, A2, Immediate(kParamEndSlotFromFp * kWordSize));
 
 
   // Call runtime or redirection via simulator.
@@ -104,7 +103,7 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S2, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset()));
@@ -148,8 +147,8 @@
   __ Comment("CallNativeCFunctionStub");
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
-  __ LoadIsolate(S6);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S2)) != 0);
+  __ LoadIsolate(S2);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -158,7 +157,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S2, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -166,7 +165,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(T5, Address(S2, Isolate::vm_tag_offset()));
 
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
@@ -184,7 +183,8 @@
   // Set argv in NativeArguments: A2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
+  // Set retval in NativeArgs.
+  __ addiu(A3, FP, Immediate(kCallerSpSlotFromFp * kWordSize));
 
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
@@ -199,21 +199,15 @@
 
   __ mov(A1, T5);  // Pass the function entrypoint.
   __ ReserveAlignedFrameSpace(2 * kWordSize);  // Just passing A0, A1.
+
   // Call native wrapper function or redirection via simulator.
-#if defined(USING_SIMULATOR)
-  uword entry = reinterpret_cast<uword>(NativeEntry::NativeCallWrapper);
-  entry = Simulator::RedirectExternalReference(
-      entry, Simulator::kNativeCall, NativeEntry::kNumCallWrapperArguments);
-  __ LoadImmediate(T9, entry);
+  __ lw(T9, Address(THR, Thread::native_call_wrapper_entry_point_offset()));
   __ jalr(T9);
-#else
-  __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNotPatchable);
-#endif
   __ Comment("CallNativeCFunctionStub return");
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S2, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset()));
@@ -238,8 +232,8 @@
   __ Comment("CallNativeCFunctionStub");
   __ EnterStubFrame();
 
-  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S6)) != 0);
-  __ LoadIsolate(S6);
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << S2)) != 0);
+  __ LoadIsolate(S2);
 
   // Save exit frame information to enable stack walking as we are about
   // to transition to native code.
@@ -248,7 +242,7 @@
 #if defined(DEBUG)
   { Label ok;
     // Check that we are always entering from Dart code.
-    __ lw(T0, Address(S6, Isolate::vm_tag_offset()));
+    __ lw(T0, Address(S2, Isolate::vm_tag_offset()));
     __ BranchEqual(T0, Immediate(VMTag::kDartTagId), &ok);
     __ Stop("Not coming from Dart code.");
     __ Bind(&ok);
@@ -256,7 +250,7 @@
 #endif
 
   // Mark that the isolate is executing Native code.
-  __ sw(T5, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(T5, Address(S2, Isolate::vm_tag_offset()));
 
   // Initialize NativeArguments structure and call native function.
   // Registers A0, A1, A2, and A3 are used.
@@ -274,7 +268,8 @@
   // Set argv in NativeArguments: A2 already contains argv.
 
   ASSERT(retval_offset == 3 * kWordSize);
-  __ addiu(A3, FP, Immediate(3 * kWordSize));  // Set retval in NativeArgs.
+  // Set retval in NativeArgs.
+  __ addiu(A3, FP, Immediate(kCallerSpSlotFromFp * kWordSize));
 
   // Passing the structure by value as in runtime calls would require changing
   // Dart API for native functions.
@@ -298,7 +293,7 @@
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kDartTagId);
-  __ sw(A2, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(A2, Address(S2, Isolate::vm_tag_offset()));
 
   // Reset exit frame information in Isolate structure.
   __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset()));
@@ -323,11 +318,11 @@
   __ Comment("CallStaticFunctionStub return");
 
   // Get Code object result and restore arguments descriptor array.
-  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 0 * kWordSize));
   __ lw(S4, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
 
-  __ lw(T0, FieldAddress(T0, Code::entry_point_offset()));
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
 
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveStubFrameAndReturn(T0);
@@ -338,9 +333,12 @@
 // (invalid because its function was optimized or deoptimized).
 // S4: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ lw(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset()));
   // Create a stub frame as we are pushing some objects on the stack before
   // calling into the runtime.
-  __ Comment("FixCallersTarget");
   __ EnterStubFrame();
   // Setup space on stack for return value and preserve arguments descriptor.
   __ addiu(SP, SP, Immediate(-2 * kWordSize));
@@ -349,12 +347,12 @@
   __ sw(TMP, Address(SP, 0 * kWordSize));
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
   // Get Code object result and restore arguments descriptor array.
-  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 0 * kWordSize));
   __ lw(S4, Address(SP, 1 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
 
   // Jump to the dart function.
-  __ lw(T0, FieldAddress(T0, Code::entry_point_offset()));
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
 
   // Remove the stub frame.
   __ LeaveStubFrameAndReturn(T0);
@@ -364,7 +362,10 @@
 // Called from object allocate instruction when the allocation stub has been
 // disabled.
 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
-  __ Comment("FixAllocationStubTarget");
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ lw(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset()));
   __ EnterStubFrame();
   // Setup space on stack for return value.
   __ addiu(SP, SP, Immediate(-1 * kWordSize));
@@ -372,11 +373,11 @@
   __ sw(TMP, Address(SP, 0 * kWordSize));
   __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
   // Get Code object result.
-  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 0 * kWordSize));
   __ addiu(SP, SP, Immediate(1 * kWordSize));
 
   // Jump to the dart function.
-  __ lw(T0, FieldAddress(T0, Code::entry_point_offset()));
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
 
   // Remove the stub frame.
   __ LeaveStubFrameAndReturn(T0);
@@ -433,34 +434,26 @@
 //   +------------------+
 //   | Saved PP         | <- TOS
 //   +------------------+
+//   | Saved CODE_REG   |
+//   +------------------+
 //   | Saved FP         | <- FP of stub
 //   +------------------+
 //   | Saved LR         |  (deoptimization point)
 //   +------------------+
-//   | PC marker        |
+//   | Saved CODE_REG   |
 //   +------------------+
 //   | ...              | <- SP of optimized frame
 //
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
-                                           bool preserve_result) {
+                                           DeoptStubKind kind) {
   const intptr_t kPushedRegistersSize =
-      kNumberOfCpuRegisters * kWordSize +
-      4 * kWordSize +  // PP, FP, RA, PC marker.
-      kNumberOfFRegisters * kWordSize;
+      kNumberOfCpuRegisters * kWordSize + kNumberOfFRegisters * kWordSize;
 
   __ SetPrologueOffset();
   __ Comment("GenerateDeoptimizationSequence");
-  // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
-  // is no need to set the correct PC marker or load PP, since they get patched.
-  __ addiu(SP, SP, Immediate(-kPushedRegistersSize * kWordSize));
-  __ sw(ZR, Address(SP, kPushedRegistersSize - 1 * kWordSize));
-  __ sw(RA, Address(SP, kPushedRegistersSize - 2 * kWordSize));
-  __ sw(FP, Address(SP, kPushedRegistersSize - 3 * kWordSize));
-  __ sw(PP, Address(SP, kPushedRegistersSize - 4 * kWordSize));
-  __ addiu(FP, SP, Immediate(kPushedRegistersSize - 3 * kWordSize));
-
-  __ LoadPoolPointer();
+  // DeoptimizeCopyFrame expects a Dart frame.
+  __ EnterStubFrame(kPushedRegistersSize);
 
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
@@ -471,27 +464,38 @@
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   for (int i = 0; i < kNumberOfCpuRegisters; i++) {
-    const int slot = 4 + kNumberOfCpuRegisters - i;
+    const int slot = kNumberOfCpuRegisters - i;
     Register reg = static_cast<Register>(i);
-    __ sw(reg, Address(SP, kPushedRegistersSize - slot * kWordSize));
+    if (reg == CODE_REG) {
+      // Save the original value of CODE_REG pushed before invoking this stub
+      // instead of the value used to call this stub.
+      COMPILE_ASSERT(TMP < CODE_REG);  // Assert TMP is pushed first.
+      __ lw(TMP, Address(FP, kCallerSpSlotFromFp * kWordSize));
+      __ sw(TMP, Address(SP, kPushedRegistersSize - slot * kWordSize));
+    } else {
+      __ sw(reg, Address(SP, kPushedRegistersSize - slot * kWordSize));
+    }
   }
   for (int i = 0; i < kNumberOfFRegisters; i++) {
     // These go below the CPU registers.
-    const int slot = 4 + kNumberOfCpuRegisters + kNumberOfFRegisters - i;
+    const int slot = kNumberOfCpuRegisters + kNumberOfFRegisters - i;
     FRegister reg = static_cast<FRegister>(i);
     __ swc1(reg, Address(SP, kPushedRegistersSize - slot * kWordSize));
   }
 
   __ mov(A0, SP);  // Pass address of saved registers block.
+  __ LoadImmediate(A1, (kind == kLazyDeopt) ? 1 : 0);
   __ ReserveAlignedFrameSpace(1 * kWordSize);
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (V0) is stack-size (FP - SP) in bytes, incl. the return address.
 
+  const bool preserve_result = (kind == kLazyDeopt);
   if (preserve_result) {
     // Restore result into T1 temporarily.
     __ lw(T1, Address(FP, saved_result_slot_from_fp * kWordSize));
   }
 
+  __ RestoreCodePointer();
   __ LeaveDartFrame();
   __ subu(SP, FP, V0);
 
@@ -510,6 +514,7 @@
     __ lw(T1, Address(FP, kFirstLocalSlotFromFp * kWordSize));
   }
   // Code above cannot cause GC.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   // Frame is fully rewritten at this point and it is safe to perform a GC.
@@ -539,13 +544,16 @@
 void StubCode::GenerateDeoptimizeLazyStub(Assembler* assembler) {
   // Correct return address to point just after the call that is being
   // deoptimized.
-  __ AddImmediate(RA, -CallPattern::kFixedLengthInBytes);
-  GenerateDeoptimizationSequence(assembler, true);  // Preserve V0.
+  __ AddImmediate(RA, -CallPattern::kDeoptCallLengthInBytes);
+  // Push zap value instead of CODE_REG for lazy deopt.
+  __ LoadImmediate(TMP, 0xf1f1f1f1);
+  __ Push(TMP);
+  GenerateDeoptimizationSequence(assembler, kLazyDeopt);
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve V0.
+  GenerateDeoptimizationSequence(assembler, kEagerDeopt);
 }
 
 
@@ -615,6 +623,7 @@
   __ lw(S5, Address(SP, 5 * kWordSize));  // Restore IC data.
   __ addiu(SP, SP, Immediate(6 * kWordSize));
 
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   if (!FLAG_lazy_dispatchers) {
@@ -623,6 +632,7 @@
     __ Bind(&call_target_function);
   }
 
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ lw(T2, FieldAddress(T0, Function::entry_point_offset()));
   __ jr(T2);
 }
@@ -780,7 +790,7 @@
 // Called when invoking Dart code from C++ (VM code).
 // Input parameters:
 //   RA : points to return address.
-//   A0 : entrypoint of the Dart function to call.
+//   A0 : code object of the Dart function to call.
 //   A1 : arguments descriptor array.
 //   A2 : arguments array.
 //   A3 : current thread.
@@ -789,6 +799,10 @@
   __ Comment("InvokeDartCodeStub");
   __ EnterFrame();
 
+  // Push code object to PC marker slot.
+  __ lw(TMP, Address(A3, Thread::invoke_dart_code_stub_offset()));
+  __ Push(TMP);
+
   // Save new context and C++ ABI callee-saved registers.
 
   // The saved vm tag, top resource, and top exit frame info.
@@ -813,10 +827,9 @@
     __ swc1(r, Address(SP, slot * kWordSize));
   }
 
-  // We now load the pool pointer(PP) as we are about to invoke dart code and we
-  // could potentially invoke some intrinsic functions which need the PP to be
-  // set up.
-  __ LoadPoolPointer();
+  // We now load the pool pointer(PP) with a GC safe value as we are about
+  // to invoke dart code.
+  __ LoadImmediate(PP, 0);
 
   // Set up THR, which caches the current thread in Dart code.
   if (THR != A3) {
@@ -840,7 +853,7 @@
   __ lw(T0, Address(THR, Thread::top_exit_frame_info_offset()));
   __ sw(ZR, Address(THR, Thread::top_exit_frame_info_offset()));
   // kExitLinkSlotFromEntryFp must be kept in sync with the code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -23);
+  ASSERT(kExitLinkSlotFromEntryFp == -24);
   __ sw(T0, Address(SP, 0 * kWordSize));
 
   // After the call, The stack pointer is restored to this location.
@@ -875,17 +888,19 @@
   // Call the Dart code entrypoint.
   // We are calling into Dart code, here, so there is no need to call through
   // T9 to match the ABI.
+  __ lw(CODE_REG, Address(A0, VMHandles::kOffsetOfRawPtrInHandle));
+  __ lw(A0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jalr(A0);  // S4 is the arguments descriptor array.
   __ Comment("InvokeDartCodeStub return");
 
   // Get rid of arguments pushed on the stack.
   __ AddImmediate(SP, FP, kExitLinkSlotFromEntryFp * kWordSize);
 
-  __ LoadIsolate(S6);
+  __ LoadIsolate(S2);
 
   // Restore the current VMTag from the stack.
   __ lw(T1, Address(SP, 2 * kWordSize));
-  __ sw(T1, Address(S6, Isolate::vm_tag_offset()));
+  __ sw(T1, Address(S2, Isolate::vm_tag_offset()));
 
   // Restore the saved top resource and top exit frame info back into the
   // Isolate structure. Uses T0 as a temporary register for this.
@@ -1108,13 +1123,9 @@
 // Input parameters:
 //   RA : return address.
 //   SP + 0 : type arguments object (only if class is parameterized).
-// Returns patch_code_pc offset where patching code for disabling the stub
-// has been generated (similar to regularly generated Dart code).
-void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls,
-    uword* entry_patch_offset, uword* patch_code_pc_offset) {
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
   __ Comment("AllocationStubForClass");
-  *entry_patch_offset = assembler->CodeSize();
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
   ASSERT(!is_cls_parameterized ||
@@ -1237,8 +1248,6 @@
   // V0: new object
   // Restore the frame pointer and return.
   __ LeaveStubFrameAndReturn(RA);
-  *patch_code_pc_offset = assembler->CodeSize();
-  __ BranchPatchable(*StubCode::FixAllocationStubTarget_entry());
 }
 
 
@@ -1558,6 +1567,9 @@
   // Remove the call arguments pushed earlier, including the IC data object
   // and the arguments descriptor array.
   __ addiu(SP, SP, Immediate(num_slots * kWordSize));
+  if (range_collection_mode == kCollectRanges) {
+    __ RestoreCodePointer();
+  }
   __ LeaveStubFrame();
 
   Label call_target_function;
@@ -1605,6 +1617,7 @@
     if (num_args == 2) {
       __ sw(T1, Address(SP, 1 * kWordSize));
     }
+    __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
     __ jalr(T4);
     __ lw(S5, Address(SP, (frame_size - 2) * kWordSize));
     __ lw(RA, Address(SP, (frame_size - 1) * kWordSize));
@@ -1612,9 +1625,11 @@
     __ UpdateRangeFeedback(V0, 2, S5, T1, &done);
     __ Bind(&done);
     __ addiu(SP, SP, Immediate(frame_size * kWordSize));
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ Ret();
   } else {
+    __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
     __ jr(T4);
   }
 
@@ -1629,6 +1644,7 @@
     __ lw(RA, Address(SP, 0 * kWordSize));
     __ lw(S5, Address(SP, 1 * kWordSize));
     __ addiu(SP, SP, Immediate(2 * kWordSize));
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1774,6 +1790,7 @@
 
   // Get function and call it, if possible.
   __ lw(T0, Address(T0, target_offset));
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ lw(T4, FieldAddress(T0, Function::entry_point_offset()));
   __ jr(T4);
 
@@ -1788,6 +1805,7 @@
     __ lw(RA, Address(SP, 0 * kWordSize));
     __ lw(S5, Address(SP, 1 * kWordSize));
     __ addiu(SP, SP, Immediate(2 * kWordSize));
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -1827,6 +1845,7 @@
   __ addiu(SP, SP, Immediate(3 * kWordSize));
   __ LeaveStubFrame();
 
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ lw(T2, FieldAddress(T0, Function::entry_point_offset()));
   __ jr(T2);
 }
@@ -1844,9 +1863,10 @@
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
 
   __ lw(S5, Address(SP, 1 * kWordSize));
-  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 0 * kWordSize));
   __ addiu(SP, SP, Immediate(2 * kWordSize));
   __ LeaveStubFrame();
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jr(T0);
 }
 
@@ -1860,9 +1880,10 @@
 
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
 
-  __ lw(T0, Address(SP, 0 * kWordSize));
+  __ lw(CODE_REG, Address(SP, 0 * kWordSize));
   __ addiu(SP, SP, Immediate(3 * kWordSize));
   __ LeaveStubFrame();
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jr(T0);
 }
 
@@ -2053,11 +2074,11 @@
   __ sw(T0, Address(SP, 0 * kWordSize));
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ Comment("OptimizeFunctionStub return");
-  __ lw(T0, Address(SP, 1 * kWordSize));  // Get Code object
+  __ lw(CODE_REG, Address(SP, 1 * kWordSize));  // Get Code object
   __ lw(S4, Address(SP, 2 * kWordSize));  // Restore argument descriptor.
   __ addiu(SP, SP, Immediate(3 * kWordSize));  // Discard argument.
 
-  __ lw(T0, FieldAddress(T0, Code::entry_point_offset()));
+  __ lw(T0, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ LeaveStubFrameAndReturn(T0);
   __ break_(0);
 }
@@ -2178,6 +2199,7 @@
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ lw(RA, Address(SP, 0 * kWordSize));
     __ addiu(SP, SP, Immediate(1 * kWordSize));
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ b(&done_stepping);
   }
@@ -2238,6 +2260,7 @@
   __ addu(T1, T2, T1);
   __ lw(T0, FieldAddress(T1, base + kWordSize));
 
+  __ lw(CODE_REG, FieldAddress(T0, Function::code_offset()));
   __ lw(target, FieldAddress(T0, Function::entry_point_offset()));
 }
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 0dd4640..7b4561d 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -79,7 +79,8 @@
   // There are no runtime calls to closures, so we do not need to set the tag
   // bits kClosureFunctionBit and kInstanceFunctionBit in argc_tag_.
   __ movq(Address(RSP, argc_tag_offset), R10);  // Set argc in NativeArguments.
-  __ leaq(RAX, Address(RBP, R10, TIMES_8, 1 * kWordSize));  // Compute argv.
+  // Compute argv.
+  __ leaq(RAX, Address(RBP, R10, TIMES_8, kParamEndSlotFromFp * kWordSize));
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ addq(RAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
@@ -184,8 +185,8 @@
   __ movq(CallingConventions::kArg1Reg, RSP);
   // Pass pointer to function entrypoint.
   __ movq(CallingConventions::kArg2Reg, RBX);
-  __ LoadExternalLabel(
-      RAX, &NativeEntry::NativeCallWrapperLabel(), kNotPatchable);
+
+  __ movq(RAX, Address(THR, Thread::native_call_wrapper_entry_point_offset()));
   __ CallCFunction(RAX);
 
   // Mark that the isolate is executing Dart code.
@@ -280,12 +281,12 @@
   // Setup space on stack for return value.
   __ PushObject(Object::null_object());
   __ CallRuntime(kPatchStaticCallRuntimeEntry, 0);
-  __ popq(RAX);  // Get Code object result.
+  __ popq(CODE_REG);  // Get Code object result.
   __ popq(R10);  // Restore arguments descriptor array.
   // Remove the stub frame as we are about to jump to the dart function.
   __ LeaveStubFrame();
 
-  __ movq(RBX, FieldAddress(RAX, Code::entry_point_offset()));
+  __ movq(RBX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jmp(RBX);
 }
 
@@ -294,14 +295,18 @@
 // (invalid because its function was optimized or deoptimized).
 // R10: arguments descriptor array.
 void StubCode::GenerateFixCallersTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ movq(CODE_REG, Address(THR, Thread::fix_callers_target_code_offset()));
   __ EnterStubFrame();
   __ pushq(R10);  // Preserve arguments descriptor array.
   // Setup space on stack for return value.
   __ PushObject(Object::null_object());
   __ CallRuntime(kFixCallersTargetRuntimeEntry, 0);
-  __ popq(RAX);  // Get Code object.
+  __ popq(CODE_REG);  // Get Code object.
   __ popq(R10);  // Restore arguments descriptor array.
-  __ movq(RAX, FieldAddress(RAX, Code::entry_point_offset()));
+  __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ LeaveStubFrame();
   __ jmp(RAX);
   __ int3();
@@ -311,12 +316,16 @@
 // Called from object allocate instruction when the allocation stub has been
 // disabled.
 void StubCode::GenerateFixAllocationStubTargetStub(Assembler* assembler) {
+  // Load code pointer to this stub from the thread:
+  // The one that is passed in, is not correct - it points to the code object
+  // that needs to be replaced.
+  __ movq(CODE_REG, Address(THR, Thread::fix_allocation_stub_code_offset()));
   __ EnterStubFrame();
   // Setup space on stack for return value.
   __ PushObject(Object::null_object());
   __ CallRuntime(kFixAllocationStubTargetRuntimeEntry, 0);
-  __ popq(RAX);  // Get Code object.
-  __ movq(RAX, FieldAddress(RAX, Code::entry_point_offset()));
+  __ popq(CODE_REG);  // Get Code object.
+  __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ LeaveStubFrame();
   __ jmp(RAX);
   __ int3();
@@ -379,11 +388,13 @@
 //   +------------------+
 //   | return-address   |  (deoptimization point)
 //   +------------------+
+//   | Saved CODE_REG   |
+//   +------------------+
 //   | ...              | <- SP of optimized frame
 //
 // Parts of the code cannot GC, part of the code can GC.
 static void GenerateDeoptimizationSequence(Assembler* assembler,
-                                           bool preserve_result) {
+                                           DeoptStubKind kind) {
   // DeoptimizeCopyFrame expects a Dart frame, i.e. EnterDartFrame(0), but there
   // is no need to set the correct PC marker or load PP, since they get patched.
   __ EnterStubFrame();
@@ -397,7 +408,13 @@
   // Push registers in their enumeration order: lowest register number at
   // lowest address.
   for (intptr_t i = kNumberOfCpuRegisters - 1; i >= 0; i--) {
-    __ pushq(static_cast<Register>(i));
+    if (i == CODE_REG) {
+      // Save the original value of CODE_REG pushed before invoking this stub
+      // instead of the value used to call this stub.
+      __ pushq(Address(RBP, 2 * kWordSize));
+    } else {
+      __ pushq(static_cast<Register>(i));
+    }
   }
   __ subq(RSP, Immediate(kNumberOfXmmRegisters * kFpuRegisterSize));
   intptr_t offset = 0;
@@ -409,16 +426,19 @@
 
   // Pass address of saved registers block.
   __ movq(CallingConventions::kArg1Reg, RSP);
+  __ movq(CallingConventions::kArg2Reg, Immediate(kind == kLazyDeopt ? 1 : 0));
   __ ReserveAlignedFrameSpace(0);  // Ensure stack is aligned before the call.
-  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
+  __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 2);
   // Result (RAX) is stack-size (FP - SP) in bytes.
 
+  const bool preserve_result = (kind == kLazyDeopt);
   if (preserve_result) {
     // Restore result into RBX temporarily.
     __ movq(RBX, Address(RBP, saved_result_slot_from_fp * kWordSize));
   }
 
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   __ popq(RCX);   // Preserve return address.
@@ -443,6 +463,7 @@
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
 
   // Frame is fully rewritten at this point and it is safe to perform a GC.
@@ -478,13 +499,15 @@
   // deoptimized.
   __ popq(RBX);
   __ subq(RBX, Immediate(ShortCallPattern::pattern_length_in_bytes()));
+  // Push zap value instead of CODE_REG for lazy deopt.
+  __ pushq(Immediate(0xf1f1f1f1));
   __ pushq(RBX);
-  GenerateDeoptimizationSequence(assembler, true);  // Preserve RAX.
+  GenerateDeoptimizationSequence(assembler, kLazyDeopt);
 }
 
 
 void StubCode::GenerateDeoptimizeStub(Assembler* assembler) {
-  GenerateDeoptimizationSequence(assembler, false);  // Don't preserve RAX.
+  GenerateDeoptimizationSequence(assembler, kEagerDeopt);
 }
 
 
@@ -542,14 +565,14 @@
   __ popq(RAX);  // Return value from the runtime call (function).
   __ popq(R10);  // Restore arguments descriptor.
   __ popq(RBX);  // Restore IC data.
+  __ RestoreCodePointer();
   __ LeaveStubFrame();
-
   if (!FLAG_lazy_dispatchers) {
     Label call_target_function;
     GenerateDispatcherCode(assembler, &call_target_function);
     __ Bind(&call_target_function);
   }
-
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
   __ jmp(RCX);
 }
@@ -693,7 +716,7 @@
 // Called when invoking Dart code from C++ (VM code).
 // Input parameters:
 //   RSP : points to return address.
-//   RDI : entrypoint of the Dart function to call.
+//   RDI : target code
 //   RSI : arguments descriptor array.
 //   RDX : arguments array.
 //   RCX : current thread.
@@ -701,16 +724,20 @@
   // Save frame pointer coming in.
   __ EnterFrame(0);
 
-  const Register kEntryPointReg = CallingConventions::kArg1Reg;
+  const Register kTargetCodeReg = CallingConventions::kArg1Reg;
   const Register kArgDescReg    = CallingConventions::kArg2Reg;
   const Register kArgsReg       = CallingConventions::kArg3Reg;
   const Register kThreadReg     = CallingConventions::kArg4Reg;
 
+  // Push code object to PC marker slot.
+  __ pushq(Address(kThreadReg, Thread::invoke_dart_code_stub_offset()));
+
   // At this point, the stack looks like:
+  // | stub code object
   // | saved RBP                                      | <-- RBP
   // | saved PC (return to DartEntry::InvokeFunction) |
 
-  const intptr_t kInitialOffset = 1;
+  const intptr_t kInitialOffset = 2;
   // Save arguments descriptor array.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
   __ pushq(kArgDescReg);
@@ -719,11 +746,6 @@
   __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
                    CallingConventions::kCalleeSaveXmmRegisters);
 
-  // We now load the pool pointer(PP) as we are about to invoke dart code and we
-  // could potentially invoke some intrinsic functions which need the PP to be
-  // set up.
-  __ LoadPoolPointer();
-
   // If any additional (or fewer) values are pushed, the offsets in
   // kExitLinkSlotFromEntryFp will need to be changed.
 
@@ -763,14 +785,15 @@
     __ Bind(&ok);
   }
 #endif
+
   __ movq(Address(THR, Thread::top_exit_frame_info_offset()),
           Immediate(0));
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
   __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
 
-  // Push arguments. At this point we only need to preserve kEntryPointReg.
-  ASSERT(kEntryPointReg != RDX);
+  // Push arguments. At this point we only need to preserve kTargetCodeReg.
+  ASSERT(kTargetCodeReg != RDX);
 
   // Load number of arguments into RBX.
   __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
@@ -794,7 +817,11 @@
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ call(kEntryPointReg);  // R10 is the arguments descriptor array.
+  __ xorq(PP, PP);  // GC-safe value into PP.
+  __ movq(CODE_REG,
+          Address(kTargetCodeReg, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(kTargetCodeReg, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ call(kTargetCodeReg);  // R10 is the arguments descriptor array.
 
   // Read the saved arguments descriptor array to obtain the number of passed
   // arguments.
@@ -831,7 +858,7 @@
 // Output:
 // RAX: new allocated RawContext object.
 void StubCode::GenerateAllocateContextStub(Assembler* assembler) {
-  __ LoadObject(R12, Object::null_object());
+  __ LoadObject(R9, Object::null_object());
   if (FLAG_inline_alloc) {
     Label slow_case;
     // First compute the rounded instance size.
@@ -915,7 +942,7 @@
     // No generational barrier needed, since we are storing null.
     __ InitializeFieldNoBarrier(RAX,
                                 FieldAddress(RAX, Context::parent_offset()),
-                                R12);
+                                R9);
 
     // Initialize the context variables.
     // RAX: new object.
@@ -934,7 +961,7 @@
       // No generational barrier needed, since we are storing null.
       __ InitializeFieldNoBarrier(RAX,
                                   Address(R13, R10, TIMES_8, 0),
-                                  R12);
+                                  R9);
       __ Bind(&entry);
       __ cmpq(R10, Immediate(0));
       __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
@@ -948,7 +975,7 @@
   }
   // Create a stub frame.
   __ EnterStubFrame();
-  __ pushq(R12);  // Setup space on stack for the return value.
+  __ pushq(R9);  // Setup space on stack for the return value.
   __ SmiTag(R10);
   __ pushq(R10);  // Push number of context variables.
   __ CallRuntime(kAllocateContextRuntimeEntry, 1);  // Allocate context.
@@ -1028,14 +1055,8 @@
 // Input parameters:
 //   RSP + 8 : type arguments object (only if class is parameterized).
 //   RSP : points to return address.
-void StubCode::GenerateAllocationStubForClass(
-    Assembler* assembler, const Class& cls,
-    uword* entry_patch_offset, uword* patch_code_pc_offset) {
-  // Must load pool pointer before being able to patch.
-  Register new_pp = R13;
-  __ LoadPoolPointer(new_pp);
-  *entry_patch_offset = assembler->CodeSize();
-
+void StubCode::GenerateAllocationStubForClass(Assembler* assembler,
+                                              const Class& cls) {
   const intptr_t kObjectTypeArgumentsOffset = 1 * kWordSize;
   // The generated code is different if the class is parameterized.
   const bool is_cls_parameterized = cls.NumTypeArguments() > 0;
@@ -1047,7 +1068,7 @@
   const int kInlineInstanceSize = 12;  // In words.
   const intptr_t instance_size = cls.instance_size();
   ASSERT(instance_size > 0);
-  __ LoadObject(R12, Object::null_object());
+  __ LoadObject(R9, Object::null_object());
   if (is_cls_parameterized) {
     __ movq(RDX, Address(RSP, kObjectTypeArgumentsOffset));
     // RDX: instantiated type arguments.
@@ -1091,7 +1112,7 @@
     // RAX: new object (tagged).
     // RBX: next object start.
     // RDX: new object type arguments (if is_cls_parameterized).
-    // R12: raw null.
+    // R9: raw null.
     // First try inlining the initialization without a loop.
     if (instance_size < (kInlineInstanceSize * kWordSize)) {
       // Check if the object contains any non-header fields.
@@ -1101,7 +1122,7 @@
            current_offset += kWordSize) {
         __ InitializeFieldNoBarrier(RAX,
                                     FieldAddress(RAX, current_offset),
-                                    R12);
+                                    R9);
       }
     } else {
       __ leaq(RCX, FieldAddress(RAX, Instance::NextFieldOffset()));
@@ -1120,7 +1141,7 @@
       static const bool kJumpLength = Assembler::kNearJump;
 #endif  // DEBUG
       __ j(ABOVE_EQUAL, &done, kJumpLength);
-      __ InitializeFieldNoBarrier(RAX, Address(RCX, 0), R12);
+      __ InitializeFieldNoBarrier(RAX, Address(RCX, 0), R9);
       __ addq(RCX, Immediate(kWordSize));
       __ jmp(&init_loop, Assembler::kNearJump);
       __ Bind(&done);
@@ -1141,12 +1162,12 @@
   // RDX: new object type arguments.
   // Create a stub frame.
   __ EnterStubFrame();  // Uses PP to access class object.
-  __ pushq(R12);  // Setup space on stack for return value.
+  __ pushq(R9);  // Setup space on stack for return value.
   __ PushObject(cls);  // Push class of object to be allocated.
   if (is_cls_parameterized) {
     __ pushq(RDX);  // Push type arguments of object to be allocated.
   } else {
-    __ pushq(R12);  // Push null type arguments.
+    __ pushq(R9);  // Push null type arguments.
   }
   __ CallRuntime(kAllocateObjectRuntimeEntry, 2);  // Allocate object.
   __ popq(RAX);  // Pop argument (type arguments of object).
@@ -1156,8 +1177,6 @@
   // Restore the frame pointer.
   __ LeaveStubFrame();
   __ ret();
-  *patch_code_pc_offset = assembler->CodeSize();
-  __ JmpPatchable(*StubCode::FixAllocationStubTarget_entry(), new_pp);
 }
 
 
@@ -1243,9 +1262,9 @@
   ASSERT(num_args == 2);
   __ movq(RCX, Address(RSP, + 1 * kWordSize));  // Right
   __ movq(RAX, Address(RSP, + 2 * kWordSize));  // Left.
-  __ movq(R12, RCX);
-  __ orq(R12, RAX);
-  __ testq(R12, Immediate(kSmiTagMask));
+  __ movq(R13, RCX);
+  __ orq(R13, RAX);
+  __ testq(R13, Immediate(kSmiTagMask));
   __ j(NOT_ZERO, not_smi_or_overflow);
   switch (kind) {
     case Token::kADD: {
@@ -1281,18 +1300,18 @@
   }
 
   // RBX: IC data object (preserved).
-  __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
-  // R12: ic_data_array with check entries: classes and target functions.
-  __ leaq(R12, FieldAddress(R12, Array::data_offset()));
-  // R12: points directly to the first ic data array element.
+  __ movq(R13, FieldAddress(RBX, ICData::ic_data_offset()));
+  // R13: ic_data_array with check entries: classes and target functions.
+  __ leaq(R13, FieldAddress(R13, Array::data_offset()));
+  // R13: points directly to the first ic data array element.
 #if defined(DEBUG)
   // Check that first entry is for Smi/Smi.
   Label error, ok;
   const Immediate& imm_smi_cid =
       Immediate(reinterpret_cast<intptr_t>(Smi::New(kSmiCid)));
-  __ cmpq(Address(R12, 0 * kWordSize), imm_smi_cid);
+  __ cmpq(Address(R13, 0 * kWordSize), imm_smi_cid);
   __ j(NOT_EQUAL, &error, Assembler::kNearJump);
-  __ cmpq(Address(R12, 1 * kWordSize), imm_smi_cid);
+  __ cmpq(Address(R13, 1 * kWordSize), imm_smi_cid);
   __ j(EQUAL, &ok, Assembler::kNearJump);
   __ Bind(&error);
   __ Stop("Incorrect IC data");
@@ -1302,11 +1321,11 @@
   if (FLAG_optimization_counter_threshold >= 0) {
     const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
     // Update counter.
-    __ movq(R8, Address(R12, count_offset));
+    __ movq(R8, Address(R13, count_offset));
     __ addq(R8, Immediate(Smi::RawValue(1)));
-    __ movq(R13, Immediate(Smi::RawValue(Smi::kMaxValue)));
-    __ cmovnoq(R13, R8);
-    __ StoreIntoSmiField(Address(R12, count_offset), R13);
+    __ movq(R9, Immediate(Smi::RawValue(Smi::kMaxValue)));
+    __ cmovnoq(R9, R8);
+    __ StoreIntoSmiField(Address(R13, count_offset), R9);
   }
 
   __ ret();
@@ -1382,18 +1401,18 @@
   // Loop that checks if there is an IC data match.
   Label loop, update, test, found;
   // RBX: IC data object (preserved).
-  __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
-  // R12: ic_data_array with check entries: classes and target functions.
-  __ leaq(R12, FieldAddress(R12, Array::data_offset()));
-  // R12: points directly to the first ic data array element.
+  __ movq(R13, FieldAddress(RBX, ICData::ic_data_offset()));
+  // R13: ic_data_array with check entries: classes and target functions.
+  __ leaq(R13, FieldAddress(R13, Array::data_offset()));
+  // R13: points directly to the first ic data array element.
 
   // Get the receiver's class ID (first read number of arguments from
   // arguments descriptor array and then access the receiver from the stack).
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-  __ movq(R13, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
-  __ LoadTaggedClassIdMayBeSmi(RAX, R13);
+  __ movq(R9, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
+  __ LoadTaggedClassIdMayBeSmi(RAX, R9);
   // RAX: receiver's class ID as smi.
-  __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
+  __ movq(R9, Address(R13, 0));  // First class ID (Smi) to check.
   __ jmp(&test);
 
   __ Comment("ICData loop");
@@ -1402,13 +1421,13 @@
     if (i > 0) {
       // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-      __ movq(R13, Address(RSP, RAX, TIMES_4, - i * kWordSize));
-      __ LoadTaggedClassIdMayBeSmi(RAX, R13);
+      __ movq(R9, Address(RSP, RAX, TIMES_4, - i * kWordSize));
+      __ LoadTaggedClassIdMayBeSmi(RAX, R9);
       // RAX: next argument class ID (smi).
-      __ movq(R13, Address(R12, i * kWordSize));
-      // R13: next class ID to check (smi).
+      __ movq(R9, Address(R13, i * kWordSize));
+      // R9: next class ID to check (smi).
     }
-    __ cmpq(RAX, R13);  // Class id match?
+    __ cmpq(RAX, R9);  // Class id match?
     if (i < (num_args - 1)) {
       __ j(NOT_EQUAL, &update);  // Continue.
     } else {
@@ -1420,20 +1439,20 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
-    __ movq(R13, Address(RSP, RAX, TIMES_4, 0));
-    __ LoadTaggedClassIdMayBeSmi(RAX, R13);
+    __ movq(R9, Address(RSP, RAX, TIMES_4, 0));
+    __ LoadTaggedClassIdMayBeSmi(RAX, R9);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
-  __ addq(R12, Immediate(entry_size));  // Next entry.
-  __ movq(R13, Address(R12, 0));  // Next class ID.
+  __ addq(R13, Immediate(entry_size));  // Next entry.
+  __ movq(R9, Address(R13, 0));  // Next class ID.
 
   __ Bind(&test);
-  __ cmpq(R13, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
+  __ cmpq(R9, Immediate(Smi::RawValue(kIllegalCid)));  // Done?
   __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
 
   __ Comment("IC miss");
-  __ LoadObject(R12, Object::null_object());
+  __ LoadObject(R13, Object::null_object());
   // Compute address of arguments (first read number of arguments from
   // arguments descriptor array and then compute address on the stack).
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
@@ -1441,7 +1460,7 @@
   __ EnterStubFrame();
   __ pushq(R10);  // Preserve arguments descriptor array.
   __ pushq(RBX);  // Preserve IC data object.
-  __ pushq(R12);  // Setup space on stack for result (target code object).
+  __ pushq(R13);  // Setup space on stack for result (target code object).
   // Push call arguments.
   for (intptr_t i = 0; i < num_args; i++) {
     __ movq(RCX, Address(RAX, -kWordSize * i));
@@ -1456,6 +1475,9 @@
   __ popq(RAX);  // Pop returned function object into RAX.
   __ popq(RBX);  // Restore IC data array.
   __ popq(R10);  // Restore arguments descriptor array.
+  if (range_collection_mode == kCollectRanges) {
+    __ RestoreCodePointer();
+  }
   __ LeaveStubFrame();
   Label call_target_function;
   if (!FLAG_lazy_dispatchers) {
@@ -1465,37 +1487,39 @@
   }
 
   __ Bind(&found);
-  // R12: Pointer to an IC data check group.
+  // R13: Pointer to an IC data check group.
   const intptr_t target_offset = ICData::TargetIndexFor(num_args) * kWordSize;
   const intptr_t count_offset = ICData::CountIndexFor(num_args) * kWordSize;
-  __ movq(RAX, Address(R12, target_offset));
+  __ movq(RAX, Address(R13, target_offset));
 
   if (FLAG_optimization_counter_threshold >= 0) {
     // Update counter.
     __ Comment("Update caller's counter");
-    __ movq(R8, Address(R12, count_offset));
+    __ movq(R8, Address(R13, count_offset));
     __ addq(R8, Immediate(Smi::RawValue(1)));
-    __ movq(R13, Immediate(Smi::RawValue(Smi::kMaxValue)));
-    __ cmovnoq(R13, R8);
-    __ StoreIntoSmiField(Address(R12, count_offset), R13);
+    __ movq(R9, Immediate(Smi::RawValue(Smi::kMaxValue)));
+    __ cmovnoq(R9, R8);
+    __ StoreIntoSmiField(Address(R13, count_offset), R9);
   }
 
   __ Comment("Call target");
   __ Bind(&call_target_function);
   // RAX: Target function.
   Label is_compiled;
-  __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
   if (range_collection_mode == kCollectRanges) {
+    __ movq(R13, FieldAddress(RAX, Function::code_offset()));
+    __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
     __ movq(R8, Address(RSP, + 1 * kWordSize));
     if (num_args == 2) {
-      __ movq(R13, Address(RSP, + 2 * kWordSize));
+      __ movq(R9, Address(RSP, + 2 * kWordSize));
     }
     __ EnterStubFrame();
     __ pushq(RBX);
     if (num_args == 2) {
-      __ pushq(R13);
+      __ pushq(R9);
     }
     __ pushq(R8);
+    __ movq(CODE_REG, R13);
     __ call(RCX);
 
     Label done;
@@ -1506,6 +1530,8 @@
     __ LeaveStubFrame();
     __ ret();
   } else {
+    __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
+    __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
     __ jmp(RCX);
   }
 
@@ -1515,6 +1541,7 @@
     __ pushq(RBX);
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ popq(RBX);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ jmp(&done_stepping);
   }
@@ -1683,6 +1710,7 @@
 
   // Get function and call it, if possible.
   __ movq(RAX, Address(R12, target_offset));
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(RCX, FieldAddress(RAX, Function::entry_point_offset()));
   __ jmp(RCX);
 
@@ -1692,6 +1720,7 @@
     __ pushq(RBX);  // Preserve IC data object.
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
     __ popq(RBX);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ jmp(&done_stepping, Assembler::kNearJump);
   }
@@ -1734,6 +1763,7 @@
   __ popq(R10);  // Restore arguments descriptor array.
   __ LeaveStubFrame();
 
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(RAX, FieldAddress(RAX, Function::entry_point_offset()));
   __ jmp(RAX);
 }
@@ -1750,9 +1780,11 @@
   __ LoadObject(R12, Object::null_object());
   __ pushq(R12);  // Room for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ popq(RAX);  // Address of original.
+  __ popq(CODE_REG);  // Address of original.
   __ popq(RBX);  // Restore IC data.
   __ LeaveStubFrame();
+
+  __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jmp(RAX);   // Jump to original stub.
 }
 
@@ -1765,8 +1797,10 @@
   __ LoadObject(R12, Object::null_object());
   __ pushq(R12);  // Room for result.
   __ CallRuntime(kBreakpointRuntimeHandlerRuntimeEntry, 0);
-  __ popq(RAX);  // Address of original.
+  __ popq(CODE_REG);  // Address of original.
   __ LeaveStubFrame();
+
+  __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jmp(RAX);   // Jump to original stub.
 }
 
@@ -1802,12 +1836,12 @@
   const intptr_t kInstanceOffsetInBytes = 2 * kWordSize;
   const intptr_t kCacheOffsetInBytes = 3 * kWordSize;
   __ movq(RAX, Address(RSP, kInstanceOffsetInBytes));
-  __ LoadObject(R12, Object::null_object());
+  __ LoadObject(R9, Object::null_object());
   if (n > 1) {
     __ LoadClass(R10, RAX);
     // Compute instance type arguments into R13.
     Label has_no_type_arguments;
-    __ movq(R13, R12);
+    __ movq(R13, R9);
     __ movl(RDI, FieldAddress(R10,
         Class::type_arguments_field_offset_in_words_offset()));
     __ cmpl(RDI, Immediate(Class::kNoTypeArguments));
@@ -1829,7 +1863,7 @@
   __ SmiTag(R10);
   __ Bind(&loop);
   __ movq(RDI, Address(RDX, kWordSize * SubtypeTestCache::kInstanceClassId));
-  __ cmpq(RDI, R12);
+  __ cmpq(RDI, R9);
   __ j(EQUAL, &not_found, Assembler::kNearJump);
   __ cmpq(RDI, R10);
   if (n == 1) {
@@ -1856,7 +1890,7 @@
   __ jmp(&loop, Assembler::kNearJump);
   // Fall through to not found.
   __ Bind(&not_found);
-  __ movq(RCX, R12);
+  __ movq(RCX, R9);
   __ ret();
 
   __ Bind(&found);
@@ -1959,9 +1993,9 @@
   __ pushq(RDI);
   __ CallRuntime(kOptimizeInvokedFunctionRuntimeEntry, 1);
   __ popq(RAX);  // Disard argument.
-  __ popq(RAX);  // Get Code object.
+  __ popq(CODE_REG);  // Get Code object.
   __ popq(R10);  // Restore argument descriptor.
-  __ movq(RAX, FieldAddress(RAX, Code::entry_point_offset()));
+  __ movq(RAX, FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ LeaveStubFrame();
   __ jmp(RAX);
   __ int3();
@@ -1988,27 +2022,27 @@
   __ CompareClassId(left, kDoubleCid);
   __ j(NOT_EQUAL, &check_mint, Assembler::kNearJump);
   __ CompareClassId(right, kDoubleCid);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, Assembler::kFarJump);
 
   // Double values bitwise compare.
   __ movq(left, FieldAddress(left, Double::value_offset()));
   __ cmpq(left, FieldAddress(right, Double::value_offset()));
-  __ jmp(&done, Assembler::kNearJump);
+  __ jmp(&done, Assembler::kFarJump);
 
   __ Bind(&check_mint);
   __ CompareClassId(left, kMintCid);
   __ j(NOT_EQUAL, &check_bigint, Assembler::kNearJump);
   __ CompareClassId(right, kMintCid);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, Assembler::kFarJump);
   __ movq(left, FieldAddress(left, Mint::value_offset()));
   __ cmpq(left, FieldAddress(right, Mint::value_offset()));
-  __ jmp(&done, Assembler::kNearJump);
+  __ jmp(&done, Assembler::kFarJump);
 
   __ Bind(&check_bigint);
   __ CompareClassId(left, kBigintCid);
-  __ j(NOT_EQUAL, &reference_compare, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &reference_compare, Assembler::kFarJump);
   __ CompareClassId(right, kBigintCid);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, Assembler::kFarJump);
   __ EnterStubFrame();
   __ ReserveAlignedFrameSpace(0);
   __ movq(CallingConventions::kArg1Reg, left);
@@ -2054,6 +2088,7 @@
     __ Bind(&stepping);
     __ EnterStubFrame();
     __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ RestoreCodePointer();
     __ LeaveStubFrame();
     __ jmp(&done_stepping);
   }
@@ -2111,6 +2146,7 @@
   // illegal class id was found, the target is a cache miss handler that can
   // be invoked as a normal Dart function.
   __ movq(RAX, FieldAddress(RDI, RCX, TIMES_8, base + kWordSize));
+  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
   __ movq(target, FieldAddress(RAX, Function::entry_point_offset()));
 }
 
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index ceba83f..79ccec8 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -8,6 +8,7 @@
 #include "vm/isolate.h"
 #include "vm/lockers.h"
 #include "vm/log.h"
+#include "vm/native_entry.h"
 #include "vm/object.h"
 #include "vm/os_thread.h"
 #include "vm/profiler.h"
@@ -255,8 +256,8 @@
 // TODO(koda): Make non-static and invoke in SafepointThreads.
 void Thread::PrepareForGC() {
   Thread* thread = Thread::Current();
-  const bool kDoNotCheckThreshold = false;  // Prevent scheduling another GC.
-  thread->StoreBufferRelease(kDoNotCheckThreshold);
+  // Prevent scheduling another GC.
+  thread->StoreBufferRelease(StoreBuffer::kIgnoreThreshold);
   // Make sure to get an *empty* block; the isolate needs all entries
   // at GC time.
   // TODO(koda): Replace with an epilogue (PrepareAfterGC) that acquires.
@@ -265,8 +266,8 @@
 }
 
 
-void Thread::StoreBufferBlockProcess(bool check_threshold) {
-  StoreBufferRelease(check_threshold);
+void Thread::StoreBufferBlockProcess(StoreBuffer::ThresholdPolicy policy) {
+  StoreBufferRelease(policy);
   StoreBufferAcquire();
 }
 
@@ -274,7 +275,7 @@
 void Thread::StoreBufferAddObject(RawObject* obj) {
   store_buffer_block_->Push(obj);
   if (store_buffer_block_->IsFull()) {
-    StoreBufferBlockProcess(true);
+    StoreBufferBlockProcess(StoreBuffer::kCheckThreshold);
   }
 }
 
@@ -282,15 +283,15 @@
 void Thread::StoreBufferAddObjectGC(RawObject* obj) {
   store_buffer_block_->Push(obj);
   if (store_buffer_block_->IsFull()) {
-    StoreBufferBlockProcess(false);
+    StoreBufferBlockProcess(StoreBuffer::kIgnoreThreshold);
   }
 }
 
 
-void Thread::StoreBufferRelease(bool check_threshold) {
+void Thread::StoreBufferRelease(StoreBuffer::ThresholdPolicy policy) {
   StoreBufferBlock* block = store_buffer_block_;
   store_buffer_block_ = NULL;
-  isolate_->store_buffer()->PushBlock(block, check_threshold);
+  isolate_->store_buffer()->PushBlock(block, policy);
 }
 
 
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index 5e14a8f..1847f5b 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -21,6 +21,7 @@
 class Object;
 class RawBool;
 class RawObject;
+class RawCode;
 class RawString;
 class RuntimeEntry;
 class StackResource;
@@ -32,10 +33,21 @@
   V(RawObject*, object_null_, Object::null(), NULL)                            \
   V(RawBool*, bool_true_, Object::bool_true().raw(), NULL)                     \
   V(RawBool*, bool_false_, Object::bool_false().raw(), NULL)                   \
+  V(RawCode*, update_store_buffer_code_,                                       \
+    StubCode::UpdateStoreBuffer_entry()->code(), NULL)                         \
+  V(RawCode*, fix_callers_target_code_,                                        \
+    StubCode::FixCallersTarget_entry()->code(), NULL)                          \
+  V(RawCode*, fix_allocation_stub_code_,                                       \
+    StubCode::FixAllocationStubTarget_entry()->code(), NULL)                   \
+  V(RawCode*, invoke_dart_code_stub_,                                          \
+    StubCode::InvokeDartCode_entry()->code(), NULL)                            \
+
 
 #define CACHED_ADDRESSES_LIST(V)                                               \
   V(uword, update_store_buffer_entry_point_,                                   \
     StubCode::UpdateStoreBuffer_entry()->EntryPoint(), 0)                      \
+  V(uword, native_call_wrapper_entry_point_,                                   \
+    NativeEntry::NativeCallWrapperEntry(), 0)                                  \
   V(RawString**, predefined_symbols_address_,                                  \
     Symbols::PredefinedAddress(), NULL)                                        \
 
@@ -129,7 +141,7 @@
     return store_buffer_block_->Contains(obj);
   }
 #endif
-  void StoreBufferBlockProcess(bool check_threshold);
+  void StoreBufferBlockProcess(StoreBuffer::ThresholdPolicy policy);
   static intptr_t store_buffer_block_offset() {
     return OFFSET_OF(Thread, store_buffer_block_);
   }
@@ -309,7 +321,8 @@
     memset(&state_, 0, sizeof(state_));
   }
 
-  void StoreBufferRelease(bool check_threshold = true);
+  void StoreBufferRelease(
+      StoreBuffer::ThresholdPolicy policy = StoreBuffer::kCheckThreshold);
   void StoreBufferAcquire();
 
   void set_zone(Zone* zone) {
diff --git a/runtime/vm/thread_barrier.h b/runtime/vm/thread_barrier.h
new file mode 100644
index 0000000..9cc1d97
--- /dev/null
+++ b/runtime/vm/thread_barrier.h
@@ -0,0 +1,116 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_THREAD_BARRIER_H_
+#define VM_THREAD_BARRIER_H_
+
+#include "vm/globals.h"
+#include "vm/os_thread.h"
+#include "vm/lockers.h"
+
+namespace dart {
+
+// Thread barrier with:
+// * fixed (at construction) number n of participating threads {T1,T2,T3,...,Tn}
+// * unknown number of rounds.
+// Requirements:
+// * there is some R such that each participating thread makes
+//   R calls to Sync() followed by its one and only call to Exit().
+// Guarantees:
+// * for any two threads Ti and Tj and round number r <= R,
+//   everything done by Ti before its r'th call to Sync() happens before
+//   everything done by Tj after its r'th call to Sync().
+// Note:
+// * it's not required that the thread that constructs the barrier participates.
+//
+// Example usage with 3 threads (1 controller + 2 workers) and 3 rounds:
+//
+// T1:
+// ThreadBarrier barrier(3);
+// Dart::thread_pool()->Run(              T2:
+//     new FooTask(&barrier));            fooSetup();
+// Dart::thread_pool()->Run(              ...                T3:
+//     new BarTask(&barrier));            ...                barSetup();
+// barrier.Sync();                        barrier_->Sync();  barrier_->Sync();
+// /* Both tasks have finished setup */   ...                ...
+// prepareWorkForTasks();                 ...                ...
+// barrier.Sync();                        barrier_->Sync();  barrier_->Sync();
+// /* Idle while tasks are working */     fooWork();         barWork();
+// barrier.Sync();                        barrier_->Sync();  barrier_->Sync();
+// collectResultsFromTasks();             barrier_->Exit();  barrier_->Exit();
+// barrier.Exit();
+//
+// Note that the calls to Sync() "line up" in time, but there is no such
+// guarantee for Exit().
+//
+class ThreadBarrier {
+ public:
+  explicit ThreadBarrier(intptr_t num_threads)
+    : num_threads_(num_threads),
+      remaining_(num_threads),
+      parity_(false),
+      done_(false) {
+    ASSERT(remaining_ > 0);
+  }
+
+  void Sync() {
+    MonitorLocker ml(&monitor_);
+    ASSERT(remaining_ > 0);
+    if (--remaining_ > 0) {
+      // I'm not last to arrive; wait until next round.
+      bool old_parity = parity_;
+      while (parity_ == old_parity) {
+        ml.Wait();
+      }
+    } else {
+      // Last one to arrive initiates the next round.
+      remaining_ = num_threads_;
+      parity_ = !parity_;
+      // Tell everyone else about the new round.
+      ml.NotifyAll();
+    }
+  }
+
+  void Exit() {
+    bool last = false;
+    {
+      MonitorLocker ml(&monitor_);
+      ASSERT(remaining_ > 0);
+      last = (--remaining_ == 0);
+    }
+    if (last) {
+      // Last one to exit sets done_.
+      MonitorLocker ml(&done_monitor_);
+      ASSERT(!done_);
+      done_ = true;
+      // Tell the destructor in case it's already waiting.
+      ml.Notify();
+    }
+  }
+
+  ~ThreadBarrier() {
+    MonitorLocker ml(&done_monitor_);
+    // Wait for everyone to exit before destroying the monitors.
+    while (!done_) {
+      ml.Wait();
+    }
+    ASSERT(remaining_ == 0);
+  }
+
+ private:
+  const intptr_t num_threads_;
+
+  Monitor monitor_;
+  intptr_t remaining_;
+  bool parity_;
+
+  Monitor done_monitor_;  // TODO(koda): Try to optimize this away.
+  bool done_;
+
+  DISALLOW_COPY_AND_ASSIGN(ThreadBarrier);
+};
+
+}  // namespace dart
+
+#endif  // VM_THREAD_BARRIER_H_
diff --git a/runtime/vm/thread_barrier_test.cc b/runtime/vm/thread_barrier_test.cc
new file mode 100644
index 0000000..4517e18
--- /dev/null
+++ b/runtime/vm/thread_barrier_test.cc
@@ -0,0 +1,59 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "platform/assert.h"
+#include "vm/random.h"
+#include "vm/thread_barrier.h"
+#include "vm/thread_pool.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+class FuzzTask : public ThreadPool::Task {
+ public:
+  FuzzTask(intptr_t num_rounds,
+           ThreadBarrier* barrier,
+           uint64_t seed)
+    : num_rounds_(num_rounds),
+      barrier_(barrier),
+      rng_(seed) {
+  }
+
+  virtual void Run() {
+    for (intptr_t i = 0; i < num_rounds_; ++i) {
+      RandomSleep();
+      barrier_->Sync();
+    }
+    barrier_->Exit();
+  }
+
+ private:
+  void RandomSleep() {
+    int64_t ms = rng_.NextUInt32() % 4;
+    if (ms > 0) {
+      OS::Sleep(ms);
+    }
+  }
+
+  const intptr_t num_rounds_;
+  ThreadBarrier* barrier_;
+  Random rng_;
+};
+
+
+UNIT_TEST_CASE(ThreadBarrier) {
+  static const intptr_t kNumTasks = 5;
+  static const intptr_t kNumRounds = 500;
+
+  ThreadBarrier barrier(kNumTasks + 1);
+  for (intptr_t i = 0; i < kNumTasks; ++i) {
+    Dart::thread_pool()->Run(new FuzzTask(kNumRounds, &barrier, i + 1));
+  }
+  for (intptr_t i = 0; i < kNumRounds; ++i) {
+    barrier.Sync();
+  }
+  barrier.Exit();
+}
+
+}  // namespace dart
diff --git a/runtime/vm/timeline.cc b/runtime/vm/timeline.cc
index d510d5e..6b03d99 100644
--- a/runtime/vm/timeline.cc
+++ b/runtime/vm/timeline.cc
@@ -39,7 +39,12 @@
     recorder_ = new TimelineEventRingRecorder();
   }
   vm_stream_ = new TimelineStream();
-  vm_stream_->Init("VM", EnableStreamByDefault("VM"));
+  vm_stream_->Init("VM", EnableStreamByDefault("VM"), NULL);
+  // Global overrides.
+#define ISOLATE_TIMELINE_STREAM_FLAG_DEFAULT(name, not_used)                   \
+  stream_##name##_enabled_ = false;
+  ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_FLAG_DEFAULT)
+#undef ISOLATE_TIMELINE_STREAM_FLAG_DEFAULT
 }
 
 
@@ -75,6 +80,11 @@
 TimelineEventRecorder* Timeline::recorder_ = NULL;
 TimelineStream* Timeline::vm_stream_ = NULL;
 
+#define ISOLATE_TIMELINE_STREAM_DEFINE_FLAG(name, enabled_by_default)          \
+  bool Timeline::stream_##name##_enabled_ = false;
+  ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_DEFINE_FLAG)
+#undef ISOLATE_TIMELINE_STREAM_DEFINE_FLAG
+
 TimelineEvent::TimelineEvent()
     : timestamp0_(0),
       timestamp1_(0),
@@ -311,19 +321,23 @@
 
 TimelineStream::TimelineStream()
     : name_(NULL),
-      enabled_(false) {
+      enabled_(false),
+      globally_enabled_(NULL) {
 }
 
 
-void TimelineStream::Init(const char* name, bool enabled) {
+void TimelineStream::Init(const char* name,
+                          bool enabled,
+                          const bool* globally_enabled) {
   name_ = name;
   enabled_ = enabled;
+  globally_enabled_ = globally_enabled;
 }
 
 
 TimelineEvent* TimelineStream::StartEvent() {
   TimelineEventRecorder* recorder = Timeline::recorder();
-  if (!enabled_ || (recorder == NULL)) {
+  if (!Enabled() || (recorder == NULL)) {
     return NULL;
   }
   ASSERT(name_ != NULL);
diff --git a/runtime/vm/timeline.h b/runtime/vm/timeline.h
index 3c771292..335ff14 100644
--- a/runtime/vm/timeline.h
+++ b/runtime/vm/timeline.h
@@ -22,6 +22,13 @@
 class TimelineEventRecorder;
 class TimelineStream;
 
+// (name, enabled by default for isolate).
+#define ISOLATE_TIMELINE_STREAM_LIST(V)                                        \
+  V(API, false)                                                                \
+  V(Compiler, false)                                                           \
+  V(Embedder, false)                                                           \
+  V(GC, false)                                                                 \
+  V(Isolate, false)                                                            \
 
 class Timeline : public AllStatic {
  public:
@@ -38,10 +45,25 @@
 
   static TimelineStream* GetVMStream();
 
+#define ISOLATE_TIMELINE_STREAM_FLAGS(name, not_used)                          \
+  static const bool* Stream##name##EnabledFlag() {                             \
+    return &stream_##name##_enabled_;                                          \
+  }                                                                            \
+  static void SetStream##name##Enabled(bool enabled) {                         \
+    stream_##name##_enabled_ = enabled;                                        \
+  }
+  ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_FLAGS)
+#undef ISOLATE_TIMELINE_STREAM_FLAGS
+
  private:
   static TimelineEventRecorder* recorder_;
   static TimelineStream* vm_stream_;
 
+#define ISOLATE_TIMELINE_STREAM_DECLARE_FLAG(name, not_used)                   \
+  static bool stream_##name##_enabled_;
+  ISOLATE_TIMELINE_STREAM_LIST(ISOLATE_TIMELINE_STREAM_DECLARE_FLAG)
+#undef ISOLATE_TIMELINE_STREAM_DECLARE_FLAG
+
   friend class TimelineRecorderOverride;
 };
 
@@ -190,17 +212,24 @@
 
 
 // A stream of timeline events. A stream has a name and can be enabled or
-// disabled.
+// disabled (globally and per isolate).
 class TimelineStream {
  public:
   TimelineStream();
 
-  void Init(const char* name, bool enabled);
+  void Init(const char* name,
+            bool enabled,
+            const bool* globally_enabled = NULL);
 
   const char* name() const {
     return name_;
   }
 
+  bool Enabled() const {
+    return ((globally_enabled_ != NULL) && *globally_enabled_) ||
+           enabled();
+  }
+
   bool enabled() const {
     return enabled_;
   }
@@ -216,18 +245,9 @@
  private:
   const char* name_;
   bool enabled_;
+  const bool* globally_enabled_;
 };
 
-
-// (name, enabled by default).
-#define ISOLATE_TIMELINE_STREAM_LIST(V)                                        \
-  V(API, false)                                                                \
-  V(Compiler, false)                                                           \
-  V(Embedder, false)                                                           \
-  V(GC, false)                                                                 \
-  V(Isolate, false)                                                            \
-
-
 #define TIMELINE_FUNCTION_COMPILATION_DURATION(thread, suffix, function)       \
   TimelineDurationScope tds(thread,                                            \
                             thread->isolate()->GetCompilerStream(),            \
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index d4853e4..6e1ca5c 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -360,34 +360,36 @@
 
   uword entry() const { return code_.EntryPoint(); }
 
-  // Invoke is used to call assembler test functions using the ABI calling
-  // convention.
+  // Invoke/InvokeWithCode is used to call assembler test functions using the
+  // ABI calling convention.
   // ResultType is the return type of the assembler test function.
   // ArgNType is the type of the Nth argument.
 #if defined(USING_SIMULATOR)
 
 #if defined(ARCH_IS_64_BIT)
-  // TODO(fschneider): Make Invoke<> more general and work on 32-bit platforms.
+  // TODO(fschneider): Make InvokeWithCode<> more general and work on 32-bit.
   // Since Simulator::Call always return a int64_t, bit_cast does not work
   // on 32-bit platforms when returning an int32_t. Since template functions
   // don't support partial specialization, we'd need to introduce a helper
   // class to support 32-bit return types.
-  template<typename ResultType> ResultType Invoke() {
+  template<typename ResultType> ResultType InvokeWithCode() {
     const bool fp_return = is_double<ResultType>::value;
     const bool fp_args = false;
     return bit_cast<ResultType, int64_t>(Simulator::Current()->Call(
-        bit_cast<intptr_t, uword>(entry()), 0, 0, 0, 0, fp_return, fp_args));
+        bit_cast<intptr_t, uword>(entry()),
+        reinterpret_cast<intptr_t>(&code_), 0, 0, 0, fp_return, fp_args));
   }
   template<typename ResultType, typename Arg1Type>
-  ResultType Invoke(Arg1Type arg1) {
+  ResultType InvokeWithCode(Arg1Type arg1) {
     const bool fp_return = is_double<ResultType>::value;
     const bool fp_args = is_double<Arg1Type>::value;
     // TODO(fschneider): Support double arguments for simulator calls.
     COMPILE_ASSERT(!fp_args);
     return bit_cast<ResultType, int64_t>(Simulator::Current()->Call(
         bit_cast<intptr_t, uword>(entry()),
+        reinterpret_cast<intptr_t>(&code_),
         reinterpret_cast<intptr_t>(arg1),
-        0, 0, 0, fp_return, fp_args));
+        0, 0, fp_return, fp_args));
   }
 #endif  // ARCH_IS_64_BIT
 
@@ -411,15 +413,15 @@
         0, fp_return, fp_args);
   }
 #else
-  template<typename ResultType> ResultType Invoke() {
-    typedef ResultType (*FunctionType) ();
-    return reinterpret_cast<FunctionType>(entry())();
+  template<typename ResultType> ResultType InvokeWithCode() {
+    typedef ResultType (*FunctionType) (const Code&);
+    return reinterpret_cast<FunctionType>(entry())(code_);
   }
 
   template<typename ResultType, typename Arg1Type>
-  ResultType Invoke(Arg1Type arg1) {
-    typedef ResultType (*FunctionType) (Arg1Type);
-    return reinterpret_cast<FunctionType>(entry())(arg1);
+  ResultType InvokeWithCode(Arg1Type arg1) {
+    typedef ResultType (*FunctionType) (const Code&, Arg1Type);
+    return reinterpret_cast<FunctionType>(entry())(code_, arg1);
   }
 
   template<typename ResultType,
diff --git a/runtime/vm/virtual_memory.cc b/runtime/vm/virtual_memory.cc
index 050c83d..2f2c1bc 100644
--- a/runtime/vm/virtual_memory.cc
+++ b/runtime/vm/virtual_memory.cc
@@ -27,4 +27,13 @@
   region_.Subregion(region_, 0, new_size);
 }
 
+
+VirtualMemory* VirtualMemory::ForInstructionsSnapshot(void* pointer,
+                                                      uword size) {
+  // Memory for precompilated instructions was allocated by the embedder, so
+  // create a VirtualMemory without allocating.
+  MemoryRegion region(pointer, size);
+  return new VirtualMemory(region);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index 607e6b2..44f3491 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -69,6 +69,8 @@
   // Commit a reserved memory area, so that the memory can be accessed.
   bool Commit(uword addr, intptr_t size, bool is_executable);
 
+  static VirtualMemory* ForInstructionsSnapshot(void* pointer, uword size);
+
  private:
   static VirtualMemory* ReserveInternal(intptr_t size);
 
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 6eb0056..5f5fc57 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -103,8 +103,6 @@
     'constants_ia32.h',
     'constants_mips.h',
     'constants_x64.h',
-    'counters.cc',
-    'counters.h',
     'coverage.cc',
     'coverage.h',
     'coverage_test.cc',
@@ -446,6 +444,8 @@
     'tags.h',
     'thread.cc',
     'thread.h',
+    'thread_barrier.h',
+    'thread_barrier_test.cc',
     'thread_interrupter.cc',
     'thread_interrupter.h',
     'thread_interrupter_android.cc',
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
index 3177ba6..85e623a 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/weak_code.cc
@@ -117,15 +117,15 @@
       // Invalidate the old code object so existing references to it
       // (from optimized code) will fail when invoked.
       if (!CodePatcher::IsEntryPatched(code)) {
-        CodePatcher::PatchEntry(code);
+        CodePatcher::PatchEntry(
+            code, Code::Handle(StubCode::FixCallersTarget_entry()->code()));
       }
     } else {
       // Make non-OSR code non-entrant.
-      if (code.GetEntryPatchPc() != 0) {
-        if (!CodePatcher::IsEntryPatched(code)) {
-          ReportSwitchingCode(code);
-          CodePatcher::PatchEntry(code);
-        }
+      if (!CodePatcher::IsEntryPatched(code)) {
+        ReportSwitchingCode(code);
+        CodePatcher::PatchEntry(
+            code, Code::Handle(StubCode::FixCallersTarget_entry()->code()));
       }
     }
   }
diff --git a/sdk/bin/dartdocgen b/sdk/bin/dartdocgen
deleted file mode 100755
index bf807ad..0000000
--- a/sdk/bin/dartdocgen
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-# 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.
-
-function follow_links() {
-  file="$1"
-  while [ -h "$file" ]; do
-    # On Mac OS, readlink -f doesn't work.
-    file="$(readlink "$file")"
-  done
-  echo "$file"
-}
-
-# Unlike $0, $BASH_SOURCE points to the absolute path of this file.
-PROG_NAME="$(follow_links "$BASH_SOURCE")"
-
-# Handle the case where dart-sdk/bin has been symlinked to.
-BIN_DIR="$(cd "${PROG_NAME%/*}" ; pwd -P)"
-
-SDK_DIR="$(cd "${BIN_DIR}/.." ; pwd -P)"
-
-unset SNAPSHOT
-
-SNAPSHOT="$BIN_DIR/snapshots/utils_wrapper.dart.snapshot"
-
-if test -f "$SNAPSHOT"; then
-  exec "$BIN_DIR"/dart \
-      "--package-root=$BIN_DIR/../packages/" "--old_gen_heap_size=1024" \
-      "$SNAPSHOT" \
-       docgen "--sdk=$SDK_DIR" "$@"
-else
-  exec "$BIN_DIR"/dart \
-      "--package-root=$BIN_DIR/../packages/" "--old_gen_heap_size=1024" \
-      "$BIN_DIR/../../pkg/docgen/bin/docgen.dart" "--sdk=$SDK_DIR" "$@"
-fi
diff --git a/sdk/bin/dartdocgen.bat b/sdk/bin/dartdocgen.bat
deleted file mode 100644
index 136b7f9..0000000
--- a/sdk/bin/dartdocgen.bat
+++ /dev/null
@@ -1,49 +0,0 @@
-@echo off
-REM Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-REM for details. All rights reserved. Use of this source code is governed by a
-REM BSD-style license that can be found in the LICENSE file.
-
-setlocal
-rem Handle the case where dart-sdk/bin has been symlinked to.
-set DIR_NAME_WITH_SLASH=%~dp0
-set DIR_NAME=%DIR_NAME_WITH_SLASH:~0,-1%%
-call :follow_links "%DIR_NAME%", RETURNED_BIN_DIR
-rem Get rid of surrounding quotes.
-for %%i in ("%RETURNED_BIN_DIR%") do set BIN_DIR=%%~fi
-
-rem Get absolute full name for SDK_DIR.
-for %%i in ("%BIN_DIR%\..\") do set SDK_DIR=%%~fi
-
-rem Remove trailing backslash if there is one
-IF %SDK_DIR:~-1%==\ set SDK_DIR=%SDK_DIR:~0,-1%
-
-set DOCGEN=%SDK_DIR%\pkg\docgen\bin\docgen.dart
-set DART=%BIN_DIR%\dart
-set SNAPSHOT=%BIN_DIR%\snapshots\utils_wrapper.dart.snapshot
-
-if not defined DART_CONFIGURATION set DART_CONFIGURATION=ReleaseIA32
-
-set BUILD_DIR=%SDK_DIR%\..\build\%DART_CONFIGURATION%
-if exist "%SNAPSHOT%" (
-  "%DART%" "%SNAPSHOT%" "docgen" "--sdk=%SDK_DIR%" %*
-) else (
-  "%BUILD_DIR%\dart-sdk\bin\dart" "--package-root=%BUILD_DIR%\packages" "%DOCGEN%" "--sdk=%SDK_DIR%" %*
-)
-
-endlocal
-
-exit /b %errorlevel%
-
-:follow_links
-setlocal
-for %%i in (%1) do set result=%%~fi
-set current=
-for /f "tokens=2 delims=[]" %%i in ('dir /a:l ^"%~dp1^" 2^>nul ^
-                                     ^| find ">     %~n1 ["') do (
-  set current=%%i
-)
-if not "%current%"=="" call :follow_links "%current%", result
-endlocal & set %~2=%result%
-goto :eof
-
-:end
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index a3d3f8d..eac32e7 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -5,6 +5,8 @@
 // WARNING: Do not edit - generated code.
 library dart.dom._blink;
 
+import 'dart:js' as js;
+
 // This is a place to put custom renames if we need them.
 final resolverMap = {
 };
@@ -627,153 +629,75 @@
 class BlinkANGLEInstancedArrays {
   static final instance = new BlinkANGLEInstancedArrays();
 
-  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);
+  drawArraysInstancedANGLE_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("drawArraysInstancedANGLE", [__arg_0, __arg_1]);
 
-  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);
+  drawArraysInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("drawArraysInstancedANGLE", [__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);
+  drawArraysInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("drawArraysInstancedANGLE", [__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);
+  drawElementsInstancedANGLE_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  drawElementsInstancedANGLE_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  drawElementsInstancedANGLE_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("drawElementsInstancedANGLE", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  vertexAttribDivisorANGLE_Callback_0_(mthis) => mthis.callMethod("vertexAttribDivisorANGLE", []);
 
-  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);
+  vertexAttribDivisorANGLE_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttribDivisorANGLE", [__arg_0]);
 
-  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);
+  vertexAttribDivisorANGLE_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttribDivisorANGLE", [__arg_0, __arg_1]);
 
 }
 
 class BlinkAnalyserNode extends BlinkAudioNode {
   static final instance = new BlinkAnalyserNode();
 
-  static fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
-  fftSize_Getter_(mthis) => fftSize_Getter(mthis);
+  fftSize_Getter_(mthis) => mthis["fftSize"];
 
-  static fftSize_Setter(mthis, __arg_0) native "AnalyserNode_fftSize_Setter";
-  fftSize_Setter_(mthis, __arg_0) => fftSize_Setter(mthis, __arg_0);
+  fftSize_Setter_(mthis, __arg_0) => mthis["fftSize"] = __arg_0;
 
-  static frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
-  frequencyBinCount_Getter_(mthis) => frequencyBinCount_Getter(mthis);
+  frequencyBinCount_Getter_(mthis) => mthis["frequencyBinCount"];
 
-  static getByteFrequencyData_Callback_0(mthis) native "AnalyserNode_getByteFrequencyData_Callback";
-  getByteFrequencyData_Callback_0_(mthis) => getByteFrequencyData_Callback_0(mthis);
+  getByteFrequencyData_Callback_0_(mthis) => mthis.callMethod("getByteFrequencyData", []);
 
-  static getByteFrequencyData_Callback_1(mthis, __arg_0) native "AnalyserNode_getByteFrequencyData_Callback";
-  getByteFrequencyData_Callback_1_(mthis, __arg_0) => getByteFrequencyData_Callback_1(mthis, __arg_0);
+  getByteFrequencyData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getByteFrequencyData", [__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);
+  getByteTimeDomainData_Callback_0_(mthis) => mthis.callMethod("getByteTimeDomainData", []);
 
-  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);
+  getByteTimeDomainData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getByteTimeDomainData", [__arg_0]);
 
-  static getByteTimeDomainData_Callback_0(mthis) native "AnalyserNode_getByteTimeDomainData_Callback";
-  getByteTimeDomainData_Callback_0_(mthis) => getByteTimeDomainData_Callback_0(mthis);
+  getFloatFrequencyData_Callback_0_(mthis) => mthis.callMethod("getFloatFrequencyData", []);
 
-  static getByteTimeDomainData_Callback_1(mthis, __arg_0) native "AnalyserNode_getByteTimeDomainData_Callback";
-  getByteTimeDomainData_Callback_1_(mthis, __arg_0) => getByteTimeDomainData_Callback_1(mthis, __arg_0);
+  getFloatFrequencyData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFloatFrequencyData", [__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);
+  getFloatTimeDomainData_Callback_0_(mthis) => mthis.callMethod("getFloatTimeDomainData", []);
 
-  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);
+  getFloatTimeDomainData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFloatTimeDomainData", [__arg_0]);
 
-  static getFloatFrequencyData_Callback_0(mthis) native "AnalyserNode_getFloatFrequencyData_Callback";
-  getFloatFrequencyData_Callback_0_(mthis) => getFloatFrequencyData_Callback_0(mthis);
+  maxDecibels_Getter_(mthis) => mthis["maxDecibels"];
 
-  static getFloatFrequencyData_Callback_1(mthis, __arg_0) native "AnalyserNode_getFloatFrequencyData_Callback";
-  getFloatFrequencyData_Callback_1_(mthis, __arg_0) => getFloatFrequencyData_Callback_1(mthis, __arg_0);
+  maxDecibels_Setter_(mthis, __arg_0) => mthis["maxDecibels"] = __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);
+  minDecibels_Getter_(mthis) => mthis["minDecibels"];
 
-  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);
+  minDecibels_Setter_(mthis, __arg_0) => mthis["minDecibels"] = __arg_0;
 
-  static getFloatTimeDomainData_Callback_0(mthis) native "AnalyserNode_getFloatTimeDomainData_Callback";
-  getFloatTimeDomainData_Callback_0_(mthis) => getFloatTimeDomainData_Callback_0(mthis);
+  smoothingTimeConstant_Getter_(mthis) => mthis["smoothingTimeConstant"];
 
-  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, __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, __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, __arg_0) native "AnalyserNode_smoothingTimeConstant_Setter";
-  smoothingTimeConstant_Setter_(mthis, __arg_0) => smoothingTimeConstant_Setter(mthis, __arg_0);
+  smoothingTimeConstant_Setter_(mthis, __arg_0) => mthis["smoothingTimeConstant"] = __arg_0;
 
 }
 
 class BlinkAnimation extends BlinkAnimationNode {
   static final instance = new BlinkAnimation();
 
-  static constructorCallback_0() native "Animation_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Animation"], []);
 
-  static constructorCallback_1(__arg_0) native "Animation_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Animation"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Animation_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Animation"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["Animation"], [__arg_0, __arg_1, __arg_2]);
 
 }
 
@@ -785,900 +709,445 @@
 class BlinkAnimationNode {
   static final instance = new BlinkAnimationNode();
 
-  static activeDuration_Getter(mthis) native "AnimationNode_activeDuration_Getter";
-  activeDuration_Getter_(mthis) => activeDuration_Getter(mthis);
+  activeDuration_Getter_(mthis) => mthis["activeDuration"];
 
-  static currentIteration_Getter(mthis) native "AnimationNode_currentIteration_Getter";
-  currentIteration_Getter_(mthis) => currentIteration_Getter(mthis);
+  currentIteration_Getter_(mthis) => mthis["currentIteration"];
 
-  static duration_Getter(mthis) native "AnimationNode_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static endTime_Getter(mthis) native "AnimationNode_endTime_Getter";
-  endTime_Getter_(mthis) => endTime_Getter(mthis);
+  endTime_Getter_(mthis) => mthis["endTime"];
 
-  static localTime_Getter(mthis) native "AnimationNode_localTime_Getter";
-  localTime_Getter_(mthis) => localTime_Getter(mthis);
+  localTime_Getter_(mthis) => mthis["localTime"];
 
-  static player_Getter(mthis) native "AnimationNode_player_Getter";
-  player_Getter_(mthis) => player_Getter(mthis);
+  player_Getter_(mthis) => mthis["player"];
 
-  static startTime_Getter(mthis) native "AnimationNode_startTime_Getter";
-  startTime_Getter_(mthis) => startTime_Getter(mthis);
+  startTime_Getter_(mthis) => mthis["startTime"];
 
-  static timing_Getter(mthis) native "AnimationNode_timing_Getter";
-  timing_Getter_(mthis) => timing_Getter(mthis);
+  timing_Getter_(mthis) => mthis["timing"];
 
 }
 
 class BlinkAnimationPlayer extends BlinkEventTarget {
   static final instance = new BlinkAnimationPlayer();
 
-  static cancel_Callback_0(mthis) native "AnimationPlayer_cancel_Callback";
-  cancel_Callback_0_(mthis) => cancel_Callback_0(mthis);
+  cancel_Callback_0_(mthis) => mthis.callMethod("cancel", []);
 
-  static cancel_Callback_1(mthis, __arg_0) native "AnimationPlayer_cancel_Callback";
-  cancel_Callback_1_(mthis, __arg_0) => cancel_Callback_1(mthis, __arg_0);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  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);
+  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
 
-  static currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
-  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+  finish_Callback_0_(mthis) => mthis.callMethod("finish", []);
 
-  static currentTime_Setter(mthis, __arg_0) native "AnimationPlayer_currentTime_Setter";
-  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
+  onfinish_Getter_(mthis) => mthis["onfinish"];
 
-  static finish_Callback_0(mthis) native "AnimationPlayer_finish_Callback";
-  finish_Callback_0_(mthis) => finish_Callback_0(mthis);
+  onfinish_Setter_(mthis, __arg_0) => mthis["onfinish"] = __arg_0;
 
-  static finish_Callback_1(mthis, __arg_0) native "AnimationPlayer_finish_Callback";
-  finish_Callback_1_(mthis, __arg_0) => finish_Callback_1(mthis, __arg_0);
+  pause_Callback_0_(mthis) => mthis.callMethod("pause", []);
 
-  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);
+  playState_Getter_(mthis) => mthis["playState"];
 
-  static onfinish_Getter(mthis) native "AnimationPlayer_onfinish_Getter";
-  onfinish_Getter_(mthis) => onfinish_Getter(mthis);
+  play_Callback_0_(mthis) => mthis.callMethod("play", []);
 
-  static onfinish_Setter(mthis, __arg_0) native "AnimationPlayer_onfinish_Setter";
-  onfinish_Setter_(mthis, __arg_0) => onfinish_Setter(mthis, __arg_0);
+  playbackRate_Getter_(mthis) => mthis["playbackRate"];
 
-  static pause_Callback_0(mthis) native "AnimationPlayer_pause_Callback";
-  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
 
-  static pause_Callback_1(mthis, __arg_0) native "AnimationPlayer_pause_Callback";
-  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+  reverse_Callback_0_(mthis) => mthis.callMethod("reverse", []);
 
-  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);
+  source_Getter_(mthis) => mthis["source"];
 
-  static playState_Getter(mthis) native "AnimationPlayer_playState_Getter";
-  playState_Getter_(mthis) => playState_Getter(mthis);
+  source_Setter_(mthis, __arg_0) => mthis["source"] = __arg_0;
 
-  static play_Callback_0(mthis) native "AnimationPlayer_play_Callback";
-  play_Callback_0_(mthis) => play_Callback_0(mthis);
+  startTime_Getter_(mthis) => mthis["startTime"];
 
-  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, __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, __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, __arg_0) native "AnimationPlayer_startTime_Setter";
-  startTime_Setter_(mthis, __arg_0) => startTime_Setter(mthis, __arg_0);
+  startTime_Setter_(mthis, __arg_0) => mthis["startTime"] = __arg_0;
 
 }
 
 class BlinkAnimationPlayerEvent extends BlinkEvent {
   static final instance = new BlinkAnimationPlayerEvent();
 
-  static constructorCallback_2(__arg_0, __arg_1) native "AnimationPlayerEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["AnimationPlayerEvent"], [__arg_0, __arg_1]);
 
-  static currentTime_Getter(mthis) native "AnimationPlayerEvent_currentTime_Getter";
-  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  static timelineTime_Getter(mthis) native "AnimationPlayerEvent_timelineTime_Getter";
-  timelineTime_Getter_(mthis) => timelineTime_Getter(mthis);
+  timelineTime_Getter_(mthis) => mthis["timelineTime"];
 
 }
 
 class BlinkAnimationTimeline {
   static final instance = new BlinkAnimationTimeline();
 
-  static currentTime_Getter(mthis) native "AnimationTimeline_currentTime_Getter";
-  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  static getAnimationPlayers_Callback_0(mthis) native "AnimationTimeline_getAnimationPlayers_Callback";
-  getAnimationPlayers_Callback_0_(mthis) => getAnimationPlayers_Callback_0(mthis);
+  getAnimationPlayers_Callback_0_(mthis) => mthis.callMethod("getAnimationPlayers", []);
 
-  static getAnimationPlayers_Callback_1(mthis, __arg_0) native "AnimationTimeline_getAnimationPlayers_Callback";
-  getAnimationPlayers_Callback_1_(mthis, __arg_0) => getAnimationPlayers_Callback_1(mthis, __arg_0);
+  play_Callback_0_(mthis) => mthis.callMethod("play", []);
 
-  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);
+  play_Callback_1_(mthis, __arg_0) => mthis.callMethod("play", [__arg_0]);
 
 }
 
 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);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "ApplicationCache_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  oncached_Getter_(mthis) => mthis["oncached"];
 
-  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);
+  oncached_Setter_(mthis, __arg_0) => mthis["oncached"] = __arg_0;
 
-  static oncached_Getter(mthis) native "ApplicationCache_oncached_Getter";
-  oncached_Getter_(mthis) => oncached_Getter(mthis);
+  onchecking_Getter_(mthis) => mthis["onchecking"];
 
-  static oncached_Setter(mthis, __arg_0) native "ApplicationCache_oncached_Setter";
-  oncached_Setter_(mthis, __arg_0) => oncached_Setter(mthis, __arg_0);
+  onchecking_Setter_(mthis, __arg_0) => mthis["onchecking"] = __arg_0;
 
-  static onchecking_Getter(mthis) native "ApplicationCache_onchecking_Getter";
-  onchecking_Getter_(mthis) => onchecking_Getter(mthis);
+  ondownloading_Getter_(mthis) => mthis["ondownloading"];
 
-  static onchecking_Setter(mthis, __arg_0) native "ApplicationCache_onchecking_Setter";
-  onchecking_Setter_(mthis, __arg_0) => onchecking_Setter(mthis, __arg_0);
+  ondownloading_Setter_(mthis, __arg_0) => mthis["ondownloading"] = __arg_0;
 
-  static ondownloading_Getter(mthis) native "ApplicationCache_ondownloading_Getter";
-  ondownloading_Getter_(mthis) => ondownloading_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static ondownloading_Setter(mthis, __arg_0) native "ApplicationCache_ondownloading_Setter";
-  ondownloading_Setter_(mthis, __arg_0) => ondownloading_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "ApplicationCache_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onnoupdate_Getter_(mthis) => mthis["onnoupdate"];
 
-  static onerror_Setter(mthis, __arg_0) native "ApplicationCache_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onnoupdate_Setter_(mthis, __arg_0) => mthis["onnoupdate"] = __arg_0;
 
-  static onnoupdate_Getter(mthis) native "ApplicationCache_onnoupdate_Getter";
-  onnoupdate_Getter_(mthis) => onnoupdate_Getter(mthis);
+  onobsolete_Getter_(mthis) => mthis["onobsolete"];
 
-  static onnoupdate_Setter(mthis, __arg_0) native "ApplicationCache_onnoupdate_Setter";
-  onnoupdate_Setter_(mthis, __arg_0) => onnoupdate_Setter(mthis, __arg_0);
+  onobsolete_Setter_(mthis, __arg_0) => mthis["onobsolete"] = __arg_0;
 
-  static onobsolete_Getter(mthis) native "ApplicationCache_onobsolete_Getter";
-  onobsolete_Getter_(mthis) => onobsolete_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onobsolete_Setter(mthis, __arg_0) native "ApplicationCache_onobsolete_Setter";
-  onobsolete_Setter_(mthis, __arg_0) => onobsolete_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "ApplicationCache_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onupdateready_Getter_(mthis) => mthis["onupdateready"];
 
-  static onprogress_Setter(mthis, __arg_0) native "ApplicationCache_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onupdateready_Setter_(mthis, __arg_0) => mthis["onupdateready"] = __arg_0;
 
-  static onupdateready_Getter(mthis) native "ApplicationCache_onupdateready_Getter";
-  onupdateready_Getter_(mthis) => onupdateready_Getter(mthis);
+  status_Getter_(mthis) => mthis["status"];
 
-  static onupdateready_Setter(mthis, __arg_0) native "ApplicationCache_onupdateready_Setter";
-  onupdateready_Setter_(mthis, __arg_0) => onupdateready_Setter(mthis, __arg_0);
+  swapCache_Callback_0_(mthis) => mthis.callMethod("swapCache", []);
 
-  static status_Getter(mthis) native "ApplicationCache_status_Getter";
-  status_Getter_(mthis) => status_Getter(mthis);
-
-  static swapCache_Callback_0(mthis) native "ApplicationCache_swapCache_Callback";
-  swapCache_Callback_0_(mthis) => swapCache_Callback_0(mthis);
-
-  static swapCache_Callback_1(mthis, __arg_0) native "ApplicationCache_swapCache_Callback";
-  swapCache_Callback_1_(mthis, __arg_0) => swapCache_Callback_1(mthis, __arg_0);
-
-  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);
+  update_Callback_0_(mthis) => mthis.callMethod("update", []);
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["ApplicationCacheErrorEvent"], [__arg_0, __arg_1]);
 
-  static message_Getter(mthis) native "ApplicationCacheErrorEvent_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
-  static reason_Getter(mthis) native "ApplicationCacheErrorEvent_reason_Getter";
-  reason_Getter_(mthis) => reason_Getter(mthis);
+  reason_Getter_(mthis) => mthis["reason"];
 
-  static status_Getter(mthis) native "ApplicationCacheErrorEvent_status_Getter";
-  status_Getter_(mthis) => status_Getter(mthis);
+  status_Getter_(mthis) => mthis["status"];
 
-  static url_Getter(mthis) native "ApplicationCacheErrorEvent_url_Getter";
-  url_Getter_(mthis) => url_Getter(mthis);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 class BlinkAttr extends BlinkNode {
   static final instance = new BlinkAttr();
 
-  static localName_Getter(mthis) native "Attr_localName_Getter";
-  localName_Getter_(mthis) => localName_Getter(mthis);
+  localName_Getter_(mthis) => mthis["localName"];
 
-  static name_Getter(mthis) native "Attr_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
-  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
+  namespaceURI_Getter_(mthis) => mthis["namespaceURI"];
 
-  static nodeValue_Getter(mthis) native "Attr_nodeValue_Getter";
-  nodeValue_Getter_(mthis) => nodeValue_Getter(mthis);
+  nodeValue_Getter_(mthis) => mthis["nodeValue"];
 
-  static nodeValue_Setter(mthis, __arg_0) native "Attr_nodeValue_Setter";
-  nodeValue_Setter_(mthis, __arg_0) => nodeValue_Setter(mthis, __arg_0);
+  nodeValue_Setter_(mthis, __arg_0) => mthis["nodeValue"] = __arg_0;
 
-  static ownerElement_Getter(mthis) native "Attr_ownerElement_Getter";
-  ownerElement_Getter_(mthis) => ownerElement_Getter(mthis);
+  ownerElement_Getter_(mthis) => mthis["ownerElement"];
 
-  static prefix_Getter(mthis) native "Attr_prefix_Getter";
-  prefix_Getter_(mthis) => prefix_Getter(mthis);
+  prefix_Getter_(mthis) => mthis["prefix"];
 
-  static specified_Getter(mthis) native "Attr_specified_Getter";
-  specified_Getter_(mthis) => specified_Getter(mthis);
+  specified_Getter_(mthis) => mthis["specified"];
 
-  static textContent_Getter(mthis) native "Attr_textContent_Getter";
-  textContent_Getter_(mthis) => textContent_Getter(mthis);
+  textContent_Getter_(mthis) => mthis["textContent"];
 
-  static textContent_Setter(mthis, __arg_0) native "Attr_textContent_Setter";
-  textContent_Setter_(mthis, __arg_0) => textContent_Setter(mthis, __arg_0);
+  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
 
-  static value_Getter(mthis) native "Attr_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "Attr_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkAudioBuffer {
   static final instance = new BlinkAudioBuffer();
 
-  static duration_Getter(mthis) native "AudioBuffer_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static getChannelData_Callback_0(mthis) native "AudioBuffer_getChannelData_Callback";
-  getChannelData_Callback_0_(mthis) => getChannelData_Callback_0(mthis);
+  getChannelData_Callback_0_(mthis) => mthis.callMethod("getChannelData", []);
 
-  static getChannelData_Callback_1(mthis, __arg_0) native "AudioBuffer_getChannelData_Callback";
-  getChannelData_Callback_1_(mthis, __arg_0) => getChannelData_Callback_1(mthis, __arg_0);
+  getChannelData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getChannelData", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  numberOfChannels_Getter_(mthis) => mthis["numberOfChannels"];
 
-  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);
+  sampleRate_Getter_(mthis) => mthis["sampleRate"];
 
 }
 
 class BlinkAudioBufferSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkAudioBufferSourceNode();
 
-  static buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
-  buffer_Getter_(mthis) => buffer_Getter(mthis);
+  buffer_Getter_(mthis) => mthis["buffer"];
 
-  static buffer_Setter(mthis, __arg_0) native "AudioBufferSourceNode_buffer_Setter";
-  buffer_Setter_(mthis, __arg_0) => buffer_Setter(mthis, __arg_0);
+  buffer_Setter_(mthis, __arg_0) => mthis["buffer"] = __arg_0;
 
-  static loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
-  loopEnd_Getter_(mthis) => loopEnd_Getter(mthis);
+  loopEnd_Getter_(mthis) => mthis["loopEnd"];
 
-  static loopEnd_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loopEnd_Setter";
-  loopEnd_Setter_(mthis, __arg_0) => loopEnd_Setter(mthis, __arg_0);
+  loopEnd_Setter_(mthis, __arg_0) => mthis["loopEnd"] = __arg_0;
 
-  static loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
-  loopStart_Getter_(mthis) => loopStart_Getter(mthis);
+  loopStart_Getter_(mthis) => mthis["loopStart"];
 
-  static loopStart_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loopStart_Setter";
-  loopStart_Setter_(mthis, __arg_0) => loopStart_Setter(mthis, __arg_0);
+  loopStart_Setter_(mthis, __arg_0) => mthis["loopStart"] = __arg_0;
 
-  static loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
-  loop_Getter_(mthis) => loop_Getter(mthis);
+  loop_Getter_(mthis) => mthis["loop"];
 
-  static loop_Setter(mthis, __arg_0) native "AudioBufferSourceNode_loop_Setter";
-  loop_Setter_(mthis, __arg_0) => loop_Setter(mthis, __arg_0);
+  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
 
-  static onended_Getter(mthis) native "AudioBufferSourceNode_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static onended_Setter(mthis, __arg_0) native "AudioBufferSourceNode_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
-  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
+  playbackRate_Getter_(mthis) => mthis["playbackRate"];
 
-  static start_Callback_0(mthis) native "AudioBufferSourceNode_start_Callback";
-  start_Callback_0_(mthis) => start_Callback_0(mthis);
+  start_Callback_0_(mthis) => mthis.callMethod("start", []);
 
-  static start_Callback_1(mthis, __arg_0) native "AudioBufferSourceNode_start_Callback";
-  start_Callback_1_(mthis, __arg_0) => start_Callback_1(mthis, __arg_0);
+  start_Callback_1_(mthis, __arg_0) => mthis.callMethod("start", [__arg_0]);
 
-  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);
+  start_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("start", [__arg_0, __arg_1]);
 
-  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);
+  start_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("start", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
-  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);
+  stop_Callback_1_(mthis, __arg_0) => mthis.callMethod("stop", [__arg_0]);
 
 }
 
 class BlinkAudioContext extends BlinkEventTarget {
   static final instance = new BlinkAudioContext();
 
-  static constructorCallback_0() native "AudioContext_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["AudioContext"], []);
 
-  static constructorCallback_1(__arg_0) native "AudioContext_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  createAnalyser_Callback_0_(mthis) => mthis.callMethod("createAnalyser", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "AudioContext_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  createBiquadFilter_Callback_0_(mthis) => mthis.callMethod("createBiquadFilter", []);
 
-  static createAnalyser_Callback_0(mthis) native "AudioContext_createAnalyser_Callback";
-  createAnalyser_Callback_0_(mthis) => createAnalyser_Callback_0(mthis);
+  createBufferSource_Callback_0_(mthis) => mthis.callMethod("createBufferSource", []);
 
-  static createAnalyser_Callback_1(mthis, __arg_0) native "AudioContext_createAnalyser_Callback";
-  createAnalyser_Callback_1_(mthis, __arg_0) => createAnalyser_Callback_1(mthis, __arg_0);
+  createBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("createBuffer", [__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);
+  createBuffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createBuffer", [__arg_0, __arg_1]);
 
-  static createBiquadFilter_Callback_0(mthis) native "AudioContext_createBiquadFilter_Callback";
-  createBiquadFilter_Callback_0_(mthis) => createBiquadFilter_Callback_0(mthis);
+  createBuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createBuffer", [__arg_0, __arg_1, __arg_2]);
 
-  static createBiquadFilter_Callback_1(mthis, __arg_0) native "AudioContext_createBiquadFilter_Callback";
-  createBiquadFilter_Callback_1_(mthis, __arg_0) => createBiquadFilter_Callback_1(mthis, __arg_0);
+  createChannelMerger_Callback_0_(mthis) => mthis.callMethod("createChannelMerger", []);
 
-  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);
+  createChannelMerger_Callback_1_(mthis, __arg_0) => mthis.callMethod("createChannelMerger", [__arg_0]);
 
-  static createBufferSource_Callback_0(mthis) native "AudioContext_createBufferSource_Callback";
-  createBufferSource_Callback_0_(mthis) => createBufferSource_Callback_0(mthis);
+  createChannelSplitter_Callback_0_(mthis) => mthis.callMethod("createChannelSplitter", []);
 
-  static createBufferSource_Callback_1(mthis, __arg_0) native "AudioContext_createBufferSource_Callback";
-  createBufferSource_Callback_1_(mthis, __arg_0) => createBufferSource_Callback_1(mthis, __arg_0);
+  createChannelSplitter_Callback_1_(mthis, __arg_0) => mthis.callMethod("createChannelSplitter", [__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);
+  createConvolver_Callback_0_(mthis) => mthis.callMethod("createConvolver", []);
 
-  static createBuffer_Callback_1(mthis, __arg_0) native "AudioContext_createBuffer_Callback";
-  createBuffer_Callback_1_(mthis, __arg_0) => createBuffer_Callback_1(mthis, __arg_0);
+  createDelay_Callback_0_(mthis) => mthis.callMethod("createDelay", []);
 
-  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);
+  createDelay_Callback_1_(mthis, __arg_0) => mthis.callMethod("createDelay", [__arg_0]);
 
-  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);
+  createDynamicsCompressor_Callback_0_(mthis) => mthis.callMethod("createDynamicsCompressor", []);
 
-  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);
+  createGain_Callback_0_(mthis) => mthis.callMethod("createGain", []);
 
-  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);
+  createMediaElementSource_Callback_0_(mthis) => mthis.callMethod("createMediaElementSource", []);
 
-  static createChannelMerger_Callback_0(mthis) native "AudioContext_createChannelMerger_Callback";
-  createChannelMerger_Callback_0_(mthis) => createChannelMerger_Callback_0(mthis);
+  createMediaElementSource_Callback_1_(mthis, __arg_0) => mthis.callMethod("createMediaElementSource", [__arg_0]);
 
-  static createChannelMerger_Callback_1(mthis, __arg_0) native "AudioContext_createChannelMerger_Callback";
-  createChannelMerger_Callback_1_(mthis, __arg_0) => createChannelMerger_Callback_1(mthis, __arg_0);
+  createMediaStreamDestination_Callback_0_(mthis) => mthis.callMethod("createMediaStreamDestination", []);
 
-  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);
+  createMediaStreamSource_Callback_0_(mthis) => mthis.callMethod("createMediaStreamSource", []);
 
-  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);
+  createMediaStreamSource_Callback_1_(mthis, __arg_0) => mthis.callMethod("createMediaStreamSource", [__arg_0]);
 
-  static createChannelSplitter_Callback_0(mthis) native "AudioContext_createChannelSplitter_Callback";
-  createChannelSplitter_Callback_0_(mthis) => createChannelSplitter_Callback_0(mthis);
+  createOscillator_Callback_0_(mthis) => mthis.callMethod("createOscillator", []);
 
-  static createChannelSplitter_Callback_1(mthis, __arg_0) native "AudioContext_createChannelSplitter_Callback";
-  createChannelSplitter_Callback_1_(mthis, __arg_0) => createChannelSplitter_Callback_1(mthis, __arg_0);
+  createPanner_Callback_0_(mthis) => mthis.callMethod("createPanner", []);
 
-  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);
+  createPeriodicWave_Callback_0_(mthis) => mthis.callMethod("createPeriodicWave", []);
 
-  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);
+  createPeriodicWave_Callback_1_(mthis, __arg_0) => mthis.callMethod("createPeriodicWave", [__arg_0]);
 
-  static createConvolver_Callback_0(mthis) native "AudioContext_createConvolver_Callback";
-  createConvolver_Callback_0_(mthis) => createConvolver_Callback_0(mthis);
+  createPeriodicWave_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createPeriodicWave", [__arg_0, __arg_1]);
 
-  static createConvolver_Callback_1(mthis, __arg_0) native "AudioContext_createConvolver_Callback";
-  createConvolver_Callback_1_(mthis, __arg_0) => createConvolver_Callback_1(mthis, __arg_0);
+  createScriptProcessor_Callback_0_(mthis) => mthis.callMethod("createScriptProcessor", []);
 
-  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);
+  createScriptProcessor_Callback_1_(mthis, __arg_0) => mthis.callMethod("createScriptProcessor", [__arg_0]);
 
-  static createDelay_Callback_0(mthis) native "AudioContext_createDelay_Callback";
-  createDelay_Callback_0_(mthis) => createDelay_Callback_0(mthis);
+  createScriptProcessor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createScriptProcessor", [__arg_0, __arg_1]);
 
-  static createDelay_Callback_1(mthis, __arg_0) native "AudioContext_createDelay_Callback";
-  createDelay_Callback_1_(mthis, __arg_0) => createDelay_Callback_1(mthis, __arg_0);
+  createScriptProcessor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createScriptProcessor", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createWaveShaper_Callback_0_(mthis) => mthis.callMethod("createWaveShaper", []);
 
-  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);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  static createDynamicsCompressor_Callback_0(mthis) native "AudioContext_createDynamicsCompressor_Callback";
-  createDynamicsCompressor_Callback_0_(mthis) => createDynamicsCompressor_Callback_0(mthis);
+  decodeAudioData_Callback_0_(mthis) => mthis.callMethod("decodeAudioData", []);
 
-  static createDynamicsCompressor_Callback_1(mthis, __arg_0) native "AudioContext_createDynamicsCompressor_Callback";
-  createDynamicsCompressor_Callback_1_(mthis, __arg_0) => createDynamicsCompressor_Callback_1(mthis, __arg_0);
+  decodeAudioData_Callback_1_(mthis, __arg_0) => mthis.callMethod("decodeAudioData", [__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);
+  decodeAudioData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("decodeAudioData", [__arg_0, __arg_1]);
 
-  static createGain_Callback_0(mthis) native "AudioContext_createGain_Callback";
-  createGain_Callback_0_(mthis) => createGain_Callback_0(mthis);
+  decodeAudioData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("decodeAudioData", [__arg_0, __arg_1, __arg_2]);
 
-  static createGain_Callback_1(mthis, __arg_0) native "AudioContext_createGain_Callback";
-  createGain_Callback_1_(mthis, __arg_0) => createGain_Callback_1(mthis, __arg_0);
+  destination_Getter_(mthis) => mthis["destination"];
 
-  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);
+  listener_Getter_(mthis) => mthis["listener"];
 
-  static createMediaElementSource_Callback_0(mthis) native "AudioContext_createMediaElementSource_Callback";
-  createMediaElementSource_Callback_0_(mthis) => createMediaElementSource_Callback_0(mthis);
+  oncomplete_Getter_(mthis) => mthis["oncomplete"];
 
-  static createMediaElementSource_Callback_1(mthis, __arg_0) native "AudioContext_createMediaElementSource_Callback";
-  createMediaElementSource_Callback_1_(mthis, __arg_0) => createMediaElementSource_Callback_1(mthis, __arg_0);
+  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __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);
+  sampleRate_Getter_(mthis) => mthis["sampleRate"];
 
-  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 startRendering_Callback_0(mthis) native "AudioContext_startRendering_Callback";
-  startRendering_Callback_0_(mthis) => startRendering_Callback_0(mthis);
-
-  static startRendering_Callback_1(mthis, __arg_0) native "AudioContext_startRendering_Callback";
-  startRendering_Callback_1_(mthis, __arg_0) => startRendering_Callback_1(mthis, __arg_0);
-
-  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);
+  startRendering_Callback_0_(mthis) => mthis.callMethod("startRendering", []);
 
 }
 
 class BlinkAudioDestinationNode extends BlinkAudioNode {
   static final instance = new BlinkAudioDestinationNode();
 
-  static maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
-  maxChannelCount_Getter_(mthis) => maxChannelCount_Getter(mthis);
+  maxChannelCount_Getter_(mthis) => mthis["maxChannelCount"];
 
 }
 
 class BlinkAudioListener {
   static final instance = new BlinkAudioListener();
 
-  static dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
-  dopplerFactor_Getter_(mthis) => dopplerFactor_Getter(mthis);
+  dopplerFactor_Getter_(mthis) => mthis["dopplerFactor"];
 
-  static dopplerFactor_Setter(mthis, __arg_0) native "AudioListener_dopplerFactor_Setter";
-  dopplerFactor_Setter_(mthis, __arg_0) => dopplerFactor_Setter(mthis, __arg_0);
+  dopplerFactor_Setter_(mthis, __arg_0) => mthis["dopplerFactor"] = __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);
+  setOrientation_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setOrientation", [__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);
+  setOrientation_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("setOrientation", [__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);
+  setOrientation_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("setOrientation", [__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);
+  setPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("setPosition", [__arg_0]);
 
-  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);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setPosition", [__arg_0, __arg_1]);
 
-  static setPosition_Callback_1(mthis, __arg_0) native "AudioListener_setPosition_Callback";
-  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setPosition", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setVelocity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setVelocity", [__arg_0]);
 
-  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);
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setVelocity", [__arg_0, __arg_1]);
 
-  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);
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setVelocity", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  speedOfSound_Getter_(mthis) => mthis["speedOfSound"];
 
-  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, __arg_0) native "AudioListener_speedOfSound_Setter";
-  speedOfSound_Setter_(mthis, __arg_0) => speedOfSound_Setter(mthis, __arg_0);
+  speedOfSound_Setter_(mthis, __arg_0) => mthis["speedOfSound"] = __arg_0;
 
 }
 
 class BlinkAudioNode extends BlinkEventTarget {
   static final instance = new BlinkAudioNode();
 
-  static channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
-  channelCountMode_Getter_(mthis) => channelCountMode_Getter(mthis);
+  channelCountMode_Getter_(mthis) => mthis["channelCountMode"];
 
-  static channelCountMode_Setter(mthis, __arg_0) native "AudioNode_channelCountMode_Setter";
-  channelCountMode_Setter_(mthis, __arg_0) => channelCountMode_Setter(mthis, __arg_0);
+  channelCountMode_Setter_(mthis, __arg_0) => mthis["channelCountMode"] = __arg_0;
 
-  static channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
-  channelCount_Getter_(mthis) => channelCount_Getter(mthis);
+  channelCount_Getter_(mthis) => mthis["channelCount"];
 
-  static channelCount_Setter(mthis, __arg_0) native "AudioNode_channelCount_Setter";
-  channelCount_Setter_(mthis, __arg_0) => channelCount_Setter(mthis, __arg_0);
+  channelCount_Setter_(mthis, __arg_0) => mthis["channelCount"] = __arg_0;
 
-  static channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
-  channelInterpretation_Getter_(mthis) => channelInterpretation_Getter(mthis);
+  channelInterpretation_Getter_(mthis) => mthis["channelInterpretation"];
 
-  static channelInterpretation_Setter(mthis, __arg_0) native "AudioNode_channelInterpretation_Setter";
-  channelInterpretation_Setter_(mthis, __arg_0) => channelInterpretation_Setter(mthis, __arg_0);
+  channelInterpretation_Setter_(mthis, __arg_0) => mthis["channelInterpretation"] = __arg_0;
 
-  static connect_Callback_0(mthis) native "AudioNode_connect_Callback";
-  connect_Callback_0_(mthis) => connect_Callback_0(mthis);
+  connect_Callback_0_(mthis) => mthis.callMethod("connect", []);
 
-  static connect_Callback_1(mthis, __arg_0) native "AudioNode_connect_Callback";
-  connect_Callback_1_(mthis, __arg_0) => connect_Callback_1(mthis, __arg_0);
+  connect_Callback_1_(mthis, __arg_0) => mthis.callMethod("connect", [__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);
+  connect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("connect", [__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);
+  connect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("connect", [__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);
+  context_Getter_(mthis) => mthis["context"];
 
-  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);
+  disconnect_Callback_0_(mthis) => mthis.callMethod("disconnect", []);
 
-  static context_Getter(mthis) native "AudioNode_context_Getter";
-  context_Getter_(mthis) => context_Getter(mthis);
+  disconnect_Callback_1_(mthis, __arg_0) => mthis.callMethod("disconnect", [__arg_0]);
 
-  static disconnect_Callback_0(mthis) native "AudioNode_disconnect_Callback";
-  disconnect_Callback_0_(mthis) => disconnect_Callback_0(mthis);
+  numberOfInputs_Getter_(mthis) => mthis["numberOfInputs"];
 
-  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);
+  numberOfOutputs_Getter_(mthis) => mthis["numberOfOutputs"];
 
 }
 
 class BlinkAudioParam {
   static final instance = new BlinkAudioParam();
 
-  static cancelScheduledValues_Callback_0(mthis) native "AudioParam_cancelScheduledValues_Callback";
-  cancelScheduledValues_Callback_0_(mthis) => cancelScheduledValues_Callback_0(mthis);
+  cancelScheduledValues_Callback_0_(mthis) => mthis.callMethod("cancelScheduledValues", []);
 
-  static cancelScheduledValues_Callback_1(mthis, __arg_0) native "AudioParam_cancelScheduledValues_Callback";
-  cancelScheduledValues_Callback_1_(mthis, __arg_0) => cancelScheduledValues_Callback_1(mthis, __arg_0);
+  cancelScheduledValues_Callback_1_(mthis, __arg_0) => mthis.callMethod("cancelScheduledValues", [__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);
+  defaultValue_Getter_(mthis) => mthis["defaultValue"];
 
-  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);
+  exponentialRampToValueAtTime_Callback_0_(mthis) => mthis.callMethod("exponentialRampToValueAtTime", []);
 
-  static defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
-  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
+  exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("exponentialRampToValueAtTime", [__arg_0]);
 
-  static exponentialRampToValueAtTime_Callback_0(mthis) native "AudioParam_exponentialRampToValueAtTime_Callback";
-  exponentialRampToValueAtTime_Callback_0_(mthis) => exponentialRampToValueAtTime_Callback_0(mthis);
+  exponentialRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("exponentialRampToValueAtTime", [__arg_0, __arg_1]);
 
-  static exponentialRampToValueAtTime_Callback_1(mthis, __arg_0) native "AudioParam_exponentialRampToValueAtTime_Callback";
-  exponentialRampToValueAtTime_Callback_1_(mthis, __arg_0) => exponentialRampToValueAtTime_Callback_1(mthis, __arg_0);
+  linearRampToValueAtTime_Callback_0_(mthis) => mthis.callMethod("linearRampToValueAtTime", []);
 
-  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);
+  linearRampToValueAtTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("linearRampToValueAtTime", [__arg_0]);
 
-  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);
+  linearRampToValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("linearRampToValueAtTime", [__arg_0, __arg_1]);
 
-  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);
+  setTargetAtTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("setTargetAtTime", [__arg_0]);
 
-  static linearRampToValueAtTime_Callback_0(mthis) native "AudioParam_linearRampToValueAtTime_Callback";
-  linearRampToValueAtTime_Callback_0_(mthis) => linearRampToValueAtTime_Callback_0(mthis);
+  setTargetAtTime_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setTargetAtTime", [__arg_0, __arg_1]);
 
-  static linearRampToValueAtTime_Callback_1(mthis, __arg_0) native "AudioParam_linearRampToValueAtTime_Callback";
-  linearRampToValueAtTime_Callback_1_(mthis, __arg_0) => linearRampToValueAtTime_Callback_1(mthis, __arg_0);
+  setTargetAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setTargetAtTime", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setValueAtTime_Callback_0_(mthis) => mthis.callMethod("setValueAtTime", []);
 
-  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);
+  setValueAtTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("setValueAtTime", [__arg_0]);
 
-  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);
+  setValueAtTime_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setValueAtTime", [__arg_0, __arg_1]);
 
-  static setTargetAtTime_Callback_1(mthis, __arg_0) native "AudioParam_setTargetAtTime_Callback";
-  setTargetAtTime_Callback_1_(mthis, __arg_0) => setTargetAtTime_Callback_1(mthis, __arg_0);
+  setValueCurveAtTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("setValueCurveAtTime", [__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);
+  setValueCurveAtTime_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setValueCurveAtTime", [__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);
+  setValueCurveAtTime_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setValueCurveAtTime", [__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);
+  value_Getter_(mthis) => mthis["value"];
 
-  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, __arg_0) native "AudioParam_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkAudioProcessingEvent extends BlinkEvent {
   static final instance = new BlinkAudioProcessingEvent();
 
-  static inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
-  inputBuffer_Getter_(mthis) => inputBuffer_Getter(mthis);
+  inputBuffer_Getter_(mthis) => mthis["inputBuffer"];
 
-  static outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
-  outputBuffer_Getter_(mthis) => outputBuffer_Getter(mthis);
+  outputBuffer_Getter_(mthis) => mthis["outputBuffer"];
 
-  static playbackTime_Getter(mthis) native "AudioProcessingEvent_playbackTime_Getter";
-  playbackTime_Getter_(mthis) => playbackTime_Getter(mthis);
+  playbackTime_Getter_(mthis) => mthis["playbackTime"];
 
 }
 
@@ -1690,270 +1159,159 @@
 class BlinkAudioTrack {
   static final instance = new BlinkAudioTrack();
 
-  static enabled_Getter(mthis) native "AudioTrack_enabled_Getter";
-  enabled_Getter_(mthis) => enabled_Getter(mthis);
+  enabled_Getter_(mthis) => mthis["enabled"];
 
-  static enabled_Setter(mthis, __arg_0) native "AudioTrack_enabled_Setter";
-  enabled_Setter_(mthis, __arg_0) => enabled_Setter(mthis, __arg_0);
+  enabled_Setter_(mthis, __arg_0) => mthis["enabled"] = __arg_0;
 
-  static id_Getter(mthis) native "AudioTrack_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static kind_Getter(mthis) native "AudioTrack_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static label_Getter(mthis) native "AudioTrack_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static language_Getter(mthis) native "AudioTrack_language_Getter";
-  language_Getter_(mthis) => language_Getter(mthis);
+  language_Getter_(mthis) => mthis["language"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getTrackById_Callback_0(mthis) native "AudioTrackList_getTrackById_Callback";
-  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+  getTrackById_Callback_0_(mthis) => mthis.callMethod("getTrackById", []);
 
-  static getTrackById_Callback_1(mthis, __arg_0) native "AudioTrackList_getTrackById_Callback";
-  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+  getTrackById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTrackById", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  onaddtrack_Getter_(mthis) => mthis["onaddtrack"];
 
-  static length_Getter(mthis) native "AudioTrackList_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
 
-  static onaddtrack_Getter(mthis) native "AudioTrackList_onaddtrack_Getter";
-  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static onaddtrack_Setter(mthis, __arg_0) native "AudioTrackList_onaddtrack_Setter";
-  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onchange_Getter(mthis) native "AudioTrackList_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  onremovetrack_Getter_(mthis) => mthis["onremovetrack"];
 
-  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);
+  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["AutocompleteErrorEvent"], [__arg_0, __arg_1]);
 
-  static reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
-  reason_Getter_(mthis) => reason_Getter(mthis);
+  reason_Getter_(mthis) => mthis["reason"];
 
 }
 
 class BlinkBarProp {
   static final instance = new BlinkBarProp();
 
-  static visible_Getter(mthis) native "BarProp_visible_Getter";
-  visible_Getter_(mthis) => visible_Getter(mthis);
+  visible_Getter_(mthis) => mthis["visible"];
 
 }
 
 class BlinkBatteryManager extends BlinkEventTarget {
   static final instance = new BlinkBatteryManager();
 
-  static chargingTime_Getter(mthis) native "BatteryManager_chargingTime_Getter";
-  chargingTime_Getter_(mthis) => chargingTime_Getter(mthis);
+  chargingTime_Getter_(mthis) => mthis["chargingTime"];
 
-  static charging_Getter(mthis) native "BatteryManager_charging_Getter";
-  charging_Getter_(mthis) => charging_Getter(mthis);
+  charging_Getter_(mthis) => mthis["charging"];
 
-  static dischargingTime_Getter(mthis) native "BatteryManager_dischargingTime_Getter";
-  dischargingTime_Getter_(mthis) => dischargingTime_Getter(mthis);
+  dischargingTime_Getter_(mthis) => mthis["dischargingTime"];
 
-  static level_Getter(mthis) native "BatteryManager_level_Getter";
-  level_Getter_(mthis) => level_Getter(mthis);
+  level_Getter_(mthis) => mthis["level"];
 
-  static onchargingchange_Getter(mthis) native "BatteryManager_onchargingchange_Getter";
-  onchargingchange_Getter_(mthis) => onchargingchange_Getter(mthis);
+  onchargingchange_Getter_(mthis) => mthis["onchargingchange"];
 
-  static onchargingchange_Setter(mthis, __arg_0) native "BatteryManager_onchargingchange_Setter";
-  onchargingchange_Setter_(mthis, __arg_0) => onchargingchange_Setter(mthis, __arg_0);
+  onchargingchange_Setter_(mthis, __arg_0) => mthis["onchargingchange"] = __arg_0;
 
-  static onchargingtimechange_Getter(mthis) native "BatteryManager_onchargingtimechange_Getter";
-  onchargingtimechange_Getter_(mthis) => onchargingtimechange_Getter(mthis);
+  onchargingtimechange_Getter_(mthis) => mthis["onchargingtimechange"];
 
-  static onchargingtimechange_Setter(mthis, __arg_0) native "BatteryManager_onchargingtimechange_Setter";
-  onchargingtimechange_Setter_(mthis, __arg_0) => onchargingtimechange_Setter(mthis, __arg_0);
+  onchargingtimechange_Setter_(mthis, __arg_0) => mthis["onchargingtimechange"] = __arg_0;
 
-  static ondischargingtimechange_Getter(mthis) native "BatteryManager_ondischargingtimechange_Getter";
-  ondischargingtimechange_Getter_(mthis) => ondischargingtimechange_Getter(mthis);
+  ondischargingtimechange_Getter_(mthis) => mthis["ondischargingtimechange"];
 
-  static ondischargingtimechange_Setter(mthis, __arg_0) native "BatteryManager_ondischargingtimechange_Setter";
-  ondischargingtimechange_Setter_(mthis, __arg_0) => ondischargingtimechange_Setter(mthis, __arg_0);
+  ondischargingtimechange_Setter_(mthis, __arg_0) => mthis["ondischargingtimechange"] = __arg_0;
 
-  static onlevelchange_Getter(mthis) native "BatteryManager_onlevelchange_Getter";
-  onlevelchange_Getter_(mthis) => onlevelchange_Getter(mthis);
+  onlevelchange_Getter_(mthis) => mthis["onlevelchange"];
 
-  static onlevelchange_Setter(mthis, __arg_0) native "BatteryManager_onlevelchange_Setter";
-  onlevelchange_Setter_(mthis, __arg_0) => onlevelchange_Setter(mthis, __arg_0);
+  onlevelchange_Setter_(mthis, __arg_0) => mthis["onlevelchange"] = __arg_0;
 
 }
 
 class BlinkBeforeUnloadEvent extends BlinkEvent {
   static final instance = new BlinkBeforeUnloadEvent();
 
-  static returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
-  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+  returnValue_Getter_(mthis) => mthis["returnValue"];
 
-  static returnValue_Setter(mthis, __arg_0) native "BeforeUnloadEvent_returnValue_Setter";
-  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
+  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
 
 }
 
 class BlinkBiquadFilterNode extends BlinkAudioNode {
   static final instance = new BlinkBiquadFilterNode();
 
-  static Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
-  Q_Getter_(mthis) => Q_Getter(mthis);
+  Q_Getter_(mthis) => mthis["Q"];
 
-  static detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
-  detune_Getter_(mthis) => detune_Getter(mthis);
+  detune_Getter_(mthis) => mthis["detune"];
 
-  static frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
-  frequency_Getter_(mthis) => frequency_Getter(mthis);
+  frequency_Getter_(mthis) => mthis["frequency"];
 
-  static gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
-  gain_Getter_(mthis) => gain_Getter(mthis);
+  gain_Getter_(mthis) => mthis["gain"];
 
-  static getFrequencyResponse_Callback_1(mthis, __arg_0) native "BiquadFilterNode_getFrequencyResponse_Callback";
-  getFrequencyResponse_Callback_1_(mthis, __arg_0) => getFrequencyResponse_Callback_1(mthis, __arg_0);
+  getFrequencyResponse_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFrequencyResponse", [__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);
+  getFrequencyResponse_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getFrequencyResponse", [__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);
+  getFrequencyResponse_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getFrequencyResponse", [__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);
+  type_Getter_(mthis) => mthis["type"];
 
-  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, __arg_0) native "BiquadFilterNode_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkBlob {
   static final instance = new BlinkBlob();
 
-  static close_Callback_0(mthis) native "Blob_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "Blob_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["Blob"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Blob"], [__arg_0]);
 
-  static constructorCallback_0() native "Blob_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Blob"], [__arg_0, __arg_1]);
 
-  static constructorCallback_1(__arg_0) native "Blob_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  size_Getter_(mthis) => mthis["size"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Blob_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  slice_Callback_0_(mthis) => mthis.callMethod("slice", []);
 
-  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);
+  slice_Callback_1_(mthis, __arg_0) => mthis.callMethod("slice", [__arg_0]);
 
-  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);
+  slice_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("slice", [__arg_0, __arg_1]);
 
-  static size_Getter(mthis) native "Blob_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
+  slice_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("slice", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkBody {
   static final instance = new BlinkBody();
 
-  static arrayBuffer_Callback_0(mthis) native "Body_arrayBuffer_Callback";
-  arrayBuffer_Callback_0_(mthis) => arrayBuffer_Callback_0(mthis);
+  arrayBuffer_Callback_0_(mthis) => mthis.callMethod("arrayBuffer", []);
 
-  static arrayBuffer_Callback_1(mthis, __arg_0) native "Body_arrayBuffer_Callback";
-  arrayBuffer_Callback_1_(mthis, __arg_0) => arrayBuffer_Callback_1(mthis, __arg_0);
+  blob_Callback_0_(mthis) => mthis.callMethod("blob", []);
 
-  static arrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "Body_arrayBuffer_Callback";
-  arrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => arrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+  bodyUsed_Getter_(mthis) => mthis["bodyUsed"];
 
-  static blob_Callback_0(mthis) native "Body_blob_Callback";
-  blob_Callback_0_(mthis) => blob_Callback_0(mthis);
+  json_Callback_0_(mthis) => mthis.callMethod("json", []);
 
-  static blob_Callback_1(mthis, __arg_0) native "Body_blob_Callback";
-  blob_Callback_1_(mthis, __arg_0) => blob_Callback_1(mthis, __arg_0);
-
-  static blob_Callback_2(mthis, __arg_0, __arg_1) native "Body_blob_Callback";
-  blob_Callback_2_(mthis, __arg_0, __arg_1) => blob_Callback_2(mthis, __arg_0, __arg_1);
-
-  static bodyUsed_Getter(mthis) native "Body_bodyUsed_Getter";
-  bodyUsed_Getter_(mthis) => bodyUsed_Getter(mthis);
-
-  static json_Callback_0(mthis) native "Body_json_Callback";
-  json_Callback_0_(mthis) => json_Callback_0(mthis);
-
-  static json_Callback_1(mthis, __arg_0) native "Body_json_Callback";
-  json_Callback_1_(mthis, __arg_0) => json_Callback_1(mthis, __arg_0);
-
-  static json_Callback_2(mthis, __arg_0, __arg_1) native "Body_json_Callback";
-  json_Callback_2_(mthis, __arg_0, __arg_1) => json_Callback_2(mthis, __arg_0, __arg_1);
-
-  static text_Callback_0(mthis) native "Body_text_Callback";
-  text_Callback_0_(mthis) => text_Callback_0(mthis);
-
-  static text_Callback_1(mthis, __arg_0) native "Body_text_Callback";
-  text_Callback_1_(mthis, __arg_0) => text_Callback_1(mthis, __arg_0);
-
-  static text_Callback_2(mthis, __arg_0, __arg_1) native "Body_text_Callback";
-  text_Callback_2_(mthis, __arg_0, __arg_1) => text_Callback_2(mthis, __arg_0, __arg_1);
+  text_Callback_0_(mthis) => mthis.callMethod("text", []);
 
 }
 
@@ -1965,516 +1323,269 @@
 class BlinkCSS {
   static final instance = new BlinkCSS();
 
-  static supports_Callback_0(mthis) native "CSS_supports_Callback";
-  supports_Callback_0_(mthis) => supports_Callback_0(mthis);
+  supports_Callback_0_(mthis) => mthis.callMethod("supports", []);
 
-  static supports_Callback_1(mthis, __arg_0) native "CSS_supports_Callback";
-  supports_Callback_1_(mthis, __arg_0) => supports_Callback_1(mthis, __arg_0);
+  supports_Callback_1_(mthis, __arg_0) => mthis.callMethod("supports", [__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);
+  supports_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("supports", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCSSCharsetRule extends BlinkCSSRule {
   static final instance = new BlinkCSSCharsetRule();
 
-  static encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
-  encoding_Getter_(mthis) => encoding_Getter(mthis);
+  encoding_Getter_(mthis) => mthis["encoding"];
 
-  static encoding_Setter(mthis, __arg_0) native "CSSCharsetRule_encoding_Setter";
-  encoding_Setter_(mthis, __arg_0) => encoding_Setter(mthis, __arg_0);
+  encoding_Setter_(mthis, __arg_0) => mthis["encoding"] = __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);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 class BlinkCSSImportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSImportRule();
 
-  static href_Getter(mthis) native "CSSImportRule_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static media_Getter(mthis) native "CSSImportRule_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
-  styleSheet_Getter_(mthis) => styleSheet_Getter(mthis);
+  styleSheet_Getter_(mthis) => mthis["styleSheet"];
 
 }
 
 class BlinkCSSKeyframeRule extends BlinkCSSRule {
   static final instance = new BlinkCSSKeyframeRule();
 
-  static keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
-  keyText_Getter_(mthis) => keyText_Getter(mthis);
+  keyText_Getter_(mthis) => mthis["keyText"];
 
-  static keyText_Setter(mthis, __arg_0) native "CSSKeyframeRule_keyText_Setter";
-  keyText_Setter_(mthis, __arg_0) => keyText_Setter(mthis, __arg_0);
+  keyText_Setter_(mthis, __arg_0) => mthis["keyText"] = __arg_0;
 
-  static style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
-  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+  cssRules_Getter_(mthis) => mthis["cssRules"];
 
-  static deleteRule_Callback_0(mthis) native "CSSKeyframesRule_deleteRule_Callback";
-  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+  deleteRule_Callback_0_(mthis) => mthis.callMethod("deleteRule", []);
 
-  static deleteRule_Callback_1(mthis, __arg_0) native "CSSKeyframesRule_deleteRule_Callback";
-  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+  deleteRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRule", [__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);
+  findRule_Callback_0_(mthis) => mthis.callMethod("findRule", []);
 
-  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);
+  findRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("findRule", [__arg_0]);
 
-  static findRule_Callback_0(mthis) native "CSSKeyframesRule_findRule_Callback";
-  findRule_Callback_0_(mthis) => findRule_Callback_0(mthis);
+  insertRule_Callback_0_(mthis) => mthis.callMethod("insertRule", []);
 
-  static findRule_Callback_1(mthis, __arg_0) native "CSSKeyframesRule_findRule_Callback";
-  findRule_Callback_1_(mthis, __arg_0) => findRule_Callback_1(mthis, __arg_0);
+  insertRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRule", [__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);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __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);
+  cssRules_Getter_(mthis) => mthis["cssRules"];
 
-  static deleteRule_Callback_0(mthis) native "CSSMediaRule_deleteRule_Callback";
-  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+  deleteRule_Callback_0_(mthis) => mthis.callMethod("deleteRule", []);
 
-  static deleteRule_Callback_1(mthis, __arg_0) native "CSSMediaRule_deleteRule_Callback";
-  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+  deleteRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRule", [__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);
+  insertRule_Callback_0_(mthis) => mthis.callMethod("insertRule", []);
 
-  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);
+  insertRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRule", [__arg_0]);
 
-  static insertRule_Callback_0(mthis) native "CSSMediaRule_insertRule_Callback";
-  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertRule", [__arg_0, __arg_1]);
 
-  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);
+  media_Getter_(mthis) => mthis["media"];
 
 }
 
 class BlinkCSSPageRule extends BlinkCSSRule {
   static final instance = new BlinkCSSPageRule();
 
-  static selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
-  selectorText_Getter_(mthis) => selectorText_Getter(mthis);
+  selectorText_Getter_(mthis) => mthis["selectorText"];
 
-  static selectorText_Setter(mthis, __arg_0) native "CSSPageRule_selectorText_Setter";
-  selectorText_Setter_(mthis, __arg_0) => selectorText_Setter(mthis, __arg_0);
+  selectorText_Setter_(mthis, __arg_0) => mthis["selectorText"] = __arg_0;
 
-  static style_Getter(mthis) native "CSSPageRule_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 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);
+  getCounterValue_Callback_0_(mthis) => mthis.callMethod("getCounterValue", []);
 
-  static getCounterValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getCounterValue_Callback";
-  getCounterValue_Callback_1_(mthis, __arg_0) => getCounterValue_Callback_1(mthis, __arg_0);
+  getFloatValue_Callback_0_(mthis) => mthis.callMethod("getFloatValue", []);
 
-  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);
+  getFloatValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFloatValue", [__arg_0]);
 
-  static getFloatValue_Callback_0(mthis) native "CSSPrimitiveValue_getFloatValue_Callback";
-  getFloatValue_Callback_0_(mthis) => getFloatValue_Callback_0(mthis);
+  getRGBColorValue_Callback_0_(mthis) => mthis.callMethod("getRGBColorValue", []);
 
-  static getFloatValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getFloatValue_Callback";
-  getFloatValue_Callback_1_(mthis, __arg_0) => getFloatValue_Callback_1(mthis, __arg_0);
+  getRectValue_Callback_0_(mthis) => mthis.callMethod("getRectValue", []);
 
-  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);
+  getStringValue_Callback_0_(mthis) => mthis.callMethod("getStringValue", []);
 
-  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);
+  primitiveType_Getter_(mthis) => mthis["primitiveType"];
 
-  static getRGBColorValue_Callback_0(mthis) native "CSSPrimitiveValue_getRGBColorValue_Callback";
-  getRGBColorValue_Callback_0_(mthis) => getRGBColorValue_Callback_0(mthis);
+  setFloatValue_Callback_0_(mthis) => mthis.callMethod("setFloatValue", []);
 
-  static getRGBColorValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getRGBColorValue_Callback";
-  getRGBColorValue_Callback_1_(mthis, __arg_0) => getRGBColorValue_Callback_1(mthis, __arg_0);
+  setFloatValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("setFloatValue", [__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);
+  setFloatValue_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setFloatValue", [__arg_0, __arg_1]);
 
-  static getRectValue_Callback_0(mthis) native "CSSPrimitiveValue_getRectValue_Callback";
-  getRectValue_Callback_0_(mthis) => getRectValue_Callback_0(mthis);
+  setStringValue_Callback_0_(mthis) => mthis.callMethod("setStringValue", []);
 
-  static getRectValue_Callback_1(mthis, __arg_0) native "CSSPrimitiveValue_getRectValue_Callback";
-  getRectValue_Callback_1_(mthis, __arg_0) => getRectValue_Callback_1(mthis, __arg_0);
+  setStringValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStringValue", [__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);
+  setStringValue_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setStringValue", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCSSRule {
   static final instance = new BlinkCSSRule();
 
-  static cssText_Getter(mthis) native "CSSRule_cssText_Getter";
-  cssText_Getter_(mthis) => cssText_Getter(mthis);
+  cssText_Getter_(mthis) => mthis["cssText"];
 
-  static cssText_Setter(mthis, __arg_0) native "CSSRule_cssText_Setter";
-  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
+  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
 
-  static parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
-  parentRule_Getter_(mthis) => parentRule_Getter(mthis);
+  parentRule_Getter_(mthis) => mthis["parentRule"];
 
-  static parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
-  parentStyleSheet_Getter_(mthis) => parentStyleSheet_Getter(mthis);
+  parentStyleSheet_Getter_(mthis) => mthis["parentStyleSheet"];
 
-  static type_Getter(mthis) native "CSSRule_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkCSSRuleList {
   static final instance = new BlinkCSSRuleList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "CSSRuleList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "CSSRuleList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "CSSRuleList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkCSSStyleDeclaration {
   static final instance = new BlinkCSSStyleDeclaration();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "CSSStyleDeclaration___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__propertyQuery___Callback_1_(mthis, __arg_0) => 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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
-  cssText_Getter_(mthis) => cssText_Getter(mthis);
+  cssText_Getter_(mthis) => mthis["cssText"];
 
-  static cssText_Setter(mthis, __arg_0) native "CSSStyleDeclaration_cssText_Setter";
-  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
+  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
 
-  static getPropertyPriority_Callback_0(mthis) native "CSSStyleDeclaration_getPropertyPriority_Callback";
-  getPropertyPriority_Callback_0_(mthis) => getPropertyPriority_Callback_0(mthis);
+  getPropertyPriority_Callback_0_(mthis) => mthis.callMethod("getPropertyPriority", []);
 
-  static getPropertyPriority_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_getPropertyPriority_Callback";
-  getPropertyPriority_Callback_1_(mthis, __arg_0) => getPropertyPriority_Callback_1(mthis, __arg_0);
+  getPropertyPriority_Callback_1_(mthis, __arg_0) => mthis.callMethod("getPropertyPriority", [__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);
+  getPropertyValue_Callback_0_(mthis) => mthis.callMethod("getPropertyValue", []);
 
-  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);
+  getPropertyValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("getPropertyValue", [__arg_0]);
 
-  static getPropertyValue_Callback_0(mthis) native "CSSStyleDeclaration_getPropertyValue_Callback";
-  getPropertyValue_Callback_0_(mthis) => getPropertyValue_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static getPropertyValue_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_getPropertyValue_Callback";
-  getPropertyValue_Callback_1_(mthis, __arg_0) => getPropertyValue_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  parentRule_Getter_(mthis) => mthis["parentRule"];
 
-  static item_Callback_0(mthis) native "CSSStyleDeclaration_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  removeProperty_Callback_0_(mthis) => mthis.callMethod("removeProperty", []);
 
-  static item_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  removeProperty_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeProperty", [__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);
+  setProperty_Callback_0_(mthis) => mthis.callMethod("setProperty", []);
 
-  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);
+  setProperty_Callback_1_(mthis, __arg_0) => mthis.callMethod("setProperty", [__arg_0]);
 
-  static length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  setProperty_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setProperty", [__arg_0, __arg_1]);
 
-  static parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
-  parentRule_Getter_(mthis) => parentRule_Getter(mthis);
-
-  static removeProperty_Callback_0(mthis) native "CSSStyleDeclaration_removeProperty_Callback";
-  removeProperty_Callback_0_(mthis) => removeProperty_Callback_0(mthis);
-
-  static removeProperty_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_removeProperty_Callback";
-  removeProperty_Callback_1_(mthis, __arg_0) => removeProperty_Callback_1(mthis, __arg_0);
-
-  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 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 setProperty_Callback_0(mthis) native "CSSStyleDeclaration_setProperty_Callback";
-  setProperty_Callback_0_(mthis) => setProperty_Callback_0(mthis);
-
-  static setProperty_Callback_1(mthis, __arg_0) native "CSSStyleDeclaration_setProperty_Callback";
-  setProperty_Callback_1_(mthis, __arg_0) => setProperty_Callback_1(mthis, __arg_0);
-
-  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, __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);
+  setProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setProperty", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkCSSStyleRule extends BlinkCSSRule {
   static final instance = new BlinkCSSStyleRule();
 
-  static selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
-  selectorText_Getter_(mthis) => selectorText_Getter(mthis);
+  selectorText_Getter_(mthis) => mthis["selectorText"];
 
-  static selectorText_Setter(mthis, __arg_0) native "CSSStyleRule_selectorText_Setter";
-  selectorText_Setter_(mthis, __arg_0) => selectorText_Setter(mthis, __arg_0);
+  selectorText_Setter_(mthis, __arg_0) => mthis["selectorText"] = __arg_0;
 
-  static style_Getter(mthis) native "CSSStyleRule_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 class BlinkCSSStyleSheet extends BlinkStyleSheet {
   static final instance = new BlinkCSSStyleSheet();
 
-  static addRule_Callback_0(mthis) native "CSSStyleSheet_addRule_Callback";
-  addRule_Callback_0_(mthis) => addRule_Callback_0(mthis);
+  addRule_Callback_0_(mthis) => mthis.callMethod("addRule", []);
 
-  static addRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_addRule_Callback";
-  addRule_Callback_1_(mthis, __arg_0) => addRule_Callback_1(mthis, __arg_0);
+  addRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("addRule", [__arg_0]);
 
-  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);
+  addRule_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addRule", [__arg_0, __arg_1]);
 
-  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);
+  addRule_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("addRule", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  cssRules_Getter_(mthis) => mthis["cssRules"];
 
-  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);
+  deleteRule_Callback_0_(mthis) => mthis.callMethod("deleteRule", []);
 
-  static cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
-  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+  deleteRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRule", [__arg_0]);
 
-  static deleteRule_Callback_0(mthis) native "CSSStyleSheet_deleteRule_Callback";
-  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+  insertRule_Callback_0_(mthis) => mthis.callMethod("insertRule", []);
 
-  static deleteRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_deleteRule_Callback";
-  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+  insertRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRule", [__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);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertRule", [__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);
+  ownerRule_Getter_(mthis) => mthis["ownerRule"];
 
-  static insertRule_Callback_0(mthis) native "CSSStyleSheet_insertRule_Callback";
-  insertRule_Callback_0_(mthis) => insertRule_Callback_0(mthis);
+  removeRule_Callback_0_(mthis) => mthis.callMethod("removeRule", []);
 
-  static insertRule_Callback_1(mthis, __arg_0) native "CSSStyleSheet_insertRule_Callback";
-  insertRule_Callback_1_(mthis, __arg_0) => insertRule_Callback_1(mthis, __arg_0);
+  removeRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeRule", [__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);
+  rules_Getter_(mthis) => mthis["rules"];
 
 }
 
 class BlinkCSSSupportsRule extends BlinkCSSRule {
   static final instance = new BlinkCSSSupportsRule();
 
-  static conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
-  conditionText_Getter_(mthis) => conditionText_Getter(mthis);
+  conditionText_Getter_(mthis) => mthis["conditionText"];
 
-  static cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
-  cssRules_Getter_(mthis) => cssRules_Getter(mthis);
+  cssRules_Getter_(mthis) => mthis["cssRules"];
 
-  static deleteRule_Callback_0(mthis) native "CSSSupportsRule_deleteRule_Callback";
-  deleteRule_Callback_0_(mthis) => deleteRule_Callback_0(mthis);
+  deleteRule_Callback_0_(mthis) => mthis.callMethod("deleteRule", []);
 
-  static deleteRule_Callback_1(mthis, __arg_0) native "CSSSupportsRule_deleteRule_Callback";
-  deleteRule_Callback_1_(mthis, __arg_0) => deleteRule_Callback_1(mthis, __arg_0);
+  deleteRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRule", [__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);
+  insertRule_Callback_0_(mthis) => mthis.callMethod("insertRule", []);
 
-  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);
+  insertRule_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRule", [__arg_0]);
 
-  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);
+  insertRule_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertRule", [__arg_0, __arg_1]);
 
 }
 
@@ -2486,1038 +1597,463 @@
 class BlinkCSSValue {
   static final instance = new BlinkCSSValue();
 
-  static cssText_Getter(mthis) native "CSSValue_cssText_Getter";
-  cssText_Getter_(mthis) => cssText_Getter(mthis);
+  cssText_Getter_(mthis) => mthis["cssText"];
 
-  static cssText_Setter(mthis, __arg_0) native "CSSValue_cssText_Setter";
-  cssText_Setter_(mthis, __arg_0) => cssText_Setter(mthis, __arg_0);
+  cssText_Setter_(mthis, __arg_0) => mthis["cssText"] = __arg_0;
 
-  static cssValueType_Getter(mthis) native "CSSValue_cssValueType_Getter";
-  cssValueType_Getter_(mthis) => cssValueType_Getter(mthis);
+  cssValueType_Getter_(mthis) => mthis["cssValueType"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "CSSValueList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "CSSValueList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkCSSViewportRule extends BlinkCSSRule {
   static final instance = new BlinkCSSViewportRule();
 
-  static style_Getter(mthis) native "CSSViewportRule_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 class BlinkCache {
   static final instance = new BlinkCache();
 
-  static addAll_Callback_0(mthis) native "Cache_addAll_Callback";
-  addAll_Callback_0_(mthis) => addAll_Callback_0(mthis);
+  addAll_Callback_0_(mthis) => mthis.callMethod("addAll", []);
 
-  static addAll_Callback_1(mthis, __arg_0) native "Cache_addAll_Callback";
-  addAll_Callback_1_(mthis, __arg_0) => addAll_Callback_1(mthis, __arg_0);
+  addAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("addAll", [__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);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  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);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__arg_0]);
 
-  static add_Callback_0(mthis) native "Cache_add_Callback";
-  add_Callback_0_(mthis) => add_Callback_0(mthis);
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  static add_Callback_1(mthis, __arg_0) native "Cache_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  delete_Callback_1_(mthis, __arg_0) => mthis.callMethod("delete", [__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);
+  delete_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("delete", [__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);
+  keys_Callback_0_(mthis) => mthis.callMethod("keys", []);
 
-  static delete_Callback_0(mthis) native "Cache_delete_Callback";
-  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+  keys_Callback_1_(mthis, __arg_0) => mthis.callMethod("keys", [__arg_0]);
 
-  static delete_Callback_1(mthis, __arg_0) native "Cache_delete_Callback";
-  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+  keys_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("keys", [__arg_0, __arg_1]);
 
-  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);
+  matchAll_Callback_0_(mthis) => mthis.callMethod("matchAll", []);
 
-  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);
+  matchAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("matchAll", [__arg_0]);
 
-  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);
+  matchAll_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("matchAll", [__arg_0, __arg_1]);
 
-  static keys_Callback_0(mthis) native "Cache_keys_Callback";
-  keys_Callback_0_(mthis) => keys_Callback_0(mthis);
+  match_Callback_0_(mthis) => mthis.callMethod("match", []);
 
-  static keys_Callback_1(mthis, __arg_0) native "Cache_keys_Callback";
-  keys_Callback_1_(mthis, __arg_0) => keys_Callback_1(mthis, __arg_0);
+  match_Callback_1_(mthis, __arg_0) => mthis.callMethod("match", [__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);
+  match_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("match", [__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);
+  put_Callback_0_(mthis) => mthis.callMethod("put", []);
 
-  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);
+  put_Callback_1_(mthis, __arg_0) => mthis.callMethod("put", [__arg_0]);
 
-  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);
+  put_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("put", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCacheStorage {
   static final instance = new BlinkCacheStorage();
 
-  static create_Callback_0(mthis) native "CacheStorage_create_Callback";
-  create_Callback_0_(mthis) => create_Callback_0(mthis);
+  create_Callback_0_(mthis) => mthis.callMethod("create", []);
 
-  static create_Callback_1(mthis, __arg_0) native "CacheStorage_create_Callback";
-  create_Callback_1_(mthis, __arg_0) => create_Callback_1(mthis, __arg_0);
+  create_Callback_1_(mthis, __arg_0) => mthis.callMethod("create", [__arg_0]);
 
-  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);
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  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);
+  delete_Callback_1_(mthis, __arg_0) => mthis.callMethod("delete", [__arg_0]);
 
-  static delete_Callback_0(mthis) native "CacheStorage_delete_Callback";
-  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  static delete_Callback_1(mthis, __arg_0) native "CacheStorage_delete_Callback";
-  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__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);
+  has_Callback_0_(mthis) => mthis.callMethod("has", []);
 
-  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);
+  has_Callback_1_(mthis, __arg_0) => mthis.callMethod("has", [__arg_0]);
 
-  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);
+  keys_Callback_0_(mthis) => mthis.callMethod("keys", []);
 
 }
 
 class BlinkCanvas2DContextAttributes {
   static final instance = new BlinkCanvas2DContextAttributes();
 
-  static alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
-  alpha_Getter_(mthis) => alpha_Getter(mthis);
+  alpha_Getter_(mthis) => mthis["alpha"];
 
-  static alpha_Setter(mthis, __arg_0) native "Canvas2DContextAttributes_alpha_Setter";
-  alpha_Setter_(mthis, __arg_0) => alpha_Setter(mthis, __arg_0);
+  alpha_Setter_(mthis, __arg_0) => mthis["alpha"] = __arg_0;
 
-  static storage_Getter(mthis) native "Canvas2DContextAttributes_storage_Getter";
-  storage_Getter_(mthis) => storage_Getter(mthis);
+  storage_Getter_(mthis) => mthis["storage"];
 
-  static storage_Setter(mthis, __arg_0) native "Canvas2DContextAttributes_storage_Setter";
-  storage_Setter_(mthis, __arg_0) => storage_Setter(mthis, __arg_0);
+  storage_Setter_(mthis, __arg_0) => mthis["storage"] = __arg_0;
 
 }
 
 class BlinkCanvasGradient {
   static final instance = new BlinkCanvasGradient();
 
-  static addColorStop_Callback_0(mthis) native "CanvasGradient_addColorStop_Callback";
-  addColorStop_Callback_0_(mthis) => addColorStop_Callback_0(mthis);
+  addColorStop_Callback_0_(mthis) => mthis.callMethod("addColorStop", []);
 
-  static addColorStop_Callback_1(mthis, __arg_0) native "CanvasGradient_addColorStop_Callback";
-  addColorStop_Callback_1_(mthis, __arg_0) => addColorStop_Callback_1(mthis, __arg_0);
+  addColorStop_Callback_1_(mthis, __arg_0) => mthis.callMethod("addColorStop", [__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);
+  addColorStop_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addColorStop", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCanvasPattern {
   static final instance = new BlinkCanvasPattern();
 
-  static setTransform_Callback_0(mthis) native "CanvasPattern_setTransform_Callback";
-  setTransform_Callback_0_(mthis) => setTransform_Callback_0(mthis);
+  setTransform_Callback_0_(mthis) => mthis.callMethod("setTransform", []);
 
-  static setTransform_Callback_1(mthis, __arg_0) native "CanvasPattern_setTransform_Callback";
-  setTransform_Callback_1_(mthis, __arg_0) => setTransform_Callback_1(mthis, __arg_0);
-
-  static setTransform_Callback_2(mthis, __arg_0, __arg_1) native "CanvasPattern_setTransform_Callback";
-  setTransform_Callback_2_(mthis, __arg_0, __arg_1) => setTransform_Callback_2(mthis, __arg_0, __arg_1);
-
-  static setTransform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "CanvasPattern_setTransform_Callback";
-  setTransform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setTransform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  setTransform_Callback_1_(mthis, __arg_0) => mthis.callMethod("setTransform", [__arg_0]);
 
 }
 
 class BlinkCanvasRenderingContext2D {
   static final instance = new BlinkCanvasRenderingContext2D();
 
-  static addHitRegion_Callback_0(mthis) native "CanvasRenderingContext2D_addHitRegion_Callback";
-  addHitRegion_Callback_0_(mthis) => addHitRegion_Callback_0(mthis);
+  addHitRegion_Callback_0_(mthis) => mthis.callMethod("addHitRegion", []);
 
-  static addHitRegion_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_addHitRegion_Callback";
-  addHitRegion_Callback_1_(mthis, __arg_0) => addHitRegion_Callback_1(mthis, __arg_0);
+  addHitRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("addHitRegion", [__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);
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  beginPath_Callback_0_(mthis) => mthis.callMethod("beginPath", []);
 
-  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);
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("bezierCurveTo", [__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);
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("bezierCurveTo", [__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);
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("bezierCurveTo", [__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);
+  canvas_Getter_(mthis) => mthis["canvas"];
 
-  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);
+  clearHitRegions_Callback_0_(mthis) => mthis.callMethod("clearHitRegions", []);
 
-  static beginPath_Callback_0(mthis) native "CanvasRenderingContext2D_beginPath_Callback";
-  beginPath_Callback_0_(mthis) => beginPath_Callback_0(mthis);
+  clearRect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("clearRect", [__arg_0, __arg_1]);
 
-  static beginPath_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_beginPath_Callback";
-  beginPath_Callback_1_(mthis, __arg_0) => beginPath_Callback_1(mthis, __arg_0);
+  clearRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("clearRect", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  clearRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("clearRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  clip_Callback_0_(mthis) => mthis.callMethod("clip", []);
 
-  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);
+  clip_Callback_1_(mthis, __arg_0) => mthis.callMethod("clip", [__arg_0]);
 
-  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);
+  clip_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("clip", [__arg_0, __arg_1]);
 
-  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);
+  closePath_Callback_0_(mthis) => mthis.callMethod("closePath", []);
 
-  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);
+  createImageData_Callback_0_(mthis) => mthis.callMethod("createImageData", []);
 
-  static canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
-  canvas_Getter_(mthis) => canvas_Getter(mthis);
+  createImageData_Callback_1_(mthis, __arg_0) => mthis.callMethod("createImageData", [__arg_0]);
 
-  static clearHitRegions_Callback_0(mthis) native "CanvasRenderingContext2D_clearHitRegions_Callback";
-  clearHitRegions_Callback_0_(mthis) => clearHitRegions_Callback_0(mthis);
+  createImageData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createImageData", [__arg_0, __arg_1]);
 
-  static clearHitRegions_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_clearHitRegions_Callback";
-  clearHitRegions_Callback_1_(mthis, __arg_0) => clearHitRegions_Callback_1(mthis, __arg_0);
+  createLinearGradient_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createLinearGradient", [__arg_0, __arg_1]);
 
-  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);
+  createLinearGradient_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createLinearGradient", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createLinearGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createLinearGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createPattern_Callback_0_(mthis) => mthis.callMethod("createPattern", []);
 
-  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);
+  createPattern_Callback_1_(mthis, __arg_0) => mthis.callMethod("createPattern", [__arg_0]);
 
-  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);
+  createPattern_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createPattern", [__arg_0, __arg_1]);
 
-  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);
+  createRadialGradient_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static clip_Callback_0(mthis) native "CanvasRenderingContext2D_clip_Callback";
-  clip_Callback_0_(mthis) => clip_Callback_0(mthis);
+  createRadialGradient_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static clip_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_clip_Callback";
-  clip_Callback_1_(mthis, __arg_0) => clip_Callback_1(mthis, __arg_0);
+  createRadialGradient_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createRadialGradient", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  currentTransform_Getter_(mthis) => mthis["currentTransform"];
 
-  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);
+  currentTransform_Setter_(mthis, __arg_0) => mthis["currentTransform"] = __arg_0;
 
-  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);
+  direction_Getter_(mthis) => mthis["direction"];
 
-  static closePath_Callback_0(mthis) native "CanvasRenderingContext2D_closePath_Callback";
-  closePath_Callback_0_(mthis) => closePath_Callback_0(mthis);
+  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
 
-  static closePath_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_closePath_Callback";
-  closePath_Callback_1_(mthis, __arg_0) => closePath_Callback_1(mthis, __arg_0);
+  drawFocusIfNeeded_Callback_0_(mthis) => mthis.callMethod("drawFocusIfNeeded", []);
 
-  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);
+  drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => mthis.callMethod("drawFocusIfNeeded", [__arg_0]);
 
-  static createImageData_Callback_0(mthis) native "CanvasRenderingContext2D_createImageData_Callback";
-  createImageData_Callback_0_(mthis) => createImageData_Callback_0(mthis);
+  drawFocusIfNeeded_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("drawFocusIfNeeded", [__arg_0, __arg_1]);
 
-  static createImageData_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_createImageData_Callback";
-  createImageData_Callback_1_(mthis, __arg_0) => createImageData_Callback_1(mthis, __arg_0);
+  drawImage_Callback_1_(mthis, __arg_0) => mthis.callMethod("drawImage", [__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);
+  drawImage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("drawImage", [__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);
+  drawImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("drawImage", [__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);
+  drawImage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("drawImage", [__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);
+  drawImage_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  drawImage_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  drawImage_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  drawImage_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("drawImage", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  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);
+  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static createPattern_Callback_0(mthis) native "CanvasRenderingContext2D_createPattern_Callback";
-  createPattern_Callback_0_(mthis) => createPattern_Callback_0(mthis);
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static createPattern_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_createPattern_Callback";
-  createPattern_Callback_1_(mthis, __arg_0) => createPattern_Callback_1(mthis, __arg_0);
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  fillRect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("fillRect", [__arg_0, __arg_1]);
 
-  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);
+  fillRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("fillRect", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  fillRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("fillRect", [__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);
+  fillStyle_Getter_(mthis) => mthis["fillStyle"];
 
-  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);
+  fillStyle_Setter_(mthis, __arg_0) => mthis["fillStyle"] = __arg_0;
 
-  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);
+  fillText_Callback_1_(mthis, __arg_0) => mthis.callMethod("fillText", [__arg_0]);
 
-  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);
+  fillText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("fillText", [__arg_0, __arg_1]);
 
-  static currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
-  currentTransform_Getter_(mthis) => currentTransform_Getter(mthis);
+  fillText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("fillText", [__arg_0, __arg_1, __arg_2]);
 
-  static currentTransform_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_currentTransform_Setter";
-  currentTransform_Setter_(mthis, __arg_0) => currentTransform_Setter(mthis, __arg_0);
+  fillText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("fillText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static direction_Getter(mthis) native "CanvasRenderingContext2D_direction_Getter";
-  direction_Getter_(mthis) => direction_Getter(mthis);
+  fill_Callback_0_(mthis) => mthis.callMethod("fill", []);
 
-  static direction_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_direction_Setter";
-  direction_Setter_(mthis, __arg_0) => direction_Setter(mthis, __arg_0);
+  fill_Callback_1_(mthis, __arg_0) => mthis.callMethod("fill", [__arg_0]);
 
-  static drawFocusIfNeeded_Callback_0(mthis) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
-  drawFocusIfNeeded_Callback_0_(mthis) => drawFocusIfNeeded_Callback_0(mthis);
+  fill_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("fill", [__arg_0, __arg_1]);
 
-  static drawFocusIfNeeded_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_drawFocusIfNeeded_Callback";
-  drawFocusIfNeeded_Callback_1_(mthis, __arg_0) => drawFocusIfNeeded_Callback_1(mthis, __arg_0);
+  font_Getter_(mthis) => mthis["font"];
 
-  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);
+  font_Setter_(mthis, __arg_0) => mthis["font"] = __arg_0;
 
-  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);
+  getContextAttributes_Callback_0_(mthis) => mthis.callMethod("getContextAttributes", []);
 
-  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);
+  getImageData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getImageData", [__arg_0, __arg_1]);
 
-  static drawImage_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_drawImage_Callback";
-  drawImage_Callback_1_(mthis, __arg_0) => drawImage_Callback_1(mthis, __arg_0);
+  getImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getImageData", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  getImageData_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("getImageData", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  getLineDash_Callback_0_(mthis) => mthis.callMethod("getLineDash", []);
 
-  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);
+  globalAlpha_Getter_(mthis) => mthis["globalAlpha"];
 
-  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);
+  globalAlpha_Setter_(mthis, __arg_0) => mthis["globalAlpha"] = __arg_0;
 
-  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);
+  globalCompositeOperation_Getter_(mthis) => mthis["globalCompositeOperation"];
 
-  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);
+  globalCompositeOperation_Setter_(mthis, __arg_0) => mthis["globalCompositeOperation"] = __arg_0;
 
-  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);
+  imageSmoothingEnabled_Getter_(mthis) => mthis["imageSmoothingEnabled"];
 
-  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);
+  imageSmoothingEnabled_Setter_(mthis, __arg_0) => mthis["imageSmoothingEnabled"] = __arg_0;
 
-  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);
+  isContextLost_Callback_0_(mthis) => mthis.callMethod("isContextLost", []);
 
-  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);
+  isPointInPath_Callback_0_(mthis) => mthis.callMethod("isPointInPath", []);
 
-  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);
+  isPointInPath_Callback_1_(mthis, __arg_0) => mthis.callMethod("isPointInPath", [__arg_0]);
 
-  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);
+  isPointInPath_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("isPointInPath", [__arg_0, __arg_1]);
 
-  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);
+  isPointInPath_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("isPointInPath", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  isPointInPath_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("isPointInPath", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  isPointInStroke_Callback_0_(mthis) => mthis.callMethod("isPointInStroke", []);
 
-  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);
+  isPointInStroke_Callback_1_(mthis, __arg_0) => mthis.callMethod("isPointInStroke", [__arg_0]);
 
-  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);
+  isPointInStroke_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("isPointInStroke", [__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);
+  isPointInStroke_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("isPointInStroke", [__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);
+  lineCap_Getter_(mthis) => mthis["lineCap"];
 
-  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);
+  lineCap_Setter_(mthis, __arg_0) => mthis["lineCap"] = __arg_0;
 
-  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);
+  lineDashOffset_Getter_(mthis) => mthis["lineDashOffset"];
 
-  static fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
-  fillStyle_Getter_(mthis) => fillStyle_Getter(mthis);
+  lineDashOffset_Setter_(mthis, __arg_0) => mthis["lineDashOffset"] = __arg_0;
 
-  static fillStyle_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_fillStyle_Setter";
-  fillStyle_Setter_(mthis, __arg_0) => fillStyle_Setter(mthis, __arg_0);
+  lineJoin_Getter_(mthis) => mthis["lineJoin"];
 
-  static fillText_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_fillText_Callback";
-  fillText_Callback_1_(mthis, __arg_0) => fillText_Callback_1(mthis, __arg_0);
+  lineJoin_Setter_(mthis, __arg_0) => mthis["lineJoin"] = __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);
+  lineTo_Callback_0_(mthis) => mthis.callMethod("lineTo", []);
 
-  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);
+  lineTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("lineTo", [__arg_0]);
 
-  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);
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("lineTo", [__arg_0, __arg_1]);
 
-  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);
+  lineWidth_Getter_(mthis) => mthis["lineWidth"];
 
-  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);
+  lineWidth_Setter_(mthis, __arg_0) => mthis["lineWidth"] = __arg_0;
 
-  static fill_Callback_0(mthis) native "CanvasRenderingContext2D_fill_Callback";
-  fill_Callback_0_(mthis) => fill_Callback_0(mthis);
+  measureText_Callback_0_(mthis) => mthis.callMethod("measureText", []);
 
-  static fill_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_fill_Callback";
-  fill_Callback_1_(mthis, __arg_0) => fill_Callback_1(mthis, __arg_0);
+  measureText_Callback_1_(mthis, __arg_0) => mthis.callMethod("measureText", [__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);
+  miterLimit_Getter_(mthis) => mthis["miterLimit"];
 
-  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);
+  miterLimit_Setter_(mthis, __arg_0) => mthis["miterLimit"] = __arg_0;
 
-  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);
+  moveTo_Callback_0_(mthis) => mthis.callMethod("moveTo", []);
 
-  static font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
-  font_Getter_(mthis) => font_Getter(mthis);
+  moveTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveTo", [__arg_0]);
 
-  static font_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_font_Setter";
-  font_Setter_(mthis, __arg_0) => font_Setter(mthis, __arg_0);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveTo", [__arg_0, __arg_1]);
 
-  static getContextAttributes_Callback_0(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback";
-  getContextAttributes_Callback_0_(mthis) => getContextAttributes_Callback_0(mthis);
+  putImageData_Callback_1_(mthis, __arg_0) => mthis.callMethod("putImageData", [__arg_0]);
 
-  static getContextAttributes_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_getContextAttributes_Callback";
-  getContextAttributes_Callback_1_(mthis, __arg_0) => getContextAttributes_Callback_1(mthis, __arg_0);
+  putImageData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("putImageData", [__arg_0, __arg_1]);
 
-  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);
+  putImageData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("putImageData", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  putImageData_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  putImageData_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  putImageData_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("putImageData", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("quadraticCurveTo", [__arg_0, __arg_1]);
 
-  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);
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("quadraticCurveTo", [__arg_0, __arg_1, __arg_2]);
 
-  static getLineDash_Callback_0(mthis) native "CanvasRenderingContext2D_getLineDash_Callback";
-  getLineDash_Callback_0_(mthis) => getLineDash_Callback_0(mthis);
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static getLineDash_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_getLineDash_Callback";
-  getLineDash_Callback_1_(mthis, __arg_0) => getLineDash_Callback_1(mthis, __arg_0);
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("rect", [__arg_0, __arg_1]);
 
-  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);
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("rect", [__arg_0, __arg_1, __arg_2]);
 
-  static globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
-  globalAlpha_Getter_(mthis) => globalAlpha_Getter(mthis);
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static globalAlpha_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_globalAlpha_Setter";
-  globalAlpha_Setter_(mthis, __arg_0) => globalAlpha_Setter(mthis, __arg_0);
+  removeHitRegion_Callback_0_(mthis) => mthis.callMethod("removeHitRegion", []);
 
-  static globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
-  globalCompositeOperation_Getter_(mthis) => globalCompositeOperation_Getter(mthis);
+  removeHitRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeHitRegion", [__arg_0]);
 
-  static globalCompositeOperation_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
-  globalCompositeOperation_Setter_(mthis, __arg_0) => globalCompositeOperation_Setter(mthis, __arg_0);
+  resetTransform_Callback_0_(mthis) => mthis.callMethod("resetTransform", []);
 
-  static imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
-  imageSmoothingEnabled_Getter_(mthis) => imageSmoothingEnabled_Getter(mthis);
+  restore_Callback_0_(mthis) => mthis.callMethod("restore", []);
 
-  static imageSmoothingEnabled_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
-  imageSmoothingEnabled_Setter_(mthis, __arg_0) => imageSmoothingEnabled_Setter(mthis, __arg_0);
+  rotate_Callback_0_(mthis) => mthis.callMethod("rotate", []);
 
-  static isContextLost_Callback_0(mthis) native "CanvasRenderingContext2D_isContextLost_Callback";
-  isContextLost_Callback_0_(mthis) => isContextLost_Callback_0(mthis);
+  rotate_Callback_1_(mthis, __arg_0) => mthis.callMethod("rotate", [__arg_0]);
 
-  static isContextLost_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_isContextLost_Callback";
-  isContextLost_Callback_1_(mthis, __arg_0) => isContextLost_Callback_1(mthis, __arg_0);
+  save_Callback_0_(mthis) => mthis.callMethod("save", []);
 
-  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);
+  scale_Callback_0_(mthis) => mthis.callMethod("scale", []);
 
-  static isPointInPath_Callback_0(mthis) native "CanvasRenderingContext2D_isPointInPath_Callback";
-  isPointInPath_Callback_0_(mthis) => isPointInPath_Callback_0(mthis);
+  scale_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale", [__arg_0]);
 
-  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, __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, __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, __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, __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, __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, __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);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scale", [__arg_0, __arg_1]);
 
-  static shadowColor_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowColor_Setter";
-  shadowColor_Setter_(mthis, __arg_0) => shadowColor_Setter(mthis, __arg_0);
+  scrollPathIntoView_Callback_0_(mthis) => mthis.callMethod("scrollPathIntoView", []);
 
-  static shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
-  shadowOffsetX_Getter_(mthis) => shadowOffsetX_Getter(mthis);
+  scrollPathIntoView_Callback_1_(mthis, __arg_0) => mthis.callMethod("scrollPathIntoView", [__arg_0]);
 
-  static shadowOffsetX_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
-  shadowOffsetX_Setter_(mthis, __arg_0) => shadowOffsetX_Setter(mthis, __arg_0);
+  setLineDash_Callback_0_(mthis) => mthis.callMethod("setLineDash", []);
 
-  static shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
-  shadowOffsetY_Getter_(mthis) => shadowOffsetY_Getter(mthis);
+  setLineDash_Callback_1_(mthis, __arg_0) => mthis.callMethod("setLineDash", [__arg_0]);
 
-  static shadowOffsetY_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
-  shadowOffsetY_Setter_(mthis, __arg_0) => shadowOffsetY_Setter(mthis, __arg_0);
+  setTransform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setTransform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  setTransform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  setTransform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("setTransform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  shadowBlur_Getter_(mthis) => mthis["shadowBlur"];
 
-  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);
+  shadowBlur_Setter_(mthis, __arg_0) => mthis["shadowBlur"] = __arg_0;
 
-  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);
+  shadowColor_Getter_(mthis) => mthis["shadowColor"];
 
-  static strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
-  strokeStyle_Getter_(mthis) => strokeStyle_Getter(mthis);
+  shadowColor_Setter_(mthis, __arg_0) => mthis["shadowColor"] = __arg_0;
 
-  static strokeStyle_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_strokeStyle_Setter";
-  strokeStyle_Setter_(mthis, __arg_0) => strokeStyle_Setter(mthis, __arg_0);
+  shadowOffsetX_Getter_(mthis) => mthis["shadowOffsetX"];
 
-  static strokeText_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_strokeText_Callback";
-  strokeText_Callback_1_(mthis, __arg_0) => strokeText_Callback_1(mthis, __arg_0);
+  shadowOffsetX_Setter_(mthis, __arg_0) => mthis["shadowOffsetX"] = __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);
+  shadowOffsetY_Getter_(mthis) => mthis["shadowOffsetY"];
 
-  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);
+  shadowOffsetY_Setter_(mthis, __arg_0) => mthis["shadowOffsetY"] = __arg_0;
 
-  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);
+  strokeRect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("strokeRect", [__arg_0, __arg_1]);
 
-  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);
+  strokeRect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("strokeRect", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  strokeRect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("strokeRect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static stroke_Callback_0(mthis) native "CanvasRenderingContext2D_stroke_Callback";
-  stroke_Callback_0_(mthis) => stroke_Callback_0(mthis);
+  strokeStyle_Getter_(mthis) => mthis["strokeStyle"];
 
-  static stroke_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_stroke_Callback";
-  stroke_Callback_1_(mthis, __arg_0) => stroke_Callback_1(mthis, __arg_0);
+  strokeStyle_Setter_(mthis, __arg_0) => mthis["strokeStyle"] = __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);
+  strokeText_Callback_1_(mthis, __arg_0) => mthis.callMethod("strokeText", [__arg_0]);
 
-  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);
+  strokeText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("strokeText", [__arg_0, __arg_1]);
 
-  static textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
-  textAlign_Getter_(mthis) => textAlign_Getter(mthis);
+  strokeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("strokeText", [__arg_0, __arg_1, __arg_2]);
 
-  static textAlign_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_textAlign_Setter";
-  textAlign_Setter_(mthis, __arg_0) => textAlign_Setter(mthis, __arg_0);
+  strokeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("strokeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
-  textBaseline_Getter_(mthis) => textBaseline_Getter(mthis);
+  stroke_Callback_0_(mthis) => mthis.callMethod("stroke", []);
 
-  static textBaseline_Setter(mthis, __arg_0) native "CanvasRenderingContext2D_textBaseline_Setter";
-  textBaseline_Setter_(mthis, __arg_0) => textBaseline_Setter(mthis, __arg_0);
+  stroke_Callback_1_(mthis, __arg_0) => mthis.callMethod("stroke", [__arg_0]);
 
-  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);
+  textAlign_Getter_(mthis) => mthis["textAlign"];
 
-  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);
+  textAlign_Setter_(mthis, __arg_0) => mthis["textAlign"] = __arg_0;
 
-  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);
+  textBaseline_Getter_(mthis) => mthis["textBaseline"];
 
-  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);
+  textBaseline_Setter_(mthis, __arg_0) => mthis["textBaseline"] = __arg_0;
 
-  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);
+  transform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("transform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static translate_Callback_0(mthis) native "CanvasRenderingContext2D_translate_Callback";
-  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
+  transform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static translate_Callback_1(mthis, __arg_0) native "CanvasRenderingContext2D_translate_Callback";
-  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
+  transform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("transform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  translate_Callback_0_(mthis) => mthis.callMethod("translate", []);
 
-  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);
+  translate_Callback_1_(mthis, __arg_0) => mthis.callMethod("translate", [__arg_0]);
 
-  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);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("translate", [__arg_0, __arg_1]);
 
 }
 
@@ -3534,3440 +2070,1846 @@
 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);
+  appendData_Callback_0_(mthis) => mthis.callMethod("appendData", []);
 
-  static appendData_Callback_1(mthis, __arg_0) native "CharacterData_appendData_Callback";
-  appendData_Callback_1_(mthis, __arg_0) => appendData_Callback_1(mthis, __arg_0);
+  appendData_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendData", [__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);
+  data_Getter_(mthis) => mthis["data"];
 
-  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);
+  data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
 
-  static data_Getter(mthis) native "CharacterData_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  deleteData_Callback_0_(mthis) => mthis.callMethod("deleteData", []);
 
-  static data_Setter(mthis, __arg_0) native "CharacterData_data_Setter";
-  data_Setter_(mthis, __arg_0) => data_Setter(mthis, __arg_0);
+  deleteData_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteData", [__arg_0]);
 
-  static deleteData_Callback_0(mthis) native "CharacterData_deleteData_Callback";
-  deleteData_Callback_0_(mthis) => deleteData_Callback_0(mthis);
+  deleteData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("deleteData", [__arg_0, __arg_1]);
 
-  static deleteData_Callback_1(mthis, __arg_0) native "CharacterData_deleteData_Callback";
-  deleteData_Callback_1_(mthis, __arg_0) => deleteData_Callback_1(mthis, __arg_0);
+  insertData_Callback_0_(mthis) => mthis.callMethod("insertData", []);
 
-  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);
+  insertData_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertData", [__arg_0]);
 
-  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);
+  insertData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertData", [__arg_0, __arg_1]);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static insertData_Callback_0(mthis) native "CharacterData_insertData_Callback";
-  insertData_Callback_0_(mthis) => insertData_Callback_0(mthis);
+  nextElementSibling_Getter_(mthis) => mthis["nextElementSibling"];
 
-  static insertData_Callback_1(mthis, __arg_0) native "CharacterData_insertData_Callback";
-  insertData_Callback_1_(mthis, __arg_0) => insertData_Callback_1(mthis, __arg_0);
+  previousElementSibling_Getter_(mthis) => mthis["previousElementSibling"];
 
-  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);
+  replaceData_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceData", [__arg_0]);
 
-  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);
+  replaceData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceData", [__arg_0, __arg_1]);
 
-  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);
+  replaceData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("replaceData", [__arg_0, __arg_1, __arg_2]);
 
-  static length_Getter(mthis) native "CharacterData_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  substringData_Callback_0_(mthis) => mthis.callMethod("substringData", []);
 
-  static nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
-  nextElementSibling_Getter_(mthis) => nextElementSibling_Getter(mthis);
+  substringData_Callback_1_(mthis, __arg_0) => mthis.callMethod("substringData", [__arg_0]);
 
-  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);
+  substringData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("substringData", [__arg_0, __arg_1]);
 
 }
 
 class BlinkCircularGeofencingRegion extends BlinkGeofencingRegion {
   static final instance = new BlinkCircularGeofencingRegion();
 
-  static constructorCallback_0() native "CircularGeofencingRegion_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["CircularGeofencingRegion"], []);
 
-  static constructorCallback_1(__arg_0) native "CircularGeofencingRegion_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["CircularGeofencingRegion"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "CircularGeofencingRegion_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  latitude_Getter_(mthis) => mthis["latitude"];
 
-  static constructorCallback_3(__arg_0, __arg_1, __arg_2) native "CircularGeofencingRegion_constructorCallback";
-  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => constructorCallback_3(__arg_0, __arg_1, __arg_2);
+  longitude_Getter_(mthis) => mthis["longitude"];
 
-  static latitude_Getter(mthis) native "CircularGeofencingRegion_latitude_Getter";
-  latitude_Getter_(mthis) => latitude_Getter(mthis);
-
-  static longitude_Getter(mthis) native "CircularGeofencingRegion_longitude_Getter";
-  longitude_Getter_(mthis) => longitude_Getter(mthis);
-
-  static radius_Getter(mthis) native "CircularGeofencingRegion_radius_Getter";
-  radius_Getter_(mthis) => radius_Getter(mthis);
+  radius_Getter_(mthis) => mthis["radius"];
 
 }
 
 class BlinkClientRect {
   static final instance = new BlinkClientRect();
 
-  static bottom_Getter(mthis) native "ClientRect_bottom_Getter";
-  bottom_Getter_(mthis) => bottom_Getter(mthis);
+  bottom_Getter_(mthis) => mthis["bottom"];
 
-  static height_Getter(mthis) native "ClientRect_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static left_Getter(mthis) native "ClientRect_left_Getter";
-  left_Getter_(mthis) => left_Getter(mthis);
+  left_Getter_(mthis) => mthis["left"];
 
-  static right_Getter(mthis) native "ClientRect_right_Getter";
-  right_Getter_(mthis) => right_Getter(mthis);
+  right_Getter_(mthis) => mthis["right"];
 
-  static top_Getter(mthis) native "ClientRect_top_Getter";
-  top_Getter_(mthis) => top_Getter(mthis);
+  top_Getter_(mthis) => mthis["top"];
 
-  static width_Getter(mthis) native "ClientRect_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
 }
 
 class BlinkClientRectList {
   static final instance = new BlinkClientRectList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "ClientRectList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "ClientRectList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "ClientRectList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkCloseEvent extends BlinkEvent {
   static final instance = new BlinkCloseEvent();
 
-  static code_Getter(mthis) native "CloseEvent_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "CloseEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["CloseEvent"], [__arg_0, __arg_1]);
 
-  static reason_Getter(mthis) native "CloseEvent_reason_Getter";
-  reason_Getter_(mthis) => reason_Getter(mthis);
+  reason_Getter_(mthis) => mthis["reason"];
 
-  static wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
-  wasClean_Getter_(mthis) => wasClean_Getter(mthis);
+  wasClean_Getter_(mthis) => mthis["wasClean"];
 
 }
 
 class BlinkComment extends BlinkCharacterData {
   static final instance = new BlinkComment();
 
-  static constructorCallback_0() native "Comment_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Comment"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Comment"], [__arg_0]);
 
 }
 
 class BlinkCompositionEvent extends BlinkUIEvent {
   static final instance = new BlinkCompositionEvent();
 
-  static activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
-  activeSegmentEnd_Getter_(mthis) => activeSegmentEnd_Getter(mthis);
+  activeSegmentEnd_Getter_(mthis) => mthis["activeSegmentEnd"];
 
-  static activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
-  activeSegmentStart_Getter_(mthis) => activeSegmentStart_Getter(mthis);
+  activeSegmentStart_Getter_(mthis) => mthis["activeSegmentStart"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "CompositionEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["CompositionEvent"], [__arg_0, __arg_1]);
 
-  static data_Getter(mthis) native "CompositionEvent_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  data_Getter_(mthis) => mthis["data"];
 
-  static getSegments_Callback_0(mthis) native "CompositionEvent_getSegments_Callback";
-  getSegments_Callback_0_(mthis) => getSegments_Callback_0(mthis);
+  getSegments_Callback_0_(mthis) => mthis.callMethod("getSegments", []);
 
-  static getSegments_Callback_1(mthis, __arg_0) native "CompositionEvent_getSegments_Callback";
-  getSegments_Callback_1_(mthis, __arg_0) => getSegments_Callback_1(mthis, __arg_0);
+  initCompositionEvent_Callback_0_(mthis) => mthis.callMethod("initCompositionEvent", []);
 
-  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);
+  initCompositionEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initCompositionEvent", [__arg_0]);
 
-  static initCompositionEvent_Callback_0(mthis) native "CompositionEvent_initCompositionEvent_Callback";
-  initCompositionEvent_Callback_0_(mthis) => initCompositionEvent_Callback_0(mthis);
+  initCompositionEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initCompositionEvent", [__arg_0, __arg_1]);
 
-  static initCompositionEvent_Callback_1(mthis, __arg_0) native "CompositionEvent_initCompositionEvent_Callback";
-  initCompositionEvent_Callback_1_(mthis, __arg_0) => initCompositionEvent_Callback_1(mthis, __arg_0);
+  initCompositionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initCompositionEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initCompositionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initCompositionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initCompositionEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkConsole extends BlinkConsoleBase {
   static final instance = new BlinkConsole();
 
-  static memory_Getter(mthis) native "Console_memory_Getter";
-  memory_Getter_(mthis) => memory_Getter(mthis);
+  memory_Getter_(mthis) => mthis["memory"];
 
 }
 
 class BlinkConsoleBase {
   static final instance = new BlinkConsoleBase();
 
-  static assert_Callback_0(mthis) native "ConsoleBase_assert_Callback";
-  assert_Callback_0_(mthis) => assert_Callback_0(mthis);
+  assert_Callback_0_(mthis) => mthis.callMethod("assert", []);
 
-  static assert_Callback_1(mthis, __arg_0) native "ConsoleBase_assert_Callback";
-  assert_Callback_1_(mthis, __arg_0) => assert_Callback_1(mthis, __arg_0);
+  assert_Callback_1_(mthis, __arg_0) => mthis.callMethod("assert", [__arg_0]);
 
-  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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  clear_Callback_1_(mthis, __arg_0) => mthis.callMethod("clear", [__arg_0]);
 
-  static clear_Callback_0(mthis) native "ConsoleBase_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  count_Callback_0_(mthis) => mthis.callMethod("count", []);
 
-  static clear_Callback_1(mthis, __arg_0) native "ConsoleBase_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  count_Callback_1_(mthis, __arg_0) => mthis.callMethod("count", [__arg_0]);
 
-  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);
+  debug_Callback_0_(mthis) => mthis.callMethod("debug", []);
 
-  static count_Callback_0(mthis) native "ConsoleBase_count_Callback";
-  count_Callback_0_(mthis) => count_Callback_0(mthis);
+  debug_Callback_1_(mthis, __arg_0) => mthis.callMethod("debug", [__arg_0]);
 
-  static count_Callback_1(mthis, __arg_0) native "ConsoleBase_count_Callback";
-  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
+  dir_Callback_0_(mthis) => mthis.callMethod("dir", []);
 
-  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);
+  dir_Callback_1_(mthis, __arg_0) => mthis.callMethod("dir", [__arg_0]);
 
-  static debug_Callback_0(mthis) native "ConsoleBase_debug_Callback";
-  debug_Callback_0_(mthis) => debug_Callback_0(mthis);
+  dirxml_Callback_0_(mthis) => mthis.callMethod("dirxml", []);
 
-  static debug_Callback_1(mthis, __arg_0) native "ConsoleBase_debug_Callback";
-  debug_Callback_1_(mthis, __arg_0) => debug_Callback_1(mthis, __arg_0);
+  dirxml_Callback_1_(mthis, __arg_0) => mthis.callMethod("dirxml", [__arg_0]);
 
-  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);
+  error_Callback_0_(mthis) => mthis.callMethod("error", []);
 
-  static dir_Callback_0(mthis) native "ConsoleBase_dir_Callback";
-  dir_Callback_0_(mthis) => dir_Callback_0(mthis);
+  error_Callback_1_(mthis, __arg_0) => mthis.callMethod("error", [__arg_0]);
 
-  static dir_Callback_1(mthis, __arg_0) native "ConsoleBase_dir_Callback";
-  dir_Callback_1_(mthis, __arg_0) => dir_Callback_1(mthis, __arg_0);
+  groupCollapsed_Callback_0_(mthis) => mthis.callMethod("groupCollapsed", []);
 
-  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);
+  groupCollapsed_Callback_1_(mthis, __arg_0) => mthis.callMethod("groupCollapsed", [__arg_0]);
 
-  static dirxml_Callback_0(mthis) native "ConsoleBase_dirxml_Callback";
-  dirxml_Callback_0_(mthis) => dirxml_Callback_0(mthis);
+  groupEnd_Callback_0_(mthis) => mthis.callMethod("groupEnd", []);
 
-  static dirxml_Callback_1(mthis, __arg_0) native "ConsoleBase_dirxml_Callback";
-  dirxml_Callback_1_(mthis, __arg_0) => dirxml_Callback_1(mthis, __arg_0);
+  group_Callback_0_(mthis) => mthis.callMethod("group", []);
 
-  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);
+  group_Callback_1_(mthis, __arg_0) => mthis.callMethod("group", [__arg_0]);
 
-  static error_Callback_0(mthis) native "ConsoleBase_error_Callback";
-  error_Callback_0_(mthis) => error_Callback_0(mthis);
+  info_Callback_0_(mthis) => mthis.callMethod("info", []);
 
-  static error_Callback_1(mthis, __arg_0) native "ConsoleBase_error_Callback";
-  error_Callback_1_(mthis, __arg_0) => error_Callback_1(mthis, __arg_0);
+  info_Callback_1_(mthis, __arg_0) => mthis.callMethod("info", [__arg_0]);
 
-  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);
+  log_Callback_0_(mthis) => mthis.callMethod("log", []);
 
-  static groupCollapsed_Callback_0(mthis) native "ConsoleBase_groupCollapsed_Callback";
-  groupCollapsed_Callback_0_(mthis) => groupCollapsed_Callback_0(mthis);
+  log_Callback_1_(mthis, __arg_0) => mthis.callMethod("log", [__arg_0]);
 
-  static groupCollapsed_Callback_1(mthis, __arg_0) native "ConsoleBase_groupCollapsed_Callback";
-  groupCollapsed_Callback_1_(mthis, __arg_0) => groupCollapsed_Callback_1(mthis, __arg_0);
+  markTimeline_Callback_0_(mthis) => mthis.callMethod("markTimeline", []);
 
-  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);
+  markTimeline_Callback_1_(mthis, __arg_0) => mthis.callMethod("markTimeline", [__arg_0]);
 
-  static groupEnd_Callback_0(mthis) native "ConsoleBase_groupEnd_Callback";
-  groupEnd_Callback_0_(mthis) => groupEnd_Callback_0(mthis);
+  profileEnd_Callback_0_(mthis) => mthis.callMethod("profileEnd", []);
 
-  static groupEnd_Callback_1(mthis, __arg_0) native "ConsoleBase_groupEnd_Callback";
-  groupEnd_Callback_1_(mthis, __arg_0) => groupEnd_Callback_1(mthis, __arg_0);
+  profileEnd_Callback_1_(mthis, __arg_0) => mthis.callMethod("profileEnd", [__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);
+  profile_Callback_0_(mthis) => mthis.callMethod("profile", []);
 
-  static group_Callback_0(mthis) native "ConsoleBase_group_Callback";
-  group_Callback_0_(mthis) => group_Callback_0(mthis);
+  profile_Callback_1_(mthis, __arg_0) => mthis.callMethod("profile", [__arg_0]);
 
-  static group_Callback_1(mthis, __arg_0) native "ConsoleBase_group_Callback";
-  group_Callback_1_(mthis, __arg_0) => group_Callback_1(mthis, __arg_0);
+  table_Callback_0_(mthis) => mthis.callMethod("table", []);
 
-  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);
+  table_Callback_1_(mthis, __arg_0) => mthis.callMethod("table", [__arg_0]);
 
-  static info_Callback_0(mthis) native "ConsoleBase_info_Callback";
-  info_Callback_0_(mthis) => info_Callback_0(mthis);
+  timeEnd_Callback_0_(mthis) => mthis.callMethod("timeEnd", []);
 
-  static info_Callback_1(mthis, __arg_0) native "ConsoleBase_info_Callback";
-  info_Callback_1_(mthis, __arg_0) => info_Callback_1(mthis, __arg_0);
+  timeEnd_Callback_1_(mthis, __arg_0) => mthis.callMethod("timeEnd", [__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);
+  timeStamp_Callback_0_(mthis) => mthis.callMethod("timeStamp", []);
 
-  static log_Callback_0(mthis) native "ConsoleBase_log_Callback";
-  log_Callback_0_(mthis) => log_Callback_0(mthis);
+  timeStamp_Callback_1_(mthis, __arg_0) => mthis.callMethod("timeStamp", [__arg_0]);
 
-  static log_Callback_1(mthis, __arg_0) native "ConsoleBase_log_Callback";
-  log_Callback_1_(mthis, __arg_0) => log_Callback_1(mthis, __arg_0);
+  time_Callback_0_(mthis) => mthis.callMethod("time", []);
 
-  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);
+  time_Callback_1_(mthis, __arg_0) => mthis.callMethod("time", [__arg_0]);
 
-  static markTimeline_Callback_0(mthis) native "ConsoleBase_markTimeline_Callback";
-  markTimeline_Callback_0_(mthis) => markTimeline_Callback_0(mthis);
+  timelineEnd_Callback_0_(mthis) => mthis.callMethod("timelineEnd", []);
 
-  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);
+  timelineEnd_Callback_1_(mthis, __arg_0) => mthis.callMethod("timelineEnd", [__arg_0]);
 
-  static trace_Callback_0(mthis) native "ConsoleBase_trace_Callback";
-  trace_Callback_0_(mthis) => trace_Callback_0(mthis);
+  timeline_Callback_0_(mthis) => mthis.callMethod("timeline", []);
 
-  static trace_Callback_1(mthis, __arg_0) native "ConsoleBase_trace_Callback";
-  trace_Callback_1_(mthis, __arg_0) => trace_Callback_1(mthis, __arg_0);
+  timeline_Callback_1_(mthis, __arg_0) => mthis.callMethod("timeline", [__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);
+  trace_Callback_0_(mthis) => mthis.callMethod("trace", []);
 
-  static warn_Callback_0(mthis) native "ConsoleBase_warn_Callback";
-  warn_Callback_0_(mthis) => warn_Callback_0(mthis);
+  trace_Callback_1_(mthis, __arg_0) => mthis.callMethod("trace", [__arg_0]);
 
-  static warn_Callback_1(mthis, __arg_0) native "ConsoleBase_warn_Callback";
-  warn_Callback_1_(mthis, __arg_0) => warn_Callback_1(mthis, __arg_0);
+  warn_Callback_0_(mthis) => mthis.callMethod("warn", []);
 
-  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);
+  warn_Callback_1_(mthis, __arg_0) => mthis.callMethod("warn", [__arg_0]);
 
 }
 
 class BlinkConvolverNode extends BlinkAudioNode {
   static final instance = new BlinkConvolverNode();
 
-  static buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
-  buffer_Getter_(mthis) => buffer_Getter(mthis);
+  buffer_Getter_(mthis) => mthis["buffer"];
 
-  static buffer_Setter(mthis, __arg_0) native "ConvolverNode_buffer_Setter";
-  buffer_Setter_(mthis, __arg_0) => buffer_Setter(mthis, __arg_0);
+  buffer_Setter_(mthis, __arg_0) => mthis["buffer"] = __arg_0;
 
-  static normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
-  normalize_Getter_(mthis) => normalize_Getter(mthis);
+  normalize_Getter_(mthis) => mthis["normalize"];
 
-  static normalize_Setter(mthis, __arg_0) native "ConvolverNode_normalize_Setter";
-  normalize_Setter_(mthis, __arg_0) => normalize_Setter(mthis, __arg_0);
+  normalize_Setter_(mthis, __arg_0) => mthis["normalize"] = __arg_0;
 
 }
 
 class BlinkCoordinates {
   static final instance = new BlinkCoordinates();
 
-  static accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
-  accuracy_Getter_(mthis) => accuracy_Getter(mthis);
+  accuracy_Getter_(mthis) => mthis["accuracy"];
 
-  static altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
-  altitudeAccuracy_Getter_(mthis) => altitudeAccuracy_Getter(mthis);
+  altitudeAccuracy_Getter_(mthis) => mthis["altitudeAccuracy"];
 
-  static altitude_Getter(mthis) native "Coordinates_altitude_Getter";
-  altitude_Getter_(mthis) => altitude_Getter(mthis);
+  altitude_Getter_(mthis) => mthis["altitude"];
 
-  static heading_Getter(mthis) native "Coordinates_heading_Getter";
-  heading_Getter_(mthis) => heading_Getter(mthis);
+  heading_Getter_(mthis) => mthis["heading"];
 
-  static latitude_Getter(mthis) native "Coordinates_latitude_Getter";
-  latitude_Getter_(mthis) => latitude_Getter(mthis);
+  latitude_Getter_(mthis) => mthis["latitude"];
 
-  static longitude_Getter(mthis) native "Coordinates_longitude_Getter";
-  longitude_Getter_(mthis) => longitude_Getter(mthis);
+  longitude_Getter_(mthis) => mthis["longitude"];
 
-  static speed_Getter(mthis) native "Coordinates_speed_Getter";
-  speed_Getter_(mthis) => speed_Getter(mthis);
+  speed_Getter_(mthis) => mthis["speed"];
 
 }
 
 class BlinkCounter {
   static final instance = new BlinkCounter();
 
-  static identifier_Getter(mthis) native "Counter_identifier_Getter";
-  identifier_Getter_(mthis) => identifier_Getter(mthis);
+  identifier_Getter_(mthis) => mthis["identifier"];
 
-  static listStyle_Getter(mthis) native "Counter_listStyle_Getter";
-  listStyle_Getter_(mthis) => listStyle_Getter(mthis);
+  listStyle_Getter_(mthis) => mthis["listStyle"];
 
-  static separator_Getter(mthis) native "Counter_separator_Getter";
-  separator_Getter_(mthis) => separator_Getter(mthis);
+  separator_Getter_(mthis) => mthis["separator"];
 
 }
 
 class BlinkCredential {
   static final instance = new BlinkCredential();
 
-  static avatarURL_Getter(mthis) native "Credential_avatarURL_Getter";
-  avatarURL_Getter_(mthis) => avatarURL_Getter(mthis);
+  avatarURL_Getter_(mthis) => mthis["avatarURL"];
 
-  static id_Getter(mthis) native "Credential_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static name_Getter(mthis) native "Credential_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
 }
 
 class BlinkCredentialsContainer {
   static final instance = new BlinkCredentialsContainer();
 
-  static notifyFailedSignIn_Callback_0(mthis) native "CredentialsContainer_notifyFailedSignIn_Callback";
-  notifyFailedSignIn_Callback_0_(mthis) => notifyFailedSignIn_Callback_0(mthis);
+  notifyFailedSignIn_Callback_0_(mthis) => mthis.callMethod("notifyFailedSignIn", []);
 
-  static notifyFailedSignIn_Callback_1(mthis, __arg_0) native "CredentialsContainer_notifyFailedSignIn_Callback";
-  notifyFailedSignIn_Callback_1_(mthis, __arg_0) => notifyFailedSignIn_Callback_1(mthis, __arg_0);
+  notifyFailedSignIn_Callback_1_(mthis, __arg_0) => mthis.callMethod("notifyFailedSignIn", [__arg_0]);
 
-  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);
+  notifySignedIn_Callback_0_(mthis) => mthis.callMethod("notifySignedIn", []);
 
-  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);
+  notifySignedIn_Callback_1_(mthis, __arg_0) => mthis.callMethod("notifySignedIn", [__arg_0]);
 
-  static notifySignedIn_Callback_0(mthis) native "CredentialsContainer_notifySignedIn_Callback";
-  notifySignedIn_Callback_0_(mthis) => notifySignedIn_Callback_0(mthis);
+  notifySignedOut_Callback_0_(mthis) => mthis.callMethod("notifySignedOut", []);
 
-  static notifySignedIn_Callback_1(mthis, __arg_0) native "CredentialsContainer_notifySignedIn_Callback";
-  notifySignedIn_Callback_1_(mthis, __arg_0) => notifySignedIn_Callback_1(mthis, __arg_0);
+  request_Callback_0_(mthis) => mthis.callMethod("request", []);
 
-  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);
+  request_Callback_1_(mthis, __arg_0) => mthis.callMethod("request", [__arg_0]);
 
 }
 
 class BlinkCrypto {
   static final instance = new BlinkCrypto();
 
-  static getRandomValues_Callback_0(mthis) native "Crypto_getRandomValues_Callback";
-  getRandomValues_Callback_0_(mthis) => getRandomValues_Callback_0(mthis);
+  getRandomValues_Callback_0_(mthis) => mthis.callMethod("getRandomValues", []);
 
-  static getRandomValues_Callback_1(mthis, __arg_0) native "Crypto_getRandomValues_Callback";
-  getRandomValues_Callback_1_(mthis, __arg_0) => getRandomValues_Callback_1(mthis, __arg_0);
+  getRandomValues_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRandomValues", [__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);
+  subtle_Getter_(mthis) => mthis["subtle"];
 
 }
 
 class BlinkCryptoKey {
   static final instance = new BlinkCryptoKey();
 
-  static algorithm_Getter(mthis) native "CryptoKey_algorithm_Getter";
-  algorithm_Getter_(mthis) => algorithm_Getter(mthis);
+  algorithm_Getter_(mthis) => mthis["algorithm"];
 
-  static extractable_Getter(mthis) native "CryptoKey_extractable_Getter";
-  extractable_Getter_(mthis) => extractable_Getter(mthis);
+  extractable_Getter_(mthis) => mthis["extractable"];
 
-  static type_Getter(mthis) native "CryptoKey_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static usages_Getter(mthis) native "CryptoKey_usages_Getter";
-  usages_Getter_(mthis) => usages_Getter(mthis);
+  usages_Getter_(mthis) => mthis["usages"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["CustomEvent"], [__arg_0, __arg_1]);
 
-  static detail_Getter(mthis) native "CustomEvent_detail_Getter";
-  detail_Getter_(mthis) => detail_Getter(mthis);
+  detail_Getter_(mthis) => mthis["detail"];
 
-  static initCustomEvent_Callback_0(mthis) native "CustomEvent_initCustomEvent_Callback";
-  initCustomEvent_Callback_0_(mthis) => initCustomEvent_Callback_0(mthis);
+  initCustomEvent_Callback_0_(mthis) => mthis.callMethod("initCustomEvent", []);
 
-  static initCustomEvent_Callback_1(mthis, __arg_0) native "CustomEvent_initCustomEvent_Callback";
-  initCustomEvent_Callback_1_(mthis, __arg_0) => initCustomEvent_Callback_1(mthis, __arg_0);
+  initCustomEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initCustomEvent", [__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);
+  initCustomEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initCustomEvent", [__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);
+  initCustomEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initCustomEvent", [__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);
+  initCustomEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initCustomEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkDOMError {
   static final instance = new BlinkDOMError();
 
-  static constructorCallback_0() native "DOMError_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DOMError"], []);
 
-  static constructorCallback_1(__arg_0) native "DOMError_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["DOMError"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMError_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DOMError"], [__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);
+  message_Getter_(mthis) => mthis["message"];
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
 }
 
 class BlinkDOMException {
   static final instance = new BlinkDOMException();
 
-  static message_Getter(mthis) native "DOMException_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
-  static name_Getter(mthis) native "DOMException_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
 }
 
 class BlinkDOMFileSystem {
   static final instance = new BlinkDOMFileSystem();
 
-  static name_Getter(mthis) native "DOMFileSystem_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static root_Getter(mthis) native "DOMFileSystem_root_Getter";
-  root_Getter_(mthis) => root_Getter(mthis);
+  root_Getter_(mthis) => mthis["root"];
 
 }
 
 class BlinkDOMFileSystemSync {
   static final instance = new BlinkDOMFileSystemSync();
 
-  static name_Getter(mthis) native "DOMFileSystemSync_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static root_Getter(mthis) native "DOMFileSystemSync_root_Getter";
-  root_Getter_(mthis) => root_Getter(mthis);
+  root_Getter_(mthis) => mthis["root"];
 
 }
 
 class BlinkDOMImplementation {
   static final instance = new BlinkDOMImplementation();
 
-  static createDocumentType_Callback_1(mthis, __arg_0) native "DOMImplementation_createDocumentType_Callback";
-  createDocumentType_Callback_1_(mthis, __arg_0) => createDocumentType_Callback_1(mthis, __arg_0);
+  createDocumentType_Callback_1_(mthis, __arg_0) => mthis.callMethod("createDocumentType", [__arg_0]);
 
-  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);
+  createDocumentType_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createDocumentType", [__arg_0, __arg_1]);
 
-  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);
+  createDocumentType_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createDocumentType", [__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);
+  createDocument_Callback_0_(mthis) => mthis.callMethod("createDocument", []);
 
-  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);
+  createDocument_Callback_1_(mthis, __arg_0) => mthis.callMethod("createDocument", [__arg_0]);
 
-  static createDocument_Callback_0(mthis) native "DOMImplementation_createDocument_Callback";
-  createDocument_Callback_0_(mthis) => createDocument_Callback_0(mthis);
+  createDocument_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createDocument", [__arg_0, __arg_1]);
 
-  static createDocument_Callback_1(mthis, __arg_0) native "DOMImplementation_createDocument_Callback";
-  createDocument_Callback_1_(mthis, __arg_0) => createDocument_Callback_1(mthis, __arg_0);
+  createDocument_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createDocument", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createHTMLDocument_Callback_0_(mthis) => mthis.callMethod("createHTMLDocument", []);
 
-  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);
+  createHTMLDocument_Callback_1_(mthis, __arg_0) => mthis.callMethod("createHTMLDocument", [__arg_0]);
 
-  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);
+  hasFeature_Callback_0_(mthis) => mthis.callMethod("hasFeature", []);
 
-  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);
+  hasFeature_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasFeature", [__arg_0]);
 
-  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);
+  hasFeature_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("hasFeature", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDOMMatrix extends BlinkDOMMatrixReadOnly {
   static final instance = new BlinkDOMMatrix();
 
-  static a_Getter(mthis) native "DOMMatrix_a_Getter";
-  a_Getter_(mthis) => a_Getter(mthis);
+  a_Getter_(mthis) => mthis["a"];
 
-  static a_Setter(mthis, __arg_0) native "DOMMatrix_a_Setter";
-  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
+  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
 
-  static b_Getter(mthis) native "DOMMatrix_b_Getter";
-  b_Getter_(mthis) => b_Getter(mthis);
+  b_Getter_(mthis) => mthis["b"];
 
-  static b_Setter(mthis, __arg_0) native "DOMMatrix_b_Setter";
-  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
+  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
 
-  static c_Getter(mthis) native "DOMMatrix_c_Getter";
-  c_Getter_(mthis) => c_Getter(mthis);
+  c_Getter_(mthis) => mthis["c"];
 
-  static c_Setter(mthis, __arg_0) native "DOMMatrix_c_Setter";
-  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
+  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
 
-  static constructorCallback_0() native "DOMMatrix_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DOMMatrix"], []);
 
-  static constructorCallback_1(__arg_0) native "DOMMatrix_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["DOMMatrix"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMMatrix_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  d_Getter_(mthis) => mthis["d"];
 
-  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);
+  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
 
-  static d_Getter(mthis) native "DOMMatrix_d_Getter";
-  d_Getter_(mthis) => d_Getter(mthis);
+  e_Getter_(mthis) => mthis["e"];
 
-  static d_Setter(mthis, __arg_0) native "DOMMatrix_d_Setter";
-  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
+  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
 
-  static e_Getter(mthis) native "DOMMatrix_e_Getter";
-  e_Getter_(mthis) => e_Getter(mthis);
+  f_Getter_(mthis) => mthis["f"];
 
-  static e_Setter(mthis, __arg_0) native "DOMMatrix_e_Setter";
-  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
+  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
 
-  static f_Getter(mthis) native "DOMMatrix_f_Getter";
-  f_Getter_(mthis) => f_Getter(mthis);
+  m11_Getter_(mthis) => mthis["m11"];
 
-  static f_Setter(mthis, __arg_0) native "DOMMatrix_f_Setter";
-  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
+  m11_Setter_(mthis, __arg_0) => mthis["m11"] = __arg_0;
 
-  static m11_Getter(mthis) native "DOMMatrix_m11_Getter";
-  m11_Getter_(mthis) => m11_Getter(mthis);
+  m12_Getter_(mthis) => mthis["m12"];
 
-  static m11_Setter(mthis, __arg_0) native "DOMMatrix_m11_Setter";
-  m11_Setter_(mthis, __arg_0) => m11_Setter(mthis, __arg_0);
+  m12_Setter_(mthis, __arg_0) => mthis["m12"] = __arg_0;
 
-  static m12_Getter(mthis) native "DOMMatrix_m12_Getter";
-  m12_Getter_(mthis) => m12_Getter(mthis);
+  m13_Getter_(mthis) => mthis["m13"];
 
-  static m12_Setter(mthis, __arg_0) native "DOMMatrix_m12_Setter";
-  m12_Setter_(mthis, __arg_0) => m12_Setter(mthis, __arg_0);
+  m13_Setter_(mthis, __arg_0) => mthis["m13"] = __arg_0;
 
-  static m13_Getter(mthis) native "DOMMatrix_m13_Getter";
-  m13_Getter_(mthis) => m13_Getter(mthis);
+  m14_Getter_(mthis) => mthis["m14"];
 
-  static m13_Setter(mthis, __arg_0) native "DOMMatrix_m13_Setter";
-  m13_Setter_(mthis, __arg_0) => m13_Setter(mthis, __arg_0);
+  m14_Setter_(mthis, __arg_0) => mthis["m14"] = __arg_0;
 
-  static m14_Getter(mthis) native "DOMMatrix_m14_Getter";
-  m14_Getter_(mthis) => m14_Getter(mthis);
+  m21_Getter_(mthis) => mthis["m21"];
 
-  static m14_Setter(mthis, __arg_0) native "DOMMatrix_m14_Setter";
-  m14_Setter_(mthis, __arg_0) => m14_Setter(mthis, __arg_0);
+  m21_Setter_(mthis, __arg_0) => mthis["m21"] = __arg_0;
 
-  static m21_Getter(mthis) native "DOMMatrix_m21_Getter";
-  m21_Getter_(mthis) => m21_Getter(mthis);
+  m22_Getter_(mthis) => mthis["m22"];
 
-  static m21_Setter(mthis, __arg_0) native "DOMMatrix_m21_Setter";
-  m21_Setter_(mthis, __arg_0) => m21_Setter(mthis, __arg_0);
+  m22_Setter_(mthis, __arg_0) => mthis["m22"] = __arg_0;
 
-  static m22_Getter(mthis) native "DOMMatrix_m22_Getter";
-  m22_Getter_(mthis) => m22_Getter(mthis);
+  m23_Getter_(mthis) => mthis["m23"];
 
-  static m22_Setter(mthis, __arg_0) native "DOMMatrix_m22_Setter";
-  m22_Setter_(mthis, __arg_0) => m22_Setter(mthis, __arg_0);
+  m23_Setter_(mthis, __arg_0) => mthis["m23"] = __arg_0;
 
-  static m23_Getter(mthis) native "DOMMatrix_m23_Getter";
-  m23_Getter_(mthis) => m23_Getter(mthis);
+  m24_Getter_(mthis) => mthis["m24"];
 
-  static m23_Setter(mthis, __arg_0) native "DOMMatrix_m23_Setter";
-  m23_Setter_(mthis, __arg_0) => m23_Setter(mthis, __arg_0);
+  m24_Setter_(mthis, __arg_0) => mthis["m24"] = __arg_0;
 
-  static m24_Getter(mthis) native "DOMMatrix_m24_Getter";
-  m24_Getter_(mthis) => m24_Getter(mthis);
+  m31_Getter_(mthis) => mthis["m31"];
 
-  static m24_Setter(mthis, __arg_0) native "DOMMatrix_m24_Setter";
-  m24_Setter_(mthis, __arg_0) => m24_Setter(mthis, __arg_0);
+  m31_Setter_(mthis, __arg_0) => mthis["m31"] = __arg_0;
 
-  static m31_Getter(mthis) native "DOMMatrix_m31_Getter";
-  m31_Getter_(mthis) => m31_Getter(mthis);
+  m32_Getter_(mthis) => mthis["m32"];
 
-  static m31_Setter(mthis, __arg_0) native "DOMMatrix_m31_Setter";
-  m31_Setter_(mthis, __arg_0) => m31_Setter(mthis, __arg_0);
+  m32_Setter_(mthis, __arg_0) => mthis["m32"] = __arg_0;
 
-  static m32_Getter(mthis) native "DOMMatrix_m32_Getter";
-  m32_Getter_(mthis) => m32_Getter(mthis);
+  m33_Getter_(mthis) => mthis["m33"];
 
-  static m32_Setter(mthis, __arg_0) native "DOMMatrix_m32_Setter";
-  m32_Setter_(mthis, __arg_0) => m32_Setter(mthis, __arg_0);
+  m33_Setter_(mthis, __arg_0) => mthis["m33"] = __arg_0;
 
-  static m33_Getter(mthis) native "DOMMatrix_m33_Getter";
-  m33_Getter_(mthis) => m33_Getter(mthis);
+  m34_Getter_(mthis) => mthis["m34"];
 
-  static m33_Setter(mthis, __arg_0) native "DOMMatrix_m33_Setter";
-  m33_Setter_(mthis, __arg_0) => m33_Setter(mthis, __arg_0);
+  m34_Setter_(mthis, __arg_0) => mthis["m34"] = __arg_0;
 
-  static m34_Getter(mthis) native "DOMMatrix_m34_Getter";
-  m34_Getter_(mthis) => m34_Getter(mthis);
+  m41_Getter_(mthis) => mthis["m41"];
 
-  static m34_Setter(mthis, __arg_0) native "DOMMatrix_m34_Setter";
-  m34_Setter_(mthis, __arg_0) => m34_Setter(mthis, __arg_0);
+  m41_Setter_(mthis, __arg_0) => mthis["m41"] = __arg_0;
 
-  static m41_Getter(mthis) native "DOMMatrix_m41_Getter";
-  m41_Getter_(mthis) => m41_Getter(mthis);
+  m42_Getter_(mthis) => mthis["m42"];
 
-  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);
-
-  static multiplySelf_Callback_0(mthis) native "DOMMatrix_multiplySelf_Callback";
-  multiplySelf_Callback_0_(mthis) => multiplySelf_Callback_0(mthis);
-
-  static multiplySelf_Callback_1(mthis, __arg_0) native "DOMMatrix_multiplySelf_Callback";
-  multiplySelf_Callback_1_(mthis, __arg_0) => multiplySelf_Callback_1(mthis, __arg_0);
-
-  static multiplySelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_multiplySelf_Callback";
-  multiplySelf_Callback_2_(mthis, __arg_0, __arg_1) => multiplySelf_Callback_2(mthis, __arg_0, __arg_1);
-
-  static multiplySelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_multiplySelf_Callback";
-  multiplySelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => multiplySelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
-
-  static preMultiplySelf_Callback_0(mthis) native "DOMMatrix_preMultiplySelf_Callback";
-  preMultiplySelf_Callback_0_(mthis) => preMultiplySelf_Callback_0(mthis);
-
-  static preMultiplySelf_Callback_1(mthis, __arg_0) native "DOMMatrix_preMultiplySelf_Callback";
-  preMultiplySelf_Callback_1_(mthis, __arg_0) => preMultiplySelf_Callback_1(mthis, __arg_0);
-
-  static preMultiplySelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_preMultiplySelf_Callback";
-  preMultiplySelf_Callback_2_(mthis, __arg_0, __arg_1) => preMultiplySelf_Callback_2(mthis, __arg_0, __arg_1);
-
-  static preMultiplySelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_preMultiplySelf_Callback";
-  preMultiplySelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => preMultiplySelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  m42_Setter_(mthis, __arg_0) => mthis["m42"] = __arg_0;
 
-  static scale3dSelf_Callback_0(mthis) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_0_(mthis) => scale3dSelf_Callback_0(mthis);
+  m43_Getter_(mthis) => mthis["m43"];
 
-  static scale3dSelf_Callback_1(mthis, __arg_0) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_1_(mthis, __arg_0) => scale3dSelf_Callback_1(mthis, __arg_0);
+  m43_Setter_(mthis, __arg_0) => mthis["m43"] = __arg_0;
 
-  static scale3dSelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_2_(mthis, __arg_0, __arg_1) => scale3dSelf_Callback_2(mthis, __arg_0, __arg_1);
+  m44_Getter_(mthis) => mthis["m44"];
 
-  static scale3dSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scale3dSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  m44_Setter_(mthis, __arg_0) => mthis["m44"] = __arg_0;
 
-  static scale3dSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scale3dSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  multiplySelf_Callback_0_(mthis) => mthis.callMethod("multiplySelf", []);
 
-  static scale3dSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scale3dSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  multiplySelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("multiplySelf", [__arg_0]);
 
-  static scale3dSelf_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMMatrix_scale3dSelf_Callback";
-  scale3dSelf_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => scale3dSelf_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+  preMultiplySelf_Callback_0_(mthis) => mthis.callMethod("preMultiplySelf", []);
 
-  static scaleNonUniformSelf_Callback_0(mthis) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_0_(mthis) => scaleNonUniformSelf_Callback_0(mthis);
+  preMultiplySelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("preMultiplySelf", [__arg_0]);
 
-  static scaleNonUniformSelf_Callback_1(mthis, __arg_0) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_1_(mthis, __arg_0) => scaleNonUniformSelf_Callback_1(mthis, __arg_0);
+  scale3dSelf_Callback_0_(mthis) => mthis.callMethod("scale3dSelf", []);
 
-  static scaleNonUniformSelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_2_(mthis, __arg_0, __arg_1) => scaleNonUniformSelf_Callback_2(mthis, __arg_0, __arg_1);
+  scale3dSelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale3dSelf", [__arg_0]);
 
-  static scaleNonUniformSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scaleNonUniformSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  scale3dSelf_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scale3dSelf", [__arg_0, __arg_1]);
 
-  static scaleNonUniformSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scaleNonUniformSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  scale3dSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scale3dSelf", [__arg_0, __arg_1, __arg_2]);
 
-  static scaleNonUniformSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scaleNonUniformSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  scale3dSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("scale3dSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static scaleNonUniformSelf_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => scaleNonUniformSelf_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+  scaleNonUniformSelf_Callback_0_(mthis) => mthis.callMethod("scaleNonUniformSelf", []);
 
-  static scaleNonUniformSelf_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => scaleNonUniformSelf_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+  scaleNonUniformSelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("scaleNonUniformSelf", [__arg_0]);
 
-  static scaleNonUniformSelf_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "DOMMatrix_scaleNonUniformSelf_Callback";
-  scaleNonUniformSelf_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => scaleNonUniformSelf_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+  scaleNonUniformSelf_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scaleNonUniformSelf", [__arg_0, __arg_1]);
 
-  static scaleSelf_Callback_0(mthis) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_0_(mthis) => scaleSelf_Callback_0(mthis);
+  scaleNonUniformSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2]);
 
-  static scaleSelf_Callback_1(mthis, __arg_0) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_1_(mthis, __arg_0) => scaleSelf_Callback_1(mthis, __arg_0);
+  scaleNonUniformSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static scaleSelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_2_(mthis, __arg_0, __arg_1) => scaleSelf_Callback_2(mthis, __arg_0, __arg_1);
+  scaleNonUniformSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static scaleSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scaleSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  scaleNonUniformSelf_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("scaleNonUniformSelf", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static scaleSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scaleSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  scaleSelf_Callback_0_(mthis) => mthis.callMethod("scaleSelf", []);
 
-  static scaleSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrix_scaleSelf_Callback";
-  scaleSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scaleSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  scaleSelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("scaleSelf", [__arg_0]);
 
-  static translateSelf_Callback_0(mthis) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_0_(mthis) => translateSelf_Callback_0(mthis);
+  scaleSelf_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scaleSelf", [__arg_0, __arg_1]);
 
-  static translateSelf_Callback_1(mthis, __arg_0) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_1_(mthis, __arg_0) => translateSelf_Callback_1(mthis, __arg_0);
+  scaleSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scaleSelf", [__arg_0, __arg_1, __arg_2]);
 
-  static translateSelf_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_2_(mthis, __arg_0, __arg_1) => translateSelf_Callback_2(mthis, __arg_0, __arg_1);
+  translateSelf_Callback_0_(mthis) => mthis.callMethod("translateSelf", []);
 
-  static translateSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => translateSelf_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  translateSelf_Callback_1_(mthis, __arg_0) => mthis.callMethod("translateSelf", [__arg_0]);
 
-  static translateSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => translateSelf_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  translateSelf_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("translateSelf", [__arg_0, __arg_1]);
 
-  static translateSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrix_translateSelf_Callback";
-  translateSelf_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => translateSelf_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  translateSelf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("translateSelf", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDOMMatrixReadOnly {
   static final instance = new BlinkDOMMatrixReadOnly();
 
-  static a_Getter(mthis) native "DOMMatrixReadOnly_a_Getter";
-  a_Getter_(mthis) => a_Getter(mthis);
+  a_Getter_(mthis) => mthis["a"];
 
-  static b_Getter(mthis) native "DOMMatrixReadOnly_b_Getter";
-  b_Getter_(mthis) => b_Getter(mthis);
+  b_Getter_(mthis) => mthis["b"];
 
-  static c_Getter(mthis) native "DOMMatrixReadOnly_c_Getter";
-  c_Getter_(mthis) => c_Getter(mthis);
+  c_Getter_(mthis) => mthis["c"];
 
-  static d_Getter(mthis) native "DOMMatrixReadOnly_d_Getter";
-  d_Getter_(mthis) => d_Getter(mthis);
+  d_Getter_(mthis) => mthis["d"];
 
-  static e_Getter(mthis) native "DOMMatrixReadOnly_e_Getter";
-  e_Getter_(mthis) => e_Getter(mthis);
+  e_Getter_(mthis) => mthis["e"];
 
-  static f_Getter(mthis) native "DOMMatrixReadOnly_f_Getter";
-  f_Getter_(mthis) => f_Getter(mthis);
+  f_Getter_(mthis) => mthis["f"];
 
-  static is2D_Getter(mthis) native "DOMMatrixReadOnly_is2D_Getter";
-  is2D_Getter_(mthis) => is2D_Getter(mthis);
+  is2D_Getter_(mthis) => mthis["is2D"];
 
-  static isIdentity_Getter(mthis) native "DOMMatrixReadOnly_isIdentity_Getter";
-  isIdentity_Getter_(mthis) => isIdentity_Getter(mthis);
+  isIdentity_Getter_(mthis) => mthis["isIdentity"];
 
-  static m11_Getter(mthis) native "DOMMatrixReadOnly_m11_Getter";
-  m11_Getter_(mthis) => m11_Getter(mthis);
+  m11_Getter_(mthis) => mthis["m11"];
 
-  static m12_Getter(mthis) native "DOMMatrixReadOnly_m12_Getter";
-  m12_Getter_(mthis) => m12_Getter(mthis);
+  m12_Getter_(mthis) => mthis["m12"];
 
-  static m13_Getter(mthis) native "DOMMatrixReadOnly_m13_Getter";
-  m13_Getter_(mthis) => m13_Getter(mthis);
+  m13_Getter_(mthis) => mthis["m13"];
 
-  static m14_Getter(mthis) native "DOMMatrixReadOnly_m14_Getter";
-  m14_Getter_(mthis) => m14_Getter(mthis);
+  m14_Getter_(mthis) => mthis["m14"];
 
-  static m21_Getter(mthis) native "DOMMatrixReadOnly_m21_Getter";
-  m21_Getter_(mthis) => m21_Getter(mthis);
+  m21_Getter_(mthis) => mthis["m21"];
 
-  static m22_Getter(mthis) native "DOMMatrixReadOnly_m22_Getter";
-  m22_Getter_(mthis) => m22_Getter(mthis);
+  m22_Getter_(mthis) => mthis["m22"];
 
-  static m23_Getter(mthis) native "DOMMatrixReadOnly_m23_Getter";
-  m23_Getter_(mthis) => m23_Getter(mthis);
+  m23_Getter_(mthis) => mthis["m23"];
 
-  static m24_Getter(mthis) native "DOMMatrixReadOnly_m24_Getter";
-  m24_Getter_(mthis) => m24_Getter(mthis);
+  m24_Getter_(mthis) => mthis["m24"];
 
-  static m31_Getter(mthis) native "DOMMatrixReadOnly_m31_Getter";
-  m31_Getter_(mthis) => m31_Getter(mthis);
+  m31_Getter_(mthis) => mthis["m31"];
 
-  static m32_Getter(mthis) native "DOMMatrixReadOnly_m32_Getter";
-  m32_Getter_(mthis) => m32_Getter(mthis);
+  m32_Getter_(mthis) => mthis["m32"];
 
-  static m33_Getter(mthis) native "DOMMatrixReadOnly_m33_Getter";
-  m33_Getter_(mthis) => m33_Getter(mthis);
+  m33_Getter_(mthis) => mthis["m33"];
 
-  static m34_Getter(mthis) native "DOMMatrixReadOnly_m34_Getter";
-  m34_Getter_(mthis) => m34_Getter(mthis);
+  m34_Getter_(mthis) => mthis["m34"];
 
-  static m41_Getter(mthis) native "DOMMatrixReadOnly_m41_Getter";
-  m41_Getter_(mthis) => m41_Getter(mthis);
+  m41_Getter_(mthis) => mthis["m41"];
 
-  static m42_Getter(mthis) native "DOMMatrixReadOnly_m42_Getter";
-  m42_Getter_(mthis) => m42_Getter(mthis);
+  m42_Getter_(mthis) => mthis["m42"];
 
-  static m43_Getter(mthis) native "DOMMatrixReadOnly_m43_Getter";
-  m43_Getter_(mthis) => m43_Getter(mthis);
+  m43_Getter_(mthis) => mthis["m43"];
 
-  static m44_Getter(mthis) native "DOMMatrixReadOnly_m44_Getter";
-  m44_Getter_(mthis) => m44_Getter(mthis);
+  m44_Getter_(mthis) => mthis["m44"];
 
-  static multiply_Callback_0(mthis) native "DOMMatrixReadOnly_multiply_Callback";
-  multiply_Callback_0_(mthis) => multiply_Callback_0(mthis);
+  multiply_Callback_0_(mthis) => mthis.callMethod("multiply", []);
 
-  static multiply_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_multiply_Callback";
-  multiply_Callback_1_(mthis, __arg_0) => multiply_Callback_1(mthis, __arg_0);
+  multiply_Callback_1_(mthis, __arg_0) => mthis.callMethod("multiply", [__arg_0]);
 
-  static multiply_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_multiply_Callback";
-  multiply_Callback_2_(mthis, __arg_0, __arg_1) => multiply_Callback_2(mthis, __arg_0, __arg_1);
+  scale3d_Callback_0_(mthis) => mthis.callMethod("scale3d", []);
 
-  static multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrixReadOnly_multiply_Callback";
-  multiply_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => multiply_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  scale3d_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale3d", [__arg_0]);
 
-  static scale3d_Callback_0(mthis) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_0_(mthis) => scale3d_Callback_0(mthis);
+  scale3d_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scale3d", [__arg_0, __arg_1]);
 
-  static scale3d_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_1_(mthis, __arg_0) => scale3d_Callback_1(mthis, __arg_0);
+  scale3d_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scale3d", [__arg_0, __arg_1, __arg_2]);
 
-  static scale3d_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_2_(mthis, __arg_0, __arg_1) => scale3d_Callback_2(mthis, __arg_0, __arg_1);
+  scale3d_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("scale3d", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static scale3d_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scale3d_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  scaleNonUniform_Callback_0_(mthis) => mthis.callMethod("scaleNonUniform", []);
 
-  static scale3d_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => scale3d_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  scaleNonUniform_Callback_1_(mthis, __arg_0) => mthis.callMethod("scaleNonUniform", [__arg_0]);
 
-  static scale3d_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scale3d_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1]);
 
-  static scale3d_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMMatrixReadOnly_scale3d_Callback";
-  scale3d_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => scale3d_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+  scaleNonUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1, __arg_2]);
 
-  static scaleNonUniform_Callback_0(mthis) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_0_(mthis) => scaleNonUniform_Callback_0(mthis);
+  scaleNonUniform_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static scaleNonUniform_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_1_(mthis, __arg_0) => scaleNonUniform_Callback_1(mthis, __arg_0);
+  scaleNonUniform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static scaleNonUniform_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => scaleNonUniform_Callback_2(mthis, __arg_0, __arg_1);
+  scaleNonUniform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static scaleNonUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => scaleNonUniform_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  scale_Callback_0_(mthis) => mthis.callMethod("scale", []);
 
-  static scaleNonUniform_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "DOMMatrixReadOnly_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);
+  scale_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale", [__arg_0]);
 
-  static scaleNonUniform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => scaleNonUniform_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scale", [__arg_0, __arg_1]);
 
-  static scaleNonUniform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => scaleNonUniform_Callback_6(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5);
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scale", [__arg_0, __arg_1, __arg_2]);
 
-  static scaleNonUniform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => scaleNonUniform_Callback_7(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6);
+  toFloat32Array_Callback_0_(mthis) => mthis.callMethod("toFloat32Array", []);
 
-  static scaleNonUniform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) native "DOMMatrixReadOnly_scaleNonUniform_Callback";
-  scaleNonUniform_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => scaleNonUniform_Callback_8(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7);
+  toFloat64Array_Callback_0_(mthis) => mthis.callMethod("toFloat64Array", []);
 
-  static scale_Callback_0(mthis) native "DOMMatrixReadOnly_scale_Callback";
-  scale_Callback_0_(mthis) => scale_Callback_0(mthis);
+  translate_Callback_0_(mthis) => mthis.callMethod("translate", []);
 
-  static scale_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_scale_Callback";
-  scale_Callback_1_(mthis, __arg_0) => scale_Callback_1(mthis, __arg_0);
+  translate_Callback_1_(mthis, __arg_0) => mthis.callMethod("translate", [__arg_0]);
 
-  static scale_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_scale_Callback";
-  scale_Callback_2_(mthis, __arg_0, __arg_1) => scale_Callback_2(mthis, __arg_0, __arg_1);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("translate", [__arg_0, __arg_1]);
 
-  static scale_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "DOMMatrixReadOnly_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 "DOMMatrixReadOnly_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 "DOMMatrixReadOnly_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 toFloat32Array_Callback_0(mthis) native "DOMMatrixReadOnly_toFloat32Array_Callback";
-  toFloat32Array_Callback_0_(mthis) => toFloat32Array_Callback_0(mthis);
-
-  static toFloat32Array_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_toFloat32Array_Callback";
-  toFloat32Array_Callback_1_(mthis, __arg_0) => toFloat32Array_Callback_1(mthis, __arg_0);
-
-  static toFloat32Array_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_toFloat32Array_Callback";
-  toFloat32Array_Callback_2_(mthis, __arg_0, __arg_1) => toFloat32Array_Callback_2(mthis, __arg_0, __arg_1);
-
-  static toFloat64Array_Callback_0(mthis) native "DOMMatrixReadOnly_toFloat64Array_Callback";
-  toFloat64Array_Callback_0_(mthis) => toFloat64Array_Callback_0(mthis);
-
-  static toFloat64Array_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_toFloat64Array_Callback";
-  toFloat64Array_Callback_1_(mthis, __arg_0) => toFloat64Array_Callback_1(mthis, __arg_0);
-
-  static toFloat64Array_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_toFloat64Array_Callback";
-  toFloat64Array_Callback_2_(mthis, __arg_0, __arg_1) => toFloat64Array_Callback_2(mthis, __arg_0, __arg_1);
-
-  static translate_Callback_0(mthis) native "DOMMatrixReadOnly_translate_Callback";
-  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
-
-  static translate_Callback_1(mthis, __arg_0) native "DOMMatrixReadOnly_translate_Callback";
-  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
-
-  static translate_Callback_2(mthis, __arg_0, __arg_1) native "DOMMatrixReadOnly_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 "DOMMatrixReadOnly_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 "DOMMatrixReadOnly_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 "DOMMatrixReadOnly_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);
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("translate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDOMParser {
   static final instance = new BlinkDOMParser();
 
-  static constructorCallback_0() native "DOMParser_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DOMParser"], []);
 
-  static constructorCallback_1(__arg_0) native "DOMParser_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  parseFromString_Callback_0_(mthis) => mthis.callMethod("parseFromString", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMParser_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  parseFromString_Callback_1_(mthis, __arg_0) => mthis.callMethod("parseFromString", [__arg_0]);
 
-  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);
+  parseFromString_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("parseFromString", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDOMPoint extends BlinkDOMPointReadOnly {
   static final instance = new BlinkDOMPoint();
 
-  static constructorCallback_0() native "DOMPoint_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DOMPoint"], []);
 
-  static constructorCallback_1(__arg_0) native "DOMPoint_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["DOMPoint"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMPoint_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DOMPoint"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["DOMPoint"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["DOMPoint"], [__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);
+  w_Getter_(mthis) => mthis["w"];
 
-  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);
+  w_Setter_(mthis, __arg_0) => mthis["w"] = __arg_0;
 
-  static w_Getter(mthis) native "DOMPoint_w_Getter";
-  w_Getter_(mthis) => w_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static w_Setter(mthis, __arg_0) native "DOMPoint_w_Setter";
-  w_Setter_(mthis, __arg_0) => w_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static x_Getter(mthis) native "DOMPoint_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static x_Setter(mthis, __arg_0) native "DOMPoint_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
-  static y_Getter(mthis) native "DOMPoint_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  z_Getter_(mthis) => mthis["z"];
 
-  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);
+  z_Setter_(mthis, __arg_0) => mthis["z"] = __arg_0;
 
 }
 
 class BlinkDOMPointReadOnly {
   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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DOMPointReadOnly"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["DOMPointReadOnly"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["DOMPointReadOnly"], [__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);
+  w_Getter_(mthis) => mthis["w"];
 
-  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);
+  x_Getter_(mthis) => mthis["x"];
 
-  static w_Getter(mthis) native "DOMPointReadOnly_w_Getter";
-  w_Getter_(mthis) => w_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  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);
+  z_Getter_(mthis) => mthis["z"];
 
 }
 
 class BlinkDOMRect extends BlinkDOMRectReadOnly {
   static final instance = new BlinkDOMRect();
 
-  static constructorCallback_0() native "DOMRect_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DOMRect"], []);
 
-  static constructorCallback_1(__arg_0) native "DOMRect_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["DOMRect"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMRect_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DOMRect"], [__arg_0, __arg_1]);
 
-  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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["DOMRect"], [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["DOMRect"], [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "DOMRect_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static height_Setter(mthis, __arg_0) native "DOMRect_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
-  static width_Getter(mthis) native "DOMRect_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static width_Setter(mthis, __arg_0) native "DOMRect_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static x_Getter(mthis) native "DOMRect_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  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);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkDOMRectReadOnly {
   static final instance = new BlinkDOMRectReadOnly();
 
-  static bottom_Getter(mthis) native "DOMRectReadOnly_bottom_Getter";
-  bottom_Getter_(mthis) => bottom_Getter(mthis);
+  bottom_Getter_(mthis) => mthis["bottom"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DOMRectReadOnly_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DOMRectReadOnly"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["DOMRectReadOnly"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["DOMRectReadOnly"], [__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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  left_Getter_(mthis) => mthis["left"];
 
-  static height_Getter(mthis) native "DOMRectReadOnly_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  right_Getter_(mthis) => mthis["right"];
 
-  static left_Getter(mthis) native "DOMRectReadOnly_left_Getter";
-  left_Getter_(mthis) => left_Getter(mthis);
+  top_Getter_(mthis) => mthis["top"];
 
-  static right_Getter(mthis) native "DOMRectReadOnly_right_Getter";
-  right_Getter_(mthis) => right_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static top_Getter(mthis) native "DOMRectReadOnly_top_Getter";
-  top_Getter_(mthis) => top_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkDOMSettableTokenList extends BlinkDOMTokenList {
   static final instance = new BlinkDOMSettableTokenList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "DOMSettableTokenList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "DOMSettableTokenList_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static contains_Callback_0(mthis) native "DOMStringList_contains_Callback";
-  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+  contains_Callback_0_(mthis) => mthis.callMethod("contains", []);
 
-  static contains_Callback_1(mthis, __arg_0) native "DOMStringList_contains_Callback";
-  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+  contains_Callback_1_(mthis, __arg_0) => mthis.callMethod("contains", [__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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  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);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkDOMStringMap {
   static final instance = new BlinkDOMStringMap();
 
-  static $__delete___Callback_1(mthis, __arg_0) native "DOMStringMap___delete___Callback";
-  $__delete___Callback_1_(mthis, __arg_0) => $__delete___Callback_1(mthis, __arg_0);
+  $__delete___Callback_1_(mthis, __arg_0) => mthis.callMethod("__delete__", [__arg_0]);
 
-  static $__getter___Callback_1(mthis, __arg_0) native "DOMStringMap___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static add_Callback_0(mthis) native "DOMTokenList_add_Callback";
-  add_Callback_0_(mthis) => add_Callback_0(mthis);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  static add_Callback_1(mthis, __arg_0) native "DOMTokenList_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__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);
+  contains_Callback_0_(mthis) => mthis.callMethod("contains", []);
 
-  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);
+  contains_Callback_1_(mthis, __arg_0) => mthis.callMethod("contains", [__arg_0]);
 
-  static contains_Callback_0(mthis) native "DOMTokenList_contains_Callback";
-  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static contains_Callback_1(mthis, __arg_0) native "DOMTokenList_contains_Callback";
-  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  static item_Callback_0(mthis) native "DOMTokenList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  remove_Callback_1_(mthis, __arg_0) => mthis.callMethod("remove", [__arg_0]);
 
-  static item_Callback_1(mthis, __arg_0) native "DOMTokenList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  toggle_Callback_0_(mthis) => mthis.callMethod("toggle", []);
 
-  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);
+  toggle_Callback_1_(mthis, __arg_0) => mthis.callMethod("toggle", [__arg_0]);
 
-  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);
+  toggle_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("toggle", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDataTransfer {
   static final instance = new BlinkDataTransfer();
 
-  static clearData_Callback_0(mthis) native "DataTransfer_clearData_Callback";
-  clearData_Callback_0_(mthis) => clearData_Callback_0(mthis);
+  clearData_Callback_0_(mthis) => mthis.callMethod("clearData", []);
 
-  static clearData_Callback_1(mthis, __arg_0) native "DataTransfer_clearData_Callback";
-  clearData_Callback_1_(mthis, __arg_0) => clearData_Callback_1(mthis, __arg_0);
+  clearData_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearData", [__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);
+  dropEffect_Getter_(mthis) => mthis["dropEffect"];
 
-  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);
+  dropEffect_Setter_(mthis, __arg_0) => mthis["dropEffect"] = __arg_0;
 
-  static dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
-  dropEffect_Getter_(mthis) => dropEffect_Getter(mthis);
+  effectAllowed_Getter_(mthis) => mthis["effectAllowed"];
 
-  static dropEffect_Setter(mthis, __arg_0) native "DataTransfer_dropEffect_Setter";
-  dropEffect_Setter_(mthis, __arg_0) => dropEffect_Setter(mthis, __arg_0);
+  effectAllowed_Setter_(mthis, __arg_0) => mthis["effectAllowed"] = __arg_0;
 
-  static effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
-  effectAllowed_Getter_(mthis) => effectAllowed_Getter(mthis);
+  files_Getter_(mthis) => mthis["files"];
 
-  static effectAllowed_Setter(mthis, __arg_0) native "DataTransfer_effectAllowed_Setter";
-  effectAllowed_Setter_(mthis, __arg_0) => effectAllowed_Setter(mthis, __arg_0);
+  getData_Callback_0_(mthis) => mthis.callMethod("getData", []);
 
-  static files_Getter(mthis) native "DataTransfer_files_Getter";
-  files_Getter_(mthis) => files_Getter(mthis);
+  getData_Callback_1_(mthis, __arg_0) => mthis.callMethod("getData", [__arg_0]);
 
-  static getData_Callback_0(mthis) native "DataTransfer_getData_Callback";
-  getData_Callback_0_(mthis) => getData_Callback_0(mthis);
+  items_Getter_(mthis) => mthis["items"];
 
-  static getData_Callback_1(mthis, __arg_0) native "DataTransfer_getData_Callback";
-  getData_Callback_1_(mthis, __arg_0) => getData_Callback_1(mthis, __arg_0);
+  setData_Callback_0_(mthis) => mthis.callMethod("setData", []);
 
-  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);
+  setData_Callback_1_(mthis, __arg_0) => mthis.callMethod("setData", [__arg_0]);
 
-  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);
+  setData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setData", [__arg_0, __arg_1]);
 
-  static items_Getter(mthis) native "DataTransfer_items_Getter";
-  items_Getter_(mthis) => items_Getter(mthis);
+  setDragImage_Callback_1_(mthis, __arg_0) => mthis.callMethod("setDragImage", [__arg_0]);
 
-  static setData_Callback_0(mthis) native "DataTransfer_setData_Callback";
-  setData_Callback_0_(mthis) => setData_Callback_0(mthis);
+  setDragImage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setDragImage", [__arg_0, __arg_1]);
 
-  static setData_Callback_1(mthis, __arg_0) native "DataTransfer_setData_Callback";
-  setData_Callback_1_(mthis, __arg_0) => setData_Callback_1(mthis, __arg_0);
+  setDragImage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setDragImage", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  types_Getter_(mthis) => mthis["types"];
 
 }
 
 class BlinkDataTransferItem {
   static final instance = new BlinkDataTransferItem();
 
-  static getAsFile_Callback_0(mthis) native "DataTransferItem_getAsFile_Callback";
-  getAsFile_Callback_0_(mthis) => getAsFile_Callback_0(mthis);
+  getAsFile_Callback_0_(mthis) => mthis.callMethod("getAsFile", []);
 
-  static getAsFile_Callback_1(mthis, __arg_0) native "DataTransferItem_getAsFile_Callback";
-  getAsFile_Callback_1_(mthis, __arg_0) => getAsFile_Callback_1(mthis, __arg_0);
+  getAsString_Callback_0_(mthis) => mthis.callMethod("getAsString", []);
 
-  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);
+  getAsString_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAsString", [__arg_0]);
 
-  static getAsString_Callback_0(mthis) native "DataTransferItem_getAsString_Callback";
-  getAsString_Callback_0_(mthis) => getAsString_Callback_0(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static getAsString_Callback_1(mthis, __arg_0) native "DataTransferItem_getAsString_Callback";
-  getAsString_Callback_1_(mthis, __arg_0) => getAsString_Callback_1(mthis, __arg_0);
+  type_Getter_(mthis) => mthis["type"];
 
-  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 webkitGetAsEntry_Callback_0(mthis) native "DataTransferItem_webkitGetAsEntry_Callback";
-  webkitGetAsEntry_Callback_0_(mthis) => webkitGetAsEntry_Callback_0(mthis);
-
-  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_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);
+  webkitGetAsEntry_Callback_0_(mthis) => mthis.callMethod("webkitGetAsEntry", []);
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static add_Callback_0(mthis) native "DataTransferItemList_add_Callback";
-  add_Callback_0_(mthis) => add_Callback_0(mthis);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  static add_Callback_1(mthis, __arg_0) native "DataTransferItemList_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__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);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("add", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static clear_Callback_0(mthis) native "DataTransferItemList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  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 remove_Callback_0(mthis) native "DataTransferItemList_remove_Callback";
-  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
-
-  static remove_Callback_1(mthis, __arg_0) native "DataTransferItemList_remove_Callback";
-  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
-
-  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 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);
+  remove_Callback_1_(mthis, __arg_0) => mthis.callMethod("remove", [__arg_0]);
 
 }
 
 class BlinkDatabase {
   static final instance = new BlinkDatabase();
 
-  static changeVersion_Callback_0(mthis) native "Database_changeVersion_Callback";
-  changeVersion_Callback_0_(mthis) => changeVersion_Callback_0(mthis);
+  changeVersion_Callback_0_(mthis) => mthis.callMethod("changeVersion", []);
 
-  static changeVersion_Callback_1(mthis, __arg_0) native "Database_changeVersion_Callback";
-  changeVersion_Callback_1_(mthis, __arg_0) => changeVersion_Callback_1(mthis, __arg_0);
+  changeVersion_Callback_1_(mthis, __arg_0) => mthis.callMethod("changeVersion", [__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);
+  changeVersion_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("changeVersion", [__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);
+  changeVersion_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("changeVersion", [__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);
+  changeVersion_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("changeVersion", [__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);
+  changeVersion_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("changeVersion", [__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);
+  readTransaction_Callback_0_(mthis) => mthis.callMethod("readTransaction", []);
 
-  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);
+  readTransaction_Callback_1_(mthis, __arg_0) => mthis.callMethod("readTransaction", [__arg_0]);
 
-  static readTransaction_Callback_0(mthis) native "Database_readTransaction_Callback";
-  readTransaction_Callback_0_(mthis) => readTransaction_Callback_0(mthis);
+  readTransaction_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("readTransaction", [__arg_0, __arg_1]);
 
-  static readTransaction_Callback_1(mthis, __arg_0) native "Database_readTransaction_Callback";
-  readTransaction_Callback_1_(mthis, __arg_0) => readTransaction_Callback_1(mthis, __arg_0);
+  readTransaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("readTransaction", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  transaction_Callback_0_(mthis) => mthis.callMethod("transaction", []);
 
-  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);
+  transaction_Callback_1_(mthis, __arg_0) => mthis.callMethod("transaction", [__arg_0]);
 
-  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);
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("transaction", [__arg_0, __arg_1]);
 
-  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);
+  transaction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("transaction", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  version_Getter_(mthis) => mthis["version"];
 
 }
 
 class BlinkDedicatedWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkDedicatedWorkerGlobalScope();
 
-  static onmessage_Getter(mthis) native "DedicatedWorkerGlobalScope_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onmessage_Setter(mthis, __arg_0) native "DedicatedWorkerGlobalScope_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static postMessage_Callback_0(mthis) native "DedicatedWorkerGlobalScope_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static postMessage_Callback_1(mthis, __arg_0) native "DedicatedWorkerGlobalScope_postMessage_Callback";
-  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__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);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkDelayNode extends BlinkAudioNode {
   static final instance = new BlinkDelayNode();
 
-  static delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
-  delayTime_Getter_(mthis) => delayTime_Getter(mthis);
+  delayTime_Getter_(mthis) => mthis["delayTime"];
 
 }
 
 class BlinkDeprecatedStorageInfo {
   static final instance = new BlinkDeprecatedStorageInfo();
 
-  static queryUsageAndQuota_Callback_0(mthis) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
-  queryUsageAndQuota_Callback_0_(mthis) => queryUsageAndQuota_Callback_0(mthis);
+  queryUsageAndQuota_Callback_0_(mthis) => mthis.callMethod("queryUsageAndQuota", []);
 
-  static queryUsageAndQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback";
-  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => queryUsageAndQuota_Callback_1(mthis, __arg_0);
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryUsageAndQuota", [__arg_0]);
 
-  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);
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("queryUsageAndQuota", [__arg_0, __arg_1]);
 
-  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);
+  queryUsageAndQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("queryUsageAndQuota", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  requestQuota_Callback_0_(mthis) => mthis.callMethod("requestQuota", []);
 
-  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);
+  requestQuota_Callback_1_(mthis, __arg_0) => mthis.callMethod("requestQuota", [__arg_0]);
 
-  static requestQuota_Callback_0(mthis) native "DeprecatedStorageInfo_requestQuota_Callback";
-  requestQuota_Callback_0_(mthis) => requestQuota_Callback_0(mthis);
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("requestQuota", [__arg_0, __arg_1]);
 
-  static requestQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageInfo_requestQuota_Callback";
-  requestQuota_Callback_1_(mthis, __arg_0) => requestQuota_Callback_1(mthis, __arg_0);
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("requestQuota", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  requestQuota_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("requestQuota", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkDeprecatedStorageQuota {
   static final instance = new BlinkDeprecatedStorageQuota();
 
-  static queryUsageAndQuota_Callback_0(mthis) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
-  queryUsageAndQuota_Callback_0_(mthis) => queryUsageAndQuota_Callback_0(mthis);
+  queryUsageAndQuota_Callback_0_(mthis) => mthis.callMethod("queryUsageAndQuota", []);
 
-  static queryUsageAndQuota_Callback_1(mthis, __arg_0) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback";
-  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => queryUsageAndQuota_Callback_1(mthis, __arg_0);
+  queryUsageAndQuota_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryUsageAndQuota", [__arg_0]);
 
-  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);
+  queryUsageAndQuota_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("queryUsageAndQuota", [__arg_0, __arg_1]);
 
-  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);
+  requestQuota_Callback_0_(mthis) => mthis.callMethod("requestQuota", []);
 
-  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);
+  requestQuota_Callback_1_(mthis, __arg_0) => mthis.callMethod("requestQuota", [__arg_0]);
 
-  static requestQuota_Callback_0(mthis) native "DeprecatedStorageQuota_requestQuota_Callback";
-  requestQuota_Callback_0_(mthis) => requestQuota_Callback_0(mthis);
+  requestQuota_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("requestQuota", [__arg_0, __arg_1]);
 
-  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);
+  requestQuota_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("requestQuota", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkDeviceAcceleration {
   static final instance = new BlinkDeviceAcceleration();
 
-  static x_Getter(mthis) native "DeviceAcceleration_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "DeviceAcceleration_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static z_Getter(mthis) native "DeviceAcceleration_z_Getter";
-  z_Getter_(mthis) => z_Getter(mthis);
+  z_Getter_(mthis) => mthis["z"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["DeviceLightEvent"], [__arg_0, __arg_1]);
 
-  static value_Getter(mthis) native "DeviceLightEvent_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
 }
 
 class BlinkDeviceMotionEvent extends BlinkEvent {
   static final instance = new BlinkDeviceMotionEvent();
 
-  static accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
-  accelerationIncludingGravity_Getter_(mthis) => accelerationIncludingGravity_Getter(mthis);
+  accelerationIncludingGravity_Getter_(mthis) => mthis["accelerationIncludingGravity"];
 
-  static acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
-  acceleration_Getter_(mthis) => acceleration_Getter(mthis);
+  acceleration_Getter_(mthis) => mthis["acceleration"];
 
-  static initDeviceMotionEvent_Callback_0(mthis) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
-  initDeviceMotionEvent_Callback_0_(mthis) => initDeviceMotionEvent_Callback_0(mthis);
+  initDeviceMotionEvent_Callback_0_(mthis) => mthis.callMethod("initDeviceMotionEvent", []);
 
-  static initDeviceMotionEvent_Callback_1(mthis, __arg_0) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
-  initDeviceMotionEvent_Callback_1_(mthis, __arg_0) => initDeviceMotionEvent_Callback_1(mthis, __arg_0);
+  initDeviceMotionEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  initDeviceMotionEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initDeviceMotionEvent", [__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);
+  interval_Getter_(mthis) => mthis["interval"];
 
-  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);
+  rotationRate_Getter_(mthis) => mthis["rotationRate"];
 
 }
 
 class BlinkDeviceOrientationEvent extends BlinkEvent {
   static final instance = new BlinkDeviceOrientationEvent();
 
-  static absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
-  absolute_Getter_(mthis) => absolute_Getter(mthis);
+  absolute_Getter_(mthis) => mthis["absolute"];
 
-  static alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
-  alpha_Getter_(mthis) => alpha_Getter(mthis);
+  alpha_Getter_(mthis) => mthis["alpha"];
 
-  static beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
-  beta_Getter_(mthis) => beta_Getter(mthis);
+  beta_Getter_(mthis) => mthis["beta"];
 
-  static gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
-  gamma_Getter_(mthis) => gamma_Getter(mthis);
+  gamma_Getter_(mthis) => mthis["gamma"];
 
-  static initDeviceOrientationEvent_Callback_0(mthis) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
-  initDeviceOrientationEvent_Callback_0_(mthis) => initDeviceOrientationEvent_Callback_0(mthis);
+  initDeviceOrientationEvent_Callback_0_(mthis) => mthis.callMethod("initDeviceOrientationEvent", []);
 
-  static initDeviceOrientationEvent_Callback_1(mthis, __arg_0) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
-  initDeviceOrientationEvent_Callback_1_(mthis, __arg_0) => initDeviceOrientationEvent_Callback_1(mthis, __arg_0);
+  initDeviceOrientationEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initDeviceOrientationEvent", [__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);
+  initDeviceOrientationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initDeviceOrientationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
 }
 
 class BlinkDeviceRotationRate {
   static final instance = new BlinkDeviceRotationRate();
 
-  static alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
-  alpha_Getter_(mthis) => alpha_Getter(mthis);
+  alpha_Getter_(mthis) => mthis["alpha"];
 
-  static beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
-  beta_Getter_(mthis) => beta_Getter(mthis);
+  beta_Getter_(mthis) => mthis["beta"];
 
-  static gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
-  gamma_Getter_(mthis) => gamma_Getter(mthis);
+  gamma_Getter_(mthis) => mthis["gamma"];
 
 }
 
 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);
+  createReader_Callback_0_(mthis) => mthis.callMethod("createReader", []);
 
-  static createReader_Callback_1(mthis, __arg_0) native "DirectoryEntry_createReader_Callback";
-  createReader_Callback_1_(mthis, __arg_0) => createReader_Callback_1(mthis, __arg_0);
+  getDirectory_Callback_0_(mthis) => mthis.callMethod("getDirectory", []);
 
-  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);
+  getDirectory_Callback_1_(mthis, __arg_0) => mthis.callMethod("getDirectory", [__arg_0]);
 
-  static getDirectory_Callback_0(mthis) native "DirectoryEntry_getDirectory_Callback";
-  getDirectory_Callback_0_(mthis) => getDirectory_Callback_0(mthis);
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getDirectory", [__arg_0, __arg_1]);
 
-  static getDirectory_Callback_1(mthis, __arg_0) native "DirectoryEntry_getDirectory_Callback";
-  getDirectory_Callback_1_(mthis, __arg_0) => getDirectory_Callback_1(mthis, __arg_0);
+  getDirectory_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getDirectory", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  getDirectory_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("getDirectory", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  getFile_Callback_0_(mthis) => mthis.callMethod("getFile", []);
 
-  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);
+  getFile_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFile", [__arg_0]);
 
-  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);
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getFile", [__arg_0, __arg_1]);
 
-  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);
+  getFile_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getFile", [__arg_0, __arg_1, __arg_2]);
 
-  static getFile_Callback_0(mthis) native "DirectoryEntry_getFile_Callback";
-  getFile_Callback_0_(mthis) => getFile_Callback_0(mthis);
+  getFile_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("getFile", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static getFile_Callback_1(mthis, __arg_0) native "DirectoryEntry_getFile_Callback";
-  getFile_Callback_1_(mthis, __arg_0) => getFile_Callback_1(mthis, __arg_0);
+  removeRecursively_Callback_0_(mthis) => mthis.callMethod("removeRecursively", []);
 
-  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);
+  removeRecursively_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeRecursively", [__arg_0]);
 
-  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);
+  removeRecursively_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("removeRecursively", [__arg_0, __arg_1]);
 
 }
 
 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);
+  createReader_Callback_0_(mthis) => mthis.callMethod("createReader", []);
 
-  static createReader_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_createReader_Callback";
-  createReader_Callback_1_(mthis, __arg_0) => createReader_Callback_1(mthis, __arg_0);
+  getDirectory_Callback_0_(mthis) => mthis.callMethod("getDirectory", []);
 
-  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);
+  getDirectory_Callback_1_(mthis, __arg_0) => mthis.callMethod("getDirectory", [__arg_0]);
 
-  static getDirectory_Callback_0(mthis) native "DirectoryEntrySync_getDirectory_Callback";
-  getDirectory_Callback_0_(mthis) => getDirectory_Callback_0(mthis);
+  getDirectory_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getDirectory", [__arg_0, __arg_1]);
 
-  static getDirectory_Callback_1(mthis, __arg_0) native "DirectoryEntrySync_getDirectory_Callback";
-  getDirectory_Callback_1_(mthis, __arg_0) => getDirectory_Callback_1(mthis, __arg_0);
+  getFile_Callback_0_(mthis) => mthis.callMethod("getFile", []);
 
-  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);
+  getFile_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFile", [__arg_0]);
 
-  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);
+  getFile_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getFile", [__arg_0, __arg_1]);
 
-  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);
+  removeRecursively_Callback_0_(mthis) => mthis.callMethod("removeRecursively", []);
 
 }
 
 class BlinkDirectoryReader {
   static final instance = new BlinkDirectoryReader();
 
-  static readEntries_Callback_0(mthis) native "DirectoryReader_readEntries_Callback";
-  readEntries_Callback_0_(mthis) => readEntries_Callback_0(mthis);
+  readEntries_Callback_0_(mthis) => mthis.callMethod("readEntries", []);
 
-  static readEntries_Callback_1(mthis, __arg_0) native "DirectoryReader_readEntries_Callback";
-  readEntries_Callback_1_(mthis, __arg_0) => readEntries_Callback_1(mthis, __arg_0);
+  readEntries_Callback_1_(mthis, __arg_0) => mthis.callMethod("readEntries", [__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);
+  readEntries_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("readEntries", [__arg_0, __arg_1]);
 
 }
 
 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);
+  readEntries_Callback_0_(mthis) => mthis.callMethod("readEntries", []);
 
 }
 
 class BlinkDocument extends BlinkNode {
   static final instance = new BlinkDocument();
 
-  static URL_Getter(mthis) native "Document_URL_Getter";
-  URL_Getter_(mthis) => URL_Getter(mthis);
+  URL_Getter_(mthis) => mthis["URL"];
 
-  static activeElement_Getter(mthis) native "Document_activeElement_Getter";
-  activeElement_Getter_(mthis) => activeElement_Getter(mthis);
+  activeElement_Getter_(mthis) => mthis["activeElement"];
 
-  static adoptNode_Callback_0(mthis) native "Document_adoptNode_Callback";
-  adoptNode_Callback_0_(mthis) => adoptNode_Callback_0(mthis);
+  adoptNode_Callback_0_(mthis) => mthis.callMethod("adoptNode", []);
 
-  static adoptNode_Callback_1(mthis, __arg_0) native "Document_adoptNode_Callback";
-  adoptNode_Callback_1_(mthis, __arg_0) => adoptNode_Callback_1(mthis, __arg_0);
+  adoptNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("adoptNode", [__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);
+  anchors_Getter_(mthis) => mthis["anchors"];
 
-  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);
+  body_Getter_(mthis) => mthis["body"];
 
-  static anchors_Getter(mthis) native "Document_anchors_Getter";
-  anchors_Getter_(mthis) => anchors_Getter(mthis);
+  body_Setter_(mthis, __arg_0) => mthis["body"] = __arg_0;
 
-  static body_Getter(mthis) native "Document_body_Getter";
-  body_Getter_(mthis) => body_Getter(mthis);
+  caretRangeFromPoint_Callback_0_(mthis) => mthis.callMethod("caretRangeFromPoint", []);
 
-  static body_Setter(mthis, __arg_0) native "Document_body_Setter";
-  body_Setter_(mthis, __arg_0) => body_Setter(mthis, __arg_0);
+  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => mthis.callMethod("caretRangeFromPoint", [__arg_0]);
 
-  static caretRangeFromPoint_Callback_0(mthis) native "Document_caretRangeFromPoint_Callback";
-  caretRangeFromPoint_Callback_0_(mthis) => caretRangeFromPoint_Callback_0(mthis);
+  caretRangeFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("caretRangeFromPoint", [__arg_0, __arg_1]);
 
-  static caretRangeFromPoint_Callback_1(mthis, __arg_0) native "Document_caretRangeFromPoint_Callback";
-  caretRangeFromPoint_Callback_1_(mthis, __arg_0) => caretRangeFromPoint_Callback_1(mthis, __arg_0);
+  characterSet_Getter_(mthis) => mthis["characterSet"];
 
-  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);
+  charset_Getter_(mthis) => mthis["charset"];
 
-  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);
+  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
 
-  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);
+  childElementCount_Getter_(mthis) => mthis["childElementCount"];
 
-  static characterSet_Getter(mthis) native "Document_characterSet_Getter";
-  characterSet_Getter_(mthis) => characterSet_Getter(mthis);
+  children_Getter_(mthis) => mthis["children"];
 
-  static charset_Getter(mthis) native "Document_charset_Getter";
-  charset_Getter_(mthis) => charset_Getter(mthis);
+  compatMode_Getter_(mthis) => mthis["compatMode"];
 
-  static charset_Setter(mthis, __arg_0) native "Document_charset_Setter";
-  charset_Setter_(mthis, __arg_0) => charset_Setter(mthis, __arg_0);
+  contentType_Getter_(mthis) => mthis["contentType"];
 
-  static childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
-  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+  cookie_Getter_(mthis) => mthis["cookie"];
 
-  static children_Getter(mthis) native "Document_children_Getter";
-  children_Getter_(mthis) => children_Getter(mthis);
+  cookie_Setter_(mthis, __arg_0) => mthis["cookie"] = __arg_0;
 
-  static compatMode_Getter(mthis) native "Document_compatMode_Getter";
-  compatMode_Getter_(mthis) => compatMode_Getter(mthis);
+  createCDATASection_Callback_0_(mthis) => mthis.callMethod("createCDATASection", []);
 
-  static contentType_Getter(mthis) native "Document_contentType_Getter";
-  contentType_Getter_(mthis) => contentType_Getter(mthis);
+  createCDATASection_Callback_1_(mthis, __arg_0) => mthis.callMethod("createCDATASection", [__arg_0]);
 
-  static cookie_Getter(mthis) native "Document_cookie_Getter";
-  cookie_Getter_(mthis) => cookie_Getter(mthis);
+  createDocumentFragment_Callback_0_(mthis) => mthis.callMethod("createDocumentFragment", []);
 
-  static cookie_Setter(mthis, __arg_0) native "Document_cookie_Setter";
-  cookie_Setter_(mthis, __arg_0) => cookie_Setter(mthis, __arg_0);
+  createElementNS_Callback_0_(mthis) => mthis.callMethod("createElementNS", []);
 
-  static createCDATASection_Callback_0(mthis) native "Document_createCDATASection_Callback";
-  createCDATASection_Callback_0_(mthis) => createCDATASection_Callback_0(mthis);
+  createElementNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("createElementNS", [__arg_0]);
 
-  static createCDATASection_Callback_1(mthis, __arg_0) native "Document_createCDATASection_Callback";
-  createCDATASection_Callback_1_(mthis, __arg_0) => createCDATASection_Callback_1(mthis, __arg_0);
+  createElementNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createElementNS", [__arg_0, __arg_1]);
 
-  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);
+  createElementNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createElementNS", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createElement_Callback_0_(mthis) => mthis.callMethod("createElement", []);
 
-  static createDocumentFragment_Callback_0(mthis) native "Document_createDocumentFragment_Callback";
-  createDocumentFragment_Callback_0_(mthis) => createDocumentFragment_Callback_0(mthis);
+  createElement_Callback_1_(mthis, __arg_0) => mthis.callMethod("createElement", [__arg_0]);
 
-  static createDocumentFragment_Callback_1(mthis, __arg_0) native "Document_createDocumentFragment_Callback";
-  createDocumentFragment_Callback_1_(mthis, __arg_0) => createDocumentFragment_Callback_1(mthis, __arg_0);
+  createElement_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createElement", [__arg_0, __arg_1]);
 
-  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);
+  createEvent_Callback_0_(mthis) => mthis.callMethod("createEvent", []);
 
-  static createElementNS_Callback_0(mthis) native "Document_createElementNS_Callback";
-  createElementNS_Callback_0_(mthis) => createElementNS_Callback_0(mthis);
+  createEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("createEvent", [__arg_0]);
 
-  static createElementNS_Callback_1(mthis, __arg_0) native "Document_createElementNS_Callback";
-  createElementNS_Callback_1_(mthis, __arg_0) => createElementNS_Callback_1(mthis, __arg_0);
+  createNodeIterator_Callback_0_(mthis) => mthis.callMethod("createNodeIterator", []);
 
-  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);
+  createNodeIterator_Callback_1_(mthis, __arg_0) => mthis.callMethod("createNodeIterator", [__arg_0]);
 
-  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);
+  createNodeIterator_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createNodeIterator", [__arg_0, __arg_1]);
 
-  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);
+  createNodeIterator_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createNodeIterator", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createRange_Callback_0_(mthis) => mthis.callMethod("createRange", []);
 
-  static createElement_Callback_0(mthis) native "Document_createElement_Callback";
-  createElement_Callback_0_(mthis) => createElement_Callback_0(mthis);
+  createTextNode_Callback_0_(mthis) => mthis.callMethod("createTextNode", []);
 
-  static createElement_Callback_1(mthis, __arg_0) native "Document_createElement_Callback";
-  createElement_Callback_1_(mthis, __arg_0) => createElement_Callback_1(mthis, __arg_0);
+  createTextNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("createTextNode", [__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);
+  createTouchList_Callback_0_(mthis) => mthis.callMethod("createTouchList", []);
 
-  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);
+  createTouchList_Callback_1_(mthis, __arg_0) => mthis.callMethod("createTouchList", [__arg_0]);
 
-  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);
+  createTouch_Callback_0_(mthis) => mthis.callMethod("createTouch", []);
 
-  static createEvent_Callback_0(mthis) native "Document_createEvent_Callback";
-  createEvent_Callback_0_(mthis) => createEvent_Callback_0(mthis);
+  createTouch_Callback_1_(mthis, __arg_0) => mthis.callMethod("createTouch", [__arg_0]);
 
-  static createEvent_Callback_1(mthis, __arg_0) native "Document_createEvent_Callback";
-  createEvent_Callback_1_(mthis, __arg_0) => createEvent_Callback_1(mthis, __arg_0);
+  createTouch_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  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);
+  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) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9, __arg_10]);
 
-  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);
+  createTouch_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createTouch", [__arg_0, __arg_1]);
 
-  static createNodeIterator_Callback_0(mthis) native "Document_createNodeIterator_Callback";
-  createNodeIterator_Callback_0_(mthis) => createNodeIterator_Callback_0(mthis);
+  createTouch_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2]);
 
-  static createNodeIterator_Callback_1(mthis, __arg_0) native "Document_createNodeIterator_Callback";
-  createNodeIterator_Callback_1_(mthis, __arg_0) => createNodeIterator_Callback_1(mthis, __arg_0);
+  createTouch_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createTouch_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  createTouch_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  createTouch_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  createTouch_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  static createRange_Callback_0(mthis) native "Document_createRange_Callback";
-  createRange_Callback_0_(mthis) => createRange_Callback_0(mthis);
+  createTouch_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("createTouch", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  static createRange_Callback_1(mthis, __arg_0) native "Document_createRange_Callback";
-  createRange_Callback_1_(mthis, __arg_0) => createRange_Callback_1(mthis, __arg_0);
+  createTreeWalker_Callback_0_(mthis) => mthis.callMethod("createTreeWalker", []);
 
-  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);
+  createTreeWalker_Callback_1_(mthis, __arg_0) => mthis.callMethod("createTreeWalker", [__arg_0]);
 
-  static createTextNode_Callback_0(mthis) native "Document_createTextNode_Callback";
-  createTextNode_Callback_0_(mthis) => createTextNode_Callback_0(mthis);
+  createTreeWalker_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createTreeWalker", [__arg_0, __arg_1]);
 
-  static createTextNode_Callback_1(mthis, __arg_0) native "Document_createTextNode_Callback";
-  createTextNode_Callback_1_(mthis, __arg_0) => createTextNode_Callback_1(mthis, __arg_0);
+  createTreeWalker_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createTreeWalker", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  currentScript_Getter_(mthis) => mthis["currentScript"];
 
-  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);
+  defaultCharset_Getter_(mthis) => mthis["defaultCharset"];
 
-  static createTouchList_Callback_0(mthis) native "Document_createTouchList_Callback";
-  createTouchList_Callback_0_(mthis) => createTouchList_Callback_0(mthis);
+  defaultView_Getter_(mthis) => mthis["defaultView"];
 
-  static createTouchList_Callback_1(mthis, __arg_0) native "Document_createTouchList_Callback";
-  createTouchList_Callback_1_(mthis, __arg_0) => createTouchList_Callback_1(mthis, __arg_0);
+  doctype_Getter_(mthis) => mthis["doctype"];
 
-  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);
+  documentElement_Getter_(mthis) => mthis["documentElement"];
 
-  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);
+  documentURI_Getter_(mthis) => mthis["documentURI"];
 
-  static createTouch_Callback_0(mthis) native "Document_createTouch_Callback";
-  createTouch_Callback_0_(mthis) => createTouch_Callback_0(mthis);
+  domain_Getter_(mthis) => mthis["domain"];
 
-  static createTouch_Callback_1(mthis, __arg_0) native "Document_createTouch_Callback";
-  createTouch_Callback_1_(mthis, __arg_0) => createTouch_Callback_1(mthis, __arg_0);
+  domain_Setter_(mthis, __arg_0) => mthis["domain"] = __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);
+  elementFromPoint_Callback_0_(mthis) => mthis.callMethod("elementFromPoint", []);
 
-  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);
+  elementFromPoint_Callback_1_(mthis, __arg_0) => mthis.callMethod("elementFromPoint", [__arg_0]);
 
-  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);
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("elementFromPoint", [__arg_0, __arg_1]);
 
-  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);
+  embeds_Getter_(mthis) => mthis["embeds"];
 
-  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);
+  execCommand_Callback_0_(mthis) => mthis.callMethod("execCommand", []);
 
-  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);
+  execCommand_Callback_1_(mthis, __arg_0) => mthis.callMethod("execCommand", [__arg_0]);
 
-  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);
+  execCommand_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("execCommand", [__arg_0, __arg_1]);
 
-  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);
+  execCommand_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("execCommand", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  exitFullscreen_Callback_0_(mthis) => mthis.callMethod("exitFullscreen", []);
 
-  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);
+  exitPointerLock_Callback_0_(mthis) => mthis.callMethod("exitPointerLock", []);
 
-  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);
+  firstElementChild_Getter_(mthis) => mthis["firstElementChild"];
 
-  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);
+  fonts_Getter_(mthis) => mthis["fonts"];
 
-  static createTreeWalker_Callback_0(mthis) native "Document_createTreeWalker_Callback";
-  createTreeWalker_Callback_0_(mthis) => createTreeWalker_Callback_0(mthis);
+  forms_Getter_(mthis) => mthis["forms"];
 
-  static createTreeWalker_Callback_1(mthis, __arg_0) native "Document_createTreeWalker_Callback";
-  createTreeWalker_Callback_1_(mthis, __arg_0) => createTreeWalker_Callback_1(mthis, __arg_0);
+  fullscreenElement_Getter_(mthis) => mthis["fullscreenElement"];
 
-  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);
+  fullscreenEnabled_Getter_(mthis) => mthis["fullscreenEnabled"];
 
-  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);
+  getCSSCanvasContext_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getCSSCanvasContext", [__arg_0, __arg_1]);
 
-  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);
+  getCSSCanvasContext_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getCSSCanvasContext", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  getCSSCanvasContext_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("getCSSCanvasContext", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static currentScript_Getter(mthis) native "Document_currentScript_Getter";
-  currentScript_Getter_(mthis) => currentScript_Getter(mthis);
+  getElementById_Callback_0_(mthis) => mthis.callMethod("getElementById", []);
 
-  static defaultCharset_Getter(mthis) native "Document_defaultCharset_Getter";
-  defaultCharset_Getter_(mthis) => defaultCharset_Getter(mthis);
+  getElementById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementById", [__arg_0]);
 
-  static defaultView_Getter(mthis) native "Document_defaultView_Getter";
-  defaultView_Getter_(mthis) => defaultView_Getter(mthis);
+  getElementsByClassName_Callback_0_(mthis) => mthis.callMethod("getElementsByClassName", []);
 
-  static doctype_Getter(mthis) native "Document_doctype_Getter";
-  doctype_Getter_(mthis) => doctype_Getter(mthis);
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByClassName", [__arg_0]);
 
-  static documentElement_Getter(mthis) native "Document_documentElement_Getter";
-  documentElement_Getter_(mthis) => documentElement_Getter(mthis);
+  getElementsByName_Callback_0_(mthis) => mthis.callMethod("getElementsByName", []);
 
-  static documentURI_Getter(mthis) native "Document_documentURI_Getter";
-  documentURI_Getter_(mthis) => documentURI_Getter(mthis);
+  getElementsByName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByName", [__arg_0]);
 
-  static domain_Getter(mthis) native "Document_domain_Getter";
-  domain_Getter_(mthis) => domain_Getter(mthis);
+  getElementsByTagName_Callback_0_(mthis) => mthis.callMethod("getElementsByTagName", []);
 
-  static domain_Setter(mthis, __arg_0) native "Document_domain_Setter";
-  domain_Setter_(mthis, __arg_0) => domain_Setter(mthis, __arg_0);
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByTagName", [__arg_0]);
 
-  static elementFromPoint_Callback_0(mthis) native "Document_elementFromPoint_Callback";
-  elementFromPoint_Callback_0_(mthis) => elementFromPoint_Callback_0(mthis);
+  head_Getter_(mthis) => mthis["head"];
 
-  static elementFromPoint_Callback_1(mthis, __arg_0) native "Document_elementFromPoint_Callback";
-  elementFromPoint_Callback_1_(mthis, __arg_0) => elementFromPoint_Callback_1(mthis, __arg_0);
+  hidden_Getter_(mthis) => mthis["hidden"];
 
-  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);
+  implementation_Getter_(mthis) => mthis["implementation"];
 
-  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);
+  importNode_Callback_0_(mthis) => mthis.callMethod("importNode", []);
 
-  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);
+  importNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("importNode", [__arg_0]);
 
-  static embeds_Getter(mthis) native "Document_embeds_Getter";
-  embeds_Getter_(mthis) => embeds_Getter(mthis);
+  importNode_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("importNode", [__arg_0, __arg_1]);
 
-  static execCommand_Callback_0(mthis) native "Document_execCommand_Callback";
-  execCommand_Callback_0_(mthis) => execCommand_Callback_0(mthis);
+  inputEncoding_Getter_(mthis) => mthis["inputEncoding"];
 
-  static execCommand_Callback_1(mthis, __arg_0) native "Document_execCommand_Callback";
-  execCommand_Callback_1_(mthis, __arg_0) => execCommand_Callback_1(mthis, __arg_0);
+  lastElementChild_Getter_(mthis) => mthis["lastElementChild"];
 
-  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);
+  lastModified_Getter_(mthis) => mthis["lastModified"];
 
-  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);
+  links_Getter_(mthis) => mthis["links"];
 
-  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);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  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);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static exitFullscreen_Callback_0(mthis) native "Document_exitFullscreen_Callback";
-  exitFullscreen_Callback_0_(mthis) => exitFullscreen_Callback_0(mthis);
+  onautocomplete_Getter_(mthis) => mthis["onautocomplete"];
 
-  static exitFullscreen_Callback_1(mthis, __arg_0) native "Document_exitFullscreen_Callback";
-  exitFullscreen_Callback_1_(mthis, __arg_0) => exitFullscreen_Callback_1(mthis, __arg_0);
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __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);
+  onautocompleteerror_Getter_(mthis) => mthis["onautocompleteerror"];
 
-  static exitPointerLock_Callback_0(mthis) native "Document_exitPointerLock_Callback";
-  exitPointerLock_Callback_0_(mthis) => exitPointerLock_Callback_0(mthis);
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  static exitPointerLock_Callback_1(mthis, __arg_0) native "Document_exitPointerLock_Callback";
-  exitPointerLock_Callback_1_(mthis, __arg_0) => exitPointerLock_Callback_1(mthis, __arg_0);
+  onbeforecopy_Getter_(mthis) => mthis["onbeforecopy"];
 
-  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);
+  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
 
-  static firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
-  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+  onbeforecut_Getter_(mthis) => mthis["onbeforecut"];
 
-  static fonts_Getter(mthis) native "Document_fonts_Getter";
-  fonts_Getter_(mthis) => fonts_Getter(mthis);
+  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
 
-  static forms_Getter(mthis) native "Document_forms_Getter";
-  forms_Getter_(mthis) => forms_Getter(mthis);
+  onbeforepaste_Getter_(mthis) => mthis["onbeforepaste"];
 
-  static fullscreenElement_Getter(mthis) native "Document_fullscreenElement_Getter";
-  fullscreenElement_Getter_(mthis) => fullscreenElement_Getter(mthis);
+  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
 
-  static fullscreenEnabled_Getter(mthis) native "Document_fullscreenEnabled_Getter";
-  fullscreenEnabled_Getter_(mthis) => fullscreenEnabled_Getter(mthis);
+  onblur_Getter_(mthis) => mthis["onblur"];
 
-  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);
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
 
-  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);
+  oncancel_Getter_(mthis) => mthis["oncancel"];
 
-  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);
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
 
-  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);
+  oncanplay_Getter_(mthis) => mthis["oncanplay"];
 
-  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);
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
 
-  static getElementById_Callback_0(mthis) native "Document_getElementById_Callback";
-  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+  oncanplaythrough_Getter_(mthis) => mthis["oncanplaythrough"];
 
-  static getElementById_Callback_1(mthis, __arg_0) native "Document_getElementById_Callback";
-  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __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);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  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);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static getElementsByClassName_Callback_0(mthis) native "Document_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+  onclick_Getter_(mthis) => mthis["onclick"];
 
-  static getElementsByClassName_Callback_1(mthis, __arg_0) native "Document_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __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);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  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);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static getElementsByName_Callback_0(mthis) native "Document_getElementsByName_Callback";
-  getElementsByName_Callback_0_(mthis) => getElementsByName_Callback_0(mthis);
+  oncontextmenu_Getter_(mthis) => mthis["oncontextmenu"];
 
-  static getElementsByName_Callback_1(mthis, __arg_0) native "Document_getElementsByName_Callback";
-  getElementsByName_Callback_1_(mthis, __arg_0) => getElementsByName_Callback_1(mthis, __arg_0);
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __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);
+  oncopy_Getter_(mthis) => mthis["oncopy"];
 
-  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);
+  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
 
-  static getElementsByTagName_Callback_0(mthis) native "Document_getElementsByTagName_Callback";
-  getElementsByTagName_Callback_0_(mthis) => getElementsByTagName_Callback_0(mthis);
+  oncuechange_Getter_(mthis) => mthis["oncuechange"];
 
-  static getElementsByTagName_Callback_1(mthis, __arg_0) native "Document_getElementsByTagName_Callback";
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => getElementsByTagName_Callback_1(mthis, __arg_0);
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __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);
+  oncut_Getter_(mthis) => mthis["oncut"];
 
-  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);
+  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
 
-  static head_Getter(mthis) native "Document_head_Getter";
-  head_Getter_(mthis) => head_Getter(mthis);
+  ondblclick_Getter_(mthis) => mthis["ondblclick"];
 
-  static hidden_Getter(mthis) native "Document_hidden_Getter";
-  hidden_Getter_(mthis) => hidden_Getter(mthis);
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
 
-  static implementation_Getter(mthis) native "Document_implementation_Getter";
-  implementation_Getter_(mthis) => implementation_Getter(mthis);
+  ondrag_Getter_(mthis) => mthis["ondrag"];
 
-  static importNode_Callback_0(mthis) native "Document_importNode_Callback";
-  importNode_Callback_0_(mthis) => importNode_Callback_0(mthis);
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
 
-  static importNode_Callback_1(mthis, __arg_0) native "Document_importNode_Callback";
-  importNode_Callback_1_(mthis, __arg_0) => importNode_Callback_1(mthis, __arg_0);
+  ondragend_Getter_(mthis) => mthis["ondragend"];
 
-  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);
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
 
-  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);
+  ondragenter_Getter_(mthis) => mthis["ondragenter"];
 
-  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);
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
 
-  static inputEncoding_Getter(mthis) native "Document_inputEncoding_Getter";
-  inputEncoding_Getter_(mthis) => inputEncoding_Getter(mthis);
+  ondragleave_Getter_(mthis) => mthis["ondragleave"];
 
-  static lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
-  lastElementChild_Getter_(mthis) => lastElementChild_Getter(mthis);
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
 
-  static lastModified_Getter(mthis) native "Document_lastModified_Getter";
-  lastModified_Getter_(mthis) => lastModified_Getter(mthis);
+  ondragover_Getter_(mthis) => mthis["ondragover"];
 
-  static links_Getter(mthis) native "Document_links_Getter";
-  links_Getter_(mthis) => links_Getter(mthis);
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
 
-  static onabort_Getter(mthis) native "Document_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  ondragstart_Getter_(mthis) => mthis["ondragstart"];
 
-  static onabort_Setter(mthis, __arg_0) native "Document_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
 
-  static onautocomplete_Getter(mthis) native "Document_onautocomplete_Getter";
-  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+  ondrop_Getter_(mthis) => mthis["ondrop"];
 
-  static onautocomplete_Setter(mthis, __arg_0) native "Document_onautocomplete_Setter";
-  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
 
-  static onautocompleteerror_Getter(mthis) native "Document_onautocompleteerror_Getter";
-  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+  ondurationchange_Getter_(mthis) => mthis["ondurationchange"];
 
-  static onautocompleteerror_Setter(mthis, __arg_0) native "Document_onautocompleteerror_Setter";
-  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
 
-  static onbeforecopy_Getter(mthis) native "Document_onbeforecopy_Getter";
-  onbeforecopy_Getter_(mthis) => onbeforecopy_Getter(mthis);
+  onemptied_Getter_(mthis) => mthis["onemptied"];
 
-  static onbeforecopy_Setter(mthis, __arg_0) native "Document_onbeforecopy_Setter";
-  onbeforecopy_Setter_(mthis, __arg_0) => onbeforecopy_Setter(mthis, __arg_0);
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
 
-  static onbeforecut_Getter(mthis) native "Document_onbeforecut_Getter";
-  onbeforecut_Getter_(mthis) => onbeforecut_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static onbeforecut_Setter(mthis, __arg_0) native "Document_onbeforecut_Setter";
-  onbeforecut_Setter_(mthis, __arg_0) => onbeforecut_Setter(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static onbeforepaste_Getter(mthis) native "Document_onbeforepaste_Getter";
-  onbeforepaste_Getter_(mthis) => onbeforepaste_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onbeforepaste_Setter(mthis, __arg_0) native "Document_onbeforepaste_Setter";
-  onbeforepaste_Setter_(mthis, __arg_0) => onbeforepaste_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onblur_Getter(mthis) native "Document_onblur_Getter";
-  onblur_Getter_(mthis) => onblur_Getter(mthis);
+  onfocus_Getter_(mthis) => mthis["onfocus"];
 
-  static onblur_Setter(mthis, __arg_0) native "Document_onblur_Setter";
-  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  static oncancel_Getter(mthis) native "Document_oncancel_Getter";
-  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+  onfullscreenchange_Getter_(mthis) => mthis["onfullscreenchange"];
 
-  static oncancel_Setter(mthis, __arg_0) native "Document_oncancel_Setter";
-  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+  onfullscreenchange_Setter_(mthis, __arg_0) => mthis["onfullscreenchange"] = __arg_0;
 
-  static oncanplay_Getter(mthis) native "Document_oncanplay_Getter";
-  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+  onfullscreenerror_Getter_(mthis) => mthis["onfullscreenerror"];
 
-  static oncanplay_Setter(mthis, __arg_0) native "Document_oncanplay_Setter";
-  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+  onfullscreenerror_Setter_(mthis, __arg_0) => mthis["onfullscreenerror"] = __arg_0;
 
-  static oncanplaythrough_Getter(mthis) native "Document_oncanplaythrough_Getter";
-  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+  oninput_Getter_(mthis) => mthis["oninput"];
 
-  static oncanplaythrough_Setter(mthis, __arg_0) native "Document_oncanplaythrough_Setter";
-  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
 
-  static onchange_Getter(mthis) native "Document_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  oninvalid_Getter_(mthis) => mthis["oninvalid"];
 
-  static onchange_Setter(mthis, __arg_0) native "Document_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
 
-  static onclick_Getter(mthis) native "Document_onclick_Getter";
-  onclick_Getter_(mthis) => onclick_Getter(mthis);
+  onkeydown_Getter_(mthis) => mthis["onkeydown"];
 
-  static onclick_Setter(mthis, __arg_0) native "Document_onclick_Setter";
-  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
 
-  static onclose_Getter(mthis) native "Document_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onkeypress_Getter_(mthis) => mthis["onkeypress"];
 
-  static onclose_Setter(mthis, __arg_0) native "Document_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
 
-  static oncontextmenu_Getter(mthis) native "Document_oncontextmenu_Getter";
-  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+  onkeyup_Getter_(mthis) => mthis["onkeyup"];
 
-  static oncontextmenu_Setter(mthis, __arg_0) native "Document_oncontextmenu_Setter";
-  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
 
-  static oncopy_Getter(mthis) native "Document_oncopy_Getter";
-  oncopy_Getter_(mthis) => oncopy_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static oncopy_Setter(mthis, __arg_0) native "Document_oncopy_Setter";
-  oncopy_Setter_(mthis, __arg_0) => oncopy_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static oncuechange_Getter(mthis) native "Document_oncuechange_Getter";
-  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+  onloadeddata_Getter_(mthis) => mthis["onloadeddata"];
 
-  static oncuechange_Setter(mthis, __arg_0) native "Document_oncuechange_Setter";
-  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
 
-  static oncut_Getter(mthis) native "Document_oncut_Getter";
-  oncut_Getter_(mthis) => oncut_Getter(mthis);
+  onloadedmetadata_Getter_(mthis) => mthis["onloadedmetadata"];
 
-  static oncut_Setter(mthis, __arg_0) native "Document_oncut_Setter";
-  oncut_Setter_(mthis, __arg_0) => oncut_Setter(mthis, __arg_0);
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
 
-  static ondblclick_Getter(mthis) native "Document_ondblclick_Getter";
-  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static ondblclick_Setter(mthis, __arg_0) native "Document_ondblclick_Setter";
-  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static ondrag_Getter(mthis) native "Document_ondrag_Getter";
-  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+  onmousedown_Getter_(mthis) => mthis["onmousedown"];
 
-  static ondrag_Setter(mthis, __arg_0) native "Document_ondrag_Setter";
-  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
 
-  static ondragend_Getter(mthis) native "Document_ondragend_Getter";
-  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+  onmouseenter_Getter_(mthis) => mthis["onmouseenter"];
 
-  static ondragend_Setter(mthis, __arg_0) native "Document_ondragend_Setter";
-  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
 
-  static ondragenter_Getter(mthis) native "Document_ondragenter_Getter";
-  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+  onmouseleave_Getter_(mthis) => mthis["onmouseleave"];
 
-  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);
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "Document_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onmousemove_Getter_(mthis) => mthis["onmousemove"];
 
-  static onprogress_Setter(mthis, __arg_0) native "Document_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
 
-  static onratechange_Getter(mthis) native "Document_onratechange_Getter";
-  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+  onmouseout_Getter_(mthis) => mthis["onmouseout"];
 
-  static onratechange_Setter(mthis, __arg_0) native "Document_onratechange_Setter";
-  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
 
-  static onreadystatechange_Getter(mthis) native "Document_onreadystatechange_Getter";
-  onreadystatechange_Getter_(mthis) => onreadystatechange_Getter(mthis);
+  onmouseover_Getter_(mthis) => mthis["onmouseover"];
 
-  static onreadystatechange_Setter(mthis, __arg_0) native "Document_onreadystatechange_Setter";
-  onreadystatechange_Setter_(mthis, __arg_0) => onreadystatechange_Setter(mthis, __arg_0);
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
 
-  static onreset_Getter(mthis) native "Document_onreset_Getter";
-  onreset_Getter_(mthis) => onreset_Getter(mthis);
+  onmouseup_Getter_(mthis) => mthis["onmouseup"];
 
-  static onreset_Setter(mthis, __arg_0) native "Document_onreset_Setter";
-  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
 
-  static onresize_Getter(mthis) native "Document_onresize_Getter";
-  onresize_Getter_(mthis) => onresize_Getter(mthis);
+  onmousewheel_Getter_(mthis) => mthis["onmousewheel"];
 
-  static onresize_Setter(mthis, __arg_0) native "Document_onresize_Setter";
-  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  static onscroll_Getter(mthis) native "Document_onscroll_Getter";
-  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+  onpaste_Getter_(mthis) => mthis["onpaste"];
 
-  static onscroll_Setter(mthis, __arg_0) native "Document_onscroll_Setter";
-  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __arg_0;
 
-  static onsearch_Getter(mthis) native "Document_onsearch_Getter";
-  onsearch_Getter_(mthis) => onsearch_Getter(mthis);
+  onpause_Getter_(mthis) => mthis["onpause"];
 
-  static onsearch_Setter(mthis, __arg_0) native "Document_onsearch_Setter";
-  onsearch_Setter_(mthis, __arg_0) => onsearch_Setter(mthis, __arg_0);
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
 
-  static onsecuritypolicyviolation_Getter(mthis) native "Document_onsecuritypolicyviolation_Getter";
-  onsecuritypolicyviolation_Getter_(mthis) => onsecuritypolicyviolation_Getter(mthis);
+  onplay_Getter_(mthis) => mthis["onplay"];
 
-  static onsecuritypolicyviolation_Setter(mthis, __arg_0) native "Document_onsecuritypolicyviolation_Setter";
-  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => onsecuritypolicyviolation_Setter(mthis, __arg_0);
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
 
-  static onseeked_Getter(mthis) native "Document_onseeked_Getter";
-  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+  onplaying_Getter_(mthis) => mthis["onplaying"];
 
-  static onseeked_Setter(mthis, __arg_0) native "Document_onseeked_Setter";
-  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  static onseeking_Getter(mthis) native "Document_onseeking_Getter";
-  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+  onpointerlockchange_Getter_(mthis) => mthis["onpointerlockchange"];
 
-  static onseeking_Setter(mthis, __arg_0) native "Document_onseeking_Setter";
-  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+  onpointerlockchange_Setter_(mthis, __arg_0) => mthis["onpointerlockchange"] = __arg_0;
 
-  static onselect_Getter(mthis) native "Document_onselect_Getter";
-  onselect_Getter_(mthis) => onselect_Getter(mthis);
+  onpointerlockerror_Getter_(mthis) => mthis["onpointerlockerror"];
 
-  static onselect_Setter(mthis, __arg_0) native "Document_onselect_Setter";
-  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+  onpointerlockerror_Setter_(mthis, __arg_0) => mthis["onpointerlockerror"] = __arg_0;
 
-  static onselectionchange_Getter(mthis) native "Document_onselectionchange_Getter";
-  onselectionchange_Getter_(mthis) => onselectionchange_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onselectionchange_Setter(mthis, __arg_0) native "Document_onselectionchange_Setter";
-  onselectionchange_Setter_(mthis, __arg_0) => onselectionchange_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onselectstart_Getter(mthis) native "Document_onselectstart_Getter";
-  onselectstart_Getter_(mthis) => onselectstart_Getter(mthis);
+  onratechange_Getter_(mthis) => mthis["onratechange"];
 
-  static onselectstart_Setter(mthis, __arg_0) native "Document_onselectstart_Setter";
-  onselectstart_Setter_(mthis, __arg_0) => onselectstart_Setter(mthis, __arg_0);
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
 
-  static onshow_Getter(mthis) native "Document_onshow_Getter";
-  onshow_Getter_(mthis) => onshow_Getter(mthis);
+  onreadystatechange_Getter_(mthis) => mthis["onreadystatechange"];
 
-  static onshow_Setter(mthis, __arg_0) native "Document_onshow_Setter";
-  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
 
-  static onstalled_Getter(mthis) native "Document_onstalled_Getter";
-  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+  onreset_Getter_(mthis) => mthis["onreset"];
 
-  static onstalled_Setter(mthis, __arg_0) native "Document_onstalled_Setter";
-  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
 
-  static onsubmit_Getter(mthis) native "Document_onsubmit_Getter";
-  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+  onresize_Getter_(mthis) => mthis["onresize"];
 
-  static onsubmit_Setter(mthis, __arg_0) native "Document_onsubmit_Setter";
-  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
 
-  static onsuspend_Getter(mthis) native "Document_onsuspend_Getter";
-  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+  onscroll_Getter_(mthis) => mthis["onscroll"];
 
-  static onsuspend_Setter(mthis, __arg_0) native "Document_onsuspend_Setter";
-  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  static ontimeupdate_Getter(mthis) native "Document_ontimeupdate_Getter";
-  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+  onsearch_Getter_(mthis) => mthis["onsearch"];
 
-  static ontimeupdate_Setter(mthis, __arg_0) native "Document_ontimeupdate_Setter";
-  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
 
-  static ontoggle_Getter(mthis) native "Document_ontoggle_Getter";
-  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+  onsecuritypolicyviolation_Getter_(mthis) => mthis["onsecuritypolicyviolation"];
 
-  static ontoggle_Setter(mthis, __arg_0) native "Document_ontoggle_Setter";
-  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+  onsecuritypolicyviolation_Setter_(mthis, __arg_0) => mthis["onsecuritypolicyviolation"] = __arg_0;
 
-  static ontouchcancel_Getter(mthis) native "Document_ontouchcancel_Getter";
-  ontouchcancel_Getter_(mthis) => ontouchcancel_Getter(mthis);
+  onseeked_Getter_(mthis) => mthis["onseeked"];
 
-  static ontouchcancel_Setter(mthis, __arg_0) native "Document_ontouchcancel_Setter";
-  ontouchcancel_Setter_(mthis, __arg_0) => ontouchcancel_Setter(mthis, __arg_0);
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
 
-  static ontouchend_Getter(mthis) native "Document_ontouchend_Getter";
-  ontouchend_Getter_(mthis) => ontouchend_Getter(mthis);
+  onseeking_Getter_(mthis) => mthis["onseeking"];
 
-  static ontouchend_Setter(mthis, __arg_0) native "Document_ontouchend_Setter";
-  ontouchend_Setter_(mthis, __arg_0) => ontouchend_Setter(mthis, __arg_0);
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
 
-  static ontouchmove_Getter(mthis) native "Document_ontouchmove_Getter";
-  ontouchmove_Getter_(mthis) => ontouchmove_Getter(mthis);
+  onselect_Getter_(mthis) => mthis["onselect"];
 
-  static ontouchmove_Setter(mthis, __arg_0) native "Document_ontouchmove_Setter";
-  ontouchmove_Setter_(mthis, __arg_0) => ontouchmove_Setter(mthis, __arg_0);
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
 
-  static ontouchstart_Getter(mthis) native "Document_ontouchstart_Getter";
-  ontouchstart_Getter_(mthis) => ontouchstart_Getter(mthis);
+  onselectionchange_Getter_(mthis) => mthis["onselectionchange"];
 
-  static ontouchstart_Setter(mthis, __arg_0) native "Document_ontouchstart_Setter";
-  ontouchstart_Setter_(mthis, __arg_0) => ontouchstart_Setter(mthis, __arg_0);
+  onselectionchange_Setter_(mthis, __arg_0) => mthis["onselectionchange"] = __arg_0;
 
-  static onvolumechange_Getter(mthis) native "Document_onvolumechange_Getter";
-  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+  onselectstart_Getter_(mthis) => mthis["onselectstart"];
 
-  static onvolumechange_Setter(mthis, __arg_0) native "Document_onvolumechange_Setter";
-  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
 
-  static onwaiting_Getter(mthis) native "Document_onwaiting_Getter";
-  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+  onshow_Getter_(mthis) => mthis["onshow"];
 
-  static onwaiting_Setter(mthis, __arg_0) native "Document_onwaiting_Setter";
-  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
 
-  static onwebkitfullscreenchange_Getter(mthis) native "Document_onwebkitfullscreenchange_Getter";
-  onwebkitfullscreenchange_Getter_(mthis) => onwebkitfullscreenchange_Getter(mthis);
+  onstalled_Getter_(mthis) => mthis["onstalled"];
 
-  static onwebkitfullscreenchange_Setter(mthis, __arg_0) native "Document_onwebkitfullscreenchange_Setter";
-  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => onwebkitfullscreenchange_Setter(mthis, __arg_0);
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
 
-  static onwebkitfullscreenerror_Getter(mthis) native "Document_onwebkitfullscreenerror_Getter";
-  onwebkitfullscreenerror_Getter_(mthis) => onwebkitfullscreenerror_Getter(mthis);
+  onsubmit_Getter_(mthis) => mthis["onsubmit"];
 
-  static onwebkitfullscreenerror_Setter(mthis, __arg_0) native "Document_onwebkitfullscreenerror_Setter";
-  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => onwebkitfullscreenerror_Setter(mthis, __arg_0);
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
 
-  static onwheel_Getter(mthis) native "Document_onwheel_Getter";
-  onwheel_Getter_(mthis) => onwheel_Getter(mthis);
+  onsuspend_Getter_(mthis) => mthis["onsuspend"];
 
-  static onwheel_Setter(mthis, __arg_0) native "Document_onwheel_Setter";
-  onwheel_Setter_(mthis, __arg_0) => onwheel_Setter(mthis, __arg_0);
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
 
-  static plugins_Getter(mthis) native "Document_plugins_Getter";
-  plugins_Getter_(mthis) => plugins_Getter(mthis);
+  ontimeupdate_Getter_(mthis) => mthis["ontimeupdate"];
 
-  static pointerLockElement_Getter(mthis) native "Document_pointerLockElement_Getter";
-  pointerLockElement_Getter_(mthis) => pointerLockElement_Getter(mthis);
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
 
-  static preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
-  preferredStylesheetSet_Getter_(mthis) => preferredStylesheetSet_Getter(mthis);
+  ontoggle_Getter_(mthis) => mthis["ontoggle"];
 
-  static queryCommandEnabled_Callback_0(mthis) native "Document_queryCommandEnabled_Callback";
-  queryCommandEnabled_Callback_0_(mthis) => queryCommandEnabled_Callback_0(mthis);
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
 
-  static queryCommandEnabled_Callback_1(mthis, __arg_0) native "Document_queryCommandEnabled_Callback";
-  queryCommandEnabled_Callback_1_(mthis, __arg_0) => queryCommandEnabled_Callback_1(mthis, __arg_0);
+  ontouchcancel_Getter_(mthis) => mthis["ontouchcancel"];
 
-  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);
+  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
 
-  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);
+  ontouchend_Getter_(mthis) => mthis["ontouchend"];
 
-  static queryCommandIndeterm_Callback_0(mthis) native "Document_queryCommandIndeterm_Callback";
-  queryCommandIndeterm_Callback_0_(mthis) => queryCommandIndeterm_Callback_0(mthis);
+  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
 
-  static queryCommandIndeterm_Callback_1(mthis, __arg_0) native "Document_queryCommandIndeterm_Callback";
-  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => queryCommandIndeterm_Callback_1(mthis, __arg_0);
+  ontouchmove_Getter_(mthis) => mthis["ontouchmove"];
 
-  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);
+  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
 
-  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);
+  ontouchstart_Getter_(mthis) => mthis["ontouchstart"];
 
-  static queryCommandState_Callback_0(mthis) native "Document_queryCommandState_Callback";
-  queryCommandState_Callback_0_(mthis) => queryCommandState_Callback_0(mthis);
+  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
 
-  static queryCommandState_Callback_1(mthis, __arg_0) native "Document_queryCommandState_Callback";
-  queryCommandState_Callback_1_(mthis, __arg_0) => queryCommandState_Callback_1(mthis, __arg_0);
+  onvolumechange_Getter_(mthis) => mthis["onvolumechange"];
 
-  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);
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
 
-  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);
+  onwaiting_Getter_(mthis) => mthis["onwaiting"];
 
-  static queryCommandSupported_Callback_0(mthis) native "Document_queryCommandSupported_Callback";
-  queryCommandSupported_Callback_0_(mthis) => queryCommandSupported_Callback_0(mthis);
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  static queryCommandSupported_Callback_1(mthis, __arg_0) native "Document_queryCommandSupported_Callback";
-  queryCommandSupported_Callback_1_(mthis, __arg_0) => queryCommandSupported_Callback_1(mthis, __arg_0);
+  onwebkitfullscreenchange_Getter_(mthis) => mthis["onwebkitfullscreenchange"];
 
-  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);
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
 
-  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);
+  onwebkitfullscreenerror_Getter_(mthis) => mthis["onwebkitfullscreenerror"];
 
-  static queryCommandValue_Callback_0(mthis) native "Document_queryCommandValue_Callback";
-  queryCommandValue_Callback_0_(mthis) => queryCommandValue_Callback_0(mthis);
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
 
-  static queryCommandValue_Callback_1(mthis, __arg_0) native "Document_queryCommandValue_Callback";
-  queryCommandValue_Callback_1_(mthis, __arg_0) => queryCommandValue_Callback_1(mthis, __arg_0);
+  onwheel_Getter_(mthis) => mthis["onwheel"];
 
-  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);
+  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
 
-  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);
+  plugins_Getter_(mthis) => mthis["plugins"];
 
-  static querySelectorAll_Callback_0(mthis) native "Document_querySelectorAll_Callback";
-  querySelectorAll_Callback_0_(mthis) => querySelectorAll_Callback_0(mthis);
+  pointerLockElement_Getter_(mthis) => mthis["pointerLockElement"];
 
-  static querySelectorAll_Callback_1(mthis, __arg_0) native "Document_querySelectorAll_Callback";
-  querySelectorAll_Callback_1_(mthis, __arg_0) => querySelectorAll_Callback_1(mthis, __arg_0);
+  preferredStylesheetSet_Getter_(mthis) => mthis["preferredStylesheetSet"];
 
-  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);
+  queryCommandEnabled_Callback_0_(mthis) => mthis.callMethod("queryCommandEnabled", []);
 
-  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);
+  queryCommandEnabled_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryCommandEnabled", [__arg_0]);
 
-  static querySelector_Callback_0(mthis) native "Document_querySelector_Callback";
-  querySelector_Callback_0_(mthis) => querySelector_Callback_0(mthis);
+  queryCommandIndeterm_Callback_0_(mthis) => mthis.callMethod("queryCommandIndeterm", []);
 
-  static querySelector_Callback_1(mthis, __arg_0) native "Document_querySelector_Callback";
-  querySelector_Callback_1_(mthis, __arg_0) => querySelector_Callback_1(mthis, __arg_0);
+  queryCommandIndeterm_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryCommandIndeterm", [__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);
+  queryCommandState_Callback_0_(mthis) => mthis.callMethod("queryCommandState", []);
 
-  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);
+  queryCommandState_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryCommandState", [__arg_0]);
 
-  static readyState_Getter(mthis) native "Document_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  queryCommandSupported_Callback_0_(mthis) => mthis.callMethod("queryCommandSupported", []);
 
-  static referrer_Getter(mthis) native "Document_referrer_Getter";
-  referrer_Getter_(mthis) => referrer_Getter(mthis);
+  queryCommandSupported_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryCommandSupported", [__arg_0]);
 
-  static registerElement_Callback_0(mthis) native "Document_registerElement_Callback";
-  registerElement_Callback_0_(mthis) => registerElement_Callback_0(mthis);
+  queryCommandValue_Callback_0_(mthis) => mthis.callMethod("queryCommandValue", []);
 
-  static registerElement_Callback_1(mthis, __arg_0) native "Document_registerElement_Callback";
-  registerElement_Callback_1_(mthis, __arg_0) => registerElement_Callback_1(mthis, __arg_0);
+  queryCommandValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryCommandValue", [__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);
+  querySelectorAll_Callback_0_(mthis) => mthis.callMethod("querySelectorAll", []);
 
-  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);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelectorAll", [__arg_0]);
 
-  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);
+  querySelector_Callback_0_(mthis) => mthis.callMethod("querySelector", []);
 
-  static rootElement_Getter(mthis) native "Document_rootElement_Getter";
-  rootElement_Getter_(mthis) => rootElement_Getter(mthis);
+  querySelector_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelector", [__arg_0]);
 
-  static scripts_Getter(mthis) native "Document_scripts_Getter";
-  scripts_Getter_(mthis) => scripts_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
-  selectedStylesheetSet_Getter_(mthis) => selectedStylesheetSet_Getter(mthis);
+  referrer_Getter_(mthis) => mthis["referrer"];
 
-  static selectedStylesheetSet_Setter(mthis, __arg_0) native "Document_selectedStylesheetSet_Setter";
-  selectedStylesheetSet_Setter_(mthis, __arg_0) => selectedStylesheetSet_Setter(mthis, __arg_0);
+  registerElement_Callback_0_(mthis) => mthis.callMethod("registerElement", []);
 
-  static styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
-  styleSheets_Getter_(mthis) => styleSheets_Getter(mthis);
+  registerElement_Callback_1_(mthis, __arg_0) => mthis.callMethod("registerElement", [__arg_0]);
 
-  static timeline_Getter(mthis) native "Document_timeline_Getter";
-  timeline_Getter_(mthis) => timeline_Getter(mthis);
+  registerElement_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("registerElement", [__arg_0, __arg_1]);
 
-  static title_Getter(mthis) native "Document_title_Getter";
-  title_Getter_(mthis) => title_Getter(mthis);
+  rootElement_Getter_(mthis) => mthis["rootElement"];
 
-  static title_Setter(mthis, __arg_0) native "Document_title_Setter";
-  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
+  scripts_Getter_(mthis) => mthis["scripts"];
 
-  static transformDocumentToTreeView_Callback_0(mthis) native "Document_transformDocumentToTreeView_Callback";
-  transformDocumentToTreeView_Callback_0_(mthis) => transformDocumentToTreeView_Callback_0(mthis);
+  selectedStylesheetSet_Getter_(mthis) => mthis["selectedStylesheetSet"];
 
-  static transformDocumentToTreeView_Callback_1(mthis, __arg_0) native "Document_transformDocumentToTreeView_Callback";
-  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => transformDocumentToTreeView_Callback_1(mthis, __arg_0);
+  selectedStylesheetSet_Setter_(mthis, __arg_0) => mthis["selectedStylesheetSet"] = __arg_0;
 
-  static transformDocumentToTreeView_Callback_2(mthis, __arg_0, __arg_1) native "Document_transformDocumentToTreeView_Callback";
-  transformDocumentToTreeView_Callback_2_(mthis, __arg_0, __arg_1) => transformDocumentToTreeView_Callback_2(mthis, __arg_0, __arg_1);
+  styleSheets_Getter_(mthis) => mthis["styleSheets"];
 
-  static transformDocumentToTreeView_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Document_transformDocumentToTreeView_Callback";
-  transformDocumentToTreeView_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => transformDocumentToTreeView_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  timeline_Getter_(mthis) => mthis["timeline"];
 
-  static visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
-  visibilityState_Getter_(mthis) => visibilityState_Getter(mthis);
+  title_Getter_(mthis) => mthis["title"];
 
-  static webkitCancelFullScreen_Callback_0(mthis) native "Document_webkitCancelFullScreen_Callback";
-  webkitCancelFullScreen_Callback_0_(mthis) => webkitCancelFullScreen_Callback_0(mthis);
+  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
 
-  static webkitCancelFullScreen_Callback_1(mthis, __arg_0) native "Document_webkitCancelFullScreen_Callback";
-  webkitCancelFullScreen_Callback_1_(mthis, __arg_0) => webkitCancelFullScreen_Callback_1(mthis, __arg_0);
+  transformDocumentToTreeView_Callback_0_(mthis) => mthis.callMethod("transformDocumentToTreeView", []);
 
-  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);
+  transformDocumentToTreeView_Callback_1_(mthis, __arg_0) => mthis.callMethod("transformDocumentToTreeView", [__arg_0]);
 
-  static webkitExitFullscreen_Callback_0(mthis) native "Document_webkitExitFullscreen_Callback";
-  webkitExitFullscreen_Callback_0_(mthis) => webkitExitFullscreen_Callback_0(mthis);
+  visibilityState_Getter_(mthis) => mthis["visibilityState"];
 
-  static webkitExitFullscreen_Callback_1(mthis, __arg_0) native "Document_webkitExitFullscreen_Callback";
-  webkitExitFullscreen_Callback_1_(mthis, __arg_0) => webkitExitFullscreen_Callback_1(mthis, __arg_0);
+  webkitCancelFullScreen_Callback_0_(mthis) => mthis.callMethod("webkitCancelFullScreen", []);
 
-  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);
+  webkitExitFullscreen_Callback_0_(mthis) => mthis.callMethod("webkitExitFullscreen", []);
 
-  static webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
-  webkitFullscreenElement_Getter_(mthis) => webkitFullscreenElement_Getter(mthis);
+  webkitFullscreenElement_Getter_(mthis) => mthis["webkitFullscreenElement"];
 
-  static webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
-  webkitFullscreenEnabled_Getter_(mthis) => webkitFullscreenEnabled_Getter(mthis);
+  webkitFullscreenEnabled_Getter_(mthis) => mthis["webkitFullscreenEnabled"];
 
-  static webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
-  webkitHidden_Getter_(mthis) => webkitHidden_Getter(mthis);
+  webkitHidden_Getter_(mthis) => mthis["webkitHidden"];
 
-  static webkitIsFullScreen_Getter(mthis) native "Document_webkitIsFullScreen_Getter";
-  webkitIsFullScreen_Getter_(mthis) => webkitIsFullScreen_Getter(mthis);
+  webkitIsFullScreen_Getter_(mthis) => mthis["webkitIsFullScreen"];
 
-  static webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
-  webkitVisibilityState_Getter_(mthis) => webkitVisibilityState_Getter(mthis);
+  webkitVisibilityState_Getter_(mthis) => mthis["webkitVisibilityState"];
 
-  static xmlEncoding_Getter(mthis) native "Document_xmlEncoding_Getter";
-  xmlEncoding_Getter_(mthis) => xmlEncoding_Getter(mthis);
+  xmlEncoding_Getter_(mthis) => mthis["xmlEncoding"];
 
 }
 
 class BlinkDocumentFragment extends BlinkNode {
   static final instance = new BlinkDocumentFragment();
 
-  static childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
-  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+  childElementCount_Getter_(mthis) => mthis["childElementCount"];
 
-  static constructorCallback_0() native "DocumentFragment_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["DocumentFragment"], []);
 
-  static constructorCallback_1(__arg_0) native "DocumentFragment_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  firstElementChild_Getter_(mthis) => mthis["firstElementChild"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "DocumentFragment_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  getElementById_Callback_0_(mthis) => mthis.callMethod("getElementById", []);
 
-  static firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
-  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+  getElementById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementById", [__arg_0]);
 
-  static getElementById_Callback_0(mthis) native "DocumentFragment_getElementById_Callback";
-  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+  lastElementChild_Getter_(mthis) => mthis["lastElementChild"];
 
-  static getElementById_Callback_1(mthis, __arg_0) native "DocumentFragment_getElementById_Callback";
-  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+  querySelectorAll_Callback_0_(mthis) => mthis.callMethod("querySelectorAll", []);
 
-  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);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelectorAll", [__arg_0]);
 
-  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);
+  querySelector_Callback_0_(mthis) => mthis.callMethod("querySelector", []);
 
-  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);
+  querySelector_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelector", [__arg_0]);
 
 }
 
@@ -6979,23 +3921,17 @@
 class BlinkDynamicsCompressorNode extends BlinkAudioNode {
   static final instance = new BlinkDynamicsCompressorNode();
 
-  static attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
-  attack_Getter_(mthis) => attack_Getter(mthis);
+  attack_Getter_(mthis) => mthis["attack"];
 
-  static knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
-  knee_Getter_(mthis) => knee_Getter(mthis);
+  knee_Getter_(mthis) => mthis["knee"];
 
-  static ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
-  ratio_Getter_(mthis) => ratio_Getter(mthis);
+  ratio_Getter_(mthis) => mthis["ratio"];
 
-  static reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
-  reduction_Getter_(mthis) => reduction_Getter(mthis);
+  reduction_Getter_(mthis) => mthis["reduction"];
 
-  static release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
-  release_Getter_(mthis) => release_Getter(mthis);
+  release_Getter_(mthis) => mthis["release"];
 
-  static threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
-  threshold_Getter_(mthis) => threshold_Getter(mthis);
+  threshold_Getter_(mthis) => mthis["threshold"];
 
 }
 
@@ -7022,2248 +3958,1154 @@
 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);
+  animate_Callback_0_(mthis) => mthis.callMethod("animate", []);
 
-  static animate_Callback_1(mthis, __arg_0) native "Element_animate_Callback";
-  animate_Callback_1_(mthis, __arg_0) => animate_Callback_1(mthis, __arg_0);
+  animate_Callback_1_(mthis, __arg_0) => mthis.callMethod("animate", [__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);
+  animate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("animate", [__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);
+  attributes_Getter_(mthis) => mthis["attributes"];
 
-  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);
+  blur_Callback_0_(mthis) => mthis.callMethod("blur", []);
 
-  static attributes_Getter(mthis) native "Element_attributes_Getter";
-  attributes_Getter_(mthis) => attributes_Getter(mthis);
+  childElementCount_Getter_(mthis) => mthis["childElementCount"];
 
-  static blur_Callback_0(mthis) native "Element_blur_Callback";
-  blur_Callback_0_(mthis) => blur_Callback_0(mthis);
+  children_Getter_(mthis) => mthis["children"];
 
-  static blur_Callback_1(mthis, __arg_0) native "Element_blur_Callback";
-  blur_Callback_1_(mthis, __arg_0) => blur_Callback_1(mthis, __arg_0);
+  classList_Getter_(mthis) => mthis["classList"];
 
-  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);
+  className_Getter_(mthis) => mthis["className"];
 
-  static childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
-  childElementCount_Getter_(mthis) => childElementCount_Getter(mthis);
+  className_Setter_(mthis, __arg_0) => mthis["className"] = __arg_0;
 
-  static children_Getter(mthis) native "Element_children_Getter";
-  children_Getter_(mthis) => children_Getter(mthis);
+  clientHeight_Getter_(mthis) => mthis["clientHeight"];
 
-  static classList_Getter(mthis) native "Element_classList_Getter";
-  classList_Getter_(mthis) => classList_Getter(mthis);
+  clientLeft_Getter_(mthis) => mthis["clientLeft"];
 
-  static className_Getter(mthis) native "Element_className_Getter";
-  className_Getter_(mthis) => className_Getter(mthis);
+  clientTop_Getter_(mthis) => mthis["clientTop"];
 
-  static className_Setter(mthis, __arg_0) native "Element_className_Setter";
-  className_Setter_(mthis, __arg_0) => className_Setter(mthis, __arg_0);
+  clientWidth_Getter_(mthis) => mthis["clientWidth"];
 
-  static clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
-  clientHeight_Getter_(mthis) => clientHeight_Getter(mthis);
+  createShadowRoot_Callback_0_(mthis) => mthis.callMethod("createShadowRoot", []);
 
-  static clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
-  clientLeft_Getter_(mthis) => clientLeft_Getter(mthis);
+  firstElementChild_Getter_(mthis) => mthis["firstElementChild"];
 
-  static clientTop_Getter(mthis) native "Element_clientTop_Getter";
-  clientTop_Getter_(mthis) => clientTop_Getter(mthis);
+  focus_Callback_0_(mthis) => mthis.callMethod("focus", []);
 
-  static clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
-  clientWidth_Getter_(mthis) => clientWidth_Getter(mthis);
+  getAnimationPlayers_Callback_0_(mthis) => mthis.callMethod("getAnimationPlayers", []);
 
-  static createShadowRoot_Callback_0(mthis) native "Element_createShadowRoot_Callback";
-  createShadowRoot_Callback_0_(mthis) => createShadowRoot_Callback_0(mthis);
+  getAttributeNS_Callback_0_(mthis) => mthis.callMethod("getAttributeNS", []);
 
-  static createShadowRoot_Callback_1(mthis, __arg_0) native "Element_createShadowRoot_Callback";
-  createShadowRoot_Callback_1_(mthis, __arg_0) => createShadowRoot_Callback_1(mthis, __arg_0);
+  getAttributeNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAttributeNS", [__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);
+  getAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getAttributeNS", [__arg_0, __arg_1]);
 
-  static firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
-  firstElementChild_Getter_(mthis) => firstElementChild_Getter(mthis);
+  getAttribute_Callback_0_(mthis) => mthis.callMethod("getAttribute", []);
 
-  static focus_Callback_0(mthis) native "Element_focus_Callback";
-  focus_Callback_0_(mthis) => focus_Callback_0(mthis);
+  getAttribute_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAttribute", [__arg_0]);
 
-  static focus_Callback_1(mthis, __arg_0) native "Element_focus_Callback";
-  focus_Callback_1_(mthis, __arg_0) => focus_Callback_1(mthis, __arg_0);
+  getBoundingClientRect_Callback_0_(mthis) => mthis.callMethod("getBoundingClientRect", []);
 
-  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);
+  getClientRects_Callback_0_(mthis) => mthis.callMethod("getClientRects", []);
 
-  static getAnimationPlayers_Callback_0(mthis) native "Element_getAnimationPlayers_Callback";
-  getAnimationPlayers_Callback_0_(mthis) => getAnimationPlayers_Callback_0(mthis);
+  getDestinationInsertionPoints_Callback_0_(mthis) => mthis.callMethod("getDestinationInsertionPoints", []);
 
-  static getAnimationPlayers_Callback_1(mthis, __arg_0) native "Element_getAnimationPlayers_Callback";
-  getAnimationPlayers_Callback_1_(mthis, __arg_0) => getAnimationPlayers_Callback_1(mthis, __arg_0);
+  getElementsByClassName_Callback_0_(mthis) => mthis.callMethod("getElementsByClassName", []);
 
-  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);
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByClassName", [__arg_0]);
 
-  static getAttributeNS_Callback_0(mthis) native "Element_getAttributeNS_Callback";
-  getAttributeNS_Callback_0_(mthis) => getAttributeNS_Callback_0(mthis);
+  getElementsByTagName_Callback_0_(mthis) => mthis.callMethod("getElementsByTagName", []);
 
-  static getAttributeNS_Callback_1(mthis, __arg_0) native "Element_getAttributeNS_Callback";
-  getAttributeNS_Callback_1_(mthis, __arg_0) => getAttributeNS_Callback_1(mthis, __arg_0);
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByTagName", [__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);
+  hasAttributeNS_Callback_0_(mthis) => mthis.callMethod("hasAttributeNS", []);
 
-  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);
+  hasAttributeNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasAttributeNS", [__arg_0]);
 
-  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);
+  hasAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("hasAttributeNS", [__arg_0, __arg_1]);
 
-  static getAttribute_Callback_0(mthis) native "Element_getAttribute_Callback";
-  getAttribute_Callback_0_(mthis) => getAttribute_Callback_0(mthis);
+  hasAttribute_Callback_0_(mthis) => mthis.callMethod("hasAttribute", []);
 
-  static getAttribute_Callback_1(mthis, __arg_0) native "Element_getAttribute_Callback";
-  getAttribute_Callback_1_(mthis, __arg_0) => getAttribute_Callback_1(mthis, __arg_0);
+  hasAttribute_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasAttribute", [__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);
+  hasAttributes_Callback_0_(mthis) => mthis.callMethod("hasAttributes", []);
 
-  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);
+  id_Getter_(mthis) => mthis["id"];
 
-  static getBoundingClientRect_Callback_0(mthis) native "Element_getBoundingClientRect_Callback";
-  getBoundingClientRect_Callback_0_(mthis) => getBoundingClientRect_Callback_0(mthis);
+  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
 
-  static getBoundingClientRect_Callback_1(mthis, __arg_0) native "Element_getBoundingClientRect_Callback";
-  getBoundingClientRect_Callback_1_(mthis, __arg_0) => getBoundingClientRect_Callback_1(mthis, __arg_0);
+  innerHTML_Getter_(mthis) => mthis["innerHTML"];
 
-  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);
+  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __arg_0;
 
-  static getClientRects_Callback_0(mthis) native "Element_getClientRects_Callback";
-  getClientRects_Callback_0_(mthis) => getClientRects_Callback_0(mthis);
+  insertAdjacentElement_Callback_0_(mthis) => mthis.callMethod("insertAdjacentElement", []);
 
-  static getClientRects_Callback_1(mthis, __arg_0) native "Element_getClientRects_Callback";
-  getClientRects_Callback_1_(mthis, __arg_0) => getClientRects_Callback_1(mthis, __arg_0);
+  insertAdjacentElement_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertAdjacentElement", [__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);
+  insertAdjacentElement_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertAdjacentElement", [__arg_0, __arg_1]);
 
-  static getDestinationInsertionPoints_Callback_0(mthis) native "Element_getDestinationInsertionPoints_Callback";
-  getDestinationInsertionPoints_Callback_0_(mthis) => getDestinationInsertionPoints_Callback_0(mthis);
+  insertAdjacentHTML_Callback_0_(mthis) => mthis.callMethod("insertAdjacentHTML", []);
 
-  static getDestinationInsertionPoints_Callback_1(mthis, __arg_0) native "Element_getDestinationInsertionPoints_Callback";
-  getDestinationInsertionPoints_Callback_1_(mthis, __arg_0) => getDestinationInsertionPoints_Callback_1(mthis, __arg_0);
+  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertAdjacentHTML", [__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);
+  insertAdjacentHTML_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertAdjacentHTML", [__arg_0, __arg_1]);
 
-  static getElementsByClassName_Callback_0(mthis) native "Element_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+  insertAdjacentText_Callback_0_(mthis) => mthis.callMethod("insertAdjacentText", []);
 
-  static getElementsByClassName_Callback_1(mthis, __arg_0) native "Element_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+  insertAdjacentText_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertAdjacentText", [__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);
+  insertAdjacentText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertAdjacentText", [__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);
+  lastElementChild_Getter_(mthis) => mthis["lastElementChild"];
 
-  static getElementsByTagName_Callback_0(mthis) native "Element_getElementsByTagName_Callback";
-  getElementsByTagName_Callback_0_(mthis) => getElementsByTagName_Callback_0(mthis);
+  localName_Getter_(mthis) => mthis["localName"];
 
-  static getElementsByTagName_Callback_1(mthis, __arg_0) native "Element_getElementsByTagName_Callback";
-  getElementsByTagName_Callback_1_(mthis, __arg_0) => getElementsByTagName_Callback_1(mthis, __arg_0);
+  matches_Callback_0_(mthis) => mthis.callMethod("matches", []);
 
-  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);
+  matches_Callback_1_(mthis, __arg_0) => mthis.callMethod("matches", [__arg_0]);
 
-  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);
+  namespaceURI_Getter_(mthis) => mthis["namespaceURI"];
 
-  static hasAttributeNS_Callback_0(mthis) native "Element_hasAttributeNS_Callback";
-  hasAttributeNS_Callback_0_(mthis) => hasAttributeNS_Callback_0(mthis);
+  nextElementSibling_Getter_(mthis) => mthis["nextElementSibling"];
 
-  static hasAttributeNS_Callback_1(mthis, __arg_0) native "Element_hasAttributeNS_Callback";
-  hasAttributeNS_Callback_1_(mthis, __arg_0) => hasAttributeNS_Callback_1(mthis, __arg_0);
+  offsetHeight_Getter_(mthis) => mthis["offsetHeight"];
 
-  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);
+  offsetLeft_Getter_(mthis) => mthis["offsetLeft"];
 
-  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);
+  offsetParent_Getter_(mthis) => mthis["offsetParent"];
 
-  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);
+  offsetTop_Getter_(mthis) => mthis["offsetTop"];
 
-  static hasAttribute_Callback_0(mthis) native "Element_hasAttribute_Callback";
-  hasAttribute_Callback_0_(mthis) => hasAttribute_Callback_0(mthis);
+  offsetWidth_Getter_(mthis) => mthis["offsetWidth"];
 
-  static hasAttribute_Callback_1(mthis, __arg_0) native "Element_hasAttribute_Callback";
-  hasAttribute_Callback_1_(mthis, __arg_0) => hasAttribute_Callback_1(mthis, __arg_0);
+  onbeforecopy_Getter_(mthis) => mthis["onbeforecopy"];
 
-  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);
+  onbeforecopy_Setter_(mthis, __arg_0) => mthis["onbeforecopy"] = __arg_0;
 
-  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);
+  onbeforecut_Getter_(mthis) => mthis["onbeforecut"];
 
-  static hasAttributes_Callback_0(mthis) native "Element_hasAttributes_Callback";
-  hasAttributes_Callback_0_(mthis) => hasAttributes_Callback_0(mthis);
+  onbeforecut_Setter_(mthis, __arg_0) => mthis["onbeforecut"] = __arg_0;
 
-  static hasAttributes_Callback_1(mthis, __arg_0) native "Element_hasAttributes_Callback";
-  hasAttributes_Callback_1_(mthis, __arg_0) => hasAttributes_Callback_1(mthis, __arg_0);
+  onbeforepaste_Getter_(mthis) => mthis["onbeforepaste"];
 
-  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);
+  onbeforepaste_Setter_(mthis, __arg_0) => mthis["onbeforepaste"] = __arg_0;
 
-  static id_Getter(mthis) native "Element_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  oncopy_Getter_(mthis) => mthis["oncopy"];
 
-  static id_Setter(mthis, __arg_0) native "Element_id_Setter";
-  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
+  oncopy_Setter_(mthis, __arg_0) => mthis["oncopy"] = __arg_0;
 
-  static innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
-  innerHTML_Getter_(mthis) => innerHTML_Getter(mthis);
+  oncut_Getter_(mthis) => mthis["oncut"];
 
-  static innerHTML_Setter(mthis, __arg_0) native "Element_innerHTML_Setter";
-  innerHTML_Setter_(mthis, __arg_0) => innerHTML_Setter(mthis, __arg_0);
+  oncut_Setter_(mthis, __arg_0) => mthis["oncut"] = __arg_0;
 
-  static insertAdjacentElement_Callback_0(mthis) native "Element_insertAdjacentElement_Callback";
-  insertAdjacentElement_Callback_0_(mthis) => insertAdjacentElement_Callback_0(mthis);
+  onpaste_Getter_(mthis) => mthis["onpaste"];
 
-  static insertAdjacentElement_Callback_1(mthis, __arg_0) native "Element_insertAdjacentElement_Callback";
-  insertAdjacentElement_Callback_1_(mthis, __arg_0) => insertAdjacentElement_Callback_1(mthis, __arg_0);
+  onpaste_Setter_(mthis, __arg_0) => mthis["onpaste"] = __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);
+  onsearch_Getter_(mthis) => mthis["onsearch"];
 
-  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);
+  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
 
-  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);
+  onselectstart_Getter_(mthis) => mthis["onselectstart"];
 
-  static insertAdjacentHTML_Callback_0(mthis) native "Element_insertAdjacentHTML_Callback";
-  insertAdjacentHTML_Callback_0_(mthis) => insertAdjacentHTML_Callback_0(mthis);
+  onselectstart_Setter_(mthis, __arg_0) => mthis["onselectstart"] = __arg_0;
 
-  static insertAdjacentHTML_Callback_1(mthis, __arg_0) native "Element_insertAdjacentHTML_Callback";
-  insertAdjacentHTML_Callback_1_(mthis, __arg_0) => insertAdjacentHTML_Callback_1(mthis, __arg_0);
+  ontouchcancel_Getter_(mthis) => mthis["ontouchcancel"];
 
-  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);
+  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
 
-  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);
+  ontouchend_Getter_(mthis) => mthis["ontouchend"];
 
-  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);
+  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
 
-  static insertAdjacentText_Callback_0(mthis) native "Element_insertAdjacentText_Callback";
-  insertAdjacentText_Callback_0_(mthis) => insertAdjacentText_Callback_0(mthis);
+  ontouchmove_Getter_(mthis) => mthis["ontouchmove"];
 
-  static insertAdjacentText_Callback_1(mthis, __arg_0) native "Element_insertAdjacentText_Callback";
-  insertAdjacentText_Callback_1_(mthis, __arg_0) => insertAdjacentText_Callback_1(mthis, __arg_0);
+  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __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);
+  ontouchstart_Getter_(mthis) => mthis["ontouchstart"];
 
-  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);
+  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
 
-  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);
+  onwebkitfullscreenchange_Getter_(mthis) => mthis["onwebkitfullscreenchange"];
 
-  static lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
-  lastElementChild_Getter_(mthis) => lastElementChild_Getter(mthis);
+  onwebkitfullscreenchange_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenchange"] = __arg_0;
 
-  static localName_Getter(mthis) native "Element_localName_Getter";
-  localName_Getter_(mthis) => localName_Getter(mthis);
+  onwebkitfullscreenerror_Getter_(mthis) => mthis["onwebkitfullscreenerror"];
 
-  static matches_Callback_0(mthis) native "Element_matches_Callback";
-  matches_Callback_0_(mthis) => matches_Callback_0(mthis);
+  onwebkitfullscreenerror_Setter_(mthis, __arg_0) => mthis["onwebkitfullscreenerror"] = __arg_0;
 
-  static matches_Callback_1(mthis, __arg_0) native "Element_matches_Callback";
-  matches_Callback_1_(mthis, __arg_0) => matches_Callback_1(mthis, __arg_0);
+  onwheel_Getter_(mthis) => mthis["onwheel"];
 
-  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);
+  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
 
-  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);
+  outerHTML_Getter_(mthis) => mthis["outerHTML"];
 
-  static namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
-  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
+  outerHTML_Setter_(mthis, __arg_0) => mthis["outerHTML"] = __arg_0;
 
-  static nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
-  nextElementSibling_Getter_(mthis) => nextElementSibling_Getter(mthis);
+  prefix_Getter_(mthis) => mthis["prefix"];
 
-  static offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
-  offsetHeight_Getter_(mthis) => offsetHeight_Getter(mthis);
+  prefix_Setter_(mthis, __arg_0) => mthis["prefix"] = __arg_0;
 
-  static offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
-  offsetLeft_Getter_(mthis) => offsetLeft_Getter(mthis);
+  previousElementSibling_Getter_(mthis) => mthis["previousElementSibling"];
 
-  static offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
-  offsetParent_Getter_(mthis) => offsetParent_Getter(mthis);
+  querySelectorAll_Callback_0_(mthis) => mthis.callMethod("querySelectorAll", []);
 
-  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);
+  querySelectorAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelectorAll", [__arg_0]);
 
-  static scrollIntoViewIfNeeded_Callback_1(mthis, __arg_0) native "Element_scrollIntoViewIfNeeded_Callback";
-  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => scrollIntoViewIfNeeded_Callback_1(mthis, __arg_0);
+  querySelector_Callback_0_(mthis) => mthis.callMethod("querySelector", []);
 
-  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);
+  querySelector_Callback_1_(mthis, __arg_0) => mthis.callMethod("querySelector", [__arg_0]);
 
-  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);
+  removeAttributeNS_Callback_0_(mthis) => mthis.callMethod("removeAttributeNS", []);
 
-  static scrollIntoView_Callback_0(mthis) native "Element_scrollIntoView_Callback";
-  scrollIntoView_Callback_0_(mthis) => scrollIntoView_Callback_0(mthis);
+  removeAttributeNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeAttributeNS", [__arg_0]);
 
-  static scrollIntoView_Callback_1(mthis, __arg_0) native "Element_scrollIntoView_Callback";
-  scrollIntoView_Callback_1_(mthis, __arg_0) => scrollIntoView_Callback_1(mthis, __arg_0);
+  removeAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("removeAttributeNS", [__arg_0, __arg_1]);
 
-  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);
+  removeAttribute_Callback_0_(mthis) => mthis.callMethod("removeAttribute", []);
 
-  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);
+  removeAttribute_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeAttribute", [__arg_0]);
 
-  static scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
-  scrollLeft_Getter_(mthis) => scrollLeft_Getter(mthis);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  static scrollLeft_Setter(mthis, __arg_0) native "Element_scrollLeft_Setter";
-  scrollLeft_Setter_(mthis, __arg_0) => scrollLeft_Setter(mthis, __arg_0);
+  requestFullscreen_Callback_0_(mthis) => mthis.callMethod("requestFullscreen", []);
 
-  static scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
-  scrollTop_Getter_(mthis) => scrollTop_Getter(mthis);
+  requestPointerLock_Callback_0_(mthis) => mthis.callMethod("requestPointerLock", []);
 
-  static scrollTop_Setter(mthis, __arg_0) native "Element_scrollTop_Setter";
-  scrollTop_Setter_(mthis, __arg_0) => scrollTop_Setter(mthis, __arg_0);
+  scrollHeight_Getter_(mthis) => mthis["scrollHeight"];
 
-  static scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
-  scrollWidth_Getter_(mthis) => scrollWidth_Getter(mthis);
+  scrollIntoViewIfNeeded_Callback_0_(mthis) => mthis.callMethod("scrollIntoViewIfNeeded", []);
 
-  static setAttributeNS_Callback_1(mthis, __arg_0) native "Element_setAttributeNS_Callback";
-  setAttributeNS_Callback_1_(mthis, __arg_0) => setAttributeNS_Callback_1(mthis, __arg_0);
+  scrollIntoViewIfNeeded_Callback_1_(mthis, __arg_0) => mthis.callMethod("scrollIntoViewIfNeeded", [__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);
+  scrollIntoView_Callback_0_(mthis) => mthis.callMethod("scrollIntoView", []);
 
-  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);
+  scrollIntoView_Callback_1_(mthis, __arg_0) => mthis.callMethod("scrollIntoView", [__arg_0]);
 
-  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);
+  scrollLeft_Getter_(mthis) => mthis["scrollLeft"];
 
-  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);
+  scrollLeft_Setter_(mthis, __arg_0) => mthis["scrollLeft"] = __arg_0;
 
-  static setAttribute_Callback_0(mthis) native "Element_setAttribute_Callback";
-  setAttribute_Callback_0_(mthis) => setAttribute_Callback_0(mthis);
+  scrollTop_Getter_(mthis) => mthis["scrollTop"];
 
-  static setAttribute_Callback_1(mthis, __arg_0) native "Element_setAttribute_Callback";
-  setAttribute_Callback_1_(mthis, __arg_0) => setAttribute_Callback_1(mthis, __arg_0);
+  scrollTop_Setter_(mthis, __arg_0) => mthis["scrollTop"] = __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);
+  scrollWidth_Getter_(mthis) => mthis["scrollWidth"];
 
-  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);
+  setAttributeNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("setAttributeNS", [__arg_0]);
 
-  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);
+  setAttributeNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setAttributeNS", [__arg_0, __arg_1]);
 
-  static shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
-  shadowRoot_Getter_(mthis) => shadowRoot_Getter(mthis);
+  setAttributeNS_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setAttributeNS", [__arg_0, __arg_1, __arg_2]);
 
-  static style_Getter(mthis) native "Element_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  setAttribute_Callback_0_(mthis) => mthis.callMethod("setAttribute", []);
 
-  static tagName_Getter(mthis) native "Element_tagName_Getter";
-  tagName_Getter_(mthis) => tagName_Getter(mthis);
+  setAttribute_Callback_1_(mthis, __arg_0) => mthis.callMethod("setAttribute", [__arg_0]);
 
-  static webkitRequestFullScreen_Callback_0(mthis) native "Element_webkitRequestFullScreen_Callback";
-  webkitRequestFullScreen_Callback_0_(mthis) => webkitRequestFullScreen_Callback_0(mthis);
+  setAttribute_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setAttribute", [__arg_0, __arg_1]);
 
-  static webkitRequestFullScreen_Callback_1(mthis, __arg_0) native "Element_webkitRequestFullScreen_Callback";
-  webkitRequestFullScreen_Callback_1_(mthis, __arg_0) => webkitRequestFullScreen_Callback_1(mthis, __arg_0);
+  shadowRoot_Getter_(mthis) => mthis["shadowRoot"];
 
-  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);
+  style_Getter_(mthis) => mthis["style"];
 
-  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);
+  tagName_Getter_(mthis) => mthis["tagName"];
 
-  static webkitRequestFullscreen_Callback_0(mthis) native "Element_webkitRequestFullscreen_Callback";
-  webkitRequestFullscreen_Callback_0_(mthis) => webkitRequestFullscreen_Callback_0(mthis);
+  webkitRequestFullScreen_Callback_0_(mthis) => mthis.callMethod("webkitRequestFullScreen", []);
 
-  static webkitRequestFullscreen_Callback_1(mthis, __arg_0) native "Element_webkitRequestFullscreen_Callback";
-  webkitRequestFullscreen_Callback_1_(mthis, __arg_0) => webkitRequestFullscreen_Callback_1(mthis, __arg_0);
+  webkitRequestFullScreen_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitRequestFullScreen", [__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);
+  webkitRequestFullscreen_Callback_0_(mthis) => mthis.callMethod("webkitRequestFullscreen", []);
 
 }
 
 class BlinkEntry {
   static final instance = new BlinkEntry();
 
-  static copyTo_Callback_0(mthis) native "Entry_copyTo_Callback";
-  copyTo_Callback_0_(mthis) => copyTo_Callback_0(mthis);
+  copyTo_Callback_0_(mthis) => mthis.callMethod("copyTo", []);
 
-  static copyTo_Callback_1(mthis, __arg_0) native "Entry_copyTo_Callback";
-  copyTo_Callback_1_(mthis, __arg_0) => copyTo_Callback_1(mthis, __arg_0);
+  copyTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("copyTo", [__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);
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("copyTo", [__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);
+  copyTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("copyTo", [__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);
+  copyTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("copyTo", [__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);
+  filesystem_Getter_(mthis) => mthis["filesystem"];
 
-  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);
+  fullPath_Getter_(mthis) => mthis["fullPath"];
 
-  static filesystem_Getter(mthis) native "Entry_filesystem_Getter";
-  filesystem_Getter_(mthis) => filesystem_Getter(mthis);
+  getMetadata_Callback_0_(mthis) => mthis.callMethod("getMetadata", []);
 
-  static fullPath_Getter(mthis) native "Entry_fullPath_Getter";
-  fullPath_Getter_(mthis) => fullPath_Getter(mthis);
+  getMetadata_Callback_1_(mthis, __arg_0) => mthis.callMethod("getMetadata", [__arg_0]);
 
-  static getMetadata_Callback_0(mthis) native "Entry_getMetadata_Callback";
-  getMetadata_Callback_0_(mthis) => getMetadata_Callback_0(mthis);
+  getMetadata_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getMetadata", [__arg_0, __arg_1]);
 
-  static getMetadata_Callback_1(mthis, __arg_0) native "Entry_getMetadata_Callback";
-  getMetadata_Callback_1_(mthis, __arg_0) => getMetadata_Callback_1(mthis, __arg_0);
+  getParent_Callback_0_(mthis) => mthis.callMethod("getParent", []);
 
-  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);
+  getParent_Callback_1_(mthis, __arg_0) => mthis.callMethod("getParent", [__arg_0]);
 
-  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);
+  getParent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getParent", [__arg_0, __arg_1]);
 
-  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);
+  isDirectory_Getter_(mthis) => mthis["isDirectory"];
 
-  static getParent_Callback_0(mthis) native "Entry_getParent_Callback";
-  getParent_Callback_0_(mthis) => getParent_Callback_0(mthis);
+  isFile_Getter_(mthis) => mthis["isFile"];
 
-  static getParent_Callback_1(mthis, __arg_0) native "Entry_getParent_Callback";
-  getParent_Callback_1_(mthis, __arg_0) => getParent_Callback_1(mthis, __arg_0);
+  moveTo_Callback_0_(mthis) => mthis.callMethod("moveTo", []);
 
-  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);
+  moveTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveTo", [__arg_0]);
 
-  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);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveTo", [__arg_0, __arg_1]);
 
-  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);
+  moveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("moveTo", [__arg_0, __arg_1, __arg_2]);
 
-  static isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
-  isDirectory_Getter_(mthis) => isDirectory_Getter(mthis);
+  moveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("moveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static isFile_Getter(mthis) native "Entry_isFile_Getter";
-  isFile_Getter_(mthis) => isFile_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static moveTo_Callback_0(mthis) native "Entry_moveTo_Callback";
-  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  static moveTo_Callback_1(mthis, __arg_0) native "Entry_moveTo_Callback";
-  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+  remove_Callback_1_(mthis, __arg_0) => mthis.callMethod("remove", [__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);
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("remove", [__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 remove_Callback_0(mthis) native "Entry_remove_Callback";
-  remove_Callback_0_(mthis) => remove_Callback_0(mthis);
-
-  static remove_Callback_1(mthis, __arg_0) native "Entry_remove_Callback";
-  remove_Callback_1_(mthis, __arg_0) => remove_Callback_1(mthis, __arg_0);
-
-  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 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 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 toURL_Callback_0(mthis) native "Entry_toURL_Callback";
-  toURL_Callback_0_(mthis) => toURL_Callback_0(mthis);
-
-  static toURL_Callback_1(mthis, __arg_0) native "Entry_toURL_Callback";
-  toURL_Callback_1_(mthis, __arg_0) => toURL_Callback_1(mthis, __arg_0);
-
-  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);
+  toURL_Callback_0_(mthis) => mthis.callMethod("toURL", []);
 
 }
 
 class BlinkEntrySync {
   static final instance = new BlinkEntrySync();
 
-  static copyTo_Callback_0(mthis) native "EntrySync_copyTo_Callback";
-  copyTo_Callback_0_(mthis) => copyTo_Callback_0(mthis);
+  copyTo_Callback_0_(mthis) => mthis.callMethod("copyTo", []);
 
-  static copyTo_Callback_1(mthis, __arg_0) native "EntrySync_copyTo_Callback";
-  copyTo_Callback_1_(mthis, __arg_0) => copyTo_Callback_1(mthis, __arg_0);
+  copyTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("copyTo", [__arg_0]);
 
-  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);
+  copyTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("copyTo", [__arg_0, __arg_1]);
 
-  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);
+  filesystem_Getter_(mthis) => mthis["filesystem"];
 
-  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);
+  fullPath_Getter_(mthis) => mthis["fullPath"];
 
-  static filesystem_Getter(mthis) native "EntrySync_filesystem_Getter";
-  filesystem_Getter_(mthis) => filesystem_Getter(mthis);
+  getMetadata_Callback_0_(mthis) => mthis.callMethod("getMetadata", []);
 
-  static fullPath_Getter(mthis) native "EntrySync_fullPath_Getter";
-  fullPath_Getter_(mthis) => fullPath_Getter(mthis);
+  getParent_Callback_0_(mthis) => mthis.callMethod("getParent", []);
 
-  static getMetadata_Callback_0(mthis) native "EntrySync_getMetadata_Callback";
-  getMetadata_Callback_0_(mthis) => getMetadata_Callback_0(mthis);
+  isDirectory_Getter_(mthis) => mthis["isDirectory"];
 
-  static getMetadata_Callback_1(mthis, __arg_0) native "EntrySync_getMetadata_Callback";
-  getMetadata_Callback_1_(mthis, __arg_0) => getMetadata_Callback_1(mthis, __arg_0);
+  isFile_Getter_(mthis) => mthis["isFile"];
 
-  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);
+  moveTo_Callback_0_(mthis) => mthis.callMethod("moveTo", []);
 
-  static getParent_Callback_0(mthis) native "EntrySync_getParent_Callback";
-  getParent_Callback_0_(mthis) => getParent_Callback_0(mthis);
+  moveTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveTo", [__arg_0]);
 
-  static getParent_Callback_1(mthis, __arg_0) native "EntrySync_getParent_Callback";
-  getParent_Callback_1_(mthis, __arg_0) => getParent_Callback_1(mthis, __arg_0);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveTo", [__arg_0, __arg_1]);
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
-  static isDirectory_Getter(mthis) native "EntrySync_isDirectory_Getter";
-  isDirectory_Getter_(mthis) => isDirectory_Getter(mthis);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  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);
+  toURL_Callback_0_(mthis) => mthis.callMethod("toURL", []);
 
 }
 
 class BlinkErrorEvent extends BlinkEvent {
   static final instance = new BlinkErrorEvent();
 
-  static colno_Getter(mthis) native "ErrorEvent_colno_Getter";
-  colno_Getter_(mthis) => colno_Getter(mthis);
+  colno_Getter_(mthis) => mthis["colno"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "ErrorEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["ErrorEvent"], [__arg_0, __arg_1]);
 
-  static error_Getter(mthis) native "ErrorEvent_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  error_Getter_(mthis) => mthis["error"];
 
-  static filename_Getter(mthis) native "ErrorEvent_filename_Getter";
-  filename_Getter_(mthis) => filename_Getter(mthis);
+  filename_Getter_(mthis) => mthis["filename"];
 
-  static lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
-  lineno_Getter_(mthis) => lineno_Getter(mthis);
+  lineno_Getter_(mthis) => mthis["lineno"];
 
-  static message_Getter(mthis) native "ErrorEvent_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
 }
 
 class BlinkEvent {
   static final instance = new BlinkEvent();
 
-  static bubbles_Getter(mthis) native "Event_bubbles_Getter";
-  bubbles_Getter_(mthis) => bubbles_Getter(mthis);
+  bubbles_Getter_(mthis) => mthis["bubbles"];
 
-  static cancelBubble_Getter(mthis) native "Event_cancelBubble_Getter";
-  cancelBubble_Getter_(mthis) => cancelBubble_Getter(mthis);
+  cancelBubble_Getter_(mthis) => mthis["cancelBubble"];
 
-  static cancelBubble_Setter(mthis, __arg_0) native "Event_cancelBubble_Setter";
-  cancelBubble_Setter_(mthis, __arg_0) => cancelBubble_Setter(mthis, __arg_0);
+  cancelBubble_Setter_(mthis, __arg_0) => mthis["cancelBubble"] = __arg_0;
 
-  static cancelable_Getter(mthis) native "Event_cancelable_Getter";
-  cancelable_Getter_(mthis) => cancelable_Getter(mthis);
+  cancelable_Getter_(mthis) => mthis["cancelable"];
 
-  static clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
-  clipboardData_Getter_(mthis) => clipboardData_Getter(mthis);
+  clipboardData_Getter_(mthis) => mthis["clipboardData"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Event_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Event"], [__arg_0, __arg_1]);
 
-  static currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
-  currentTarget_Getter_(mthis) => currentTarget_Getter(mthis);
+  currentTarget_Getter_(mthis) => mthis["currentTarget"];
 
-  static defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
-  defaultPrevented_Getter_(mthis) => defaultPrevented_Getter(mthis);
+  defaultPrevented_Getter_(mthis) => mthis["defaultPrevented"];
 
-  static eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
-  eventPhase_Getter_(mthis) => eventPhase_Getter(mthis);
+  eventPhase_Getter_(mthis) => mthis["eventPhase"];
 
-  static initEvent_Callback_0(mthis) native "Event_initEvent_Callback";
-  initEvent_Callback_0_(mthis) => initEvent_Callback_0(mthis);
+  initEvent_Callback_0_(mthis) => mthis.callMethod("initEvent", []);
 
-  static initEvent_Callback_1(mthis, __arg_0) native "Event_initEvent_Callback";
-  initEvent_Callback_1_(mthis, __arg_0) => initEvent_Callback_1(mthis, __arg_0);
+  initEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initEvent", [__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);
+  initEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initEvent", [__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);
+  initEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initEvent", [__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);
+  path_Getter_(mthis) => mthis["path"];
 
-  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);
+  preventDefault_Callback_0_(mthis) => mthis.callMethod("preventDefault", []);
 
-  static path_Getter(mthis) native "Event_path_Getter";
-  path_Getter_(mthis) => path_Getter(mthis);
+  returnValue_Getter_(mthis) => mthis["returnValue"];
 
-  static preventDefault_Callback_0(mthis) native "Event_preventDefault_Callback";
-  preventDefault_Callback_0_(mthis) => preventDefault_Callback_0(mthis);
+  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
 
-  static preventDefault_Callback_1(mthis, __arg_0) native "Event_preventDefault_Callback";
-  preventDefault_Callback_1_(mthis, __arg_0) => preventDefault_Callback_1(mthis, __arg_0);
+  stopImmediatePropagation_Callback_0_(mthis) => mthis.callMethod("stopImmediatePropagation", []);
 
-  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);
+  stopPropagation_Callback_0_(mthis) => mthis.callMethod("stopPropagation", []);
 
-  static returnValue_Getter(mthis) native "Event_returnValue_Getter";
-  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static returnValue_Setter(mthis, __arg_0) native "Event_returnValue_Setter";
-  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
+  timeStamp_Getter_(mthis) => mthis["timeStamp"];
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "EventSource_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["EventSource"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["EventSource"], [__arg_0]);
 
-  static constructorCallback_0() native "EventSource_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["EventSource"], [__arg_0, __arg_1]);
 
-  static constructorCallback_1(__arg_0) native "EventSource_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "EventSource_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  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);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  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);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onerror_Getter(mthis) native "EventSource_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onopen_Getter_(mthis) => mthis["onopen"];
 
-  static onerror_Setter(mthis, __arg_0) native "EventSource_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "EventSource_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static onmessage_Setter(mthis, __arg_0) native "EventSource_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  url_Getter_(mthis) => mthis["url"];
 
-  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);
+  withCredentials_Getter_(mthis) => mthis["withCredentials"];
 
 }
 
 class BlinkEventTarget {
   static final instance = new BlinkEventTarget();
 
-  static addEventListener_Callback_0(mthis) native "EventTarget_addEventListener_Callback";
-  addEventListener_Callback_0_(mthis) => addEventListener_Callback_0(mthis);
+  addEventListener_Callback_0_(mthis) => mthis.callMethod("addEventListener", []);
 
-  static addEventListener_Callback_1(mthis, __arg_0) native "EventTarget_addEventListener_Callback";
-  addEventListener_Callback_1_(mthis, __arg_0) => addEventListener_Callback_1(mthis, __arg_0);
+  addEventListener_Callback_1_(mthis, __arg_0) => mthis.callMethod("addEventListener", [__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);
+  addEventListener_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addEventListener", [__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);
+  addEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("addEventListener", [__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);
+  dispatchEvent_Callback_0_(mthis) => mthis.callMethod("dispatchEvent", []);
 
-  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);
+  dispatchEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("dispatchEvent", [__arg_0]);
 
-  static dispatchEvent_Callback_0(mthis) native "EventTarget_dispatchEvent_Callback";
-  dispatchEvent_Callback_0_(mthis) => dispatchEvent_Callback_0(mthis);
+  removeEventListener_Callback_0_(mthis) => mthis.callMethod("removeEventListener", []);
 
-  static dispatchEvent_Callback_1(mthis, __arg_0) native "EventTarget_dispatchEvent_Callback";
-  dispatchEvent_Callback_1_(mthis, __arg_0) => dispatchEvent_Callback_1(mthis, __arg_0);
+  removeEventListener_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeEventListener", [__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);
+  removeEventListener_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("removeEventListener", [__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);
+  removeEventListener_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("removeEventListener", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkExtendableEvent extends BlinkEvent {
   static final instance = new BlinkExtendableEvent();
 
-  static waitUntil_Callback_0(mthis) native "ExtendableEvent_waitUntil_Callback";
-  waitUntil_Callback_0_(mthis) => waitUntil_Callback_0(mthis);
+  waitUntil_Callback_0_(mthis) => mthis.callMethod("waitUntil", []);
 
-  static waitUntil_Callback_1(mthis, __arg_0) native "ExtendableEvent_waitUntil_Callback";
-  waitUntil_Callback_1_(mthis, __arg_0) => waitUntil_Callback_1(mthis, __arg_0);
-
-  static waitUntil_Callback_2(mthis, __arg_0, __arg_1) native "ExtendableEvent_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 "ExtendableEvent_waitUntil_Callback";
-  waitUntil_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => waitUntil_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  waitUntil_Callback_1_(mthis, __arg_0) => mthis.callMethod("waitUntil", [__arg_0]);
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["FederatedCredential"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["FederatedCredential"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["FederatedCredential"], [__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);
+  federation_Getter_(mthis) => mthis["federation"];
 
 }
 
 class BlinkFetchEvent extends BlinkEvent {
   static final instance = new BlinkFetchEvent();
 
-  static isReload_Getter(mthis) native "FetchEvent_isReload_Getter";
-  isReload_Getter_(mthis) => isReload_Getter(mthis);
+  isReload_Getter_(mthis) => mthis["isReload"];
 
-  static request_Getter(mthis) native "FetchEvent_request_Getter";
-  request_Getter_(mthis) => request_Getter(mthis);
+  request_Getter_(mthis) => mthis["request"];
 
-  static respondWith_Callback_0(mthis) native "FetchEvent_respondWith_Callback";
-  respondWith_Callback_0_(mthis) => respondWith_Callback_0(mthis);
+  respondWith_Callback_0_(mthis) => mthis.callMethod("respondWith", []);
 
-  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);
+  respondWith_Callback_1_(mthis, __arg_0) => mthis.callMethod("respondWith", [__arg_0]);
 
 }
 
 class BlinkFile extends BlinkBlob {
   static final instance = new BlinkFile();
 
-  static constructorCallback_0() native "File_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["File"], []);
 
-  static constructorCallback_1(__arg_0) native "File_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["File"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "File_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["File"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["File"], [__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);
+  lastModifiedDate_Getter_(mthis) => mthis["lastModifiedDate"];
 
-  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);
+  lastModified_Getter_(mthis) => mthis["lastModified"];
 
-  static lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
-  lastModifiedDate_Getter_(mthis) => lastModifiedDate_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  webkitRelativePath_Getter_(mthis) => mthis["webkitRelativePath"];
 
 }
 
 class BlinkFileEntry extends BlinkEntry {
   static final instance = new BlinkFileEntry();
 
-  static createWriter_Callback_0(mthis) native "FileEntry_createWriter_Callback";
-  createWriter_Callback_0_(mthis) => createWriter_Callback_0(mthis);
+  createWriter_Callback_0_(mthis) => mthis.callMethod("createWriter", []);
 
-  static createWriter_Callback_1(mthis, __arg_0) native "FileEntry_createWriter_Callback";
-  createWriter_Callback_1_(mthis, __arg_0) => createWriter_Callback_1(mthis, __arg_0);
+  createWriter_Callback_1_(mthis, __arg_0) => mthis.callMethod("createWriter", [__arg_0]);
 
-  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);
+  createWriter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createWriter", [__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);
+  file_Callback_0_(mthis) => mthis.callMethod("file", []);
 
-  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);
+  file_Callback_1_(mthis, __arg_0) => mthis.callMethod("file", [__arg_0]);
 
-  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);
+  file_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("file", [__arg_0, __arg_1]);
 
 }
 
 class BlinkFileEntrySync extends BlinkEntrySync {
   static final instance = new BlinkFileEntrySync();
 
-  static createWriter_Callback_0(mthis) native "FileEntrySync_createWriter_Callback";
-  createWriter_Callback_0_(mthis) => createWriter_Callback_0(mthis);
+  createWriter_Callback_0_(mthis) => mthis.callMethod("createWriter", []);
 
-  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);
+  file_Callback_0_(mthis) => mthis.callMethod("file", []);
 
 }
 
 class BlinkFileError extends BlinkDOMError {
   static final instance = new BlinkFileError();
 
-  static code_Getter(mthis) native "FileError_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
 }
 
 class BlinkFileList {
   static final instance = new BlinkFileList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "FileList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "FileList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "FileList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 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);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "FileReader_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["FileReader"], []);
 
-  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);
+  error_Getter_(mthis) => mthis["error"];
 
-  static constructorCallback_0() native "FileReader_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static constructorCallback_1(__arg_0) native "FileReader_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static constructorCallback_2(__arg_0, __arg_1) native "FileReader_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static error_Getter(mthis) native "FileReader_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onabort_Getter(mthis) native "FileReader_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static onabort_Setter(mthis, __arg_0) native "FileReader_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static onerror_Getter(mthis) native "FileReader_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onloadend_Getter_(mthis) => mthis["onloadend"];
 
-  static onerror_Setter(mthis, __arg_0) native "FileReader_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
 
-  static onload_Getter(mthis) native "FileReader_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static onload_Setter(mthis, __arg_0) native "FileReader_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static onloadend_Getter(mthis) native "FileReader_onloadend_Getter";
-  onloadend_Getter_(mthis) => onloadend_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onloadend_Setter(mthis, __arg_0) native "FileReader_onloadend_Setter";
-  onloadend_Setter_(mthis, __arg_0) => onloadend_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onloadstart_Getter(mthis) native "FileReader_onloadstart_Getter";
-  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+  readAsArrayBuffer_Callback_0_(mthis) => mthis.callMethod("readAsArrayBuffer", []);
 
-  static onloadstart_Setter(mthis, __arg_0) native "FileReader_onloadstart_Setter";
-  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsArrayBuffer", [__arg_0]);
 
-  static onprogress_Getter(mthis) native "FileReader_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  readAsBinaryString_Callback_0_(mthis) => mthis.callMethod("readAsBinaryString", []);
 
-  static onprogress_Setter(mthis, __arg_0) native "FileReader_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsBinaryString", [__arg_0]);
 
-  static readAsArrayBuffer_Callback_0(mthis) native "FileReader_readAsArrayBuffer_Callback";
-  readAsArrayBuffer_Callback_0_(mthis) => readAsArrayBuffer_Callback_0(mthis);
+  readAsDataURL_Callback_0_(mthis) => mthis.callMethod("readAsDataURL", []);
 
-  static readAsArrayBuffer_Callback_1(mthis, __arg_0) native "FileReader_readAsArrayBuffer_Callback";
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => readAsArrayBuffer_Callback_1(mthis, __arg_0);
+  readAsDataURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsDataURL", [__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);
+  readAsText_Callback_0_(mthis) => mthis.callMethod("readAsText", []);
 
-  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);
+  readAsText_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsText", [__arg_0]);
 
-  static readAsBinaryString_Callback_0(mthis) native "FileReader_readAsBinaryString_Callback";
-  readAsBinaryString_Callback_0_(mthis) => readAsBinaryString_Callback_0(mthis);
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("readAsText", [__arg_0, __arg_1]);
 
-  static readAsBinaryString_Callback_1(mthis, __arg_0) native "FileReader_readAsBinaryString_Callback";
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => readAsBinaryString_Callback_1(mthis, __arg_0);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  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);
+  result_Getter_(mthis) => mthis["result"];
 
 }
 
 class BlinkFileReaderSync {
   static final instance = new BlinkFileReaderSync();
 
-  static constructorCallback_0() native "FileReaderSync_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["FileReaderSync"], []);
 
-  static constructorCallback_1(__arg_0) native "FileReaderSync_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  readAsArrayBuffer_Callback_0_(mthis) => mthis.callMethod("readAsArrayBuffer", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "FileReaderSync_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsArrayBuffer", [__arg_0]);
 
-  static readAsArrayBuffer_Callback_0(mthis) native "FileReaderSync_readAsArrayBuffer_Callback";
-  readAsArrayBuffer_Callback_0_(mthis) => readAsArrayBuffer_Callback_0(mthis);
+  readAsBinaryString_Callback_0_(mthis) => mthis.callMethod("readAsBinaryString", []);
 
-  static readAsArrayBuffer_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsArrayBuffer_Callback";
-  readAsArrayBuffer_Callback_1_(mthis, __arg_0) => readAsArrayBuffer_Callback_1(mthis, __arg_0);
+  readAsBinaryString_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsBinaryString", [__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);
+  readAsDataURL_Callback_0_(mthis) => mthis.callMethod("readAsDataURL", []);
 
-  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);
+  readAsDataURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsDataURL", [__arg_0]);
 
-  static readAsBinaryString_Callback_0(mthis) native "FileReaderSync_readAsBinaryString_Callback";
-  readAsBinaryString_Callback_0_(mthis) => readAsBinaryString_Callback_0(mthis);
+  readAsText_Callback_0_(mthis) => mthis.callMethod("readAsText", []);
 
-  static readAsBinaryString_Callback_1(mthis, __arg_0) native "FileReaderSync_readAsBinaryString_Callback";
-  readAsBinaryString_Callback_1_(mthis, __arg_0) => readAsBinaryString_Callback_1(mthis, __arg_0);
+  readAsText_Callback_1_(mthis, __arg_0) => mthis.callMethod("readAsText", [__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);
+  readAsText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("readAsText", [__arg_0, __arg_1]);
 
 }
 
 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);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "FileWriter_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  error_Getter_(mthis) => mthis["error"];
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static error_Getter(mthis) native "FileWriter_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static length_Getter(mthis) native "FileWriter_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static onabort_Getter(mthis) native "FileWriter_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onabort_Setter(mthis, __arg_0) native "FileWriter_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "FileWriter_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onerror_Setter(mthis, __arg_0) native "FileWriter_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "FileWriter_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onwrite_Getter_(mthis) => mthis["onwrite"];
 
-  static onprogress_Setter(mthis, __arg_0) native "FileWriter_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onwrite_Setter_(mthis, __arg_0) => mthis["onwrite"] = __arg_0;
 
-  static onwrite_Getter(mthis) native "FileWriter_onwrite_Getter";
-  onwrite_Getter_(mthis) => onwrite_Getter(mthis);
+  onwriteend_Getter_(mthis) => mthis["onwriteend"];
 
-  static onwrite_Setter(mthis, __arg_0) native "FileWriter_onwrite_Setter";
-  onwrite_Setter_(mthis, __arg_0) => onwrite_Setter(mthis, __arg_0);
+  onwriteend_Setter_(mthis, __arg_0) => mthis["onwriteend"] = __arg_0;
 
-  static onwriteend_Getter(mthis) native "FileWriter_onwriteend_Getter";
-  onwriteend_Getter_(mthis) => onwriteend_Getter(mthis);
+  onwritestart_Getter_(mthis) => mthis["onwritestart"];
 
-  static onwriteend_Setter(mthis, __arg_0) native "FileWriter_onwriteend_Setter";
-  onwriteend_Setter_(mthis, __arg_0) => onwriteend_Setter(mthis, __arg_0);
+  onwritestart_Setter_(mthis, __arg_0) => mthis["onwritestart"] = __arg_0;
 
-  static onwritestart_Getter(mthis) native "FileWriter_onwritestart_Getter";
-  onwritestart_Getter_(mthis) => onwritestart_Getter(mthis);
+  position_Getter_(mthis) => mthis["position"];
 
-  static onwritestart_Setter(mthis, __arg_0) native "FileWriter_onwritestart_Setter";
-  onwritestart_Setter_(mthis, __arg_0) => onwritestart_Setter(mthis, __arg_0);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static position_Getter(mthis) native "FileWriter_position_Getter";
-  position_Getter_(mthis) => position_Getter(mthis);
+  seek_Callback_0_(mthis) => mthis.callMethod("seek", []);
 
-  static readyState_Getter(mthis) native "FileWriter_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  seek_Callback_1_(mthis, __arg_0) => mthis.callMethod("seek", [__arg_0]);
 
-  static seek_Callback_0(mthis) native "FileWriter_seek_Callback";
-  seek_Callback_0_(mthis) => seek_Callback_0(mthis);
+  truncate_Callback_0_(mthis) => mthis.callMethod("truncate", []);
 
-  static seek_Callback_1(mthis, __arg_0) native "FileWriter_seek_Callback";
-  seek_Callback_1_(mthis, __arg_0) => seek_Callback_1(mthis, __arg_0);
+  truncate_Callback_1_(mthis, __arg_0) => mthis.callMethod("truncate", [__arg_0]);
 
-  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);
+  write_Callback_0_(mthis) => mthis.callMethod("write", []);
 
-  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);
+  write_Callback_1_(mthis, __arg_0) => mthis.callMethod("write", [__arg_0]);
 
 }
 
 class BlinkFileWriterSync {
   static final instance = new BlinkFileWriterSync();
 
-  static length_Getter(mthis) native "FileWriterSync_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  length_Getter_(mthis) => mthis["length"];
 
-  static position_Getter(mthis) native "FileWriterSync_position_Getter";
-  position_Getter_(mthis) => position_Getter(mthis);
+  position_Getter_(mthis) => mthis["position"];
 
-  static seek_Callback_0(mthis) native "FileWriterSync_seek_Callback";
-  seek_Callback_0_(mthis) => seek_Callback_0(mthis);
+  seek_Callback_0_(mthis) => mthis.callMethod("seek", []);
 
-  static seek_Callback_1(mthis, __arg_0) native "FileWriterSync_seek_Callback";
-  seek_Callback_1_(mthis, __arg_0) => seek_Callback_1(mthis, __arg_0);
+  seek_Callback_1_(mthis, __arg_0) => mthis.callMethod("seek", [__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);
+  truncate_Callback_0_(mthis) => mthis.callMethod("truncate", []);
 
-  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);
+  truncate_Callback_1_(mthis, __arg_0) => mthis.callMethod("truncate", [__arg_0]);
 
-  static truncate_Callback_0(mthis) native "FileWriterSync_truncate_Callback";
-  truncate_Callback_0_(mthis) => truncate_Callback_0(mthis);
+  write_Callback_0_(mthis) => mthis.callMethod("write", []);
 
-  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);
+  write_Callback_1_(mthis, __arg_0) => mthis.callMethod("write", [__arg_0]);
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["FocusEvent"], [__arg_0, __arg_1]);
 
-  static relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
-  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
+  relatedTarget_Getter_(mthis) => mthis["relatedTarget"];
 
 }
 
 class BlinkFontFace {
   static final instance = new BlinkFontFace();
 
-  static constructorCallback_0() native "FontFace_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["FontFace"], []);
 
-  static constructorCallback_1(__arg_0) native "FontFace_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["FontFace"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "FontFace_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["FontFace"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["FontFace"], [__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);
+  family_Getter_(mthis) => mthis["family"];
 
-  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);
+  family_Setter_(mthis, __arg_0) => mthis["family"] = __arg_0;
 
-  static family_Getter(mthis) native "FontFace_family_Getter";
-  family_Getter_(mthis) => family_Getter(mthis);
+  featureSettings_Getter_(mthis) => mthis["featureSettings"];
 
-  static family_Setter(mthis, __arg_0) native "FontFace_family_Setter";
-  family_Setter_(mthis, __arg_0) => family_Setter(mthis, __arg_0);
+  featureSettings_Setter_(mthis, __arg_0) => mthis["featureSettings"] = __arg_0;
 
-  static featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
-  featureSettings_Getter_(mthis) => featureSettings_Getter(mthis);
+  load_Callback_0_(mthis) => mthis.callMethod("load", []);
 
-  static featureSettings_Setter(mthis, __arg_0) native "FontFace_featureSettings_Setter";
-  featureSettings_Setter_(mthis, __arg_0) => featureSettings_Setter(mthis, __arg_0);
+  loaded_Getter_(mthis) => mthis["loaded"];
 
-  static load_Callback_0(mthis) native "FontFace_load_Callback";
-  load_Callback_0_(mthis) => load_Callback_0(mthis);
+  status_Getter_(mthis) => mthis["status"];
 
-  static load_Callback_1(mthis, __arg_0) native "FontFace_load_Callback";
-  load_Callback_1_(mthis, __arg_0) => load_Callback_1(mthis, __arg_0);
+  stretch_Getter_(mthis) => mthis["stretch"];
 
-  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);
+  stretch_Setter_(mthis, __arg_0) => mthis["stretch"] = __arg_0;
 
-  static loaded_Getter(mthis) native "FontFace_loaded_Getter";
-  loaded_Getter_(mthis) => loaded_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
-  static status_Getter(mthis) native "FontFace_status_Getter";
-  status_Getter_(mthis) => status_Getter(mthis);
+  style_Setter_(mthis, __arg_0) => mthis["style"] = __arg_0;
 
-  static stretch_Getter(mthis) native "FontFace_stretch_Getter";
-  stretch_Getter_(mthis) => stretch_Getter(mthis);
+  unicodeRange_Getter_(mthis) => mthis["unicodeRange"];
 
-  static stretch_Setter(mthis, __arg_0) native "FontFace_stretch_Setter";
-  stretch_Setter_(mthis, __arg_0) => stretch_Setter(mthis, __arg_0);
+  unicodeRange_Setter_(mthis, __arg_0) => mthis["unicodeRange"] = __arg_0;
 
-  static style_Getter(mthis) native "FontFace_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  variant_Getter_(mthis) => mthis["variant"];
 
-  static style_Setter(mthis, __arg_0) native "FontFace_style_Setter";
-  style_Setter_(mthis, __arg_0) => style_Setter(mthis, __arg_0);
+  variant_Setter_(mthis, __arg_0) => mthis["variant"] = __arg_0;
 
-  static unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
-  unicodeRange_Getter_(mthis) => unicodeRange_Getter(mthis);
+  weight_Getter_(mthis) => mthis["weight"];
 
-  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, __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, __arg_0) native "FontFace_weight_Setter";
-  weight_Setter_(mthis, __arg_0) => weight_Setter(mthis, __arg_0);
+  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
 
 }
 
 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);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  static add_Callback_1(mthis, __arg_0) native "FontFaceSet_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__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);
+  check_Callback_0_(mthis) => mthis.callMethod("check", []);
 
-  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);
+  check_Callback_1_(mthis, __arg_0) => mthis.callMethod("check", [__arg_0]);
 
-  static check_Callback_0(mthis) native "FontFaceSet_check_Callback";
-  check_Callback_0_(mthis) => check_Callback_0(mthis);
+  check_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("check", [__arg_0, __arg_1]);
 
-  static check_Callback_1(mthis, __arg_0) native "FontFaceSet_check_Callback";
-  check_Callback_1_(mthis, __arg_0) => check_Callback_1(mthis, __arg_0);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  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);
+  delete_Callback_1_(mthis, __arg_0) => mthis.callMethod("delete", [__arg_0]);
 
-  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);
+  forEach_Callback_0_(mthis) => mthis.callMethod("forEach", []);
 
-  static clear_Callback_0(mthis) native "FontFaceSet_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  forEach_Callback_1_(mthis, __arg_0) => mthis.callMethod("forEach", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "FontFaceSet_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("forEach", [__arg_0, __arg_1]);
 
-  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);
+  has_Callback_0_(mthis) => mthis.callMethod("has", []);
 
-  static delete_Callback_0(mthis) native "FontFaceSet_delete_Callback";
-  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+  has_Callback_1_(mthis, __arg_0) => mthis.callMethod("has", [__arg_0]);
 
-  static delete_Callback_1(mthis, __arg_0) native "FontFaceSet_delete_Callback";
-  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+  onloading_Getter_(mthis) => mthis["onloading"];
 
-  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);
+  onloading_Setter_(mthis, __arg_0) => mthis["onloading"] = __arg_0;
 
-  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);
+  onloadingdone_Getter_(mthis) => mthis["onloadingdone"];
 
-  static forEach_Callback_0(mthis) native "FontFaceSet_forEach_Callback";
-  forEach_Callback_0_(mthis) => forEach_Callback_0(mthis);
+  onloadingdone_Setter_(mthis, __arg_0) => mthis["onloadingdone"] = __arg_0;
 
-  static forEach_Callback_1(mthis, __arg_0) native "FontFaceSet_forEach_Callback";
-  forEach_Callback_1_(mthis, __arg_0) => forEach_Callback_1(mthis, __arg_0);
+  onloadingerror_Getter_(mthis) => mthis["onloadingerror"];
 
-  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);
+  onloadingerror_Setter_(mthis, __arg_0) => mthis["onloadingerror"] = __arg_0;
 
-  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);
+  size_Getter_(mthis) => mthis["size"];
 
-  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);
+  status_Getter_(mthis) => mthis["status"];
 
 }
 
 class BlinkFontFaceSetLoadEvent extends BlinkEvent {
   static final instance = new BlinkFontFaceSetLoadEvent();
 
-  static fontfaces_Getter(mthis) native "FontFaceSetLoadEvent_fontfaces_Getter";
-  fontfaces_Getter_(mthis) => fontfaces_Getter(mthis);
+  fontfaces_Getter_(mthis) => mthis["fontfaces"];
 
 }
 
 class BlinkFormData {
   static final instance = new BlinkFormData();
 
-  static append_Callback_0(mthis) native "FormData_append_Callback";
-  append_Callback_0_(mthis) => append_Callback_0(mthis);
+  append_Callback_0_(mthis) => mthis.callMethod("append", []);
 
-  static append_Callback_1(mthis, __arg_0) native "FormData_append_Callback";
-  append_Callback_1_(mthis, __arg_0) => append_Callback_1(mthis, __arg_0);
+  append_Callback_1_(mthis, __arg_0) => mthis.callMethod("append", [__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);
+  append_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("append", [__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);
+  append_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("append", [__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);
+  constructorCallback_0_() => new js.JsObject(js.context["FormData"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["FormData"], [__arg_0]);
 
 }
 
 class BlinkGainNode extends BlinkAudioNode {
   static final instance = new BlinkGainNode();
 
-  static gain_Getter(mthis) native "GainNode_gain_Getter";
-  gain_Getter_(mthis) => gain_Getter(mthis);
+  gain_Getter_(mthis) => mthis["gain"];
 
 }
 
 class BlinkGamepad {
   static final instance = new BlinkGamepad();
 
-  static axes_Getter(mthis) native "Gamepad_axes_Getter";
-  axes_Getter_(mthis) => axes_Getter(mthis);
+  axes_Getter_(mthis) => mthis["axes"];
 
-  static connected_Getter(mthis) native "Gamepad_connected_Getter";
-  connected_Getter_(mthis) => connected_Getter(mthis);
+  connected_Getter_(mthis) => mthis["connected"];
 
-  static id_Getter(mthis) native "Gamepad_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static index_Getter(mthis) native "Gamepad_index_Getter";
-  index_Getter_(mthis) => index_Getter(mthis);
+  index_Getter_(mthis) => mthis["index"];
 
-  static mapping_Getter(mthis) native "Gamepad_mapping_Getter";
-  mapping_Getter_(mthis) => mapping_Getter(mthis);
+  mapping_Getter_(mthis) => mthis["mapping"];
 
-  static timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
-  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+  timestamp_Getter_(mthis) => mthis["timestamp"];
 
 }
 
 class BlinkGamepadButton {
   static final instance = new BlinkGamepadButton();
 
-  static pressed_Getter(mthis) native "GamepadButton_pressed_Getter";
-  pressed_Getter_(mthis) => pressed_Getter(mthis);
+  pressed_Getter_(mthis) => mthis["pressed"];
 
-  static value_Getter(mthis) native "GamepadButton_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["GamepadEvent"], [__arg_0, __arg_1]);
 
-  static gamepad_Getter(mthis) native "GamepadEvent_gamepad_Getter";
-  gamepad_Getter_(mthis) => gamepad_Getter(mthis);
+  gamepad_Getter_(mthis) => mthis["gamepad"];
 
 }
 
 class BlinkGamepadList {
   static final instance = new BlinkGamepadList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "GamepadList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "GamepadList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "GamepadList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkGeofencing {
   static final instance = new BlinkGeofencing();
 
-  static getRegisteredRegions_Callback_0(mthis) native "Geofencing_getRegisteredRegions_Callback";
-  getRegisteredRegions_Callback_0_(mthis) => getRegisteredRegions_Callback_0(mthis);
+  getRegisteredRegions_Callback_0_(mthis) => mthis.callMethod("getRegisteredRegions", []);
 
-  static getRegisteredRegions_Callback_1(mthis, __arg_0) native "Geofencing_getRegisteredRegions_Callback";
-  getRegisteredRegions_Callback_1_(mthis, __arg_0) => getRegisteredRegions_Callback_1(mthis, __arg_0);
+  registerRegion_Callback_0_(mthis) => mthis.callMethod("registerRegion", []);
 
-  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);
+  registerRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("registerRegion", [__arg_0]);
 
-  static registerRegion_Callback_0(mthis) native "Geofencing_registerRegion_Callback";
-  registerRegion_Callback_0_(mthis) => registerRegion_Callback_0(mthis);
+  unregisterRegion_Callback_0_(mthis) => mthis.callMethod("unregisterRegion", []);
 
-  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);
+  unregisterRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("unregisterRegion", [__arg_0]);
 
 }
 
 class BlinkGeofencingRegion {
   static final instance = new BlinkGeofencingRegion();
 
-  static id_Getter(mthis) native "GeofencingRegion_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
 }
 
 class BlinkGeolocation {
   static final instance = new BlinkGeolocation();
 
-  static clearWatch_Callback_0(mthis) native "Geolocation_clearWatch_Callback";
-  clearWatch_Callback_0_(mthis) => clearWatch_Callback_0(mthis);
+  clearWatch_Callback_0_(mthis) => mthis.callMethod("clearWatch", []);
 
-  static clearWatch_Callback_1(mthis, __arg_0) native "Geolocation_clearWatch_Callback";
-  clearWatch_Callback_1_(mthis, __arg_0) => clearWatch_Callback_1(mthis, __arg_0);
+  clearWatch_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearWatch", [__arg_0]);
 
-  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);
+  getCurrentPosition_Callback_0_(mthis) => mthis.callMethod("getCurrentPosition", []);
 
-  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);
+  getCurrentPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("getCurrentPosition", [__arg_0]);
 
-  static getCurrentPosition_Callback_0(mthis) native "Geolocation_getCurrentPosition_Callback";
-  getCurrentPosition_Callback_0_(mthis) => getCurrentPosition_Callback_0(mthis);
+  getCurrentPosition_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getCurrentPosition", [__arg_0, __arg_1]);
 
-  static getCurrentPosition_Callback_1(mthis, __arg_0) native "Geolocation_getCurrentPosition_Callback";
-  getCurrentPosition_Callback_1_(mthis, __arg_0) => getCurrentPosition_Callback_1(mthis, __arg_0);
+  getCurrentPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getCurrentPosition", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  watchPosition_Callback_0_(mthis) => mthis.callMethod("watchPosition", []);
 
-  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);
+  watchPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("watchPosition", [__arg_0]);
 
-  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);
+  watchPosition_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("watchPosition", [__arg_0, __arg_1]);
 
-  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);
+  watchPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("watchPosition", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkGeoposition {
   static final instance = new BlinkGeoposition();
 
-  static coords_Getter(mthis) native "Geoposition_coords_Getter";
-  coords_Getter_(mthis) => coords_Getter(mthis);
+  coords_Getter_(mthis) => mthis["coords"];
 
-  static timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
-  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+  timestamp_Getter_(mthis) => mthis["timestamp"];
 
 }
 
 class BlinkHTMLAllCollection {
   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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "HTMLAllCollection_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "HTMLAllCollection_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  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);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
 }
 
 class BlinkHTMLAnchorElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLAnchorElement();
 
-  static download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
-  download_Getter_(mthis) => download_Getter(mthis);
+  download_Getter_(mthis) => mthis["download"];
 
-  static download_Setter(mthis, __arg_0) native "HTMLAnchorElement_download_Setter";
-  download_Setter_(mthis, __arg_0) => download_Setter(mthis, __arg_0);
+  download_Setter_(mthis, __arg_0) => mthis["download"] = __arg_0;
 
-  static hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
-  hash_Getter_(mthis) => hash_Getter(mthis);
+  hash_Getter_(mthis) => mthis["hash"];
 
-  static hash_Setter(mthis, __arg_0) native "HTMLAnchorElement_hash_Setter";
-  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
 
-  static host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
-  host_Getter_(mthis) => host_Getter(mthis);
+  host_Getter_(mthis) => mthis["host"];
 
-  static host_Setter(mthis, __arg_0) native "HTMLAnchorElement_host_Setter";
-  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
 
-  static hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
-  hostname_Getter_(mthis) => hostname_Getter(mthis);
+  hostname_Getter_(mthis) => mthis["hostname"];
 
-  static hostname_Setter(mthis, __arg_0) native "HTMLAnchorElement_hostname_Setter";
-  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
 
-  static href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static href_Setter(mthis, __arg_0) native "HTMLAnchorElement_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
-  hreflang_Getter_(mthis) => hreflang_Getter(mthis);
+  hreflang_Getter_(mthis) => mthis["hreflang"];
 
-  static hreflang_Setter(mthis, __arg_0) native "HTMLAnchorElement_hreflang_Setter";
-  hreflang_Setter_(mthis, __arg_0) => hreflang_Setter(mthis, __arg_0);
+  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLAnchorElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLAnchorElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLAnchorElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLAnchorElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
-  origin_Getter_(mthis) => origin_Getter(mthis);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  static password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
-  password_Getter_(mthis) => password_Getter(mthis);
+  password_Getter_(mthis) => mthis["password"];
 
-  static password_Setter(mthis, __arg_0) native "HTMLAnchorElement_password_Setter";
-  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
 
-  static pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
-  pathname_Getter_(mthis) => pathname_Getter(mthis);
+  pathname_Getter_(mthis) => mthis["pathname"];
 
-  static pathname_Setter(mthis, __arg_0) native "HTMLAnchorElement_pathname_Setter";
-  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
 
-  static ping_Getter(mthis) native "HTMLAnchorElement_ping_Getter";
-  ping_Getter_(mthis) => ping_Getter(mthis);
+  ping_Getter_(mthis) => mthis["ping"];
 
-  static ping_Setter(mthis, __arg_0) native "HTMLAnchorElement_ping_Setter";
-  ping_Setter_(mthis, __arg_0) => ping_Setter(mthis, __arg_0);
+  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
 
-  static port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  static port_Setter(mthis, __arg_0) native "HTMLAnchorElement_port_Setter";
-  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
 
-  static protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static protocol_Setter(mthis, __arg_0) native "HTMLAnchorElement_protocol_Setter";
-  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
-  static rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
-  rel_Getter_(mthis) => rel_Getter(mthis);
+  rel_Getter_(mthis) => mthis["rel"];
 
-  static rel_Setter(mthis, __arg_0) native "HTMLAnchorElement_rel_Setter";
-  rel_Setter_(mthis, __arg_0) => rel_Setter(mthis, __arg_0);
+  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
 
-  static search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
-  search_Getter_(mthis) => search_Getter(mthis);
+  search_Getter_(mthis) => mthis["search"];
 
-  static search_Setter(mthis, __arg_0) native "HTMLAnchorElement_search_Setter";
-  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
 
-  static target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static target_Setter(mthis, __arg_0) native "HTMLAnchorElement_target_Setter";
-  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
 
-  static toString_Callback_0(mthis) native "HTMLAnchorElement_toString_Callback";
-  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
-  static toString_Callback_1(mthis, __arg_0) native "HTMLAnchorElement_toString_Callback";
-  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+  type_Getter_(mthis) => mthis["type"];
 
-  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);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  username_Getter_(mthis) => mthis["username"];
 
-  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, __arg_0) native "HTMLAnchorElement_username_Setter";
-  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
 
 }
 
 class BlinkHTMLAppletElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLAppletElement();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "HTMLAppletElement___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__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);
+  alt_Getter_(mthis) => mthis["alt"];
 
-  static alt_Setter(mthis, __arg_0) native "HTMLAreaElement_alt_Setter";
-  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
+  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
 
-  static coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
-  coords_Getter_(mthis) => coords_Getter(mthis);
+  coords_Getter_(mthis) => mthis["coords"];
 
-  static coords_Setter(mthis, __arg_0) native "HTMLAreaElement_coords_Setter";
-  coords_Setter_(mthis, __arg_0) => coords_Setter(mthis, __arg_0);
+  coords_Setter_(mthis, __arg_0) => mthis["coords"] = __arg_0;
 
-  static hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
-  hash_Getter_(mthis) => hash_Getter(mthis);
+  hash_Getter_(mthis) => mthis["hash"];
 
-  static hash_Setter(mthis, __arg_0) native "HTMLAreaElement_hash_Setter";
-  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
 
-  static host_Getter(mthis) native "HTMLAreaElement_host_Getter";
-  host_Getter_(mthis) => host_Getter(mthis);
+  host_Getter_(mthis) => mthis["host"];
 
-  static host_Setter(mthis, __arg_0) native "HTMLAreaElement_host_Setter";
-  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
 
-  static hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
-  hostname_Getter_(mthis) => hostname_Getter(mthis);
+  hostname_Getter_(mthis) => mthis["hostname"];
 
-  static hostname_Setter(mthis, __arg_0) native "HTMLAreaElement_hostname_Setter";
-  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
 
-  static href_Getter(mthis) native "HTMLAreaElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static href_Setter(mthis, __arg_0) native "HTMLAreaElement_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
-  origin_Getter_(mthis) => origin_Getter(mthis);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  static password_Getter(mthis) native "HTMLAreaElement_password_Getter";
-  password_Getter_(mthis) => password_Getter(mthis);
+  password_Getter_(mthis) => mthis["password"];
 
-  static password_Setter(mthis, __arg_0) native "HTMLAreaElement_password_Setter";
-  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
 
-  static pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
-  pathname_Getter_(mthis) => pathname_Getter(mthis);
+  pathname_Getter_(mthis) => mthis["pathname"];
 
-  static pathname_Setter(mthis, __arg_0) native "HTMLAreaElement_pathname_Setter";
-  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
 
-  static ping_Getter(mthis) native "HTMLAreaElement_ping_Getter";
-  ping_Getter_(mthis) => ping_Getter(mthis);
+  ping_Getter_(mthis) => mthis["ping"];
 
-  static ping_Setter(mthis, __arg_0) native "HTMLAreaElement_ping_Setter";
-  ping_Setter_(mthis, __arg_0) => ping_Setter(mthis, __arg_0);
+  ping_Setter_(mthis, __arg_0) => mthis["ping"] = __arg_0;
 
-  static port_Getter(mthis) native "HTMLAreaElement_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  static port_Setter(mthis, __arg_0) native "HTMLAreaElement_port_Setter";
-  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
 
-  static protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static protocol_Setter(mthis, __arg_0) native "HTMLAreaElement_protocol_Setter";
-  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
-  static search_Getter(mthis) native "HTMLAreaElement_search_Getter";
-  search_Getter_(mthis) => search_Getter(mthis);
+  search_Getter_(mthis) => mthis["search"];
 
-  static search_Setter(mthis, __arg_0) native "HTMLAreaElement_search_Setter";
-  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
 
-  static shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
-  shape_Getter_(mthis) => shape_Getter(mthis);
+  shape_Getter_(mthis) => mthis["shape"];
 
-  static shape_Setter(mthis, __arg_0) native "HTMLAreaElement_shape_Setter";
-  shape_Setter_(mthis, __arg_0) => shape_Setter(mthis, __arg_0);
+  shape_Setter_(mthis, __arg_0) => mthis["shape"] = __arg_0;
 
-  static target_Getter(mthis) native "HTMLAreaElement_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static target_Setter(mthis, __arg_0) native "HTMLAreaElement_target_Setter";
-  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
 
-  static toString_Callback_0(mthis) native "HTMLAreaElement_toString_Callback";
-  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
-  static toString_Callback_1(mthis, __arg_0) native "HTMLAreaElement_toString_Callback";
-  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
+  username_Getter_(mthis) => mthis["username"];
 
-  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, __arg_0) native "HTMLAreaElement_username_Setter";
-  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
 
 }
 
 class BlinkHTMLAudioElement extends BlinkHTMLMediaElement {
   static final instance = new BlinkHTMLAudioElement();
 
-  static constructorCallback_0() native "HTMLAudioElement_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Audio"], []);
 
-  static constructorCallback_1(__arg_0) native "HTMLAudioElement_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
-
-  static constructorCallback_2(__arg_0, __arg_1) native "HTMLAudioElement_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
-
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Audio"], [__arg_0]);
 
 }
 
@@ -9275,333 +5117,204 @@
 class BlinkHTMLBaseElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLBaseElement();
 
-  static href_Getter(mthis) native "HTMLBaseElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static href_Setter(mthis, __arg_0) native "HTMLBaseElement_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static target_Getter(mthis) native "HTMLBaseElement_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static target_Setter(mthis, __arg_0) native "HTMLBaseElement_target_Setter";
-  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
 
 }
 
 class BlinkHTMLBodyElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLBodyElement();
 
-  static onbeforeunload_Getter(mthis) native "HTMLBodyElement_onbeforeunload_Getter";
-  onbeforeunload_Getter_(mthis) => onbeforeunload_Getter(mthis);
+  onbeforeunload_Getter_(mthis) => mthis["onbeforeunload"];
 
-  static onbeforeunload_Setter(mthis, __arg_0) native "HTMLBodyElement_onbeforeunload_Setter";
-  onbeforeunload_Setter_(mthis, __arg_0) => onbeforeunload_Setter(mthis, __arg_0);
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
 
-  static onblur_Getter(mthis) native "HTMLBodyElement_onblur_Getter";
-  onblur_Getter_(mthis) => onblur_Getter(mthis);
+  onblur_Getter_(mthis) => mthis["onblur"];
 
-  static onblur_Setter(mthis, __arg_0) native "HTMLBodyElement_onblur_Setter";
-  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
 
-  static onerror_Getter(mthis) native "HTMLBodyElement_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onerror_Setter(mthis, __arg_0) native "HTMLBodyElement_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onfocus_Getter(mthis) native "HTMLBodyElement_onfocus_Getter";
-  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+  onfocus_Getter_(mthis) => mthis["onfocus"];
 
-  static onfocus_Setter(mthis, __arg_0) native "HTMLBodyElement_onfocus_Setter";
-  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  static onhashchange_Getter(mthis) native "HTMLBodyElement_onhashchange_Getter";
-  onhashchange_Getter_(mthis) => onhashchange_Getter(mthis);
+  onhashchange_Getter_(mthis) => mthis["onhashchange"];
 
-  static onhashchange_Setter(mthis, __arg_0) native "HTMLBodyElement_onhashchange_Setter";
-  onhashchange_Setter_(mthis, __arg_0) => onhashchange_Setter(mthis, __arg_0);
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
 
-  static onlanguagechange_Getter(mthis) native "HTMLBodyElement_onlanguagechange_Getter";
-  onlanguagechange_Getter_(mthis) => onlanguagechange_Getter(mthis);
+  onlanguagechange_Getter_(mthis) => mthis["onlanguagechange"];
 
-  static onlanguagechange_Setter(mthis, __arg_0) native "HTMLBodyElement_onlanguagechange_Setter";
-  onlanguagechange_Setter_(mthis, __arg_0) => onlanguagechange_Setter(mthis, __arg_0);
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
 
-  static onload_Getter(mthis) native "HTMLBodyElement_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static onload_Setter(mthis, __arg_0) native "HTMLBodyElement_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "HTMLBodyElement_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onmessage_Setter(mthis, __arg_0) native "HTMLBodyElement_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onoffline_Getter(mthis) native "HTMLBodyElement_onoffline_Getter";
-  onoffline_Getter_(mthis) => onoffline_Getter(mthis);
+  onoffline_Getter_(mthis) => mthis["onoffline"];
 
-  static onoffline_Setter(mthis, __arg_0) native "HTMLBodyElement_onoffline_Setter";
-  onoffline_Setter_(mthis, __arg_0) => onoffline_Setter(mthis, __arg_0);
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
 
-  static ononline_Getter(mthis) native "HTMLBodyElement_ononline_Getter";
-  ononline_Getter_(mthis) => ononline_Getter(mthis);
+  ononline_Getter_(mthis) => mthis["ononline"];
 
-  static ononline_Setter(mthis, __arg_0) native "HTMLBodyElement_ononline_Setter";
-  ononline_Setter_(mthis, __arg_0) => ononline_Setter(mthis, __arg_0);
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
 
-  static onorientationchange_Getter(mthis) native "HTMLBodyElement_onorientationchange_Getter";
-  onorientationchange_Getter_(mthis) => onorientationchange_Getter(mthis);
+  onorientationchange_Getter_(mthis) => mthis["onorientationchange"];
 
-  static onorientationchange_Setter(mthis, __arg_0) native "HTMLBodyElement_onorientationchange_Setter";
-  onorientationchange_Setter_(mthis, __arg_0) => onorientationchange_Setter(mthis, __arg_0);
+  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
 
-  static onpagehide_Getter(mthis) native "HTMLBodyElement_onpagehide_Getter";
-  onpagehide_Getter_(mthis) => onpagehide_Getter(mthis);
+  onpagehide_Getter_(mthis) => mthis["onpagehide"];
 
-  static onpagehide_Setter(mthis, __arg_0) native "HTMLBodyElement_onpagehide_Setter";
-  onpagehide_Setter_(mthis, __arg_0) => onpagehide_Setter(mthis, __arg_0);
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
 
-  static onpageshow_Getter(mthis) native "HTMLBodyElement_onpageshow_Getter";
-  onpageshow_Getter_(mthis) => onpageshow_Getter(mthis);
+  onpageshow_Getter_(mthis) => mthis["onpageshow"];
 
-  static onpageshow_Setter(mthis, __arg_0) native "HTMLBodyElement_onpageshow_Setter";
-  onpageshow_Setter_(mthis, __arg_0) => onpageshow_Setter(mthis, __arg_0);
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
 
-  static onpopstate_Getter(mthis) native "HTMLBodyElement_onpopstate_Getter";
-  onpopstate_Getter_(mthis) => onpopstate_Getter(mthis);
+  onpopstate_Getter_(mthis) => mthis["onpopstate"];
 
-  static onpopstate_Setter(mthis, __arg_0) native "HTMLBodyElement_onpopstate_Setter";
-  onpopstate_Setter_(mthis, __arg_0) => onpopstate_Setter(mthis, __arg_0);
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
 
-  static onresize_Getter(mthis) native "HTMLBodyElement_onresize_Getter";
-  onresize_Getter_(mthis) => onresize_Getter(mthis);
+  onresize_Getter_(mthis) => mthis["onresize"];
 
-  static onresize_Setter(mthis, __arg_0) native "HTMLBodyElement_onresize_Setter";
-  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
 
-  static onscroll_Getter(mthis) native "HTMLBodyElement_onscroll_Getter";
-  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+  onscroll_Getter_(mthis) => mthis["onscroll"];
 
-  static onscroll_Setter(mthis, __arg_0) native "HTMLBodyElement_onscroll_Setter";
-  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  static onstorage_Getter(mthis) native "HTMLBodyElement_onstorage_Getter";
-  onstorage_Getter_(mthis) => onstorage_Getter(mthis);
+  onstorage_Getter_(mthis) => mthis["onstorage"];
 
-  static onstorage_Setter(mthis, __arg_0) native "HTMLBodyElement_onstorage_Setter";
-  onstorage_Setter_(mthis, __arg_0) => onstorage_Setter(mthis, __arg_0);
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __arg_0;
 
-  static onunload_Getter(mthis) native "HTMLBodyElement_onunload_Getter";
-  onunload_Getter_(mthis) => onunload_Getter(mthis);
+  onunload_Getter_(mthis) => mthis["onunload"];
 
-  static onunload_Setter(mthis, __arg_0) native "HTMLBodyElement_onunload_Setter";
-  onunload_Setter_(mthis, __arg_0) => onunload_Setter(mthis, __arg_0);
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __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);
+  autofocus_Getter_(mthis) => mthis["autofocus"];
 
-  static autofocus_Setter(mthis, __arg_0) native "HTMLButtonElement_autofocus_Setter";
-  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  static checkValidity_Callback_0(mthis) native "HTMLButtonElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLButtonElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  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);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  formAction_Getter_(mthis) => mthis["formAction"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLButtonElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
 
-  static formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
-  formAction_Getter_(mthis) => formAction_Getter(mthis);
+  formEnctype_Getter_(mthis) => mthis["formEnctype"];
 
-  static formAction_Setter(mthis, __arg_0) native "HTMLButtonElement_formAction_Setter";
-  formAction_Setter_(mthis, __arg_0) => formAction_Setter(mthis, __arg_0);
+  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
 
-  static formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
-  formEnctype_Getter_(mthis) => formEnctype_Getter(mthis);
+  formMethod_Getter_(mthis) => mthis["formMethod"];
 
-  static formEnctype_Setter(mthis, __arg_0) native "HTMLButtonElement_formEnctype_Setter";
-  formEnctype_Setter_(mthis, __arg_0) => formEnctype_Setter(mthis, __arg_0);
+  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
 
-  static formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
-  formMethod_Getter_(mthis) => formMethod_Getter(mthis);
+  formNoValidate_Getter_(mthis) => mthis["formNoValidate"];
 
-  static formMethod_Setter(mthis, __arg_0) native "HTMLButtonElement_formMethod_Setter";
-  formMethod_Setter_(mthis, __arg_0) => formMethod_Setter(mthis, __arg_0);
+  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
 
-  static formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
-  formNoValidate_Getter_(mthis) => formNoValidate_Getter(mthis);
+  formTarget_Getter_(mthis) => mthis["formTarget"];
 
-  static formNoValidate_Setter(mthis, __arg_0) native "HTMLButtonElement_formNoValidate_Setter";
-  formNoValidate_Setter_(mthis, __arg_0) => formNoValidate_Setter(mthis, __arg_0);
+  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
 
-  static formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
-  formTarget_Getter_(mthis) => formTarget_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static formTarget_Setter(mthis, __arg_0) native "HTMLButtonElement_formTarget_Setter";
-  formTarget_Setter_(mthis, __arg_0) => formTarget_Setter(mthis, __arg_0);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static form_Getter(mthis) native "HTMLButtonElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLButtonElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static name_Setter(mthis, __arg_0) native "HTMLButtonElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLButtonElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLButtonElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __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);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  static type_Getter(mthis) native "HTMLButtonElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLButtonElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __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, __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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
 class BlinkHTMLCanvasElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLCanvasElement();
 
-  static getContext_Callback_0(mthis) native "HTMLCanvasElement_getContext_Callback";
-  getContext_Callback_0_(mthis) => getContext_Callback_0(mthis);
+  getContext_Callback_0_(mthis) => mthis.callMethod("getContext", []);
 
-  static getContext_Callback_1(mthis, __arg_0) native "HTMLCanvasElement_getContext_Callback";
-  getContext_Callback_1_(mthis, __arg_0) => getContext_Callback_1(mthis, __arg_0);
+  getContext_Callback_1_(mthis, __arg_0) => mthis.callMethod("getContext", [__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);
+  getContext_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getContext", [__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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  toDataURL_Callback_0_(mthis) => mthis.callMethod("toDataURL", []);
 
-  static height_Setter(mthis, __arg_0) native "HTMLCanvasElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  toDataURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("toDataURL", [__arg_0]);
 
-  static toDataURL_Callback_0(mthis) native "HTMLCanvasElement_toDataURL_Callback";
-  toDataURL_Callback_0_(mthis) => toDataURL_Callback_0(mthis);
+  toDataURL_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("toDataURL", [__arg_0, __arg_1]);
 
-  static toDataURL_Callback_1(mthis, __arg_0) native "HTMLCanvasElement_toDataURL_Callback";
-  toDataURL_Callback_1_(mthis, __arg_0) => toDataURL_Callback_1(mthis, __arg_0);
+  width_Getter_(mthis) => mthis["width"];
 
-  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, __arg_0) native "HTMLCanvasElement_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "HTMLCollection_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "HTMLCollection_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static length_Getter(mthis) native "HTMLCollection_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
-
-  static namedItem_Callback_0(mthis) native "HTMLCollection_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
-
-  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);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
 }
 
 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);
+  getDistributedNodes_Callback_0_(mthis) => mthis.callMethod("getDistributedNodes", []);
 
-  static getDistributedNodes_Callback_1(mthis, __arg_0) native "HTMLContentElement_getDistributedNodes_Callback";
-  getDistributedNodes_Callback_1_(mthis, __arg_0) => getDistributedNodes_Callback_1(mthis, __arg_0);
+  select_Getter_(mthis) => mthis["select"];
 
-  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, __arg_0) native "HTMLContentElement_select_Setter";
-  select_Setter_(mthis, __arg_0) => select_Setter(mthis, __arg_0);
+  select_Setter_(mthis, __arg_0) => mthis["select"] = __arg_0;
 
 }
 
@@ -9613,66 +5326,37 @@
 class BlinkHTMLDataListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDataListElement();
 
-  static options_Getter(mthis) native "HTMLDataListElement_options_Getter";
-  options_Getter_(mthis) => options_Getter(mthis);
+  options_Getter_(mthis) => mthis["options"];
 
 }
 
 class BlinkHTMLDetailsElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDetailsElement();
 
-  static open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
-  open_Getter_(mthis) => open_Getter(mthis);
+  open_Getter_(mthis) => mthis["open"];
 
-  static open_Setter(mthis, __arg_0) native "HTMLDetailsElement_open_Setter";
-  open_Setter_(mthis, __arg_0) => open_Setter(mthis, __arg_0);
+  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
 
 }
 
 class BlinkHTMLDialogElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLDialogElement();
 
-  static close_Callback_0(mthis) native "HTMLDialogElement_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "HTMLDialogElement_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  close_Callback_1_(mthis, __arg_0) => mthis.callMethod("close", [__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);
+  open_Getter_(mthis) => mthis["open"];
 
-  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);
+  open_Setter_(mthis, __arg_0) => mthis["open"] = __arg_0;
 
-  static open_Getter(mthis) native "HTMLDialogElement_open_Getter";
-  open_Getter_(mthis) => open_Getter(mthis);
+  returnValue_Getter_(mthis) => mthis["returnValue"];
 
-  static open_Setter(mthis, __arg_0) native "HTMLDialogElement_open_Setter";
-  open_Setter_(mthis, __arg_0) => open_Setter(mthis, __arg_0);
+  returnValue_Setter_(mthis, __arg_0) => mthis["returnValue"] = __arg_0;
 
-  static returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
-  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+  showModal_Callback_0_(mthis) => mthis.callMethod("showModal", []);
 
-  static returnValue_Setter(mthis, __arg_0) native "HTMLDialogElement_returnValue_Setter";
-  returnValue_Setter_(mthis, __arg_0) => returnValue_Setter(mthis, __arg_0);
-
-  static showModal_Callback_0(mthis) native "HTMLDialogElement_showModal_Callback";
-  showModal_Callback_0_(mthis) => showModal_Callback_0(mthis);
-
-  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_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);
+  show_Callback_0_(mthis) => mthis.callMethod("show", []);
 
 }
 
@@ -9689,695 +5373,426 @@
 class BlinkHTMLDocument extends BlinkDocument {
   static final instance = new BlinkHTMLDocument();
 
-  static alinkColor_Getter(mthis) native "HTMLDocument_alinkColor_Getter";
-  alinkColor_Getter_(mthis) => alinkColor_Getter(mthis);
+  alinkColor_Getter_(mthis) => mthis["alinkColor"];
 
-  static alinkColor_Setter(mthis, __arg_0) native "HTMLDocument_alinkColor_Setter";
-  alinkColor_Setter_(mthis, __arg_0) => alinkColor_Setter(mthis, __arg_0);
+  alinkColor_Setter_(mthis, __arg_0) => mthis["alinkColor"] = __arg_0;
 
-  static bgColor_Getter(mthis) native "HTMLDocument_bgColor_Getter";
-  bgColor_Getter_(mthis) => bgColor_Getter(mthis);
+  bgColor_Getter_(mthis) => mthis["bgColor"];
 
-  static bgColor_Setter(mthis, __arg_0) native "HTMLDocument_bgColor_Setter";
-  bgColor_Setter_(mthis, __arg_0) => bgColor_Setter(mthis, __arg_0);
+  bgColor_Setter_(mthis, __arg_0) => mthis["bgColor"] = __arg_0;
 
-  static captureEvents_Callback_0(mthis) native "HTMLDocument_captureEvents_Callback";
-  captureEvents_Callback_0_(mthis) => captureEvents_Callback_0(mthis);
+  captureEvents_Callback_0_(mthis) => mthis.callMethod("captureEvents", []);
 
-  static captureEvents_Callback_1(mthis, __arg_0) native "HTMLDocument_captureEvents_Callback";
-  captureEvents_Callback_1_(mthis, __arg_0) => captureEvents_Callback_1(mthis, __arg_0);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static clear_Callback_0(mthis) native "HTMLDocument_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  compatMode_Getter_(mthis) => mthis["compatMode"];
 
-  static clear_Callback_1(mthis, __arg_0) native "HTMLDocument_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  fgColor_Getter_(mthis) => mthis["fgColor"];
 
-  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);
+  fgColor_Setter_(mthis, __arg_0) => mthis["fgColor"] = __arg_0;
 
-  static close_Callback_0(mthis) native "HTMLDocument_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  linkColor_Getter_(mthis) => mthis["linkColor"];
 
-  static close_Callback_1(mthis, __arg_0) native "HTMLDocument_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  linkColor_Setter_(mthis, __arg_0) => mthis["linkColor"] = __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);
+  open_Callback_0_(mthis) => mthis.callMethod("open", []);
 
-  static compatMode_Getter(mthis) native "HTMLDocument_compatMode_Getter";
-  compatMode_Getter_(mthis) => compatMode_Getter(mthis);
+  releaseEvents_Callback_0_(mthis) => mthis.callMethod("releaseEvents", []);
 
-  static fgColor_Getter(mthis) native "HTMLDocument_fgColor_Getter";
-  fgColor_Getter_(mthis) => fgColor_Getter(mthis);
+  vlinkColor_Getter_(mthis) => mthis["vlinkColor"];
 
-  static fgColor_Setter(mthis, __arg_0) native "HTMLDocument_fgColor_Setter";
-  fgColor_Setter_(mthis, __arg_0) => fgColor_Setter(mthis, __arg_0);
+  vlinkColor_Setter_(mthis, __arg_0) => mthis["vlinkColor"] = __arg_0;
 
-  static linkColor_Getter(mthis) native "HTMLDocument_linkColor_Getter";
-  linkColor_Getter_(mthis) => linkColor_Getter(mthis);
+  write_Callback_0_(mthis) => mthis.callMethod("write", []);
 
-  static linkColor_Setter(mthis, __arg_0) native "HTMLDocument_linkColor_Setter";
-  linkColor_Setter_(mthis, __arg_0) => linkColor_Setter(mthis, __arg_0);
+  write_Callback_1_(mthis, __arg_0) => mthis.callMethod("write", [__arg_0]);
 
-  static open_Callback_0(mthis) native "HTMLDocument_open_Callback";
-  open_Callback_0_(mthis) => open_Callback_0(mthis);
+  writeln_Callback_0_(mthis) => mthis.callMethod("writeln", []);
 
-  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);
+  writeln_Callback_1_(mthis, __arg_0) => mthis.callMethod("writeln", [__arg_0]);
 
 }
 
 class BlinkHTMLElement extends BlinkElement {
   static final instance = new BlinkHTMLElement();
 
-  static accessKey_Getter(mthis) native "HTMLElement_accessKey_Getter";
-  accessKey_Getter_(mthis) => accessKey_Getter(mthis);
+  accessKey_Getter_(mthis) => mthis["accessKey"];
 
-  static accessKey_Setter(mthis, __arg_0) native "HTMLElement_accessKey_Setter";
-  accessKey_Setter_(mthis, __arg_0) => accessKey_Setter(mthis, __arg_0);
+  accessKey_Setter_(mthis, __arg_0) => mthis["accessKey"] = __arg_0;
 
-  static click_Callback_0(mthis) native "HTMLElement_click_Callback";
-  click_Callback_0_(mthis) => click_Callback_0(mthis);
+  click_Callback_0_(mthis) => mthis.callMethod("click", []);
 
-  static click_Callback_1(mthis, __arg_0) native "HTMLElement_click_Callback";
-  click_Callback_1_(mthis, __arg_0) => click_Callback_1(mthis, __arg_0);
+  contentEditable_Getter_(mthis) => mthis["contentEditable"];
 
-  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);
+  contentEditable_Setter_(mthis, __arg_0) => mthis["contentEditable"] = __arg_0;
 
-  static contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
-  contentEditable_Getter_(mthis) => contentEditable_Getter(mthis);
+  contextMenu_Getter_(mthis) => mthis["contextMenu"];
 
-  static contentEditable_Setter(mthis, __arg_0) native "HTMLElement_contentEditable_Setter";
-  contentEditable_Setter_(mthis, __arg_0) => contentEditable_Setter(mthis, __arg_0);
+  contextMenu_Setter_(mthis, __arg_0) => mthis["contextMenu"] = __arg_0;
 
-  static contextMenu_Getter(mthis) native "HTMLElement_contextMenu_Getter";
-  contextMenu_Getter_(mthis) => contextMenu_Getter(mthis);
+  dir_Getter_(mthis) => mthis["dir"];
 
-  static contextMenu_Setter(mthis, __arg_0) native "HTMLElement_contextMenu_Setter";
-  contextMenu_Setter_(mthis, __arg_0) => contextMenu_Setter(mthis, __arg_0);
+  dir_Setter_(mthis, __arg_0) => mthis["dir"] = __arg_0;
 
-  static dir_Getter(mthis) native "HTMLElement_dir_Getter";
-  dir_Getter_(mthis) => dir_Getter(mthis);
+  draggable_Getter_(mthis) => mthis["draggable"];
 
-  static dir_Setter(mthis, __arg_0) native "HTMLElement_dir_Setter";
-  dir_Setter_(mthis, __arg_0) => dir_Setter(mthis, __arg_0);
+  draggable_Setter_(mthis, __arg_0) => mthis["draggable"] = __arg_0;
 
-  static draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
-  draggable_Getter_(mthis) => draggable_Getter(mthis);
+  hidden_Getter_(mthis) => mthis["hidden"];
 
-  static draggable_Setter(mthis, __arg_0) native "HTMLElement_draggable_Setter";
-  draggable_Setter_(mthis, __arg_0) => draggable_Setter(mthis, __arg_0);
+  hidden_Setter_(mthis, __arg_0) => mthis["hidden"] = __arg_0;
 
-  static hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
-  hidden_Getter_(mthis) => hidden_Getter(mthis);
+  innerText_Getter_(mthis) => mthis["innerText"];
 
-  static hidden_Setter(mthis, __arg_0) native "HTMLElement_hidden_Setter";
-  hidden_Setter_(mthis, __arg_0) => hidden_Setter(mthis, __arg_0);
+  innerText_Setter_(mthis, __arg_0) => mthis["innerText"] = __arg_0;
 
-  static innerText_Getter(mthis) native "HTMLElement_innerText_Getter";
-  innerText_Getter_(mthis) => innerText_Getter(mthis);
+  inputMethodContext_Getter_(mthis) => mthis["inputMethodContext"];
 
-  static innerText_Setter(mthis, __arg_0) native "HTMLElement_innerText_Setter";
-  innerText_Setter_(mthis, __arg_0) => innerText_Setter(mthis, __arg_0);
+  isContentEditable_Getter_(mthis) => mthis["isContentEditable"];
 
-  static inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
-  inputMethodContext_Getter_(mthis) => inputMethodContext_Getter(mthis);
+  lang_Getter_(mthis) => mthis["lang"];
 
-  static isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
-  isContentEditable_Getter_(mthis) => isContentEditable_Getter(mthis);
+  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
 
-  static lang_Getter(mthis) native "HTMLElement_lang_Getter";
-  lang_Getter_(mthis) => lang_Getter(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static lang_Setter(mthis, __arg_0) native "HTMLElement_lang_Setter";
-  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static onabort_Getter(mthis) native "HTMLElement_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onautocomplete_Getter_(mthis) => mthis["onautocomplete"];
 
-  static onabort_Setter(mthis, __arg_0) native "HTMLElement_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
 
-  static onautocomplete_Getter(mthis) native "HTMLElement_onautocomplete_Getter";
-  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+  onautocompleteerror_Getter_(mthis) => mthis["onautocompleteerror"];
 
-  static onautocomplete_Setter(mthis, __arg_0) native "HTMLElement_onautocomplete_Setter";
-  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  static onautocompleteerror_Getter(mthis) native "HTMLElement_onautocompleteerror_Getter";
-  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+  onblur_Getter_(mthis) => mthis["onblur"];
 
-  static onautocompleteerror_Setter(mthis, __arg_0) native "HTMLElement_onautocompleteerror_Setter";
-  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
 
-  static onblur_Getter(mthis) native "HTMLElement_onblur_Getter";
-  onblur_Getter_(mthis) => onblur_Getter(mthis);
+  oncancel_Getter_(mthis) => mthis["oncancel"];
 
-  static onblur_Setter(mthis, __arg_0) native "HTMLElement_onblur_Setter";
-  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
 
-  static oncancel_Getter(mthis) native "HTMLElement_oncancel_Getter";
-  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+  oncanplay_Getter_(mthis) => mthis["oncanplay"];
 
-  static oncancel_Setter(mthis, __arg_0) native "HTMLElement_oncancel_Setter";
-  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
 
-  static oncanplay_Getter(mthis) native "HTMLElement_oncanplay_Getter";
-  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+  oncanplaythrough_Getter_(mthis) => mthis["oncanplaythrough"];
 
-  static oncanplay_Setter(mthis, __arg_0) native "HTMLElement_oncanplay_Setter";
-  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
 
-  static oncanplaythrough_Getter(mthis) native "HTMLElement_oncanplaythrough_Getter";
-  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static oncanplaythrough_Setter(mthis, __arg_0) native "HTMLElement_oncanplaythrough_Setter";
-  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onchange_Getter(mthis) native "HTMLElement_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  onclick_Getter_(mthis) => mthis["onclick"];
 
-  static onchange_Setter(mthis, __arg_0) native "HTMLElement_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
 
-  static onclick_Getter(mthis) native "HTMLElement_onclick_Getter";
-  onclick_Getter_(mthis) => onclick_Getter(mthis);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  static onclick_Setter(mthis, __arg_0) native "HTMLElement_onclick_Setter";
-  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static onclose_Getter(mthis) native "HTMLElement_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  oncontextmenu_Getter_(mthis) => mthis["oncontextmenu"];
 
-  static onclose_Setter(mthis, __arg_0) native "HTMLElement_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
 
-  static oncontextmenu_Getter(mthis) native "HTMLElement_oncontextmenu_Getter";
-  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+  oncuechange_Getter_(mthis) => mthis["oncuechange"];
 
-  static oncontextmenu_Setter(mthis, __arg_0) native "HTMLElement_oncontextmenu_Setter";
-  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
 
-  static oncuechange_Getter(mthis) native "HTMLElement_oncuechange_Getter";
-  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+  ondblclick_Getter_(mthis) => mthis["ondblclick"];
 
-  static oncuechange_Setter(mthis, __arg_0) native "HTMLElement_oncuechange_Setter";
-  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
 
-  static ondblclick_Getter(mthis) native "HTMLElement_ondblclick_Getter";
-  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+  ondrag_Getter_(mthis) => mthis["ondrag"];
 
-  static ondblclick_Setter(mthis, __arg_0) native "HTMLElement_ondblclick_Setter";
-  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
 
-  static ondrag_Getter(mthis) native "HTMLElement_ondrag_Getter";
-  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+  ondragend_Getter_(mthis) => mthis["ondragend"];
 
-  static ondrag_Setter(mthis, __arg_0) native "HTMLElement_ondrag_Setter";
-  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
 
-  static ondragend_Getter(mthis) native "HTMLElement_ondragend_Getter";
-  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+  ondragenter_Getter_(mthis) => mthis["ondragenter"];
 
-  static ondragend_Setter(mthis, __arg_0) native "HTMLElement_ondragend_Setter";
-  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
 
-  static ondragenter_Getter(mthis) native "HTMLElement_ondragenter_Getter";
-  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+  ondragleave_Getter_(mthis) => mthis["ondragleave"];
 
-  static ondragenter_Setter(mthis, __arg_0) native "HTMLElement_ondragenter_Setter";
-  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
 
-  static ondragleave_Getter(mthis) native "HTMLElement_ondragleave_Getter";
-  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+  ondragover_Getter_(mthis) => mthis["ondragover"];
 
-  static ondragleave_Setter(mthis, __arg_0) native "HTMLElement_ondragleave_Setter";
-  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
 
-  static ondragover_Getter(mthis) native "HTMLElement_ondragover_Getter";
-  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+  ondragstart_Getter_(mthis) => mthis["ondragstart"];
 
-  static ondragover_Setter(mthis, __arg_0) native "HTMLElement_ondragover_Setter";
-  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
 
-  static ondragstart_Getter(mthis) native "HTMLElement_ondragstart_Getter";
-  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+  ondrop_Getter_(mthis) => mthis["ondrop"];
 
-  static ondragstart_Setter(mthis, __arg_0) native "HTMLElement_ondragstart_Setter";
-  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
 
-  static ondrop_Getter(mthis) native "HTMLElement_ondrop_Getter";
-  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+  ondurationchange_Getter_(mthis) => mthis["ondurationchange"];
 
-  static ondrop_Setter(mthis, __arg_0) native "HTMLElement_ondrop_Setter";
-  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
 
-  static ondurationchange_Getter(mthis) native "HTMLElement_ondurationchange_Getter";
-  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+  onemptied_Getter_(mthis) => mthis["onemptied"];
 
-  static ondurationchange_Setter(mthis, __arg_0) native "HTMLElement_ondurationchange_Setter";
-  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
 
-  static onemptied_Getter(mthis) native "HTMLElement_onemptied_Getter";
-  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static onemptied_Setter(mthis, __arg_0) native "HTMLElement_onemptied_Setter";
-  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static onended_Getter(mthis) native "HTMLElement_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onended_Setter(mthis, __arg_0) native "HTMLElement_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "HTMLElement_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onfocus_Getter_(mthis) => mthis["onfocus"];
 
-  static onerror_Setter(mthis, __arg_0) native "HTMLElement_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  static onfocus_Getter(mthis) native "HTMLElement_onfocus_Getter";
-  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+  oninput_Getter_(mthis) => mthis["oninput"];
 
-  static onfocus_Setter(mthis, __arg_0) native "HTMLElement_onfocus_Setter";
-  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
 
-  static oninput_Getter(mthis) native "HTMLElement_oninput_Getter";
-  oninput_Getter_(mthis) => oninput_Getter(mthis);
+  oninvalid_Getter_(mthis) => mthis["oninvalid"];
 
-  static oninput_Setter(mthis, __arg_0) native "HTMLElement_oninput_Setter";
-  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
 
-  static oninvalid_Getter(mthis) native "HTMLElement_oninvalid_Getter";
-  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+  onkeydown_Getter_(mthis) => mthis["onkeydown"];
 
-  static oninvalid_Setter(mthis, __arg_0) native "HTMLElement_oninvalid_Setter";
-  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
 
-  static onkeydown_Getter(mthis) native "HTMLElement_onkeydown_Getter";
-  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+  onkeypress_Getter_(mthis) => mthis["onkeypress"];
 
-  static onkeydown_Setter(mthis, __arg_0) native "HTMLElement_onkeydown_Setter";
-  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __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);
+  onkeyup_Getter_(mthis) => mthis["onkeyup"];
 
-  static onkeyup_Setter(mthis, __arg_0) native "HTMLElement_onkeyup_Setter";
-  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
 
-  static onload_Getter(mthis) native "HTMLElement_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static onload_Setter(mthis, __arg_0) native "HTMLElement_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static onloadeddata_Getter(mthis) native "HTMLElement_onloadeddata_Getter";
-  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+  onloadeddata_Getter_(mthis) => mthis["onloadeddata"];
 
-  static onloadeddata_Setter(mthis, __arg_0) native "HTMLElement_onloadeddata_Setter";
-  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
 
-  static onloadedmetadata_Getter(mthis) native "HTMLElement_onloadedmetadata_Getter";
-  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+  onloadedmetadata_Getter_(mthis) => mthis["onloadedmetadata"];
 
-  static onloadedmetadata_Setter(mthis, __arg_0) native "HTMLElement_onloadedmetadata_Setter";
-  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
 
-  static onloadstart_Getter(mthis) native "HTMLElement_onloadstart_Getter";
-  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static onloadstart_Setter(mthis, __arg_0) native "HTMLElement_onloadstart_Setter";
-  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static onmousedown_Getter(mthis) native "HTMLElement_onmousedown_Getter";
-  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+  onmousedown_Getter_(mthis) => mthis["onmousedown"];
 
-  static onmousedown_Setter(mthis, __arg_0) native "HTMLElement_onmousedown_Setter";
-  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
 
-  static onmouseenter_Getter(mthis) native "HTMLElement_onmouseenter_Getter";
-  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+  onmouseenter_Getter_(mthis) => mthis["onmouseenter"];
 
-  static onmouseenter_Setter(mthis, __arg_0) native "HTMLElement_onmouseenter_Setter";
-  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
 
-  static onmouseleave_Getter(mthis) native "HTMLElement_onmouseleave_Getter";
-  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+  onmouseleave_Getter_(mthis) => mthis["onmouseleave"];
 
-  static onmouseleave_Setter(mthis, __arg_0) native "HTMLElement_onmouseleave_Setter";
-  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
 
-  static onmousemove_Getter(mthis) native "HTMLElement_onmousemove_Getter";
-  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+  onmousemove_Getter_(mthis) => mthis["onmousemove"];
 
-  static onmousemove_Setter(mthis, __arg_0) native "HTMLElement_onmousemove_Setter";
-  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
 
-  static onmouseout_Getter(mthis) native "HTMLElement_onmouseout_Getter";
-  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+  onmouseout_Getter_(mthis) => mthis["onmouseout"];
 
-  static onmouseout_Setter(mthis, __arg_0) native "HTMLElement_onmouseout_Setter";
-  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
 
-  static onmouseover_Getter(mthis) native "HTMLElement_onmouseover_Getter";
-  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+  onmouseover_Getter_(mthis) => mthis["onmouseover"];
 
-  static onmouseover_Setter(mthis, __arg_0) native "HTMLElement_onmouseover_Setter";
-  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
 
-  static onmouseup_Getter(mthis) native "HTMLElement_onmouseup_Getter";
-  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+  onmouseup_Getter_(mthis) => mthis["onmouseup"];
 
-  static onmouseup_Setter(mthis, __arg_0) native "HTMLElement_onmouseup_Setter";
-  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
 
-  static onmousewheel_Getter(mthis) native "HTMLElement_onmousewheel_Getter";
-  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+  onmousewheel_Getter_(mthis) => mthis["onmousewheel"];
 
-  static onmousewheel_Setter(mthis, __arg_0) native "HTMLElement_onmousewheel_Setter";
-  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  static onpause_Getter(mthis) native "HTMLElement_onpause_Getter";
-  onpause_Getter_(mthis) => onpause_Getter(mthis);
+  onpause_Getter_(mthis) => mthis["onpause"];
 
-  static onpause_Setter(mthis, __arg_0) native "HTMLElement_onpause_Setter";
-  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
 
-  static onplay_Getter(mthis) native "HTMLElement_onplay_Getter";
-  onplay_Getter_(mthis) => onplay_Getter(mthis);
+  onplay_Getter_(mthis) => mthis["onplay"];
 
-  static onplay_Setter(mthis, __arg_0) native "HTMLElement_onplay_Setter";
-  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
 
-  static onplaying_Getter(mthis) native "HTMLElement_onplaying_Getter";
-  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+  onplaying_Getter_(mthis) => mthis["onplaying"];
 
-  static onplaying_Setter(mthis, __arg_0) native "HTMLElement_onplaying_Setter";
-  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "HTMLElement_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onprogress_Setter(mthis, __arg_0) native "HTMLElement_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onratechange_Getter(mthis) native "HTMLElement_onratechange_Getter";
-  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+  onratechange_Getter_(mthis) => mthis["onratechange"];
 
-  static onratechange_Setter(mthis, __arg_0) native "HTMLElement_onratechange_Setter";
-  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
 
-  static onreset_Getter(mthis) native "HTMLElement_onreset_Getter";
-  onreset_Getter_(mthis) => onreset_Getter(mthis);
+  onreset_Getter_(mthis) => mthis["onreset"];
 
-  static onreset_Setter(mthis, __arg_0) native "HTMLElement_onreset_Setter";
-  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
 
-  static onresize_Getter(mthis) native "HTMLElement_onresize_Getter";
-  onresize_Getter_(mthis) => onresize_Getter(mthis);
+  onresize_Getter_(mthis) => mthis["onresize"];
 
-  static onresize_Setter(mthis, __arg_0) native "HTMLElement_onresize_Setter";
-  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
 
-  static onscroll_Getter(mthis) native "HTMLElement_onscroll_Getter";
-  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+  onscroll_Getter_(mthis) => mthis["onscroll"];
 
-  static onscroll_Setter(mthis, __arg_0) native "HTMLElement_onscroll_Setter";
-  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  static onseeked_Getter(mthis) native "HTMLElement_onseeked_Getter";
-  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+  onseeked_Getter_(mthis) => mthis["onseeked"];
 
-  static onseeked_Setter(mthis, __arg_0) native "HTMLElement_onseeked_Setter";
-  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
 
-  static onseeking_Getter(mthis) native "HTMLElement_onseeking_Getter";
-  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+  onseeking_Getter_(mthis) => mthis["onseeking"];
 
-  static onseeking_Setter(mthis, __arg_0) native "HTMLElement_onseeking_Setter";
-  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
 
-  static onselect_Getter(mthis) native "HTMLElement_onselect_Getter";
-  onselect_Getter_(mthis) => onselect_Getter(mthis);
+  onselect_Getter_(mthis) => mthis["onselect"];
 
-  static onselect_Setter(mthis, __arg_0) native "HTMLElement_onselect_Setter";
-  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
 
-  static onshow_Getter(mthis) native "HTMLElement_onshow_Getter";
-  onshow_Getter_(mthis) => onshow_Getter(mthis);
+  onshow_Getter_(mthis) => mthis["onshow"];
 
-  static onshow_Setter(mthis, __arg_0) native "HTMLElement_onshow_Setter";
-  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
 
-  static onstalled_Getter(mthis) native "HTMLElement_onstalled_Getter";
-  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+  onstalled_Getter_(mthis) => mthis["onstalled"];
 
-  static onstalled_Setter(mthis, __arg_0) native "HTMLElement_onstalled_Setter";
-  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
 
-  static onsubmit_Getter(mthis) native "HTMLElement_onsubmit_Getter";
-  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+  onsubmit_Getter_(mthis) => mthis["onsubmit"];
 
-  static onsubmit_Setter(mthis, __arg_0) native "HTMLElement_onsubmit_Setter";
-  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
 
-  static onsuspend_Getter(mthis) native "HTMLElement_onsuspend_Getter";
-  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+  onsuspend_Getter_(mthis) => mthis["onsuspend"];
 
-  static onsuspend_Setter(mthis, __arg_0) native "HTMLElement_onsuspend_Setter";
-  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
 
-  static ontimeupdate_Getter(mthis) native "HTMLElement_ontimeupdate_Getter";
-  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+  ontimeupdate_Getter_(mthis) => mthis["ontimeupdate"];
 
-  static ontimeupdate_Setter(mthis, __arg_0) native "HTMLElement_ontimeupdate_Setter";
-  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
 
-  static ontoggle_Getter(mthis) native "HTMLElement_ontoggle_Getter";
-  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+  ontoggle_Getter_(mthis) => mthis["ontoggle"];
 
-  static ontoggle_Setter(mthis, __arg_0) native "HTMLElement_ontoggle_Setter";
-  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
 
-  static onvolumechange_Getter(mthis) native "HTMLElement_onvolumechange_Getter";
-  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+  onvolumechange_Getter_(mthis) => mthis["onvolumechange"];
 
-  static onvolumechange_Setter(mthis, __arg_0) native "HTMLElement_onvolumechange_Setter";
-  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
 
-  static onwaiting_Getter(mthis) native "HTMLElement_onwaiting_Getter";
-  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+  onwaiting_Getter_(mthis) => mthis["onwaiting"];
 
-  static onwaiting_Setter(mthis, __arg_0) native "HTMLElement_onwaiting_Setter";
-  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  static outerText_Getter(mthis) native "HTMLElement_outerText_Getter";
-  outerText_Getter_(mthis) => outerText_Getter(mthis);
+  outerText_Getter_(mthis) => mthis["outerText"];
 
-  static outerText_Setter(mthis, __arg_0) native "HTMLElement_outerText_Setter";
-  outerText_Setter_(mthis, __arg_0) => outerText_Setter(mthis, __arg_0);
+  outerText_Setter_(mthis, __arg_0) => mthis["outerText"] = __arg_0;
 
-  static spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
-  spellcheck_Getter_(mthis) => spellcheck_Getter(mthis);
+  spellcheck_Getter_(mthis) => mthis["spellcheck"];
 
-  static spellcheck_Setter(mthis, __arg_0) native "HTMLElement_spellcheck_Setter";
-  spellcheck_Setter_(mthis, __arg_0) => spellcheck_Setter(mthis, __arg_0);
+  spellcheck_Setter_(mthis, __arg_0) => mthis["spellcheck"] = __arg_0;
 
-  static tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
-  tabIndex_Getter_(mthis) => tabIndex_Getter(mthis);
+  tabIndex_Getter_(mthis) => mthis["tabIndex"];
 
-  static tabIndex_Setter(mthis, __arg_0) native "HTMLElement_tabIndex_Setter";
-  tabIndex_Setter_(mthis, __arg_0) => tabIndex_Setter(mthis, __arg_0);
+  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
 
-  static title_Getter(mthis) native "HTMLElement_title_Getter";
-  title_Getter_(mthis) => title_Getter(mthis);
+  title_Getter_(mthis) => mthis["title"];
 
-  static title_Setter(mthis, __arg_0) native "HTMLElement_title_Setter";
-  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
+  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
 
-  static translate_Getter(mthis) native "HTMLElement_translate_Getter";
-  translate_Getter_(mthis) => translate_Getter(mthis);
+  translate_Getter_(mthis) => mthis["translate"];
 
-  static translate_Setter(mthis, __arg_0) native "HTMLElement_translate_Setter";
-  translate_Setter_(mthis, __arg_0) => translate_Setter(mthis, __arg_0);
+  translate_Setter_(mthis, __arg_0) => mthis["translate"] = __arg_0;
 
-  static webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
-  webkitdropzone_Getter_(mthis) => webkitdropzone_Getter(mthis);
+  webkitdropzone_Getter_(mthis) => mthis["webkitdropzone"];
 
-  static webkitdropzone_Setter(mthis, __arg_0) native "HTMLElement_webkitdropzone_Setter";
-  webkitdropzone_Setter_(mthis, __arg_0) => webkitdropzone_Setter(mthis, __arg_0);
+  webkitdropzone_Setter_(mthis, __arg_0) => mthis["webkitdropzone"] = __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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static align_Getter(mthis) native "HTMLEmbedElement_align_Getter";
-  align_Getter_(mthis) => align_Getter(mthis);
+  align_Getter_(mthis) => mthis["align"];
 
-  static align_Setter(mthis, __arg_0) native "HTMLEmbedElement_align_Setter";
-  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
-  static getSVGDocument_Callback_0(mthis) native "HTMLEmbedElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+  getSVGDocument_Callback_0_(mthis) => mthis.callMethod("getSVGDocument", []);
 
-  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLEmbedElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLEmbedElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLEmbedElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLEmbedElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLEmbedElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLEmbedElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  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, __arg_0) native "HTMLEmbedElement_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
 }
 
 class BlinkHTMLFieldSetElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLFieldSetElement();
 
-  static checkValidity_Callback_0(mthis) native "HTMLFieldSetElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLFieldSetElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  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);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  elements_Getter_(mthis) => mthis["elements"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLFieldSetElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  form_Getter_(mthis) => mthis["form"];
 
-  static elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
-  elements_Getter_(mthis) => elements_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static name_Setter(mthis, __arg_0) native "HTMLFieldSetElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLFieldSetElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLFieldSetElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
@@ -10389,124 +5804,66 @@
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static namedItem_Callback_0(mthis) native "HTMLFormControlsCollection_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  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);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
-  acceptCharset_Getter_(mthis) => acceptCharset_Getter(mthis);
+  acceptCharset_Getter_(mthis) => mthis["acceptCharset"];
 
-  static acceptCharset_Setter(mthis, __arg_0) native "HTMLFormElement_acceptCharset_Setter";
-  acceptCharset_Setter_(mthis, __arg_0) => acceptCharset_Setter(mthis, __arg_0);
+  acceptCharset_Setter_(mthis, __arg_0) => mthis["acceptCharset"] = __arg_0;
 
-  static action_Getter(mthis) native "HTMLFormElement_action_Getter";
-  action_Getter_(mthis) => action_Getter(mthis);
+  action_Getter_(mthis) => mthis["action"];
 
-  static action_Setter(mthis, __arg_0) native "HTMLFormElement_action_Setter";
-  action_Setter_(mthis, __arg_0) => action_Setter(mthis, __arg_0);
+  action_Setter_(mthis, __arg_0) => mthis["action"] = __arg_0;
 
-  static autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
-  autocomplete_Getter_(mthis) => autocomplete_Getter(mthis);
+  autocomplete_Getter_(mthis) => mthis["autocomplete"];
 
-  static autocomplete_Setter(mthis, __arg_0) native "HTMLFormElement_autocomplete_Setter";
-  autocomplete_Setter_(mthis, __arg_0) => autocomplete_Setter(mthis, __arg_0);
+  autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
 
-  static checkValidity_Callback_0(mthis) native "HTMLFormElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLFormElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  elements_Getter_(mthis) => mthis["elements"];
 
-  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);
+  encoding_Getter_(mthis) => mthis["encoding"];
 
-  static elements_Getter(mthis) native "HTMLFormElement_elements_Getter";
-  elements_Getter_(mthis) => elements_Getter(mthis);
+  encoding_Setter_(mthis, __arg_0) => mthis["encoding"] = __arg_0;
 
-  static encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
-  encoding_Getter_(mthis) => encoding_Getter(mthis);
+  enctype_Getter_(mthis) => mthis["enctype"];
 
-  static encoding_Setter(mthis, __arg_0) native "HTMLFormElement_encoding_Setter";
-  encoding_Setter_(mthis, __arg_0) => encoding_Setter(mthis, __arg_0);
+  enctype_Setter_(mthis, __arg_0) => mthis["enctype"] = __arg_0;
 
-  static enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
-  enctype_Getter_(mthis) => enctype_Getter(mthis);
+  length_Getter_(mthis) => mthis["length"];
 
-  static enctype_Setter(mthis, __arg_0) native "HTMLFormElement_enctype_Setter";
-  enctype_Setter_(mthis, __arg_0) => enctype_Setter(mthis, __arg_0);
+  method_Getter_(mthis) => mthis["method"];
 
-  static length_Getter(mthis) native "HTMLFormElement_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  method_Setter_(mthis, __arg_0) => mthis["method"] = __arg_0;
 
-  static method_Getter(mthis) native "HTMLFormElement_method_Getter";
-  method_Getter_(mthis) => method_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static method_Setter(mthis, __arg_0) native "HTMLFormElement_method_Setter";
-  method_Setter_(mthis, __arg_0) => method_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLFormElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  noValidate_Getter_(mthis) => mthis["noValidate"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLFormElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  noValidate_Setter_(mthis, __arg_0) => mthis["noValidate"] = __arg_0;
 
-  static noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
-  noValidate_Getter_(mthis) => noValidate_Getter(mthis);
+  requestAutocomplete_Callback_0_(mthis) => mthis.callMethod("requestAutocomplete", []);
 
-  static noValidate_Setter(mthis, __arg_0) native "HTMLFormElement_noValidate_Setter";
-  noValidate_Setter_(mthis, __arg_0) => noValidate_Setter(mthis, __arg_0);
+  reset_Callback_0_(mthis) => mthis.callMethod("reset", []);
 
-  static requestAutocomplete_Callback_0(mthis) native "HTMLFormElement_requestAutocomplete_Callback";
-  requestAutocomplete_Callback_0_(mthis) => requestAutocomplete_Callback_0(mthis);
+  submit_Callback_0_(mthis) => mthis.callMethod("submit", []);
 
-  static requestAutocomplete_Callback_1(mthis, __arg_0) native "HTMLFormElement_requestAutocomplete_Callback";
-  requestAutocomplete_Callback_1_(mthis, __arg_0) => requestAutocomplete_Callback_1(mthis, __arg_0);
+  target_Getter_(mthis) => mthis["target"];
 
-  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, __arg_0) native "HTMLFormElement_target_Setter";
-  target_Setter_(mthis, __arg_0) => target_Setter(mthis, __arg_0);
+  target_Setter_(mthis, __arg_0) => mthis["target"] = __arg_0;
 
 }
 
@@ -10518,19 +5875,16 @@
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  color_Getter_(mthis) => mthis["color"];
 
-  static color_Setter(mthis, __arg_0) native "HTMLHRElement_color_Setter";
-  color_Setter_(mthis, __arg_0) => color_Setter(mthis, __arg_0);
+  color_Setter_(mthis, __arg_0) => mthis["color"] = __arg_0;
 
 }
 
@@ -10552,744 +5906,467 @@
 class BlinkHTMLIFrameElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLIFrameElement();
 
-  static allowFullscreen_Getter(mthis) native "HTMLIFrameElement_allowFullscreen_Getter";
-  allowFullscreen_Getter_(mthis) => allowFullscreen_Getter(mthis);
+  allowFullscreen_Getter_(mthis) => mthis["allowFullscreen"];
 
-  static allowFullscreen_Setter(mthis, __arg_0) native "HTMLIFrameElement_allowFullscreen_Setter";
-  allowFullscreen_Setter_(mthis, __arg_0) => allowFullscreen_Setter(mthis, __arg_0);
+  allowFullscreen_Setter_(mthis, __arg_0) => mthis["allowFullscreen"] = __arg_0;
 
-  static contentDocument_Getter(mthis) native "HTMLIFrameElement_contentDocument_Getter";
-  contentDocument_Getter_(mthis) => contentDocument_Getter(mthis);
+  contentDocument_Getter_(mthis) => mthis["contentDocument"];
 
-  static contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
-  contentWindow_Getter_(mthis) => contentWindow_Getter(mthis);
+  contentWindow_Getter_(mthis) => mthis["contentWindow"];
 
-  static getSVGDocument_Callback_0(mthis) native "HTMLIFrameElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+  getSVGDocument_Callback_0_(mthis) => mthis.callMethod("getSVGDocument", []);
 
-  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLIFrameElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLIFrameElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLIFrameElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLIFrameElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  sandbox_Getter_(mthis) => mthis["sandbox"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLIFrameElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  sandbox_Setter_(mthis, __arg_0) => mthis["sandbox"] = __arg_0;
 
-  static sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
-  sandbox_Getter_(mthis) => sandbox_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static sandbox_Setter(mthis, __arg_0) native "HTMLIFrameElement_sandbox_Setter";
-  sandbox_Setter_(mthis, __arg_0) => sandbox_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  srcdoc_Getter_(mthis) => mthis["srcdoc"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLIFrameElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  srcdoc_Setter_(mthis, __arg_0) => mthis["srcdoc"] = __arg_0;
 
-  static srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
-  srcdoc_Getter_(mthis) => srcdoc_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  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, __arg_0) native "HTMLIFrameElement_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
 }
 
 class BlinkHTMLImageElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLImageElement();
 
-  static alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
-  alt_Getter_(mthis) => alt_Getter(mthis);
+  alt_Getter_(mthis) => mthis["alt"];
 
-  static alt_Setter(mthis, __arg_0) native "HTMLImageElement_alt_Setter";
-  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
+  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
 
-  static border_Getter(mthis) native "HTMLImageElement_border_Getter";
-  border_Getter_(mthis) => border_Getter(mthis);
+  border_Getter_(mthis) => mthis["border"];
 
-  static border_Setter(mthis, __arg_0) native "HTMLImageElement_border_Setter";
-  border_Setter_(mthis, __arg_0) => border_Setter(mthis, __arg_0);
+  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
 
-  static complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
-  complete_Getter_(mthis) => complete_Getter(mthis);
+  complete_Getter_(mthis) => mthis["complete"];
 
-  static constructorCallback_0() native "HTMLImageElement_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Image"], []);
 
-  static constructorCallback_1(__arg_0) native "HTMLImageElement_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Image"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "HTMLImageElement_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Image"], [__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);
+  crossOrigin_Getter_(mthis) => mthis["crossOrigin"];
 
-  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);
+  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
 
-  static crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
-  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+  currentSrc_Getter_(mthis) => mthis["currentSrc"];
 
-  static crossOrigin_Setter(mthis, __arg_0) native "HTMLImageElement_crossOrigin_Setter";
-  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  static currentSrc_Getter(mthis) native "HTMLImageElement_currentSrc_Getter";
-  currentSrc_Getter_(mthis) => currentSrc_Getter(mthis);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLImageElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLImageElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLImageElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  isMap_Getter_(mthis) => mthis["isMap"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLImageElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  isMap_Setter_(mthis, __arg_0) => mthis["isMap"] = __arg_0;
 
-  static isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
-  isMap_Getter_(mthis) => isMap_Getter(mthis);
+  lowsrc_Getter_(mthis) => mthis["lowsrc"];
 
-  static isMap_Setter(mthis, __arg_0) native "HTMLImageElement_isMap_Setter";
-  isMap_Setter_(mthis, __arg_0) => isMap_Setter(mthis, __arg_0);
+  lowsrc_Setter_(mthis, __arg_0) => mthis["lowsrc"] = __arg_0;
 
-  static lowsrc_Getter(mthis) native "HTMLImageElement_lowsrc_Getter";
-  lowsrc_Getter_(mthis) => lowsrc_Getter(mthis);
+  naturalHeight_Getter_(mthis) => mthis["naturalHeight"];
 
-  static lowsrc_Setter(mthis, __arg_0) native "HTMLImageElement_lowsrc_Setter";
-  lowsrc_Setter_(mthis, __arg_0) => lowsrc_Setter(mthis, __arg_0);
+  naturalWidth_Getter_(mthis) => mthis["naturalWidth"];
 
-  static naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
-  naturalHeight_Getter_(mthis) => naturalHeight_Getter(mthis);
+  sizes_Getter_(mthis) => mthis["sizes"];
 
-  static naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
-  naturalWidth_Getter_(mthis) => naturalWidth_Getter(mthis);
+  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
 
-  static sizes_Getter(mthis) native "HTMLImageElement_sizes_Getter";
-  sizes_Getter_(mthis) => sizes_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static sizes_Setter(mthis, __arg_0) native "HTMLImageElement_sizes_Setter";
-  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static src_Getter(mthis) native "HTMLImageElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  srcset_Getter_(mthis) => mthis["srcset"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLImageElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  srcset_Setter_(mthis, __arg_0) => mthis["srcset"] = __arg_0;
 
-  static srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
-  srcset_Getter_(mthis) => srcset_Getter(mthis);
+  useMap_Getter_(mthis) => mthis["useMap"];
 
-  static srcset_Setter(mthis, __arg_0) native "HTMLImageElement_srcset_Setter";
-  srcset_Setter_(mthis, __arg_0) => srcset_Setter(mthis, __arg_0);
+  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
 
-  static useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
-  useMap_Getter_(mthis) => useMap_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static useMap_Setter(mthis, __arg_0) native "HTMLImageElement_useMap_Setter";
-  useMap_Setter_(mthis, __arg_0) => useMap_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
-  static width_Getter(mthis) native "HTMLImageElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkHTMLInputElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLInputElement();
 
-  static accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
-  accept_Getter_(mthis) => accept_Getter(mthis);
+  accept_Getter_(mthis) => mthis["accept"];
 
-  static accept_Setter(mthis, __arg_0) native "HTMLInputElement_accept_Setter";
-  accept_Setter_(mthis, __arg_0) => accept_Setter(mthis, __arg_0);
+  accept_Setter_(mthis, __arg_0) => mthis["accept"] = __arg_0;
 
-  static alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
-  alt_Getter_(mthis) => alt_Getter(mthis);
+  alt_Getter_(mthis) => mthis["alt"];
 
-  static alt_Setter(mthis, __arg_0) native "HTMLInputElement_alt_Setter";
-  alt_Setter_(mthis, __arg_0) => alt_Setter(mthis, __arg_0);
+  alt_Setter_(mthis, __arg_0) => mthis["alt"] = __arg_0;
 
-  static autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
-  autocomplete_Getter_(mthis) => autocomplete_Getter(mthis);
+  autocomplete_Getter_(mthis) => mthis["autocomplete"];
 
-  static autocomplete_Setter(mthis, __arg_0) native "HTMLInputElement_autocomplete_Setter";
-  autocomplete_Setter_(mthis, __arg_0) => autocomplete_Setter(mthis, __arg_0);
+  autocomplete_Setter_(mthis, __arg_0) => mthis["autocomplete"] = __arg_0;
 
-  static autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
-  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+  autofocus_Getter_(mthis) => mthis["autofocus"];
 
-  static autofocus_Setter(mthis, __arg_0) native "HTMLInputElement_autofocus_Setter";
-  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  static capture_Getter(mthis) native "HTMLInputElement_capture_Getter";
-  capture_Getter_(mthis) => capture_Getter(mthis);
+  capture_Getter_(mthis) => mthis["capture"];
 
-  static capture_Setter(mthis, __arg_0) native "HTMLInputElement_capture_Setter";
-  capture_Setter_(mthis, __arg_0) => capture_Setter(mthis, __arg_0);
+  capture_Setter_(mthis, __arg_0) => mthis["capture"] = __arg_0;
 
-  static checkValidity_Callback_0(mthis) native "HTMLInputElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLInputElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  checked_Getter_(mthis) => mthis["checked"];
 
-  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);
+  checked_Setter_(mthis, __arg_0) => mthis["checked"] = __arg_0;
 
-  static checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
-  checked_Getter_(mthis) => checked_Getter(mthis);
+  defaultChecked_Getter_(mthis) => mthis["defaultChecked"];
 
-  static checked_Setter(mthis, __arg_0) native "HTMLInputElement_checked_Setter";
-  checked_Setter_(mthis, __arg_0) => checked_Setter(mthis, __arg_0);
+  defaultChecked_Setter_(mthis, __arg_0) => mthis["defaultChecked"] = __arg_0;
 
-  static defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
-  defaultChecked_Getter_(mthis) => defaultChecked_Getter(mthis);
+  defaultValue_Getter_(mthis) => mthis["defaultValue"];
 
-  static defaultChecked_Setter(mthis, __arg_0) native "HTMLInputElement_defaultChecked_Setter";
-  defaultChecked_Setter_(mthis, __arg_0) => defaultChecked_Setter(mthis, __arg_0);
+  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
 
-  static defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
-  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
+  dirName_Getter_(mthis) => mthis["dirName"];
 
-  static defaultValue_Setter(mthis, __arg_0) native "HTMLInputElement_defaultValue_Setter";
-  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
+  dirName_Setter_(mthis, __arg_0) => mthis["dirName"] = __arg_0;
 
-  static dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
-  dirName_Getter_(mthis) => dirName_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static dirName_Setter(mthis, __arg_0) native "HTMLInputElement_dirName_Setter";
-  dirName_Setter_(mthis, __arg_0) => dirName_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  files_Getter_(mthis) => mthis["files"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLInputElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  files_Setter_(mthis, __arg_0) => mthis["files"] = __arg_0;
 
-  static files_Getter(mthis) native "HTMLInputElement_files_Getter";
-  files_Getter_(mthis) => files_Getter(mthis);
+  formAction_Getter_(mthis) => mthis["formAction"];
 
-  static files_Setter(mthis, __arg_0) native "HTMLInputElement_files_Setter";
-  files_Setter_(mthis, __arg_0) => files_Setter(mthis, __arg_0);
+  formAction_Setter_(mthis, __arg_0) => mthis["formAction"] = __arg_0;
 
-  static formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
-  formAction_Getter_(mthis) => formAction_Getter(mthis);
+  formEnctype_Getter_(mthis) => mthis["formEnctype"];
 
-  static formAction_Setter(mthis, __arg_0) native "HTMLInputElement_formAction_Setter";
-  formAction_Setter_(mthis, __arg_0) => formAction_Setter(mthis, __arg_0);
+  formEnctype_Setter_(mthis, __arg_0) => mthis["formEnctype"] = __arg_0;
 
-  static formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
-  formEnctype_Getter_(mthis) => formEnctype_Getter(mthis);
+  formMethod_Getter_(mthis) => mthis["formMethod"];
 
-  static formEnctype_Setter(mthis, __arg_0) native "HTMLInputElement_formEnctype_Setter";
-  formEnctype_Setter_(mthis, __arg_0) => formEnctype_Setter(mthis, __arg_0);
+  formMethod_Setter_(mthis, __arg_0) => mthis["formMethod"] = __arg_0;
 
-  static formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
-  formMethod_Getter_(mthis) => formMethod_Getter(mthis);
+  formNoValidate_Getter_(mthis) => mthis["formNoValidate"];
 
-  static formMethod_Setter(mthis, __arg_0) native "HTMLInputElement_formMethod_Setter";
-  formMethod_Setter_(mthis, __arg_0) => formMethod_Setter(mthis, __arg_0);
+  formNoValidate_Setter_(mthis, __arg_0) => mthis["formNoValidate"] = __arg_0;
 
-  static formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
-  formNoValidate_Getter_(mthis) => formNoValidate_Getter(mthis);
+  formTarget_Getter_(mthis) => mthis["formTarget"];
 
-  static formNoValidate_Setter(mthis, __arg_0) native "HTMLInputElement_formNoValidate_Setter";
-  formNoValidate_Setter_(mthis, __arg_0) => formNoValidate_Setter(mthis, __arg_0);
+  formTarget_Setter_(mthis, __arg_0) => mthis["formTarget"] = __arg_0;
 
-  static formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
-  formTarget_Getter_(mthis) => formTarget_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static formTarget_Setter(mthis, __arg_0) native "HTMLInputElement_formTarget_Setter";
-  formTarget_Setter_(mthis, __arg_0) => formTarget_Setter(mthis, __arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  static form_Getter(mthis) native "HTMLInputElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLInputElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  incremental_Getter_(mthis) => mthis["incremental"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLInputElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  incremental_Setter_(mthis, __arg_0) => mthis["incremental"] = __arg_0;
 
-  static incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
-  incremental_Getter_(mthis) => incremental_Getter(mthis);
+  indeterminate_Getter_(mthis) => mthis["indeterminate"];
 
-  static incremental_Setter(mthis, __arg_0) native "HTMLInputElement_incremental_Setter";
-  incremental_Setter_(mthis, __arg_0) => incremental_Setter(mthis, __arg_0);
+  indeterminate_Setter_(mthis, __arg_0) => mthis["indeterminate"] = __arg_0;
 
-  static indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
-  indeterminate_Getter_(mthis) => indeterminate_Getter(mthis);
+  inputMode_Getter_(mthis) => mthis["inputMode"];
 
-  static indeterminate_Setter(mthis, __arg_0) native "HTMLInputElement_indeterminate_Setter";
-  indeterminate_Setter_(mthis, __arg_0) => indeterminate_Setter(mthis, __arg_0);
+  inputMode_Setter_(mthis, __arg_0) => mthis["inputMode"] = __arg_0;
 
-  static inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
-  inputMode_Getter_(mthis) => inputMode_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static inputMode_Setter(mthis, __arg_0) native "HTMLInputElement_inputMode_Setter";
-  inputMode_Setter_(mthis, __arg_0) => inputMode_Setter(mthis, __arg_0);
+  list_Getter_(mthis) => mthis["list"];
 
-  static labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  maxLength_Getter_(mthis) => mthis["maxLength"];
 
-  static list_Getter(mthis) native "HTMLInputElement_list_Getter";
-  list_Getter_(mthis) => list_Getter(mthis);
+  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
 
-  static maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
-  maxLength_Getter_(mthis) => maxLength_Getter(mthis);
+  max_Getter_(mthis) => mthis["max"];
 
-  static maxLength_Setter(mthis, __arg_0) native "HTMLInputElement_maxLength_Setter";
-  maxLength_Setter_(mthis, __arg_0) => maxLength_Setter(mthis, __arg_0);
+  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
 
-  static max_Getter(mthis) native "HTMLInputElement_max_Getter";
-  max_Getter_(mthis) => max_Getter(mthis);
+  min_Getter_(mthis) => mthis["min"];
 
-  static max_Setter(mthis, __arg_0) native "HTMLInputElement_max_Setter";
-  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
+  min_Setter_(mthis, __arg_0) => mthis["min"] = __arg_0;
 
-  static min_Getter(mthis) native "HTMLInputElement_min_Getter";
-  min_Getter_(mthis) => min_Getter(mthis);
+  multiple_Getter_(mthis) => mthis["multiple"];
 
-  static min_Setter(mthis, __arg_0) native "HTMLInputElement_min_Setter";
-  min_Setter_(mthis, __arg_0) => min_Setter(mthis, __arg_0);
+  multiple_Setter_(mthis, __arg_0) => mthis["multiple"] = __arg_0;
 
-  static multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
-  multiple_Getter_(mthis) => multiple_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static multiple_Setter(mthis, __arg_0) native "HTMLInputElement_multiple_Setter";
-  multiple_Setter_(mthis, __arg_0) => multiple_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLInputElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  pattern_Getter_(mthis) => mthis["pattern"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLInputElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  pattern_Setter_(mthis, __arg_0) => mthis["pattern"] = __arg_0;
 
-  static pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
-  pattern_Getter_(mthis) => pattern_Getter(mthis);
+  placeholder_Getter_(mthis) => mthis["placeholder"];
 
-  static pattern_Setter(mthis, __arg_0) native "HTMLInputElement_pattern_Setter";
-  pattern_Setter_(mthis, __arg_0) => pattern_Setter(mthis, __arg_0);
+  placeholder_Setter_(mthis, __arg_0) => mthis["placeholder"] = __arg_0;
 
-  static placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
-  placeholder_Getter_(mthis) => placeholder_Getter(mthis);
+  readOnly_Getter_(mthis) => mthis["readOnly"];
 
-  static placeholder_Setter(mthis, __arg_0) native "HTMLInputElement_placeholder_Setter";
-  placeholder_Setter_(mthis, __arg_0) => placeholder_Setter(mthis, __arg_0);
+  readOnly_Setter_(mthis, __arg_0) => mthis["readOnly"] = __arg_0;
 
-  static readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
-  readOnly_Getter_(mthis) => readOnly_Getter(mthis);
-
-  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, __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, __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, __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, __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);
+  required_Getter_(mthis) => mthis["required"];
 
-  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);
+  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
 
-  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);
+  select_Callback_0_(mthis) => mthis.callMethod("select", []);
 
-  static setRangeText_Callback_0(mthis) native "HTMLInputElement_setRangeText_Callback";
-  setRangeText_Callback_0_(mthis) => setRangeText_Callback_0(mthis);
+  selectionDirection_Getter_(mthis) => mthis["selectionDirection"];
 
-  static setRangeText_Callback_1(mthis, __arg_0) native "HTMLInputElement_setRangeText_Callback";
-  setRangeText_Callback_1_(mthis, __arg_0) => setRangeText_Callback_1(mthis, __arg_0);
+  selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __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);
+  selectionEnd_Getter_(mthis) => mthis["selectionEnd"];
 
-  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);
+  selectionEnd_Setter_(mthis, __arg_0) => mthis["selectionEnd"] = __arg_0;
 
-  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);
+  selectionStart_Getter_(mthis) => mthis["selectionStart"];
 
-  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);
+  selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
 
-  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);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static setSelectionRange_Callback_0(mthis) native "HTMLInputElement_setSelectionRange_Callback";
-  setSelectionRange_Callback_0_(mthis) => setSelectionRange_Callback_0(mthis);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static setSelectionRange_Callback_1(mthis, __arg_0) native "HTMLInputElement_setSelectionRange_Callback";
-  setSelectionRange_Callback_1_(mthis, __arg_0) => setSelectionRange_Callback_1(mthis, __arg_0);
+  setRangeText_Callback_0_(mthis) => mthis.callMethod("setRangeText", []);
 
-  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);
+  setRangeText_Callback_1_(mthis, __arg_0) => mthis.callMethod("setRangeText", [__arg_0]);
 
-  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);
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setRangeText", [__arg_0, __arg_1]);
 
-  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);
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setRangeText", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static size_Getter(mthis) native "HTMLInputElement_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
+  setSelectionRange_Callback_0_(mthis) => mthis.callMethod("setSelectionRange", []);
 
-  static size_Setter(mthis, __arg_0) native "HTMLInputElement_size_Setter";
-  size_Setter_(mthis, __arg_0) => size_Setter(mthis, __arg_0);
+  setSelectionRange_Callback_1_(mthis, __arg_0) => mthis.callMethod("setSelectionRange", [__arg_0]);
 
-  static src_Getter(mthis) native "HTMLInputElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setSelectionRange", [__arg_0, __arg_1]);
 
-  static src_Setter(mthis, __arg_0) native "HTMLInputElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
-  static stepDown_Callback_0(mthis) native "HTMLInputElement_stepDown_Callback";
-  stepDown_Callback_0_(mthis) => stepDown_Callback_0(mthis);
+  size_Getter_(mthis) => mthis["size"];
 
-  static stepDown_Callback_1(mthis, __arg_0) native "HTMLInputElement_stepDown_Callback";
-  stepDown_Callback_1_(mthis, __arg_0) => stepDown_Callback_1(mthis, __arg_0);
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __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);
+  src_Getter_(mthis) => mthis["src"];
 
-  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);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static stepUp_Callback_0(mthis) native "HTMLInputElement_stepUp_Callback";
-  stepUp_Callback_0_(mthis) => stepUp_Callback_0(mthis);
+  stepDown_Callback_0_(mthis) => mthis.callMethod("stepDown", []);
 
-  static stepUp_Callback_1(mthis, __arg_0) native "HTMLInputElement_stepUp_Callback";
-  stepUp_Callback_1_(mthis, __arg_0) => stepUp_Callback_1(mthis, __arg_0);
+  stepDown_Callback_1_(mthis, __arg_0) => mthis.callMethod("stepDown", [__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);
+  stepUp_Callback_0_(mthis) => mthis.callMethod("stepUp", []);
 
-  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);
+  stepUp_Callback_1_(mthis, __arg_0) => mthis.callMethod("stepUp", [__arg_0]);
 
-  static step_Getter(mthis) native "HTMLInputElement_step_Getter";
-  step_Getter_(mthis) => step_Getter(mthis);
+  step_Getter_(mthis) => mthis["step"];
 
-  static step_Setter(mthis, __arg_0) native "HTMLInputElement_step_Setter";
-  step_Setter_(mthis, __arg_0) => step_Setter(mthis, __arg_0);
+  step_Setter_(mthis, __arg_0) => mthis["step"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLInputElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLInputElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
-  static useMap_Getter(mthis) native "HTMLInputElement_useMap_Getter";
-  useMap_Getter_(mthis) => useMap_Getter(mthis);
+  useMap_Getter_(mthis) => mthis["useMap"];
 
-  static useMap_Setter(mthis, __arg_0) native "HTMLInputElement_useMap_Setter";
-  useMap_Setter_(mthis, __arg_0) => useMap_Setter(mthis, __arg_0);
+  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __arg_0;
 
-  static validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
-  validationMessage_Getter_(mthis) => validationMessage_Getter(mthis);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  static validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
-  validity_Getter_(mthis) => validity_Getter(mthis);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  static valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
-  valueAsDate_Getter_(mthis) => valueAsDate_Getter(mthis);
+  valueAsDate_Getter_(mthis) => mthis["valueAsDate"];
 
-  static valueAsDate_Setter(mthis, __arg_0) native "HTMLInputElement_valueAsDate_Setter";
-  valueAsDate_Setter_(mthis, __arg_0) => valueAsDate_Setter(mthis, __arg_0);
+  valueAsDate_Setter_(mthis, __arg_0) => mthis["valueAsDate"] = __arg_0;
 
-  static valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
-  valueAsNumber_Getter_(mthis) => valueAsNumber_Getter(mthis);
+  valueAsNumber_Getter_(mthis) => mthis["valueAsNumber"];
 
-  static valueAsNumber_Setter(mthis, __arg_0) native "HTMLInputElement_valueAsNumber_Setter";
-  valueAsNumber_Setter_(mthis, __arg_0) => valueAsNumber_Setter(mthis, __arg_0);
+  valueAsNumber_Setter_(mthis, __arg_0) => mthis["valueAsNumber"] = __arg_0;
 
-  static value_Getter(mthis) native "HTMLInputElement_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "HTMLInputElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
-  static webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
-  webkitEntries_Getter_(mthis) => webkitEntries_Getter(mthis);
+  webkitEntries_Getter_(mthis) => mthis["webkitEntries"];
 
-  static webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
-  webkitdirectory_Getter_(mthis) => webkitdirectory_Getter(mthis);
+  webkitdirectory_Getter_(mthis) => mthis["webkitdirectory"];
 
-  static webkitdirectory_Setter(mthis, __arg_0) native "HTMLInputElement_webkitdirectory_Setter";
-  webkitdirectory_Setter_(mthis, __arg_0) => webkitdirectory_Setter(mthis, __arg_0);
+  webkitdirectory_Setter_(mthis, __arg_0) => mthis["webkitdirectory"] = __arg_0;
 
-  static width_Getter(mthis) native "HTMLInputElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static width_Setter(mthis, __arg_0) native "HTMLInputElement_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
-  static willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
-  willValidate_Getter_(mthis) => willValidate_Getter(mthis);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
 class BlinkHTMLKeygenElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLKeygenElement();
 
-  static autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
-  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+  autofocus_Getter_(mthis) => mthis["autofocus"];
 
-  static autofocus_Setter(mthis, __arg_0) native "HTMLKeygenElement_autofocus_Setter";
-  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  static challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
-  challenge_Getter_(mthis) => challenge_Getter(mthis);
+  challenge_Getter_(mthis) => mthis["challenge"];
 
-  static challenge_Setter(mthis, __arg_0) native "HTMLKeygenElement_challenge_Setter";
-  challenge_Setter_(mthis, __arg_0) => challenge_Setter(mthis, __arg_0);
+  challenge_Setter_(mthis, __arg_0) => mthis["challenge"] = __arg_0;
 
-  static checkValidity_Callback_0(mthis) native "HTMLKeygenElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLKeygenElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  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);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLKeygenElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  keytype_Getter_(mthis) => mthis["keytype"];
 
-  static form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  keytype_Setter_(mthis, __arg_0) => mthis["keytype"] = __arg_0;
 
-  static keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
-  keytype_Getter_(mthis) => keytype_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static keytype_Setter(mthis, __arg_0) native "HTMLKeygenElement_keytype_Setter";
-  keytype_Setter_(mthis, __arg_0) => keytype_Setter(mthis, __arg_0);
+  name_Getter_(mthis) => mthis["name"];
 
-  static labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static name_Setter(mthis, __arg_0) native "HTMLKeygenElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLKeygenElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLKeygenElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
 class BlinkHTMLLIElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLIElement();
 
-  static type_Getter(mthis) native "HTMLLIElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLLIElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
-  static value_Getter(mthis) native "HTMLLIElement_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "HTMLLIElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkHTMLLabelElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLabelElement();
 
-  static control_Getter(mthis) native "HTMLLabelElement_control_Getter";
-  control_Getter_(mthis) => control_Getter(mthis);
+  control_Getter_(mthis) => mthis["control"];
 
-  static form_Getter(mthis) native "HTMLLabelElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
-  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
+  htmlFor_Getter_(mthis) => mthis["htmlFor"];
 
-  static htmlFor_Setter(mthis, __arg_0) native "HTMLLabelElement_htmlFor_Setter";
-  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
+  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
 
 }
 
 class BlinkHTMLLegendElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLegendElement();
 
-  static form_Getter(mthis) native "HTMLLegendElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
 }
 
 class BlinkHTMLLinkElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLLinkElement();
 
-  static crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
-  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+  crossOrigin_Getter_(mthis) => mthis["crossOrigin"];
 
-  static crossOrigin_Setter(mthis, __arg_0) native "HTMLLinkElement_crossOrigin_Setter";
-  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
+  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLLinkElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static href_Getter(mthis) native "HTMLLinkElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static href_Setter(mthis, __arg_0) native "HTMLLinkElement_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
-  hreflang_Getter_(mthis) => hreflang_Getter(mthis);
+  hreflang_Getter_(mthis) => mthis["hreflang"];
 
-  static hreflang_Setter(mthis, __arg_0) native "HTMLLinkElement_hreflang_Setter";
-  hreflang_Setter_(mthis, __arg_0) => hreflang_Setter(mthis, __arg_0);
+  hreflang_Setter_(mthis, __arg_0) => mthis["hreflang"] = __arg_0;
 
-  static import_Getter(mthis) native "HTMLLinkElement_import_Getter";
-  import_Getter_(mthis) => import_Getter(mthis);
+  import_Getter_(mthis) => mthis["import"];
 
-  static integrity_Getter(mthis) native "HTMLLinkElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLLinkElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static media_Getter(mthis) native "HTMLLinkElement_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static media_Setter(mthis, __arg_0) native "HTMLLinkElement_media_Setter";
-  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
+  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
 
-  static rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
-  rel_Getter_(mthis) => rel_Getter(mthis);
+  rel_Getter_(mthis) => mthis["rel"];
 
-  static rel_Setter(mthis, __arg_0) native "HTMLLinkElement_rel_Setter";
-  rel_Setter_(mthis, __arg_0) => rel_Setter(mthis, __arg_0);
+  rel_Setter_(mthis, __arg_0) => mthis["rel"] = __arg_0;
 
-  static sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
-  sheet_Getter_(mthis) => sheet_Getter(mthis);
+  sheet_Getter_(mthis) => mthis["sheet"];
 
-  static sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
-  sizes_Getter_(mthis) => sizes_Getter(mthis);
+  sizes_Getter_(mthis) => mthis["sizes"];
 
-  static sizes_Setter(mthis, __arg_0) native "HTMLLinkElement_sizes_Setter";
-  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
+  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLLinkElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLLinkElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkHTMLMapElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMapElement();
 
-  static areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
-  areas_Getter_(mthis) => areas_Getter(mthis);
+  areas_Getter_(mthis) => mthis["areas"];
 
-  static name_Getter(mthis) native "HTMLMapElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLMapElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
 }
 
@@ -11301,720 +6378,440 @@
 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);
+  addTextTrack_Callback_0_(mthis) => mthis.callMethod("addTextTrack", []);
 
-  static addTextTrack_Callback_1(mthis, __arg_0) native "HTMLMediaElement_addTextTrack_Callback";
-  addTextTrack_Callback_1_(mthis, __arg_0) => addTextTrack_Callback_1(mthis, __arg_0);
+  addTextTrack_Callback_1_(mthis, __arg_0) => mthis.callMethod("addTextTrack", [__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);
+  addTextTrack_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addTextTrack", [__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);
+  addTextTrack_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("addTextTrack", [__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);
+  audioTracks_Getter_(mthis) => mthis["audioTracks"];
 
-  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);
+  autoplay_Getter_(mthis) => mthis["autoplay"];
 
-  static audioTracks_Getter(mthis) native "HTMLMediaElement_audioTracks_Getter";
-  audioTracks_Getter_(mthis) => audioTracks_Getter(mthis);
+  autoplay_Setter_(mthis, __arg_0) => mthis["autoplay"] = __arg_0;
 
-  static autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
-  autoplay_Getter_(mthis) => autoplay_Getter(mthis);
+  buffered_Getter_(mthis) => mthis["buffered"];
 
-  static autoplay_Setter(mthis, __arg_0) native "HTMLMediaElement_autoplay_Setter";
-  autoplay_Setter_(mthis, __arg_0) => autoplay_Setter(mthis, __arg_0);
+  canPlayType_Callback_0_(mthis) => mthis.callMethod("canPlayType", []);
 
-  static buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
-  buffered_Getter_(mthis) => buffered_Getter(mthis);
+  canPlayType_Callback_1_(mthis, __arg_0) => mthis.callMethod("canPlayType", [__arg_0]);
 
-  static canPlayType_Callback_0(mthis) native "HTMLMediaElement_canPlayType_Callback";
-  canPlayType_Callback_0_(mthis) => canPlayType_Callback_0(mthis);
+  canPlayType_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("canPlayType", [__arg_0, __arg_1]);
 
-  static canPlayType_Callback_1(mthis, __arg_0) native "HTMLMediaElement_canPlayType_Callback";
-  canPlayType_Callback_1_(mthis, __arg_0) => canPlayType_Callback_1(mthis, __arg_0);
+  controller_Getter_(mthis) => mthis["controller"];
 
-  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);
+  controller_Setter_(mthis, __arg_0) => mthis["controller"] = __arg_0;
 
-  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);
+  controls_Getter_(mthis) => mthis["controls"];
 
-  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);
+  controls_Setter_(mthis, __arg_0) => mthis["controls"] = __arg_0;
 
-  static controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
-  controller_Getter_(mthis) => controller_Getter(mthis);
+  crossOrigin_Getter_(mthis) => mthis["crossOrigin"];
 
-  static controller_Setter(mthis, __arg_0) native "HTMLMediaElement_controller_Setter";
-  controller_Setter_(mthis, __arg_0) => controller_Setter(mthis, __arg_0);
+  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
 
-  static controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
-  controls_Getter_(mthis) => controls_Getter(mthis);
+  currentSrc_Getter_(mthis) => mthis["currentSrc"];
 
-  static controls_Setter(mthis, __arg_0) native "HTMLMediaElement_controls_Setter";
-  controls_Setter_(mthis, __arg_0) => controls_Setter(mthis, __arg_0);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  static crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
-  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
 
-  static crossOrigin_Setter(mthis, __arg_0) native "HTMLMediaElement_crossOrigin_Setter";
-  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
+  defaultMuted_Getter_(mthis) => mthis["defaultMuted"];
 
-  static currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
-  currentSrc_Getter_(mthis) => currentSrc_Getter(mthis);
+  defaultMuted_Setter_(mthis, __arg_0) => mthis["defaultMuted"] = __arg_0;
 
-  static currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
-  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+  defaultPlaybackRate_Getter_(mthis) => mthis["defaultPlaybackRate"];
 
-  static currentTime_Setter(mthis, __arg_0) native "HTMLMediaElement_currentTime_Setter";
-  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => mthis["defaultPlaybackRate"] = __arg_0;
 
-  static defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
-  defaultMuted_Getter_(mthis) => defaultMuted_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static defaultMuted_Setter(mthis, __arg_0) native "HTMLMediaElement_defaultMuted_Setter";
-  defaultMuted_Setter_(mthis, __arg_0) => defaultMuted_Setter(mthis, __arg_0);
+  ended_Getter_(mthis) => mthis["ended"];
 
-  static defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
-  defaultPlaybackRate_Getter_(mthis) => defaultPlaybackRate_Getter(mthis);
+  error_Getter_(mthis) => mthis["error"];
 
-  static defaultPlaybackRate_Setter(mthis, __arg_0) native "HTMLMediaElement_defaultPlaybackRate_Setter";
-  defaultPlaybackRate_Setter_(mthis, __arg_0) => defaultPlaybackRate_Setter(mthis, __arg_0);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
-  ended_Getter_(mthis) => ended_Getter(mthis);
+  load_Callback_0_(mthis) => mthis.callMethod("load", []);
 
-  static error_Getter(mthis) native "HTMLMediaElement_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  loop_Getter_(mthis) => mthis["loop"];
 
-  static integrity_Getter(mthis) native "HTMLMediaElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  loop_Setter_(mthis, __arg_0) => mthis["loop"] = __arg_0;
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLMediaElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  mediaGroup_Getter_(mthis) => mthis["mediaGroup"];
 
-  static load_Callback_0(mthis) native "HTMLMediaElement_load_Callback";
-  load_Callback_0_(mthis) => load_Callback_0(mthis);
+  mediaGroup_Setter_(mthis, __arg_0) => mthis["mediaGroup"] = __arg_0;
 
-  static load_Callback_1(mthis, __arg_0) native "HTMLMediaElement_load_Callback";
-  load_Callback_1_(mthis, __arg_0) => load_Callback_1(mthis, __arg_0);
+  mediaKeys_Getter_(mthis) => mthis["mediaKeys"];
 
-  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);
+  muted_Getter_(mthis) => mthis["muted"];
 
-  static loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
-  loop_Getter_(mthis) => loop_Getter(mthis);
+  muted_Setter_(mthis, __arg_0) => mthis["muted"] = __arg_0;
 
-  static loop_Setter(mthis, __arg_0) native "HTMLMediaElement_loop_Setter";
-  loop_Setter_(mthis, __arg_0) => loop_Setter(mthis, __arg_0);
+  networkState_Getter_(mthis) => mthis["networkState"];
 
-  static mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
-  mediaGroup_Getter_(mthis) => mediaGroup_Getter(mthis);
+  onneedkey_Getter_(mthis) => mthis["onneedkey"];
 
-  static mediaGroup_Setter(mthis, __arg_0) native "HTMLMediaElement_mediaGroup_Setter";
-  mediaGroup_Setter_(mthis, __arg_0) => mediaGroup_Setter(mthis, __arg_0);
+  onneedkey_Setter_(mthis, __arg_0) => mthis["onneedkey"] = __arg_0;
 
-  static mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
-  mediaKeys_Getter_(mthis) => mediaKeys_Getter(mthis);
+  onwebkitkeyadded_Getter_(mthis) => mthis["onwebkitkeyadded"];
 
-  static muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
-  muted_Getter_(mthis) => muted_Getter(mthis);
+  onwebkitkeyadded_Setter_(mthis, __arg_0) => mthis["onwebkitkeyadded"] = __arg_0;
 
-  static muted_Setter(mthis, __arg_0) native "HTMLMediaElement_muted_Setter";
-  muted_Setter_(mthis, __arg_0) => muted_Setter(mthis, __arg_0);
+  onwebkitkeyerror_Getter_(mthis) => mthis["onwebkitkeyerror"];
 
-  static networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
-  networkState_Getter_(mthis) => networkState_Getter(mthis);
+  onwebkitkeyerror_Setter_(mthis, __arg_0) => mthis["onwebkitkeyerror"] = __arg_0;
 
-  static onneedkey_Getter(mthis) native "HTMLMediaElement_onneedkey_Getter";
-  onneedkey_Getter_(mthis) => onneedkey_Getter(mthis);
+  onwebkitkeymessage_Getter_(mthis) => mthis["onwebkitkeymessage"];
 
-  static onneedkey_Setter(mthis, __arg_0) native "HTMLMediaElement_onneedkey_Setter";
-  onneedkey_Setter_(mthis, __arg_0) => onneedkey_Setter(mthis, __arg_0);
+  onwebkitkeymessage_Setter_(mthis, __arg_0) => mthis["onwebkitkeymessage"] = __arg_0;
 
-  static onwebkitkeyadded_Getter(mthis) native "HTMLMediaElement_onwebkitkeyadded_Getter";
-  onwebkitkeyadded_Getter_(mthis) => onwebkitkeyadded_Getter(mthis);
+  onwebkitneedkey_Getter_(mthis) => mthis["onwebkitneedkey"];
 
-  static onwebkitkeyadded_Setter(mthis, __arg_0) native "HTMLMediaElement_onwebkitkeyadded_Setter";
-  onwebkitkeyadded_Setter_(mthis, __arg_0) => onwebkitkeyadded_Setter(mthis, __arg_0);
+  onwebkitneedkey_Setter_(mthis, __arg_0) => mthis["onwebkitneedkey"] = __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);
+  pause_Callback_0_(mthis) => mthis.callMethod("pause", []);
 
-  static seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
-  seekable_Getter_(mthis) => seekable_Getter(mthis);
+  paused_Getter_(mthis) => mthis["paused"];
 
-  static seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
-  seeking_Getter_(mthis) => seeking_Getter(mthis);
+  play_Callback_0_(mthis) => mthis.callMethod("play", []);
 
-  static setMediaKeys_Callback_0(mthis) native "HTMLMediaElement_setMediaKeys_Callback";
-  setMediaKeys_Callback_0_(mthis) => setMediaKeys_Callback_0(mthis);
+  playbackRate_Getter_(mthis) => mthis["playbackRate"];
 
-  static setMediaKeys_Callback_1(mthis, __arg_0) native "HTMLMediaElement_setMediaKeys_Callback";
-  setMediaKeys_Callback_1_(mthis, __arg_0) => setMediaKeys_Callback_1(mthis, __arg_0);
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __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);
+  played_Getter_(mthis) => mthis["played"];
 
-  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);
+  preload_Getter_(mthis) => mthis["preload"];
 
-  static src_Getter(mthis) native "HTMLMediaElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  preload_Setter_(mthis, __arg_0) => mthis["preload"] = __arg_0;
 
-  static src_Setter(mthis, __arg_0) native "HTMLMediaElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
-  textTracks_Getter_(mthis) => textTracks_Getter(mthis);
+  seekable_Getter_(mthis) => mthis["seekable"];
 
-  static videoTracks_Getter(mthis) native "HTMLMediaElement_videoTracks_Getter";
-  videoTracks_Getter_(mthis) => videoTracks_Getter(mthis);
+  seeking_Getter_(mthis) => mthis["seeking"];
 
-  static volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
-  volume_Getter_(mthis) => volume_Getter(mthis);
+  setMediaKeys_Callback_0_(mthis) => mthis.callMethod("setMediaKeys", []);
 
-  static volume_Setter(mthis, __arg_0) native "HTMLMediaElement_volume_Setter";
-  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
+  setMediaKeys_Callback_1_(mthis, __arg_0) => mthis.callMethod("setMediaKeys", [__arg_0]);
 
-  static webkitAddKey_Callback_0(mthis) native "HTMLMediaElement_webkitAddKey_Callback";
-  webkitAddKey_Callback_0_(mthis) => webkitAddKey_Callback_0(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static webkitAddKey_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitAddKey_Callback";
-  webkitAddKey_Callback_1_(mthis, __arg_0) => webkitAddKey_Callback_1(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __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);
+  textTracks_Getter_(mthis) => mthis["textTracks"];
 
-  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);
+  videoTracks_Getter_(mthis) => mthis["videoTracks"];
 
-  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);
+  volume_Getter_(mthis) => mthis["volume"];
 
-  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);
+  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
 
-  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);
+  webkitAddKey_Callback_0_(mthis) => mthis.callMethod("webkitAddKey", []);
 
-  static webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
-  webkitAudioDecodedByteCount_Getter_(mthis) => webkitAudioDecodedByteCount_Getter(mthis);
+  webkitAddKey_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitAddKey", [__arg_0]);
 
-  static webkitCancelKeyRequest_Callback_0(mthis) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
-  webkitCancelKeyRequest_Callback_0_(mthis) => webkitCancelKeyRequest_Callback_0(mthis);
+  webkitAddKey_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitAddKey", [__arg_0, __arg_1]);
 
-  static webkitCancelKeyRequest_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitCancelKeyRequest_Callback";
-  webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => webkitCancelKeyRequest_Callback_1(mthis, __arg_0);
+  webkitAddKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitAddKey", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  webkitAddKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("webkitAddKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  webkitAudioDecodedByteCount_Getter_(mthis) => mthis["webkitAudioDecodedByteCount"];
 
-  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);
+  webkitCancelKeyRequest_Callback_0_(mthis) => mthis.callMethod("webkitCancelKeyRequest", []);
 
-  static webkitGenerateKeyRequest_Callback_0(mthis) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
-  webkitGenerateKeyRequest_Callback_0_(mthis) => webkitGenerateKeyRequest_Callback_0(mthis);
+  webkitCancelKeyRequest_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitCancelKeyRequest", [__arg_0]);
 
-  static webkitGenerateKeyRequest_Callback_1(mthis, __arg_0) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback";
-  webkitGenerateKeyRequest_Callback_1_(mthis, __arg_0) => webkitGenerateKeyRequest_Callback_1(mthis, __arg_0);
+  webkitCancelKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitCancelKeyRequest", [__arg_0, __arg_1]);
 
-  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);
+  webkitGenerateKeyRequest_Callback_0_(mthis) => mthis.callMethod("webkitGenerateKeyRequest", []);
 
-  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);
+  webkitGenerateKeyRequest_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitGenerateKeyRequest", [__arg_0]);
 
-  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);
+  webkitGenerateKeyRequest_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitGenerateKeyRequest", [__arg_0, __arg_1]);
 
-  static webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
-  webkitVideoDecodedByteCount_Getter_(mthis) => webkitVideoDecodedByteCount_Getter(mthis);
+  webkitVideoDecodedByteCount_Getter_(mthis) => mthis["webkitVideoDecodedByteCount"];
 
 }
 
 class BlinkHTMLMenuElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMenuElement();
 
-  static label_Getter(mthis) native "HTMLMenuElement_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static label_Setter(mthis, __arg_0) native "HTMLMenuElement_label_Setter";
-  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLMenuElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLMenuElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkHTMLMenuItemElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMenuItemElement();
 
-  static checked_Getter(mthis) native "HTMLMenuItemElement_checked_Getter";
-  checked_Getter_(mthis) => checked_Getter(mthis);
+  checked_Getter_(mthis) => mthis["checked"];
 
-  static checked_Setter(mthis, __arg_0) native "HTMLMenuItemElement_checked_Setter";
-  checked_Setter_(mthis, __arg_0) => checked_Setter(mthis, __arg_0);
+  checked_Setter_(mthis, __arg_0) => mthis["checked"] = __arg_0;
 
-  static default_Getter(mthis) native "HTMLMenuItemElement_default_Getter";
-  default_Getter_(mthis) => default_Getter(mthis);
+  default_Getter_(mthis) => mthis["default"];
 
-  static default_Setter(mthis, __arg_0) native "HTMLMenuItemElement_default_Setter";
-  default_Setter_(mthis, __arg_0) => default_Setter(mthis, __arg_0);
+  default_Setter_(mthis, __arg_0) => mthis["default"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLMenuItemElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLMenuItemElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static label_Getter(mthis) native "HTMLMenuItemElement_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static label_Setter(mthis, __arg_0) native "HTMLMenuItemElement_label_Setter";
-  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLMenuItemElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLMenuItemElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkHTMLMetaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMetaElement();
 
-  static content_Getter(mthis) native "HTMLMetaElement_content_Getter";
-  content_Getter_(mthis) => content_Getter(mthis);
+  content_Getter_(mthis) => mthis["content"];
 
-  static content_Setter(mthis, __arg_0) native "HTMLMetaElement_content_Setter";
-  content_Setter_(mthis, __arg_0) => content_Setter(mthis, __arg_0);
+  content_Setter_(mthis, __arg_0) => mthis["content"] = __arg_0;
 
-  static httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
-  httpEquiv_Getter_(mthis) => httpEquiv_Getter(mthis);
+  httpEquiv_Getter_(mthis) => mthis["httpEquiv"];
 
-  static httpEquiv_Setter(mthis, __arg_0) native "HTMLMetaElement_httpEquiv_Setter";
-  httpEquiv_Setter_(mthis, __arg_0) => httpEquiv_Setter(mthis, __arg_0);
+  httpEquiv_Setter_(mthis, __arg_0) => mthis["httpEquiv"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLMetaElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLMetaElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
 }
 
 class BlinkHTMLMeterElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLMeterElement();
 
-  static high_Getter(mthis) native "HTMLMeterElement_high_Getter";
-  high_Getter_(mthis) => high_Getter(mthis);
+  high_Getter_(mthis) => mthis["high"];
 
-  static high_Setter(mthis, __arg_0) native "HTMLMeterElement_high_Setter";
-  high_Setter_(mthis, __arg_0) => high_Setter(mthis, __arg_0);
+  high_Setter_(mthis, __arg_0) => mthis["high"] = __arg_0;
 
-  static labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static low_Getter(mthis) native "HTMLMeterElement_low_Getter";
-  low_Getter_(mthis) => low_Getter(mthis);
+  low_Getter_(mthis) => mthis["low"];
 
-  static low_Setter(mthis, __arg_0) native "HTMLMeterElement_low_Setter";
-  low_Setter_(mthis, __arg_0) => low_Setter(mthis, __arg_0);
+  low_Setter_(mthis, __arg_0) => mthis["low"] = __arg_0;
 
-  static max_Getter(mthis) native "HTMLMeterElement_max_Getter";
-  max_Getter_(mthis) => max_Getter(mthis);
+  max_Getter_(mthis) => mthis["max"];
 
-  static max_Setter(mthis, __arg_0) native "HTMLMeterElement_max_Setter";
-  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
+  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
 
-  static min_Getter(mthis) native "HTMLMeterElement_min_Getter";
-  min_Getter_(mthis) => min_Getter(mthis);
+  min_Getter_(mthis) => mthis["min"];
 
-  static min_Setter(mthis, __arg_0) native "HTMLMeterElement_min_Setter";
-  min_Setter_(mthis, __arg_0) => min_Setter(mthis, __arg_0);
+  min_Setter_(mthis, __arg_0) => mthis["min"] = __arg_0;
 
-  static optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
-  optimum_Getter_(mthis) => optimum_Getter(mthis);
+  optimum_Getter_(mthis) => mthis["optimum"];
 
-  static optimum_Setter(mthis, __arg_0) native "HTMLMeterElement_optimum_Setter";
-  optimum_Setter_(mthis, __arg_0) => optimum_Setter(mthis, __arg_0);
+  optimum_Setter_(mthis, __arg_0) => mthis["optimum"] = __arg_0;
 
-  static value_Getter(mthis) native "HTMLMeterElement_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "HTMLMeterElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkHTMLModElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLModElement();
 
-  static cite_Getter(mthis) native "HTMLModElement_cite_Getter";
-  cite_Getter_(mthis) => cite_Getter(mthis);
+  cite_Getter_(mthis) => mthis["cite"];
 
-  static cite_Setter(mthis, __arg_0) native "HTMLModElement_cite_Setter";
-  cite_Setter_(mthis, __arg_0) => cite_Setter(mthis, __arg_0);
+  cite_Setter_(mthis, __arg_0) => mthis["cite"] = __arg_0;
 
-  static dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
-  dateTime_Getter_(mthis) => dateTime_Getter(mthis);
+  dateTime_Getter_(mthis) => mthis["dateTime"];
 
-  static dateTime_Setter(mthis, __arg_0) native "HTMLModElement_dateTime_Setter";
-  dateTime_Setter_(mthis, __arg_0) => dateTime_Setter(mthis, __arg_0);
+  dateTime_Setter_(mthis, __arg_0) => mthis["dateTime"] = __arg_0;
 
 }
 
 class BlinkHTMLOListElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOListElement();
 
-  static reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
-  reversed_Getter_(mthis) => reversed_Getter(mthis);
+  reversed_Getter_(mthis) => mthis["reversed"];
 
-  static reversed_Setter(mthis, __arg_0) native "HTMLOListElement_reversed_Setter";
-  reversed_Setter_(mthis, __arg_0) => reversed_Setter(mthis, __arg_0);
+  reversed_Setter_(mthis, __arg_0) => mthis["reversed"] = __arg_0;
 
-  static start_Getter(mthis) native "HTMLOListElement_start_Getter";
-  start_Getter_(mthis) => start_Getter(mthis);
+  start_Getter_(mthis) => mthis["start"];
 
-  static start_Setter(mthis, __arg_0) native "HTMLOListElement_start_Setter";
-  start_Setter_(mthis, __arg_0) => start_Setter(mthis, __arg_0);
+  start_Setter_(mthis, __arg_0) => mthis["start"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLOListElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLOListElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkHTMLObjectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLObjectElement();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "HTMLObjectElement___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static checkValidity_Callback_0(mthis) native "HTMLObjectElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLObjectElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  code_Getter_(mthis) => mthis["code"];
 
-  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);
+  code_Setter_(mthis, __arg_0) => mthis["code"] = __arg_0;
 
-  static code_Getter(mthis) native "HTMLObjectElement_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  contentDocument_Getter_(mthis) => mthis["contentDocument"];
 
-  static code_Setter(mthis, __arg_0) native "HTMLObjectElement_code_Setter";
-  code_Setter_(mthis, __arg_0) => code_Setter(mthis, __arg_0);
+  data_Getter_(mthis) => mthis["data"];
 
-  static contentDocument_Getter(mthis) native "HTMLObjectElement_contentDocument_Getter";
-  contentDocument_Getter_(mthis) => contentDocument_Getter(mthis);
+  data_Setter_(mthis, __arg_0) => mthis["data"] = __arg_0;
 
-  static data_Getter(mthis) native "HTMLObjectElement_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static data_Setter(mthis, __arg_0) native "HTMLObjectElement_data_Setter";
-  data_Setter_(mthis, __arg_0) => data_Setter(mthis, __arg_0);
+  getSVGDocument_Callback_0_(mthis) => mthis.callMethod("getSVGDocument", []);
 
-  static form_Getter(mthis) native "HTMLObjectElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static getSVGDocument_Callback_0(mthis) native "HTMLObjectElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_0_(mthis) => getSVGDocument_Callback_0(mthis);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static getSVGDocument_Callback_1(mthis, __arg_0) native "HTMLObjectElement_getSVGDocument_Callback";
-  getSVGDocument_Callback_1_(mthis, __arg_0) => getSVGDocument_Callback_1(mthis, __arg_0);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  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);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLObjectElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLObjectElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLObjectElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLObjectElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static name_Getter(mthis) native "HTMLObjectElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLObjectElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLObjectElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  useMap_Getter_(mthis) => mthis["useMap"];
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLObjectElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  useMap_Setter_(mthis, __arg_0) => mthis["useMap"] = __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);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  static type_Getter(mthis) native "HTMLObjectElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLObjectElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
-  static useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
-  useMap_Getter_(mthis) => useMap_Getter(mthis);
-
-  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, __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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
 class BlinkHTMLOptGroupElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOptGroupElement();
 
-  static disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLOptGroupElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static label_Setter(mthis, __arg_0) native "HTMLOptGroupElement_label_Setter";
-  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
 }
 
 class BlinkHTMLOptionElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLOptionElement();
 
-  static constructorCallback_0() native "HTMLOptionElement_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Option"], []);
 
-  static constructorCallback_1(__arg_0) native "HTMLOptionElement_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Option"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "HTMLOptionElement_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Option"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["Option"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["Option"], [__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);
+  defaultSelected_Getter_(mthis) => mthis["defaultSelected"];
 
-  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);
+  defaultSelected_Setter_(mthis, __arg_0) => mthis["defaultSelected"] = __arg_0;
 
-  static defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
-  defaultSelected_Getter_(mthis) => defaultSelected_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static defaultSelected_Setter(mthis, __arg_0) native "HTMLOptionElement_defaultSelected_Setter";
-  defaultSelected_Setter_(mthis, __arg_0) => defaultSelected_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLOptionElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  index_Getter_(mthis) => mthis["index"];
 
-  static form_Getter(mthis) native "HTMLOptionElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static index_Getter(mthis) native "HTMLOptionElement_index_Getter";
-  index_Getter_(mthis) => index_Getter(mthis);
+  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
-  static label_Getter(mthis) native "HTMLOptionElement_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  selected_Getter_(mthis) => mthis["selected"];
 
-  static label_Setter(mthis, __arg_0) native "HTMLOptionElement_label_Setter";
-  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+  selected_Setter_(mthis, __arg_0) => mthis["selected"] = __arg_0;
 
-  static selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
-  selected_Getter_(mthis) => selected_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  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, __arg_0) native "HTMLOptionElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkHTMLOptionsCollection extends BlinkHTMLCollection {
   static final instance = new BlinkHTMLOptionsCollection();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "HTMLOptionsCollection___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__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);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLOutputElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  defaultValue_Getter_(mthis) => mthis["defaultValue"];
 
-  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);
+  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
 
-  static defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
-  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static defaultValue_Setter(mthis, __arg_0) native "HTMLOutputElement_defaultValue_Setter";
-  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
+  htmlFor_Getter_(mthis) => mthis["htmlFor"];
 
-  static form_Getter(mthis) native "HTMLOutputElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
 
-  static htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
-  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static htmlFor_Setter(mthis, __arg_0) native "HTMLOutputElement_htmlFor_Setter";
-  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
+  name_Getter_(mthis) => mthis["name"];
 
-  static labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLOutputElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static name_Setter(mthis, __arg_0) native "HTMLOutputElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLOutputElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLOutputElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  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);
+  value_Getter_(mthis) => mthis["value"];
 
-  static type_Getter(mthis) native "HTMLOutputElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
-  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, __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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
@@ -12026,17 +6823,13 @@
 class BlinkHTMLParamElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLParamElement();
 
-  static name_Getter(mthis) native "HTMLParamElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLParamElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static value_Getter(mthis) native "HTMLParamElement_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "HTMLParamElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
@@ -12053,297 +6846,184 @@
 class BlinkHTMLProgressElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLProgressElement();
 
-  static labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static max_Getter(mthis) native "HTMLProgressElement_max_Getter";
-  max_Getter_(mthis) => max_Getter(mthis);
+  max_Getter_(mthis) => mthis["max"];
 
-  static max_Setter(mthis, __arg_0) native "HTMLProgressElement_max_Setter";
-  max_Setter_(mthis, __arg_0) => max_Setter(mthis, __arg_0);
+  max_Setter_(mthis, __arg_0) => mthis["max"] = __arg_0;
 
-  static position_Getter(mthis) native "HTMLProgressElement_position_Getter";
-  position_Getter_(mthis) => position_Getter(mthis);
+  position_Getter_(mthis) => mthis["position"];
 
-  static value_Getter(mthis) native "HTMLProgressElement_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "HTMLProgressElement_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
 class BlinkHTMLQuoteElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLQuoteElement();
 
-  static cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
-  cite_Getter_(mthis) => cite_Getter(mthis);
+  cite_Getter_(mthis) => mthis["cite"];
 
-  static cite_Setter(mthis, __arg_0) native "HTMLQuoteElement_cite_Setter";
-  cite_Setter_(mthis, __arg_0) => cite_Setter(mthis, __arg_0);
+  cite_Setter_(mthis, __arg_0) => mthis["cite"] = __arg_0;
 
 }
 
 class BlinkHTMLScriptElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLScriptElement();
 
-  static async_Getter(mthis) native "HTMLScriptElement_async_Getter";
-  async_Getter_(mthis) => async_Getter(mthis);
+  async_Getter_(mthis) => mthis["async"];
 
-  static async_Setter(mthis, __arg_0) native "HTMLScriptElement_async_Setter";
-  async_Setter_(mthis, __arg_0) => async_Setter(mthis, __arg_0);
+  async_Setter_(mthis, __arg_0) => mthis["async"] = __arg_0;
 
-  static charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
-  charset_Getter_(mthis) => charset_Getter(mthis);
+  charset_Getter_(mthis) => mthis["charset"];
 
-  static charset_Setter(mthis, __arg_0) native "HTMLScriptElement_charset_Setter";
-  charset_Setter_(mthis, __arg_0) => charset_Setter(mthis, __arg_0);
+  charset_Setter_(mthis, __arg_0) => mthis["charset"] = __arg_0;
 
-  static crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
-  crossOrigin_Getter_(mthis) => crossOrigin_Getter(mthis);
+  crossOrigin_Getter_(mthis) => mthis["crossOrigin"];
 
-  static crossOrigin_Setter(mthis, __arg_0) native "HTMLScriptElement_crossOrigin_Setter";
-  crossOrigin_Setter_(mthis, __arg_0) => crossOrigin_Setter(mthis, __arg_0);
+  crossOrigin_Setter_(mthis, __arg_0) => mthis["crossOrigin"] = __arg_0;
 
-  static defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
-  defer_Getter_(mthis) => defer_Getter(mthis);
+  defer_Getter_(mthis) => mthis["defer"];
 
-  static defer_Setter(mthis, __arg_0) native "HTMLScriptElement_defer_Setter";
-  defer_Setter_(mthis, __arg_0) => defer_Setter(mthis, __arg_0);
+  defer_Setter_(mthis, __arg_0) => mthis["defer"] = __arg_0;
 
-  static event_Getter(mthis) native "HTMLScriptElement_event_Getter";
-  event_Getter_(mthis) => event_Getter(mthis);
+  event_Getter_(mthis) => mthis["event"];
 
-  static event_Setter(mthis, __arg_0) native "HTMLScriptElement_event_Setter";
-  event_Setter_(mthis, __arg_0) => event_Setter(mthis, __arg_0);
+  event_Setter_(mthis, __arg_0) => mthis["event"] = __arg_0;
 
-  static htmlFor_Getter(mthis) native "HTMLScriptElement_htmlFor_Getter";
-  htmlFor_Getter_(mthis) => htmlFor_Getter(mthis);
+  htmlFor_Getter_(mthis) => mthis["htmlFor"];
 
-  static htmlFor_Setter(mthis, __arg_0) native "HTMLScriptElement_htmlFor_Setter";
-  htmlFor_Setter_(mthis, __arg_0) => htmlFor_Setter(mthis, __arg_0);
+  htmlFor_Setter_(mthis, __arg_0) => mthis["htmlFor"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLScriptElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLScriptElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
-  nonce_Getter_(mthis) => nonce_Getter(mthis);
+  nonce_Getter_(mthis) => mthis["nonce"];
 
-  static nonce_Setter(mthis, __arg_0) native "HTMLScriptElement_nonce_Setter";
-  nonce_Setter_(mthis, __arg_0) => nonce_Setter(mthis, __arg_0);
+  nonce_Setter_(mthis, __arg_0) => mthis["nonce"] = __arg_0;
 
-  static src_Getter(mthis) native "HTMLScriptElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLScriptElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLScriptElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLScriptElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkHTMLSelectElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSelectElement();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "HTMLSelectElement___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static add_Callback_0(mthis) native "HTMLSelectElement_add_Callback";
-  add_Callback_0_(mthis) => add_Callback_0(mthis);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  static add_Callback_1(mthis, __arg_0) native "HTMLSelectElement_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__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);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("add", [__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);
+  autofocus_Getter_(mthis) => mthis["autofocus"];
 
-  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);
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  static autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
-  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static autofocus_Setter(mthis, __arg_0) native "HTMLSelectElement_autofocus_Setter";
-  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static checkValidity_Callback_0(mthis) native "HTMLSelectElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLSelectElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  form_Getter_(mthis) => mthis["form"];
 
-  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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLSelectElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static form_Getter(mthis) native "HTMLSelectElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  length_Getter_(mthis) => mthis["length"];
 
-  static item_Callback_0(mthis) native "HTMLSelectElement_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  length_Setter_(mthis, __arg_0) => mthis["length"] = __arg_0;
 
-  static item_Callback_1(mthis, __arg_0) native "HTMLSelectElement_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  multiple_Getter_(mthis) => mthis["multiple"];
 
-  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);
+  multiple_Setter_(mthis, __arg_0) => mthis["multiple"] = __arg_0;
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
-  static labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static length_Getter(mthis) native "HTMLSelectElement_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static length_Setter(mthis, __arg_0) native "HTMLSelectElement_length_Setter";
-  length_Setter_(mthis, __arg_0) => length_Setter(mthis, __arg_0);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
-  static multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
-  multiple_Getter_(mthis) => multiple_Getter(mthis);
+  required_Getter_(mthis) => mthis["required"];
 
-  static multiple_Setter(mthis, __arg_0) native "HTMLSelectElement_multiple_Setter";
-  multiple_Setter_(mthis, __arg_0) => multiple_Setter(mthis, __arg_0);
+  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLSelectElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  selectedIndex_Getter_(mthis) => mthis["selectedIndex"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLSelectElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  selectedIndex_Setter_(mthis, __arg_0) => mthis["selectedIndex"] = __arg_0;
 
-  static namedItem_Callback_0(mthis) native "HTMLSelectElement_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static namedItem_Callback_1(mthis, __arg_0) native "HTMLSelectElement_namedItem_Callback";
-  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__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);
+  size_Getter_(mthis) => mthis["size"];
 
-  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);
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
 
-  static required_Getter(mthis) native "HTMLSelectElement_required_Getter";
-  required_Getter_(mthis) => required_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static required_Setter(mthis, __arg_0) native "HTMLSelectElement_required_Setter";
-  required_Setter_(mthis, __arg_0) => required_Setter(mthis, __arg_0);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  static selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
-  selectedIndex_Getter_(mthis) => selectedIndex_Getter(mthis);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  static selectedIndex_Setter(mthis, __arg_0) native "HTMLSelectElement_selectedIndex_Setter";
-  selectedIndex_Setter_(mthis, __arg_0) => selectedIndex_Setter(mthis, __arg_0);
+  value_Getter_(mthis) => mthis["value"];
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLSelectElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
-  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, __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, __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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
 }
 
 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);
+  getDistributedNodes_Callback_0_(mthis) => mthis.callMethod("getDistributedNodes", []);
 
 }
 
 class BlinkHTMLSourceElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLSourceElement();
 
-  static integrity_Getter(mthis) native "HTMLSourceElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLSourceElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static media_Getter(mthis) native "HTMLSourceElement_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static media_Setter(mthis, __arg_0) native "HTMLSourceElement_media_Setter";
-  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
+  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
 
-  static sizes_Getter(mthis) native "HTMLSourceElement_sizes_Getter";
-  sizes_Getter_(mthis) => sizes_Getter(mthis);
+  sizes_Getter_(mthis) => mthis["sizes"];
 
-  static sizes_Setter(mthis, __arg_0) native "HTMLSourceElement_sizes_Setter";
-  sizes_Setter_(mthis, __arg_0) => sizes_Setter(mthis, __arg_0);
+  sizes_Setter_(mthis, __arg_0) => mthis["sizes"] = __arg_0;
 
-  static src_Getter(mthis) native "HTMLSourceElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLSourceElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static srcset_Getter(mthis) native "HTMLSourceElement_srcset_Getter";
-  srcset_Getter_(mthis) => srcset_Getter(mthis);
+  srcset_Getter_(mthis) => mthis["srcset"];
 
-  static srcset_Setter(mthis, __arg_0) native "HTMLSourceElement_srcset_Setter";
-  srcset_Setter_(mthis, __arg_0) => srcset_Setter(mthis, __arg_0);
+  srcset_Setter_(mthis, __arg_0) => mthis["srcset"] = __arg_0;
 
-  static type_Getter(mthis) native "HTMLSourceElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLSourceElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
@@ -12355,26 +7035,19 @@
 class BlinkHTMLStyleElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLStyleElement();
 
-  static disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLStyleElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static media_Getter(mthis) native "HTMLStyleElement_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static media_Setter(mthis, __arg_0) native "HTMLStyleElement_media_Setter";
-  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
+  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
 
-  static sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
-  sheet_Getter_(mthis) => sheet_Getter(mthis);
+  sheet_Getter_(mthis) => mthis["sheet"];
 
-  static type_Getter(mthis) native "HTMLStyleElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "HTMLStyleElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
@@ -12386,434 +7059,229 @@
 class BlinkHTMLTableCellElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableCellElement();
 
-  static cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
-  cellIndex_Getter_(mthis) => cellIndex_Getter(mthis);
+  cellIndex_Getter_(mthis) => mthis["cellIndex"];
 
-  static colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
-  colSpan_Getter_(mthis) => colSpan_Getter(mthis);
+  colSpan_Getter_(mthis) => mthis["colSpan"];
 
-  static colSpan_Setter(mthis, __arg_0) native "HTMLTableCellElement_colSpan_Setter";
-  colSpan_Setter_(mthis, __arg_0) => colSpan_Setter(mthis, __arg_0);
+  colSpan_Setter_(mthis, __arg_0) => mthis["colSpan"] = __arg_0;
 
-  static headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
-  headers_Getter_(mthis) => headers_Getter(mthis);
+  headers_Getter_(mthis) => mthis["headers"];
 
-  static headers_Setter(mthis, __arg_0) native "HTMLTableCellElement_headers_Setter";
-  headers_Setter_(mthis, __arg_0) => headers_Setter(mthis, __arg_0);
+  headers_Setter_(mthis, __arg_0) => mthis["headers"] = __arg_0;
 
-  static rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
-  rowSpan_Getter_(mthis) => rowSpan_Getter(mthis);
+  rowSpan_Getter_(mthis) => mthis["rowSpan"];
 
-  static rowSpan_Setter(mthis, __arg_0) native "HTMLTableCellElement_rowSpan_Setter";
-  rowSpan_Setter_(mthis, __arg_0) => rowSpan_Setter(mthis, __arg_0);
+  rowSpan_Setter_(mthis, __arg_0) => mthis["rowSpan"] = __arg_0;
 
 }
 
 class BlinkHTMLTableColElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableColElement();
 
-  static span_Getter(mthis) native "HTMLTableColElement_span_Getter";
-  span_Getter_(mthis) => span_Getter(mthis);
+  span_Getter_(mthis) => mthis["span"];
 
-  static span_Setter(mthis, __arg_0) native "HTMLTableColElement_span_Setter";
-  span_Setter_(mthis, __arg_0) => span_Setter(mthis, __arg_0);
+  span_Setter_(mthis, __arg_0) => mthis["span"] = __arg_0;
 
 }
 
 class BlinkHTMLTableElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableElement();
 
-  static border_Getter(mthis) native "HTMLTableElement_border_Getter";
-  border_Getter_(mthis) => border_Getter(mthis);
+  border_Getter_(mthis) => mthis["border"];
 
-  static border_Setter(mthis, __arg_0) native "HTMLTableElement_border_Setter";
-  border_Setter_(mthis, __arg_0) => border_Setter(mthis, __arg_0);
+  border_Setter_(mthis, __arg_0) => mthis["border"] = __arg_0;
 
-  static caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
-  caption_Getter_(mthis) => caption_Getter(mthis);
+  caption_Getter_(mthis) => mthis["caption"];
 
-  static caption_Setter(mthis, __arg_0) native "HTMLTableElement_caption_Setter";
-  caption_Setter_(mthis, __arg_0) => caption_Setter(mthis, __arg_0);
+  caption_Setter_(mthis, __arg_0) => mthis["caption"] = __arg_0;
 
-  static createCaption_Callback_0(mthis) native "HTMLTableElement_createCaption_Callback";
-  createCaption_Callback_0_(mthis) => createCaption_Callback_0(mthis);
+  createCaption_Callback_0_(mthis) => mthis.callMethod("createCaption", []);
 
-  static createCaption_Callback_1(mthis, __arg_0) native "HTMLTableElement_createCaption_Callback";
-  createCaption_Callback_1_(mthis, __arg_0) => createCaption_Callback_1(mthis, __arg_0);
+  createTBody_Callback_0_(mthis) => mthis.callMethod("createTBody", []);
 
-  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);
+  createTFoot_Callback_0_(mthis) => mthis.callMethod("createTFoot", []);
 
-  static createTBody_Callback_0(mthis) native "HTMLTableElement_createTBody_Callback";
-  createTBody_Callback_0_(mthis) => createTBody_Callback_0(mthis);
+  createTHead_Callback_0_(mthis) => mthis.callMethod("createTHead", []);
 
-  static createTBody_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTBody_Callback";
-  createTBody_Callback_1_(mthis, __arg_0) => createTBody_Callback_1(mthis, __arg_0);
+  deleteCaption_Callback_0_(mthis) => mthis.callMethod("deleteCaption", []);
 
-  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);
+  deleteRow_Callback_0_(mthis) => mthis.callMethod("deleteRow", []);
 
-  static createTFoot_Callback_0(mthis) native "HTMLTableElement_createTFoot_Callback";
-  createTFoot_Callback_0_(mthis) => createTFoot_Callback_0(mthis);
+  deleteRow_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRow", [__arg_0]);
 
-  static createTFoot_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTFoot_Callback";
-  createTFoot_Callback_1_(mthis, __arg_0) => createTFoot_Callback_1(mthis, __arg_0);
+  deleteTFoot_Callback_0_(mthis) => mthis.callMethod("deleteTFoot", []);
 
-  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);
+  deleteTHead_Callback_0_(mthis) => mthis.callMethod("deleteTHead", []);
 
-  static createTHead_Callback_0(mthis) native "HTMLTableElement_createTHead_Callback";
-  createTHead_Callback_0_(mthis) => createTHead_Callback_0(mthis);
+  insertRow_Callback_0_(mthis) => mthis.callMethod("insertRow", []);
 
-  static createTHead_Callback_1(mthis, __arg_0) native "HTMLTableElement_createTHead_Callback";
-  createTHead_Callback_1_(mthis, __arg_0) => createTHead_Callback_1(mthis, __arg_0);
+  insertRow_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRow", [__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);
+  rows_Getter_(mthis) => mthis["rows"];
 
-  static deleteCaption_Callback_0(mthis) native "HTMLTableElement_deleteCaption_Callback";
-  deleteCaption_Callback_0_(mthis) => deleteCaption_Callback_0(mthis);
+  tBodies_Getter_(mthis) => mthis["tBodies"];
 
-  static deleteCaption_Callback_1(mthis, __arg_0) native "HTMLTableElement_deleteCaption_Callback";
-  deleteCaption_Callback_1_(mthis, __arg_0) => deleteCaption_Callback_1(mthis, __arg_0);
+  tFoot_Getter_(mthis) => mthis["tFoot"];
 
-  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);
+  tFoot_Setter_(mthis, __arg_0) => mthis["tFoot"] = __arg_0;
 
-  static deleteRow_Callback_0(mthis) native "HTMLTableElement_deleteRow_Callback";
-  deleteRow_Callback_0_(mthis) => deleteRow_Callback_0(mthis);
+  tHead_Getter_(mthis) => mthis["tHead"];
 
-  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, __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, __arg_0) native "HTMLTableElement_tHead_Setter";
-  tHead_Setter_(mthis, __arg_0) => tHead_Setter(mthis, __arg_0);
+  tHead_Setter_(mthis, __arg_0) => mthis["tHead"] = __arg_0;
 
 }
 
 class BlinkHTMLTableRowElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTableRowElement();
 
-  static cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
-  cells_Getter_(mthis) => cells_Getter(mthis);
+  cells_Getter_(mthis) => mthis["cells"];
 
-  static deleteCell_Callback_0(mthis) native "HTMLTableRowElement_deleteCell_Callback";
-  deleteCell_Callback_0_(mthis) => deleteCell_Callback_0(mthis);
+  deleteCell_Callback_0_(mthis) => mthis.callMethod("deleteCell", []);
 
-  static deleteCell_Callback_1(mthis, __arg_0) native "HTMLTableRowElement_deleteCell_Callback";
-  deleteCell_Callback_1_(mthis, __arg_0) => deleteCell_Callback_1(mthis, __arg_0);
+  deleteCell_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteCell", [__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);
+  insertCell_Callback_0_(mthis) => mthis.callMethod("insertCell", []);
 
-  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);
+  insertCell_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertCell", [__arg_0]);
 
-  static insertCell_Callback_0(mthis) native "HTMLTableRowElement_insertCell_Callback";
-  insertCell_Callback_0_(mthis) => insertCell_Callback_0(mthis);
+  rowIndex_Getter_(mthis) => mthis["rowIndex"];
 
-  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);
+  sectionRowIndex_Getter_(mthis) => mthis["sectionRowIndex"];
 
 }
 
 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);
+  deleteRow_Callback_0_(mthis) => mthis.callMethod("deleteRow", []);
 
-  static deleteRow_Callback_1(mthis, __arg_0) native "HTMLTableSectionElement_deleteRow_Callback";
-  deleteRow_Callback_1_(mthis, __arg_0) => deleteRow_Callback_1(mthis, __arg_0);
+  deleteRow_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRow", [__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);
+  insertRow_Callback_0_(mthis) => mthis.callMethod("insertRow", []);
 
-  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);
+  insertRow_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertRow", [__arg_0]);
 
-  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);
+  rows_Getter_(mthis) => mthis["rows"];
 
 }
 
 class BlinkHTMLTemplateElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTemplateElement();
 
-  static content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
-  content_Getter_(mthis) => content_Getter(mthis);
+  content_Getter_(mthis) => mthis["content"];
 
 }
 
 class BlinkHTMLTextAreaElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTextAreaElement();
 
-  static autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
-  autofocus_Getter_(mthis) => autofocus_Getter(mthis);
+  autofocus_Getter_(mthis) => mthis["autofocus"];
 
-  static autofocus_Setter(mthis, __arg_0) native "HTMLTextAreaElement_autofocus_Setter";
-  autofocus_Setter_(mthis, __arg_0) => autofocus_Setter(mthis, __arg_0);
+  autofocus_Setter_(mthis, __arg_0) => mthis["autofocus"] = __arg_0;
 
-  static checkValidity_Callback_0(mthis) native "HTMLTextAreaElement_checkValidity_Callback";
-  checkValidity_Callback_0_(mthis) => checkValidity_Callback_0(mthis);
+  checkValidity_Callback_0_(mthis) => mthis.callMethod("checkValidity", []);
 
-  static checkValidity_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_checkValidity_Callback";
-  checkValidity_Callback_1_(mthis, __arg_0) => checkValidity_Callback_1(mthis, __arg_0);
+  cols_Getter_(mthis) => mthis["cols"];
 
-  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);
+  cols_Setter_(mthis, __arg_0) => mthis["cols"] = __arg_0;
 
-  static cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
-  cols_Getter_(mthis) => cols_Getter(mthis);
+  defaultValue_Getter_(mthis) => mthis["defaultValue"];
 
-  static cols_Setter(mthis, __arg_0) native "HTMLTextAreaElement_cols_Setter";
-  cols_Setter_(mthis, __arg_0) => cols_Setter(mthis, __arg_0);
+  defaultValue_Setter_(mthis, __arg_0) => mthis["defaultValue"] = __arg_0;
 
-  static defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
-  defaultValue_Getter_(mthis) => defaultValue_Getter(mthis);
+  dirName_Getter_(mthis) => mthis["dirName"];
 
-  static defaultValue_Setter(mthis, __arg_0) native "HTMLTextAreaElement_defaultValue_Setter";
-  defaultValue_Setter_(mthis, __arg_0) => defaultValue_Setter(mthis, __arg_0);
+  dirName_Setter_(mthis, __arg_0) => mthis["dirName"] = __arg_0;
 
-  static dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
-  dirName_Getter_(mthis) => dirName_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static dirName_Setter(mthis, __arg_0) native "HTMLTextAreaElement_dirName_Setter";
-  dirName_Setter_(mthis, __arg_0) => dirName_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  form_Getter_(mthis) => mthis["form"];
 
-  static disabled_Setter(mthis, __arg_0) native "HTMLTextAreaElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  inputMode_Getter_(mthis) => mthis["inputMode"];
 
-  static form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
-  form_Getter_(mthis) => form_Getter(mthis);
+  inputMode_Setter_(mthis, __arg_0) => mthis["inputMode"] = __arg_0;
 
-  static inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
-  inputMode_Getter_(mthis) => inputMode_Getter(mthis);
+  labels_Getter_(mthis) => mthis["labels"];
 
-  static inputMode_Setter(mthis, __arg_0) native "HTMLTextAreaElement_inputMode_Setter";
-  inputMode_Setter_(mthis, __arg_0) => inputMode_Setter(mthis, __arg_0);
+  maxLength_Getter_(mthis) => mthis["maxLength"];
 
-  static labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
-  labels_Getter_(mthis) => labels_Getter(mthis);
+  maxLength_Setter_(mthis, __arg_0) => mthis["maxLength"] = __arg_0;
 
-  static maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
-  maxLength_Getter_(mthis) => maxLength_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static maxLength_Setter(mthis, __arg_0) native "HTMLTextAreaElement_maxLength_Setter";
-  maxLength_Setter_(mthis, __arg_0) => maxLength_Setter(mthis, __arg_0);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  static name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  placeholder_Getter_(mthis) => mthis["placeholder"];
 
-  static name_Setter(mthis, __arg_0) native "HTMLTextAreaElement_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  placeholder_Setter_(mthis, __arg_0) => mthis["placeholder"] = __arg_0;
 
-  static placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
-  placeholder_Getter_(mthis) => placeholder_Getter(mthis);
+  readOnly_Getter_(mthis) => mthis["readOnly"];
 
-  static placeholder_Setter(mthis, __arg_0) native "HTMLTextAreaElement_placeholder_Setter";
-  placeholder_Setter_(mthis, __arg_0) => placeholder_Setter(mthis, __arg_0);
+  readOnly_Setter_(mthis, __arg_0) => mthis["readOnly"] = __arg_0;
 
-  static readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
-  readOnly_Getter_(mthis) => readOnly_Getter(mthis);
+  required_Getter_(mthis) => mthis["required"];
 
-  static readOnly_Setter(mthis, __arg_0) native "HTMLTextAreaElement_readOnly_Setter";
-  readOnly_Setter_(mthis, __arg_0) => readOnly_Setter(mthis, __arg_0);
+  required_Setter_(mthis, __arg_0) => mthis["required"] = __arg_0;
 
-  static required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
-  required_Getter_(mthis) => required_Getter(mthis);
+  rows_Getter_(mthis) => mthis["rows"];
 
-  static required_Setter(mthis, __arg_0) native "HTMLTextAreaElement_required_Setter";
-  required_Setter_(mthis, __arg_0) => required_Setter(mthis, __arg_0);
+  rows_Setter_(mthis, __arg_0) => mthis["rows"] = __arg_0;
 
-  static rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
-  rows_Getter_(mthis) => rows_Getter(mthis);
+  select_Callback_0_(mthis) => mthis.callMethod("select", []);
 
-  static rows_Setter(mthis, __arg_0) native "HTMLTextAreaElement_rows_Setter";
-  rows_Setter_(mthis, __arg_0) => rows_Setter(mthis, __arg_0);
+  selectionDirection_Getter_(mthis) => mthis["selectionDirection"];
 
-  static select_Callback_0(mthis) native "HTMLTextAreaElement_select_Callback";
-  select_Callback_0_(mthis) => select_Callback_0(mthis);
+  selectionDirection_Setter_(mthis, __arg_0) => mthis["selectionDirection"] = __arg_0;
 
-  static select_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_select_Callback";
-  select_Callback_1_(mthis, __arg_0) => select_Callback_1(mthis, __arg_0);
+  selectionEnd_Getter_(mthis) => mthis["selectionEnd"];
 
-  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);
+  selectionEnd_Setter_(mthis, __arg_0) => mthis["selectionEnd"] = __arg_0;
 
-  static selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
-  selectionDirection_Getter_(mthis) => selectionDirection_Getter(mthis);
+  selectionStart_Getter_(mthis) => mthis["selectionStart"];
 
-  static selectionDirection_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionDirection_Setter";
-  selectionDirection_Setter_(mthis, __arg_0) => selectionDirection_Setter(mthis, __arg_0);
+  selectionStart_Setter_(mthis, __arg_0) => mthis["selectionStart"] = __arg_0;
 
-  static selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
-  selectionEnd_Getter_(mthis) => selectionEnd_Getter(mthis);
+  setCustomValidity_Callback_0_(mthis) => mthis.callMethod("setCustomValidity", []);
 
-  static selectionEnd_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionEnd_Setter";
-  selectionEnd_Setter_(mthis, __arg_0) => selectionEnd_Setter(mthis, __arg_0);
+  setCustomValidity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCustomValidity", [__arg_0]);
 
-  static selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
-  selectionStart_Getter_(mthis) => selectionStart_Getter(mthis);
+  setRangeText_Callback_0_(mthis) => mthis.callMethod("setRangeText", []);
 
-  static selectionStart_Setter(mthis, __arg_0) native "HTMLTextAreaElement_selectionStart_Setter";
-  selectionStart_Setter_(mthis, __arg_0) => selectionStart_Setter(mthis, __arg_0);
+  setRangeText_Callback_1_(mthis, __arg_0) => mthis.callMethod("setRangeText", [__arg_0]);
 
-  static setCustomValidity_Callback_0(mthis) native "HTMLTextAreaElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_0_(mthis) => setCustomValidity_Callback_0(mthis);
+  setRangeText_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setRangeText", [__arg_0, __arg_1]);
 
-  static setCustomValidity_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setCustomValidity_Callback";
-  setCustomValidity_Callback_1_(mthis, __arg_0) => setCustomValidity_Callback_1(mthis, __arg_0);
+  setRangeText_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setRangeText", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setRangeText_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setRangeText", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  setSelectionRange_Callback_0_(mthis) => mthis.callMethod("setSelectionRange", []);
 
-  static setRangeText_Callback_0(mthis) native "HTMLTextAreaElement_setRangeText_Callback";
-  setRangeText_Callback_0_(mthis) => setRangeText_Callback_0(mthis);
+  setSelectionRange_Callback_1_(mthis, __arg_0) => mthis.callMethod("setSelectionRange", [__arg_0]);
 
-  static setRangeText_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setRangeText_Callback";
-  setRangeText_Callback_1_(mthis, __arg_0) => setRangeText_Callback_1(mthis, __arg_0);
+  setSelectionRange_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setSelectionRange", [__arg_0, __arg_1]);
 
-  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);
+  setSelectionRange_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setSelectionRange", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  textLength_Getter_(mthis) => mthis["textLength"];
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
-  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);
+  validationMessage_Getter_(mthis) => mthis["validationMessage"];
 
-  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);
+  validity_Getter_(mthis) => mthis["validity"];
 
-  static setSelectionRange_Callback_0(mthis) native "HTMLTextAreaElement_setSelectionRange_Callback";
-  setSelectionRange_Callback_0_(mthis) => setSelectionRange_Callback_0(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static setSelectionRange_Callback_1(mthis, __arg_0) native "HTMLTextAreaElement_setSelectionRange_Callback";
-  setSelectionRange_Callback_1_(mthis, __arg_0) => setSelectionRange_Callback_1(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __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);
+  willValidate_Getter_(mthis) => mthis["willValidate"];
 
-  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);
+  wrap_Getter_(mthis) => mthis["wrap"];
 
-  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, __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, __arg_0) native "HTMLTextAreaElement_wrap_Setter";
-  wrap_Setter_(mthis, __arg_0) => wrap_Setter(mthis, __arg_0);
+  wrap_Setter_(mthis, __arg_0) => mthis["wrap"] = __arg_0;
 
 }
 
@@ -12825,47 +7293,33 @@
 class BlinkHTMLTrackElement extends BlinkHTMLElement {
   static final instance = new BlinkHTMLTrackElement();
 
-  static default_Getter(mthis) native "HTMLTrackElement_default_Getter";
-  default_Getter_(mthis) => default_Getter(mthis);
+  default_Getter_(mthis) => mthis["default"];
 
-  static default_Setter(mthis, __arg_0) native "HTMLTrackElement_default_Setter";
-  default_Setter_(mthis, __arg_0) => default_Setter(mthis, __arg_0);
+  default_Setter_(mthis, __arg_0) => mthis["default"] = __arg_0;
 
-  static integrity_Getter(mthis) native "HTMLTrackElement_integrity_Getter";
-  integrity_Getter_(mthis) => integrity_Getter(mthis);
+  integrity_Getter_(mthis) => mthis["integrity"];
 
-  static integrity_Setter(mthis, __arg_0) native "HTMLTrackElement_integrity_Setter";
-  integrity_Setter_(mthis, __arg_0) => integrity_Setter(mthis, __arg_0);
+  integrity_Setter_(mthis, __arg_0) => mthis["integrity"] = __arg_0;
 
-  static kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static kind_Setter(mthis, __arg_0) native "HTMLTrackElement_kind_Setter";
-  kind_Setter_(mthis, __arg_0) => kind_Setter(mthis, __arg_0);
+  kind_Setter_(mthis, __arg_0) => mthis["kind"] = __arg_0;
 
-  static label_Getter(mthis) native "HTMLTrackElement_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static label_Setter(mthis, __arg_0) native "HTMLTrackElement_label_Setter";
-  label_Setter_(mthis, __arg_0) => label_Setter(mthis, __arg_0);
+  label_Setter_(mthis, __arg_0) => mthis["label"] = __arg_0;
 
-  static readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static src_Getter(mthis) native "HTMLTrackElement_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  src_Getter_(mthis) => mthis["src"];
 
-  static src_Setter(mthis, __arg_0) native "HTMLTrackElement_src_Setter";
-  src_Setter_(mthis, __arg_0) => src_Setter(mthis, __arg_0);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
-  srclang_Getter_(mthis) => srclang_Getter(mthis);
+  srclang_Getter_(mthis) => mthis["srclang"];
 
-  static srclang_Setter(mthis, __arg_0) native "HTMLTrackElement_srclang_Setter";
-  srclang_Setter_(mthis, __arg_0) => srclang_Setter(mthis, __arg_0);
+  srclang_Setter_(mthis, __arg_0) => mthis["srclang"] = __arg_0;
 
-  static track_Getter(mthis) native "HTMLTrackElement_track_Getter";
-  track_Getter_(mthis) => track_Getter(mthis);
+  track_Getter_(mthis) => mthis["track"];
 
 }
 
@@ -12882,3802 +7336,1889 @@
 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);
+  getVideoPlaybackQuality_Callback_0_(mthis) => mthis.callMethod("getVideoPlaybackQuality", []);
 
-  static getVideoPlaybackQuality_Callback_1(mthis, __arg_0) native "HTMLVideoElement_getVideoPlaybackQuality_Callback";
-  getVideoPlaybackQuality_Callback_1_(mthis, __arg_0) => getVideoPlaybackQuality_Callback_1(mthis, __arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "HTMLVideoElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  poster_Getter_(mthis) => mthis["poster"];
 
-  static height_Setter(mthis, __arg_0) native "HTMLVideoElement_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  poster_Setter_(mthis, __arg_0) => mthis["poster"] = __arg_0;
 
-  static poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
-  poster_Getter_(mthis) => poster_Getter(mthis);
+  videoHeight_Getter_(mthis) => mthis["videoHeight"];
 
-  static poster_Setter(mthis, __arg_0) native "HTMLVideoElement_poster_Setter";
-  poster_Setter_(mthis, __arg_0) => poster_Setter(mthis, __arg_0);
+  videoWidth_Getter_(mthis) => mthis["videoWidth"];
 
-  static videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
-  videoHeight_Getter_(mthis) => videoHeight_Getter(mthis);
+  webkitDecodedFrameCount_Getter_(mthis) => mthis["webkitDecodedFrameCount"];
 
-  static videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
-  videoWidth_Getter_(mthis) => videoWidth_Getter(mthis);
+  webkitDisplayingFullscreen_Getter_(mthis) => mthis["webkitDisplayingFullscreen"];
 
-  static webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
-  webkitDecodedFrameCount_Getter_(mthis) => webkitDecodedFrameCount_Getter(mthis);
+  webkitDroppedFrameCount_Getter_(mthis) => mthis["webkitDroppedFrameCount"];
 
-  static webkitDisplayingFullscreen_Getter(mthis) native "HTMLVideoElement_webkitDisplayingFullscreen_Getter";
-  webkitDisplayingFullscreen_Getter_(mthis) => webkitDisplayingFullscreen_Getter(mthis);
+  webkitEnterFullScreen_Callback_0_(mthis) => mthis.callMethod("webkitEnterFullScreen", []);
 
-  static webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
-  webkitDroppedFrameCount_Getter_(mthis) => webkitDroppedFrameCount_Getter(mthis);
+  webkitEnterFullscreen_Callback_0_(mthis) => mthis.callMethod("webkitEnterFullscreen", []);
 
-  static webkitEnterFullScreen_Callback_0(mthis) native "HTMLVideoElement_webkitEnterFullScreen_Callback";
-  webkitEnterFullScreen_Callback_0_(mthis) => webkitEnterFullScreen_Callback_0(mthis);
+  webkitExitFullScreen_Callback_0_(mthis) => mthis.callMethod("webkitExitFullScreen", []);
 
-  static webkitEnterFullScreen_Callback_1(mthis, __arg_0) native "HTMLVideoElement_webkitEnterFullScreen_Callback";
-  webkitEnterFullScreen_Callback_1_(mthis, __arg_0) => webkitEnterFullScreen_Callback_1(mthis, __arg_0);
+  webkitExitFullscreen_Callback_0_(mthis) => mthis.callMethod("webkitExitFullscreen", []);
 
-  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);
+  webkitSupportsFullscreen_Getter_(mthis) => mthis["webkitSupportsFullscreen"];
 
-  static webkitEnterFullscreen_Callback_0(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback";
-  webkitEnterFullscreen_Callback_0_(mthis) => webkitEnterFullscreen_Callback_0(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  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, __arg_0) native "HTMLVideoElement_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["HashChangeEvent"], [__arg_0, __arg_1]);
 
-  static initHashChangeEvent_Callback_0(mthis) native "HashChangeEvent_initHashChangeEvent_Callback";
-  initHashChangeEvent_Callback_0_(mthis) => initHashChangeEvent_Callback_0(mthis);
+  initHashChangeEvent_Callback_0_(mthis) => mthis.callMethod("initHashChangeEvent", []);
 
-  static initHashChangeEvent_Callback_1(mthis, __arg_0) native "HashChangeEvent_initHashChangeEvent_Callback";
-  initHashChangeEvent_Callback_1_(mthis, __arg_0) => initHashChangeEvent_Callback_1(mthis, __arg_0);
+  initHashChangeEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initHashChangeEvent", [__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);
+  initHashChangeEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initHashChangeEvent", [__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);
+  initHashChangeEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initHashChangeEvent", [__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);
+  initHashChangeEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initHashChangeEvent", [__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);
+  initHashChangeEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initHashChangeEvent", [__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);
+  newURL_Getter_(mthis) => mthis["newURL"];
 
-  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);
+  oldURL_Getter_(mthis) => mthis["oldURL"];
 
 }
 
 class BlinkHeaders {
   static final instance = new BlinkHeaders();
 
-  static append_Callback_0(mthis) native "Headers_append_Callback";
-  append_Callback_0_(mthis) => append_Callback_0(mthis);
+  append_Callback_0_(mthis) => mthis.callMethod("append", []);
 
-  static append_Callback_1(mthis, __arg_0) native "Headers_append_Callback";
-  append_Callback_1_(mthis, __arg_0) => append_Callback_1(mthis, __arg_0);
+  append_Callback_1_(mthis, __arg_0) => mthis.callMethod("append", [__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);
+  append_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("append", [__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);
+  constructorCallback_0_() => new js.JsObject(js.context["Headers"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Headers"], [__arg_0]);
 
-  static constructorCallback_0() native "Headers_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  static constructorCallback_1(__arg_0) native "Headers_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  delete_Callback_1_(mthis, __arg_0) => mthis.callMethod("delete", [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Headers_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  forEach_Callback_0_(mthis) => mthis.callMethod("forEach", []);
 
-  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);
+  forEach_Callback_1_(mthis, __arg_0) => mthis.callMethod("forEach", [__arg_0]);
 
-  static delete_Callback_0(mthis) native "Headers_delete_Callback";
-  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+  forEach_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("forEach", [__arg_0, __arg_1]);
 
-  static delete_Callback_1(mthis, __arg_0) native "Headers_delete_Callback";
-  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+  getAll_Callback_0_(mthis) => mthis.callMethod("getAll", []);
 
-  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);
+  getAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAll", [__arg_0]);
 
-  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);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  static forEach_Callback_0(mthis) native "Headers_forEach_Callback";
-  forEach_Callback_0_(mthis) => forEach_Callback_0(mthis);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__arg_0]);
 
-  static forEach_Callback_1(mthis, __arg_0) native "Headers_forEach_Callback";
-  forEach_Callback_1_(mthis, __arg_0) => forEach_Callback_1(mthis, __arg_0);
+  has_Callback_0_(mthis) => mthis.callMethod("has", []);
 
-  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);
+  has_Callback_1_(mthis, __arg_0) => mthis.callMethod("has", [__arg_0]);
 
-  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);
+  set_Callback_0_(mthis) => mthis.callMethod("set", []);
 
-  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);
+  set_Callback_1_(mthis, __arg_0) => mthis.callMethod("set", [__arg_0]);
 
-  static getAll_Callback_0(mthis) native "Headers_getAll_Callback";
-  getAll_Callback_0_(mthis) => getAll_Callback_0(mthis);
+  set_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("set", [__arg_0, __arg_1]);
 
-  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);
+  size_Getter_(mthis) => mthis["size"];
 
 }
 
 class BlinkHistory {
   static final instance = new BlinkHistory();
 
-  static back_Callback_0(mthis) native "History_back_Callback";
-  back_Callback_0_(mthis) => back_Callback_0(mthis);
+  back_Callback_0_(mthis) => mthis.callMethod("back", []);
 
-  static back_Callback_1(mthis, __arg_0) native "History_back_Callback";
-  back_Callback_1_(mthis, __arg_0) => back_Callback_1(mthis, __arg_0);
+  forward_Callback_0_(mthis) => mthis.callMethod("forward", []);
 
-  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);
+  go_Callback_0_(mthis) => mthis.callMethod("go", []);
 
-  static forward_Callback_0(mthis) native "History_forward_Callback";
-  forward_Callback_0_(mthis) => forward_Callback_0(mthis);
+  go_Callback_1_(mthis, __arg_0) => mthis.callMethod("go", [__arg_0]);
 
-  static forward_Callback_1(mthis, __arg_0) native "History_forward_Callback";
-  forward_Callback_1_(mthis, __arg_0) => forward_Callback_1(mthis, __arg_0);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  pushState_Callback_0_(mthis) => mthis.callMethod("pushState", []);
 
-  static go_Callback_0(mthis) native "History_go_Callback";
-  go_Callback_0_(mthis) => go_Callback_0(mthis);
+  pushState_Callback_1_(mthis, __arg_0) => mthis.callMethod("pushState", [__arg_0]);
 
-  static go_Callback_1(mthis, __arg_0) native "History_go_Callback";
-  go_Callback_1_(mthis, __arg_0) => go_Callback_1(mthis, __arg_0);
+  pushState_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("pushState", [__arg_0, __arg_1]);
 
-  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);
+  pushState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("pushState", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  replaceState_Callback_0_(mthis) => mthis.callMethod("replaceState", []);
 
-  static length_Getter(mthis) native "History_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  replaceState_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceState", [__arg_0]);
 
-  static pushState_Callback_0(mthis) native "History_pushState_Callback";
-  pushState_Callback_0_(mthis) => pushState_Callback_0(mthis);
+  replaceState_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceState", [__arg_0, __arg_1]);
 
-  static pushState_Callback_1(mthis, __arg_0) native "History_pushState_Callback";
-  pushState_Callback_1_(mthis, __arg_0) => pushState_Callback_1(mthis, __arg_0);
+  replaceState_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("replaceState", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  state_Getter_(mthis) => mthis["state"];
 
 }
 
 class BlinkIDBCursor {
   static final instance = new BlinkIDBCursor();
 
-  static advance_Callback_0(mthis) native "IDBCursor_advance_Callback";
-  advance_Callback_0_(mthis) => advance_Callback_0(mthis);
+  advance_Callback_0_(mthis) => mthis.callMethod("advance", []);
 
-  static advance_Callback_1(mthis, __arg_0) native "IDBCursor_advance_Callback";
-  advance_Callback_1_(mthis, __arg_0) => advance_Callback_1(mthis, __arg_0);
+  advance_Callback_1_(mthis, __arg_0) => mthis.callMethod("advance", [__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);
+  continuePrimaryKey_Callback_0_(mthis) => mthis.callMethod("continuePrimaryKey", []);
 
-  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);
+  continuePrimaryKey_Callback_1_(mthis, __arg_0) => mthis.callMethod("continuePrimaryKey", [__arg_0]);
 
-  static continuePrimaryKey_Callback_0(mthis) native "IDBCursor_continuePrimaryKey_Callback";
-  continuePrimaryKey_Callback_0_(mthis) => continuePrimaryKey_Callback_0(mthis);
+  continuePrimaryKey_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("continuePrimaryKey", [__arg_0, __arg_1]);
 
-  static continuePrimaryKey_Callback_1(mthis, __arg_0) native "IDBCursor_continuePrimaryKey_Callback";
-  continuePrimaryKey_Callback_1_(mthis, __arg_0) => continuePrimaryKey_Callback_1(mthis, __arg_0);
+  continue_Callback_0_(mthis) => mthis.callMethod("continue", []);
 
-  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);
+  continue_Callback_1_(mthis, __arg_0) => mthis.callMethod("continue", [__arg_0]);
 
-  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);
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  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);
+  direction_Getter_(mthis) => mthis["direction"];
 
-  static continue_Callback_0(mthis) native "IDBCursor_continue_Callback";
-  continue_Callback_0_(mthis) => continue_Callback_0(mthis);
+  key_Getter_(mthis) => mthis["key"];
 
-  static continue_Callback_1(mthis, __arg_0) native "IDBCursor_continue_Callback";
-  continue_Callback_1_(mthis, __arg_0) => continue_Callback_1(mthis, __arg_0);
+  primaryKey_Getter_(mthis) => mthis["primaryKey"];
 
-  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);
+  source_Getter_(mthis) => mthis["source"];
 
-  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);
+  update_Callback_0_(mthis) => mthis.callMethod("update", []);
 
-  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 update_Callback_0(mthis) native "IDBCursor_update_Callback";
-  update_Callback_0_(mthis) => update_Callback_0(mthis);
-
-  static update_Callback_1(mthis, __arg_0) native "IDBCursor_update_Callback";
-  update_Callback_1_(mthis, __arg_0) => update_Callback_1(mthis, __arg_0);
-
-  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 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);
+  update_Callback_1_(mthis, __arg_0) => mthis.callMethod("update", [__arg_0]);
 
 }
 
 class BlinkIDBCursorWithValue extends BlinkIDBCursor {
   static final instance = new BlinkIDBCursorWithValue();
 
-  static value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
 }
 
 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);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "IDBDatabase_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  createObjectStore_Callback_0_(mthis) => mthis.callMethod("createObjectStore", []);
 
-  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);
+  createObjectStore_Callback_1_(mthis, __arg_0) => mthis.callMethod("createObjectStore", [__arg_0]);
 
-  static createObjectStore_Callback_0(mthis) native "IDBDatabase_createObjectStore_Callback";
-  createObjectStore_Callback_0_(mthis) => createObjectStore_Callback_0(mthis);
+  createObjectStore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createObjectStore", [__arg_0, __arg_1]);
 
-  static createObjectStore_Callback_1(mthis, __arg_0) native "IDBDatabase_createObjectStore_Callback";
-  createObjectStore_Callback_1_(mthis, __arg_0) => createObjectStore_Callback_1(mthis, __arg_0);
+  deleteObjectStore_Callback_0_(mthis) => mthis.callMethod("deleteObjectStore", []);
 
-  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);
+  deleteObjectStore_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteObjectStore", [__arg_0]);
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  objectStoreNames_Getter_(mthis) => mthis["objectStoreNames"];
 
-  static deleteObjectStore_Callback_0(mthis) native "IDBDatabase_deleteObjectStore_Callback";
-  deleteObjectStore_Callback_0_(mthis) => deleteObjectStore_Callback_0(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static deleteObjectStore_Callback_1(mthis, __arg_0) native "IDBDatabase_deleteObjectStore_Callback";
-  deleteObjectStore_Callback_1_(mthis, __arg_0) => deleteObjectStore_Callback_1(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __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);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  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);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static name_Getter(mthis) native "IDBDatabase_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
-  objectStoreNames_Getter_(mthis) => objectStoreNames_Getter(mthis);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onabort_Getter(mthis) native "IDBDatabase_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onversionchange_Getter_(mthis) => mthis["onversionchange"];
 
-  static onabort_Setter(mthis, __arg_0) native "IDBDatabase_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onversionchange_Setter_(mthis, __arg_0) => mthis["onversionchange"] = __arg_0;
 
-  static onclose_Getter(mthis) native "IDBDatabase_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  transaction_Callback_0_(mthis) => mthis.callMethod("transaction", []);
 
-  static onclose_Setter(mthis, __arg_0) native "IDBDatabase_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  transaction_Callback_1_(mthis, __arg_0) => mthis.callMethod("transaction", [__arg_0]);
 
-  static onerror_Getter(mthis) native "IDBDatabase_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  transaction_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("transaction", [__arg_0, __arg_1]);
 
-  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);
+  version_Getter_(mthis) => mthis["version"];
 
 }
 
 class BlinkIDBFactory {
   static final instance = new BlinkIDBFactory();
 
-  static cmp_Callback_0(mthis) native "IDBFactory_cmp_Callback";
-  cmp_Callback_0_(mthis) => cmp_Callback_0(mthis);
+  cmp_Callback_0_(mthis) => mthis.callMethod("cmp", []);
 
-  static cmp_Callback_1(mthis, __arg_0) native "IDBFactory_cmp_Callback";
-  cmp_Callback_1_(mthis, __arg_0) => cmp_Callback_1(mthis, __arg_0);
+  cmp_Callback_1_(mthis, __arg_0) => mthis.callMethod("cmp", [__arg_0]);
 
-  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);
+  cmp_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("cmp", [__arg_0, __arg_1]);
 
-  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);
+  deleteDatabase_Callback_0_(mthis) => mthis.callMethod("deleteDatabase", []);
 
-  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);
+  deleteDatabase_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteDatabase", [__arg_0]);
 
-  static deleteDatabase_Callback_0(mthis) native "IDBFactory_deleteDatabase_Callback";
-  deleteDatabase_Callback_0_(mthis) => deleteDatabase_Callback_0(mthis);
+  open_Callback_0_(mthis) => mthis.callMethod("open", []);
 
-  static deleteDatabase_Callback_1(mthis, __arg_0) native "IDBFactory_deleteDatabase_Callback";
-  deleteDatabase_Callback_1_(mthis, __arg_0) => deleteDatabase_Callback_1(mthis, __arg_0);
+  open_Callback_1_(mthis, __arg_0) => mthis.callMethod("open", [__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);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("open", [__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);
+  webkitGetDatabaseNames_Callback_0_(mthis) => mthis.callMethod("webkitGetDatabaseNames", []);
 
 }
 
 class BlinkIDBIndex {
   static final instance = new BlinkIDBIndex();
 
-  static count_Callback_0(mthis) native "IDBIndex_count_Callback";
-  count_Callback_0_(mthis) => count_Callback_0(mthis);
+  count_Callback_0_(mthis) => mthis.callMethod("count", []);
 
-  static count_Callback_1(mthis, __arg_0) native "IDBIndex_count_Callback";
-  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
+  count_Callback_1_(mthis, __arg_0) => mthis.callMethod("count", [__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);
+  getKey_Callback_0_(mthis) => mthis.callMethod("getKey", []);
 
-  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);
+  getKey_Callback_1_(mthis, __arg_0) => mthis.callMethod("getKey", [__arg_0]);
 
-  static getKey_Callback_0(mthis) native "IDBIndex_getKey_Callback";
-  getKey_Callback_0_(mthis) => getKey_Callback_0(mthis);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  static getKey_Callback_1(mthis, __arg_0) native "IDBIndex_getKey_Callback";
-  getKey_Callback_1_(mthis, __arg_0) => getKey_Callback_1(mthis, __arg_0);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__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);
+  keyPath_Getter_(mthis) => mthis["keyPath"];
 
-  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);
+  multiEntry_Getter_(mthis) => mthis["multiEntry"];
 
-  static get_Callback_0(mthis) native "IDBIndex_get_Callback";
-  get_Callback_0_(mthis) => get_Callback_0(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static get_Callback_1(mthis, __arg_0) native "IDBIndex_get_Callback";
-  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+  objectStore_Getter_(mthis) => mthis["objectStore"];
 
-  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);
+  openCursor_Callback_0_(mthis) => mthis.callMethod("openCursor", []);
 
-  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);
+  openCursor_Callback_1_(mthis, __arg_0) => mthis.callMethod("openCursor", [__arg_0]);
 
-  static keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
-  keyPath_Getter_(mthis) => keyPath_Getter(mthis);
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("openCursor", [__arg_0, __arg_1]);
 
-  static multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
-  multiEntry_Getter_(mthis) => multiEntry_Getter(mthis);
+  openKeyCursor_Callback_0_(mthis) => mthis.callMethod("openKeyCursor", []);
 
-  static name_Getter(mthis) native "IDBIndex_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  openKeyCursor_Callback_1_(mthis, __arg_0) => mthis.callMethod("openKeyCursor", [__arg_0]);
 
-  static objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
-  objectStore_Getter_(mthis) => objectStore_Getter(mthis);
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("openKeyCursor", [__arg_0, __arg_1]);
 
-  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);
+  unique_Getter_(mthis) => mthis["unique"];
 
 }
 
 class BlinkIDBKeyRange {
   static final instance = new BlinkIDBKeyRange();
 
-  static bound_Callback_0() native "IDBKeyRange_bound_Callback";
-  bound_Callback_0_() => bound_Callback_0();
+  bound_Callback_0_() => js.context["IDBKeyRange"].callMethod("bound", []);
 
-  static bound_Callback_1(__arg_0) native "IDBKeyRange_bound_Callback";
-  bound_Callback_1_(__arg_0) => bound_Callback_1(__arg_0);
+  bound_Callback_1_(__arg_0) => js.context["IDBKeyRange"].callMethod("bound", [__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);
+  bound_Callback_2_(__arg_0, __arg_1) => js.context["IDBKeyRange"].callMethod("bound", [__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);
+  bound_Callback_3_(__arg_0, __arg_1, __arg_2) => js.context["IDBKeyRange"].callMethod("bound", [__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);
+  bound_Callback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => js.context["IDBKeyRange"].callMethod("bound", [__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);
+  lowerBound_Callback_0_() => js.context["IDBKeyRange"].callMethod("lowerBound", []);
 
-  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);
+  lowerBound_Callback_1_(__arg_0) => js.context["IDBKeyRange"].callMethod("lowerBound", [__arg_0]);
 
-  static lowerBound_Callback_0() native "IDBKeyRange_lowerBound_Callback";
-  lowerBound_Callback_0_() => lowerBound_Callback_0();
+  lowerBound_Callback_2_(__arg_0, __arg_1) => js.context["IDBKeyRange"].callMethod("lowerBound", [__arg_0, __arg_1]);
 
-  static lowerBound_Callback_1(__arg_0) native "IDBKeyRange_lowerBound_Callback";
-  lowerBound_Callback_1_(__arg_0) => lowerBound_Callback_1(__arg_0);
+  lowerOpen_Getter_(mthis) => mthis["lowerOpen"];
 
-  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);
+  lower_Getter_(mthis) => mthis["lower"];
 
-  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);
+  only_Callback_0_() => js.context["IDBKeyRange"].callMethod("only", []);
 
-  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);
+  only_Callback_1_(__arg_0) => js.context["IDBKeyRange"].callMethod("only", [__arg_0]);
 
-  static lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
-  lowerOpen_Getter_(mthis) => lowerOpen_Getter(mthis);
+  upperBound_Callback_0_() => js.context["IDBKeyRange"].callMethod("upperBound", []);
 
-  static lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
-  lower_Getter_(mthis) => lower_Getter(mthis);
+  upperBound_Callback_1_(__arg_0) => js.context["IDBKeyRange"].callMethod("upperBound", [__arg_0]);
 
-  static only_Callback_0() native "IDBKeyRange_only_Callback";
-  only_Callback_0_() => only_Callback_0();
+  upperBound_Callback_2_(__arg_0, __arg_1) => js.context["IDBKeyRange"].callMethod("upperBound", [__arg_0, __arg_1]);
 
-  static only_Callback_1(__arg_0) native "IDBKeyRange_only_Callback";
-  only_Callback_1_(__arg_0) => only_Callback_1(__arg_0);
+  upperOpen_Getter_(mthis) => mthis["upperOpen"];
 
-  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 upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
-  upper_Getter_(mthis) => upper_Getter(mthis);
+  upper_Getter_(mthis) => mthis["upper"];
 
 }
 
 class BlinkIDBObjectStore {
   static final instance = new BlinkIDBObjectStore();
 
-  static add_Callback_0(mthis) native "IDBObjectStore_add_Callback";
-  add_Callback_0_(mthis) => add_Callback_0(mthis);
+  add_Callback_0_(mthis) => mthis.callMethod("add", []);
 
-  static add_Callback_1(mthis, __arg_0) native "IDBObjectStore_add_Callback";
-  add_Callback_1_(mthis, __arg_0) => add_Callback_1(mthis, __arg_0);
+  add_Callback_1_(mthis, __arg_0) => mthis.callMethod("add", [__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);
+  add_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("add", [__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);
+  autoIncrement_Getter_(mthis) => mthis["autoIncrement"];
 
-  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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  static autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
-  autoIncrement_Getter_(mthis) => autoIncrement_Getter(mthis);
+  count_Callback_0_(mthis) => mthis.callMethod("count", []);
 
-  static clear_Callback_0(mthis) native "IDBObjectStore_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  count_Callback_1_(mthis, __arg_0) => mthis.callMethod("count", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "IDBObjectStore_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  createIndex_Callback_0_(mthis) => mthis.callMethod("createIndex", []);
 
-  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);
+  createIndex_Callback_1_(mthis, __arg_0) => mthis.callMethod("createIndex", [__arg_0]);
 
-  static count_Callback_0(mthis) native "IDBObjectStore_count_Callback";
-  count_Callback_0_(mthis) => count_Callback_0(mthis);
+  createIndex_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createIndex", [__arg_0, __arg_1]);
 
-  static count_Callback_1(mthis, __arg_0) native "IDBObjectStore_count_Callback";
-  count_Callback_1_(mthis, __arg_0) => count_Callback_1(mthis, __arg_0);
+  createIndex_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createIndex", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  deleteIndex_Callback_0_(mthis) => mthis.callMethod("deleteIndex", []);
 
-  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);
+  deleteIndex_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteIndex", [__arg_0]);
 
-  static createIndex_Callback_0(mthis) native "IDBObjectStore_createIndex_Callback";
-  createIndex_Callback_0_(mthis) => createIndex_Callback_0(mthis);
+  delete_Callback_0_(mthis) => mthis.callMethod("delete", []);
 
-  static createIndex_Callback_1(mthis, __arg_0) native "IDBObjectStore_createIndex_Callback";
-  createIndex_Callback_1_(mthis, __arg_0) => createIndex_Callback_1(mthis, __arg_0);
+  delete_Callback_1_(mthis, __arg_0) => mthis.callMethod("delete", [__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);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  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);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__arg_0]);
 
-  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);
+  indexNames_Getter_(mthis) => mthis["indexNames"];
 
-  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);
+  index_Callback_0_(mthis) => mthis.callMethod("index", []);
 
-  static deleteIndex_Callback_0(mthis) native "IDBObjectStore_deleteIndex_Callback";
-  deleteIndex_Callback_0_(mthis) => deleteIndex_Callback_0(mthis);
+  index_Callback_1_(mthis, __arg_0) => mthis.callMethod("index", [__arg_0]);
 
-  static deleteIndex_Callback_1(mthis, __arg_0) native "IDBObjectStore_deleteIndex_Callback";
-  deleteIndex_Callback_1_(mthis, __arg_0) => deleteIndex_Callback_1(mthis, __arg_0);
+  keyPath_Getter_(mthis) => mthis["keyPath"];
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  openCursor_Callback_0_(mthis) => mthis.callMethod("openCursor", []);
 
-  static delete_Callback_0(mthis) native "IDBObjectStore_delete_Callback";
-  delete_Callback_0_(mthis) => delete_Callback_0(mthis);
+  openCursor_Callback_1_(mthis, __arg_0) => mthis.callMethod("openCursor", [__arg_0]);
 
-  static delete_Callback_1(mthis, __arg_0) native "IDBObjectStore_delete_Callback";
-  delete_Callback_1_(mthis, __arg_0) => delete_Callback_1(mthis, __arg_0);
+  openCursor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("openCursor", [__arg_0, __arg_1]);
 
-  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);
+  openKeyCursor_Callback_0_(mthis) => mthis.callMethod("openKeyCursor", []);
 
-  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);
+  openKeyCursor_Callback_1_(mthis, __arg_0) => mthis.callMethod("openKeyCursor", [__arg_0]);
 
-  static get_Callback_0(mthis) native "IDBObjectStore_get_Callback";
-  get_Callback_0_(mthis) => get_Callback_0(mthis);
+  openKeyCursor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("openKeyCursor", [__arg_0, __arg_1]);
 
-  static get_Callback_1(mthis, __arg_0) native "IDBObjectStore_get_Callback";
-  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+  put_Callback_0_(mthis) => mthis.callMethod("put", []);
 
-  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);
+  put_Callback_1_(mthis, __arg_0) => mthis.callMethod("put", [__arg_0]);
 
-  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);
+  put_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("put", [__arg_0, __arg_1]);
 
-  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);
+  transaction_Getter_(mthis) => mthis["transaction"];
 
 }
 
 class BlinkIDBOpenDBRequest extends BlinkIDBRequest {
   static final instance = new BlinkIDBOpenDBRequest();
 
-  static onblocked_Getter(mthis) native "IDBOpenDBRequest_onblocked_Getter";
-  onblocked_Getter_(mthis) => onblocked_Getter(mthis);
+  onblocked_Getter_(mthis) => mthis["onblocked"];
 
-  static onblocked_Setter(mthis, __arg_0) native "IDBOpenDBRequest_onblocked_Setter";
-  onblocked_Setter_(mthis, __arg_0) => onblocked_Setter(mthis, __arg_0);
+  onblocked_Setter_(mthis, __arg_0) => mthis["onblocked"] = __arg_0;
 
-  static onupgradeneeded_Getter(mthis) native "IDBOpenDBRequest_onupgradeneeded_Getter";
-  onupgradeneeded_Getter_(mthis) => onupgradeneeded_Getter(mthis);
+  onupgradeneeded_Getter_(mthis) => mthis["onupgradeneeded"];
 
-  static onupgradeneeded_Setter(mthis, __arg_0) native "IDBOpenDBRequest_onupgradeneeded_Setter";
-  onupgradeneeded_Setter_(mthis, __arg_0) => onupgradeneeded_Setter(mthis, __arg_0);
+  onupgradeneeded_Setter_(mthis, __arg_0) => mthis["onupgradeneeded"] = __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);
+  error_Getter_(mthis) => mthis["error"];
 
-  static onerror_Getter(mthis) native "IDBRequest_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onerror_Setter(mthis, __arg_0) native "IDBRequest_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onsuccess_Getter(mthis) native "IDBRequest_onsuccess_Getter";
-  onsuccess_Getter_(mthis) => onsuccess_Getter(mthis);
+  onsuccess_Getter_(mthis) => mthis["onsuccess"];
 
-  static onsuccess_Setter(mthis, __arg_0) native "IDBRequest_onsuccess_Setter";
-  onsuccess_Setter_(mthis, __arg_0) => onsuccess_Setter(mthis, __arg_0);
+  onsuccess_Setter_(mthis, __arg_0) => mthis["onsuccess"] = __arg_0;
 
-  static readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static result_Getter(mthis) native "IDBRequest_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static source_Getter(mthis) native "IDBRequest_source_Getter";
-  source_Getter_(mthis) => source_Getter(mthis);
+  source_Getter_(mthis) => mthis["source"];
 
-  static transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
-  transaction_Getter_(mthis) => transaction_Getter(mthis);
+  transaction_Getter_(mthis) => mthis["transaction"];
 
 }
 
 class BlinkIDBTransaction extends BlinkEventTarget {
   static final instance = new BlinkIDBTransaction();
 
-  static abort_Callback_0(mthis) native "IDBTransaction_abort_Callback";
-  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "IDBTransaction_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  db_Getter_(mthis) => mthis["db"];
 
-  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);
+  error_Getter_(mthis) => mthis["error"];
 
-  static db_Getter(mthis) native "IDBTransaction_db_Getter";
-  db_Getter_(mthis) => db_Getter(mthis);
+  mode_Getter_(mthis) => mthis["mode"];
 
-  static error_Getter(mthis) native "IDBTransaction_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  objectStore_Callback_0_(mthis) => mthis.callMethod("objectStore", []);
 
-  static mode_Getter(mthis) native "IDBTransaction_mode_Getter";
-  mode_Getter_(mthis) => mode_Getter(mthis);
+  objectStore_Callback_1_(mthis, __arg_0) => mthis.callMethod("objectStore", [__arg_0]);
 
-  static objectStore_Callback_0(mthis) native "IDBTransaction_objectStore_Callback";
-  objectStore_Callback_0_(mthis) => objectStore_Callback_0(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static objectStore_Callback_1(mthis, __arg_0) native "IDBTransaction_objectStore_Callback";
-  objectStore_Callback_1_(mthis, __arg_0) => objectStore_Callback_1(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __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);
+  oncomplete_Getter_(mthis) => mthis["oncomplete"];
 
-  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);
+  oncomplete_Setter_(mthis, __arg_0) => mthis["oncomplete"] = __arg_0;
 
-  static onabort_Getter(mthis) native "IDBTransaction_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  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);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
 }
 
 class BlinkIDBVersionChangeEvent extends BlinkEvent {
   static final instance = new BlinkIDBVersionChangeEvent();
 
-  static constructorCallback_2(__arg_0, __arg_1) native "IDBVersionChangeEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["IDBVersionChangeEvent"], [__arg_0, __arg_1]);
 
-  static dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
-  dataLossMessage_Getter_(mthis) => dataLossMessage_Getter(mthis);
+  dataLossMessage_Getter_(mthis) => mthis["dataLossMessage"];
 
-  static dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
-  dataLoss_Getter_(mthis) => dataLoss_Getter(mthis);
+  dataLoss_Getter_(mthis) => mthis["dataLoss"];
 
-  static newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
-  newVersion_Getter_(mthis) => newVersion_Getter(mthis);
+  newVersion_Getter_(mthis) => mthis["newVersion"];
 
-  static oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
-  oldVersion_Getter_(mthis) => oldVersion_Getter(mthis);
+  oldVersion_Getter_(mthis) => mthis["oldVersion"];
 
 }
 
 class BlinkImageBitmap {
   static final instance = new BlinkImageBitmap();
 
-  static height_Getter(mthis) native "ImageBitmap_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static width_Getter(mthis) native "ImageBitmap_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
 }
 
 class BlinkImageData {
   static final instance = new BlinkImageData();
 
-  static constructorCallback_0() native "ImageData_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["ImageData"], []);
 
-  static constructorCallback_1(__arg_0) native "ImageData_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["ImageData"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "ImageData_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["ImageData"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["ImageData"], [__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);
+  data_Getter_(mthis) => mthis["data"];
 
-  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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  width_Getter_(mthis) => mthis["width"];
 
 }
 
 class BlinkInjectedScriptHost {
   static final instance = new BlinkInjectedScriptHost();
 
-  static callFunction_Callback_0(mthis) native "InjectedScriptHost_callFunction_Callback";
-  callFunction_Callback_0_(mthis) => callFunction_Callback_0(mthis);
+  callFunction_Callback_0_(mthis) => mthis.callMethod("callFunction", []);
 
-  static callFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_callFunction_Callback";
-  callFunction_Callback_1_(mthis, __arg_0) => callFunction_Callback_1(mthis, __arg_0);
+  callFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("callFunction", [__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);
+  callFunction_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("callFunction", [__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);
+  callFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("callFunction", [__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);
+  clearConsoleMessages_Callback_0_(mthis) => mthis.callMethod("clearConsoleMessages", []);
 
-  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);
+  collectionEntries_Callback_0_(mthis) => mthis.callMethod("collectionEntries", []);
 
-  static clearConsoleMessages_Callback_0(mthis) native "InjectedScriptHost_clearConsoleMessages_Callback";
-  clearConsoleMessages_Callback_0_(mthis) => clearConsoleMessages_Callback_0(mthis);
+  collectionEntries_Callback_1_(mthis, __arg_0) => mthis.callMethod("collectionEntries", [__arg_0]);
 
-  static clearConsoleMessages_Callback_1(mthis, __arg_0) native "InjectedScriptHost_clearConsoleMessages_Callback";
-  clearConsoleMessages_Callback_1_(mthis, __arg_0) => clearConsoleMessages_Callback_1(mthis, __arg_0);
+  debugFunction_Callback_0_(mthis) => mthis.callMethod("debugFunction", []);
 
-  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);
+  debugFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("debugFunction", [__arg_0]);
 
-  static collectionEntries_Callback_0(mthis) native "InjectedScriptHost_collectionEntries_Callback";
-  collectionEntries_Callback_0_(mthis) => collectionEntries_Callback_0(mthis);
+  eval_Callback_0_(mthis) => mthis.callMethod("eval", []);
 
-  static collectionEntries_Callback_1(mthis, __arg_0) native "InjectedScriptHost_collectionEntries_Callback";
-  collectionEntries_Callback_1_(mthis, __arg_0) => collectionEntries_Callback_1(mthis, __arg_0);
+  eval_Callback_1_(mthis, __arg_0) => mthis.callMethod("eval", [__arg_0]);
 
-  static collectionEntries_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_collectionEntries_Callback";
-  collectionEntries_Callback_2_(mthis, __arg_0, __arg_1) => collectionEntries_Callback_2(mthis, __arg_0, __arg_1);
+  evaluateWithExceptionDetails_Callback_0_(mthis) => mthis.callMethod("evaluateWithExceptionDetails", []);
 
-  static collectionEntries_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_collectionEntries_Callback";
-  collectionEntries_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => collectionEntries_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => mthis.callMethod("evaluateWithExceptionDetails", [__arg_0]);
 
-  static debugFunction_Callback_0(mthis) native "InjectedScriptHost_debugFunction_Callback";
-  debugFunction_Callback_0_(mthis) => debugFunction_Callback_0(mthis);
+  functionDetails_Callback_0_(mthis) => mthis.callMethod("functionDetails", []);
 
-  static debugFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_debugFunction_Callback";
-  debugFunction_Callback_1_(mthis, __arg_0) => debugFunction_Callback_1(mthis, __arg_0);
+  functionDetails_Callback_1_(mthis, __arg_0) => mthis.callMethod("functionDetails", [__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);
+  getEventListeners_Callback_0_(mthis) => mthis.callMethod("getEventListeners", []);
 
-  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);
+  getEventListeners_Callback_1_(mthis, __arg_0) => mthis.callMethod("getEventListeners", [__arg_0]);
 
-  static eval_Callback_0(mthis) native "InjectedScriptHost_eval_Callback";
-  eval_Callback_0_(mthis) => eval_Callback_0(mthis);
+  getInternalProperties_Callback_0_(mthis) => mthis.callMethod("getInternalProperties", []);
 
-  static eval_Callback_1(mthis, __arg_0) native "InjectedScriptHost_eval_Callback";
-  eval_Callback_1_(mthis, __arg_0) => eval_Callback_1(mthis, __arg_0);
+  getInternalProperties_Callback_1_(mthis, __arg_0) => mthis.callMethod("getInternalProperties", [__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);
+  inspect_Callback_0_(mthis) => mthis.callMethod("inspect", []);
 
-  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);
+  inspect_Callback_1_(mthis, __arg_0) => mthis.callMethod("inspect", [__arg_0]);
 
-  static evaluateWithExceptionDetails_Callback_0(mthis) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
-  evaluateWithExceptionDetails_Callback_0_(mthis) => evaluateWithExceptionDetails_Callback_0(mthis);
+  inspect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("inspect", [__arg_0, __arg_1]);
 
-  static evaluateWithExceptionDetails_Callback_1(mthis, __arg_0) native "InjectedScriptHost_evaluateWithExceptionDetails_Callback";
-  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => evaluateWithExceptionDetails_Callback_1(mthis, __arg_0);
+  inspectedObject_Callback_0_(mthis) => mthis.callMethod("inspectedObject", []);
 
-  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);
+  inspectedObject_Callback_1_(mthis, __arg_0) => mthis.callMethod("inspectedObject", [__arg_0]);
 
-  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);
+  internalConstructorName_Callback_0_(mthis) => mthis.callMethod("internalConstructorName", []);
 
-  static functionDetails_Callback_0(mthis) native "InjectedScriptHost_functionDetails_Callback";
-  functionDetails_Callback_0_(mthis) => functionDetails_Callback_0(mthis);
+  internalConstructorName_Callback_1_(mthis, __arg_0) => mthis.callMethod("internalConstructorName", [__arg_0]);
 
-  static functionDetails_Callback_1(mthis, __arg_0) native "InjectedScriptHost_functionDetails_Callback";
-  functionDetails_Callback_1_(mthis, __arg_0) => functionDetails_Callback_1(mthis, __arg_0);
+  isHTMLAllCollection_Callback_0_(mthis) => mthis.callMethod("isHTMLAllCollection", []);
 
-  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);
+  isHTMLAllCollection_Callback_1_(mthis, __arg_0) => mthis.callMethod("isHTMLAllCollection", [__arg_0]);
 
-  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);
+  monitorFunction_Callback_0_(mthis) => mthis.callMethod("monitorFunction", []);
 
-  static getEventListeners_Callback_0(mthis) native "InjectedScriptHost_getEventListeners_Callback";
-  getEventListeners_Callback_0_(mthis) => getEventListeners_Callback_0(mthis);
+  monitorFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("monitorFunction", [__arg_0]);
 
-  static getEventListeners_Callback_1(mthis, __arg_0) native "InjectedScriptHost_getEventListeners_Callback";
-  getEventListeners_Callback_1_(mthis, __arg_0) => getEventListeners_Callback_1(mthis, __arg_0);
+  setFunctionVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setFunctionVariableValue", [__arg_0, __arg_1]);
 
-  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);
+  setFunctionVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setFunctionVariableValue", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setFunctionVariableValue_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setFunctionVariableValue", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static getInternalProperties_Callback_0(mthis) native "InjectedScriptHost_getInternalProperties_Callback";
-  getInternalProperties_Callback_0_(mthis) => getInternalProperties_Callback_0(mthis);
+  setNonEnumProperty_Callback_1_(mthis, __arg_0) => mthis.callMethod("setNonEnumProperty", [__arg_0]);
 
-  static getInternalProperties_Callback_1(mthis, __arg_0) native "InjectedScriptHost_getInternalProperties_Callback";
-  getInternalProperties_Callback_1_(mthis, __arg_0) => getInternalProperties_Callback_1(mthis, __arg_0);
+  setNonEnumProperty_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setNonEnumProperty", [__arg_0, __arg_1]);
 
-  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);
+  setNonEnumProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setNonEnumProperty", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  subtype_Callback_0_(mthis) => mthis.callMethod("subtype", []);
 
-  static inspect_Callback_0(mthis) native "InjectedScriptHost_inspect_Callback";
-  inspect_Callback_0_(mthis) => inspect_Callback_0(mthis);
+  subtype_Callback_1_(mthis, __arg_0) => mthis.callMethod("subtype", [__arg_0]);
 
-  static inspect_Callback_1(mthis, __arg_0) native "InjectedScriptHost_inspect_Callback";
-  inspect_Callback_1_(mthis, __arg_0) => inspect_Callback_1(mthis, __arg_0);
+  suppressWarningsAndCallFunction_Callback_0_(mthis) => mthis.callMethod("suppressWarningsAndCallFunction", []);
 
-  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);
+  suppressWarningsAndCallFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("suppressWarningsAndCallFunction", [__arg_0]);
 
-  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);
+  suppressWarningsAndCallFunction_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("suppressWarningsAndCallFunction", [__arg_0, __arg_1]);
 
-  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);
+  suppressWarningsAndCallFunction_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("suppressWarningsAndCallFunction", [__arg_0, __arg_1, __arg_2]);
 
-  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 setNonEnumProperty_Callback_1(mthis, __arg_0) native "InjectedScriptHost_setNonEnumProperty_Callback";
-  setNonEnumProperty_Callback_1_(mthis, __arg_0) => setNonEnumProperty_Callback_1(mthis, __arg_0);
-
-  static setNonEnumProperty_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_setNonEnumProperty_Callback";
-  setNonEnumProperty_Callback_2_(mthis, __arg_0, __arg_1) => setNonEnumProperty_Callback_2(mthis, __arg_0, __arg_1);
-
-  static setNonEnumProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_setNonEnumProperty_Callback";
-  setNonEnumProperty_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => setNonEnumProperty_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
-
-  static setNonEnumProperty_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "InjectedScriptHost_setNonEnumProperty_Callback";
-  setNonEnumProperty_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => setNonEnumProperty_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
-
-  static setNonEnumProperty_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "InjectedScriptHost_setNonEnumProperty_Callback";
-  setNonEnumProperty_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => setNonEnumProperty_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
-
-  static subtype_Callback_0(mthis) native "InjectedScriptHost_subtype_Callback";
-  subtype_Callback_0_(mthis) => subtype_Callback_0(mthis);
-
-  static subtype_Callback_1(mthis, __arg_0) native "InjectedScriptHost_subtype_Callback";
-  subtype_Callback_1_(mthis, __arg_0) => subtype_Callback_1(mthis, __arg_0);
-
-  static subtype_Callback_2(mthis, __arg_0, __arg_1) native "InjectedScriptHost_subtype_Callback";
-  subtype_Callback_2_(mthis, __arg_0, __arg_1) => subtype_Callback_2(mthis, __arg_0, __arg_1);
-
-  static subtype_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "InjectedScriptHost_subtype_Callback";
-  subtype_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => subtype_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
-
-  static suppressWarningsAndCallFunction_Callback_0(mthis) native "InjectedScriptHost_suppressWarningsAndCallFunction_Callback";
-  suppressWarningsAndCallFunction_Callback_0_(mthis) => suppressWarningsAndCallFunction_Callback_0(mthis);
-
-  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 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);
+  undebugFunction_Callback_0_(mthis) => mthis.callMethod("undebugFunction", []);
 
-  static unmonitorFunction_Callback_1(mthis, __arg_0) native "InjectedScriptHost_unmonitorFunction_Callback";
-  unmonitorFunction_Callback_1_(mthis, __arg_0) => unmonitorFunction_Callback_1(mthis, __arg_0);
+  undebugFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("undebugFunction", [__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);
+  unmonitorFunction_Callback_0_(mthis) => mthis.callMethod("unmonitorFunction", []);
 
-  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);
+  unmonitorFunction_Callback_1_(mthis, __arg_0) => mthis.callMethod("unmonitorFunction", [__arg_0]);
 
 }
 
 class BlinkInputMethodContext extends BlinkEventTarget {
   static final instance = new BlinkInputMethodContext();
 
-  static compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
-  compositionEndOffset_Getter_(mthis) => compositionEndOffset_Getter(mthis);
+  compositionEndOffset_Getter_(mthis) => mthis["compositionEndOffset"];
 
-  static compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
-  compositionStartOffset_Getter_(mthis) => compositionStartOffset_Getter(mthis);
+  compositionStartOffset_Getter_(mthis) => mthis["compositionStartOffset"];
 
-  static confirmComposition_Callback_0(mthis) native "InputMethodContext_confirmComposition_Callback";
-  confirmComposition_Callback_0_(mthis) => confirmComposition_Callback_0(mthis);
+  confirmComposition_Callback_0_(mthis) => mthis.callMethod("confirmComposition", []);
 
-  static confirmComposition_Callback_1(mthis, __arg_0) native "InputMethodContext_confirmComposition_Callback";
-  confirmComposition_Callback_1_(mthis, __arg_0) => confirmComposition_Callback_1(mthis, __arg_0);
+  locale_Getter_(mthis) => mthis["locale"];
 
-  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);
+  oncandidatewindowhide_Getter_(mthis) => mthis["oncandidatewindowhide"];
 
-  static locale_Getter(mthis) native "InputMethodContext_locale_Getter";
-  locale_Getter_(mthis) => locale_Getter(mthis);
+  oncandidatewindowhide_Setter_(mthis, __arg_0) => mthis["oncandidatewindowhide"] = __arg_0;
 
-  static oncandidatewindowhide_Getter(mthis) native "InputMethodContext_oncandidatewindowhide_Getter";
-  oncandidatewindowhide_Getter_(mthis) => oncandidatewindowhide_Getter(mthis);
+  oncandidatewindowshow_Getter_(mthis) => mthis["oncandidatewindowshow"];
 
-  static oncandidatewindowhide_Setter(mthis, __arg_0) native "InputMethodContext_oncandidatewindowhide_Setter";
-  oncandidatewindowhide_Setter_(mthis, __arg_0) => oncandidatewindowhide_Setter(mthis, __arg_0);
+  oncandidatewindowshow_Setter_(mthis, __arg_0) => mthis["oncandidatewindowshow"] = __arg_0;
 
-  static oncandidatewindowshow_Getter(mthis) native "InputMethodContext_oncandidatewindowshow_Getter";
-  oncandidatewindowshow_Getter_(mthis) => oncandidatewindowshow_Getter(mthis);
+  oncandidatewindowupdate_Getter_(mthis) => mthis["oncandidatewindowupdate"];
 
-  static oncandidatewindowshow_Setter(mthis, __arg_0) native "InputMethodContext_oncandidatewindowshow_Setter";
-  oncandidatewindowshow_Setter_(mthis, __arg_0) => oncandidatewindowshow_Setter(mthis, __arg_0);
+  oncandidatewindowupdate_Setter_(mthis, __arg_0) => mthis["oncandidatewindowupdate"] = __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);
+  target_Getter_(mthis) => mthis["target"];
 
 }
 
 class BlinkInspectorFrontendHost {
   static final instance = new BlinkInspectorFrontendHost();
 
-  static copyText_Callback_0(mthis) native "InspectorFrontendHost_copyText_Callback";
-  copyText_Callback_0_(mthis) => copyText_Callback_0(mthis);
+  copyText_Callback_0_(mthis) => mthis.callMethod("copyText", []);
 
-  static copyText_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_copyText_Callback";
-  copyText_Callback_1_(mthis, __arg_0) => copyText_Callback_1(mthis, __arg_0);
+  copyText_Callback_1_(mthis, __arg_0) => mthis.callMethod("copyText", [__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);
+  getSelectionBackgroundColor_Callback_0_(mthis) => mthis.callMethod("getSelectionBackgroundColor", []);
 
-  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);
+  getSelectionForegroundColor_Callback_0_(mthis) => mthis.callMethod("getSelectionForegroundColor", []);
 
-  static getSelectionBackgroundColor_Callback_0(mthis) native "InspectorFrontendHost_getSelectionBackgroundColor_Callback";
-  getSelectionBackgroundColor_Callback_0_(mthis) => getSelectionBackgroundColor_Callback_0(mthis);
+  isHostedMode_Callback_0_(mthis) => mthis.callMethod("isHostedMode", []);
 
-  static getSelectionBackgroundColor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_getSelectionBackgroundColor_Callback";
-  getSelectionBackgroundColor_Callback_1_(mthis, __arg_0) => getSelectionBackgroundColor_Callback_1(mthis, __arg_0);
+  isUnderTest_Callback_0_(mthis) => mthis.callMethod("isUnderTest", []);
 
-  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);
+  isolatedFileSystem_Callback_0_(mthis) => mthis.callMethod("isolatedFileSystem", []);
 
-  static getSelectionForegroundColor_Callback_0(mthis) native "InspectorFrontendHost_getSelectionForegroundColor_Callback";
-  getSelectionForegroundColor_Callback_0_(mthis) => getSelectionForegroundColor_Callback_0(mthis);
+  isolatedFileSystem_Callback_1_(mthis, __arg_0) => mthis.callMethod("isolatedFileSystem", [__arg_0]);
 
-  static getSelectionForegroundColor_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_getSelectionForegroundColor_Callback";
-  getSelectionForegroundColor_Callback_1_(mthis, __arg_0) => getSelectionForegroundColor_Callback_1(mthis, __arg_0);
+  isolatedFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("isolatedFileSystem", [__arg_0, __arg_1]);
 
-  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);
+  platform_Callback_0_(mthis) => mthis.callMethod("platform", []);
 
-  static isHostedMode_Callback_0(mthis) native "InspectorFrontendHost_isHostedMode_Callback";
-  isHostedMode_Callback_0_(mthis) => isHostedMode_Callback_0(mthis);
+  port_Callback_0_(mthis) => mthis.callMethod("port", []);
 
-  static isHostedMode_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isHostedMode_Callback";
-  isHostedMode_Callback_1_(mthis, __arg_0) => isHostedMode_Callback_1(mthis, __arg_0);
+  recordActionTaken_Callback_0_(mthis) => mthis.callMethod("recordActionTaken", []);
 
-  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);
+  recordActionTaken_Callback_1_(mthis, __arg_0) => mthis.callMethod("recordActionTaken", [__arg_0]);
 
-  static isUnderTest_Callback_0(mthis) native "InspectorFrontendHost_isUnderTest_Callback";
-  isUnderTest_Callback_0_(mthis) => isUnderTest_Callback_0(mthis);
+  recordPanelShown_Callback_0_(mthis) => mthis.callMethod("recordPanelShown", []);
 
-  static isUnderTest_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isUnderTest_Callback";
-  isUnderTest_Callback_1_(mthis, __arg_0) => isUnderTest_Callback_1(mthis, __arg_0);
+  recordPanelShown_Callback_1_(mthis, __arg_0) => mthis.callMethod("recordPanelShown", [__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);
+  sendMessageToBackend_Callback_0_(mthis) => mthis.callMethod("sendMessageToBackend", []);
 
-  static isolatedFileSystem_Callback_0(mthis) native "InspectorFrontendHost_isolatedFileSystem_Callback";
-  isolatedFileSystem_Callback_0_(mthis) => isolatedFileSystem_Callback_0(mthis);
+  sendMessageToBackend_Callback_1_(mthis, __arg_0) => mthis.callMethod("sendMessageToBackend", [__arg_0]);
 
-  static isolatedFileSystem_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_isolatedFileSystem_Callback";
-  isolatedFileSystem_Callback_1_(mthis, __arg_0) => isolatedFileSystem_Callback_1(mthis, __arg_0);
+  sendMessageToEmbedder_Callback_0_(mthis) => mthis.callMethod("sendMessageToEmbedder", []);
 
-  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);
+  sendMessageToEmbedder_Callback_1_(mthis, __arg_0) => mthis.callMethod("sendMessageToEmbedder", [__arg_0]);
 
-  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);
+  setInjectedScriptForOrigin_Callback_0_(mthis) => mthis.callMethod("setInjectedScriptForOrigin", []);
 
-  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);
+  setInjectedScriptForOrigin_Callback_1_(mthis, __arg_0) => mthis.callMethod("setInjectedScriptForOrigin", [__arg_0]);
 
-  static platform_Callback_0(mthis) native "InspectorFrontendHost_platform_Callback";
-  platform_Callback_0_(mthis) => platform_Callback_0(mthis);
+  setInjectedScriptForOrigin_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setInjectedScriptForOrigin", [__arg_0, __arg_1]);
 
-  static platform_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_platform_Callback";
-  platform_Callback_1_(mthis, __arg_0) => platform_Callback_1(mthis, __arg_0);
+  setZoomFactor_Callback_0_(mthis) => mthis.callMethod("setZoomFactor", []);
 
-  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);
+  setZoomFactor_Callback_1_(mthis, __arg_0) => mthis.callMethod("setZoomFactor", [__arg_0]);
 
-  static port_Callback_0(mthis) native "InspectorFrontendHost_port_Callback";
-  port_Callback_0_(mthis) => port_Callback_0(mthis);
+  showContextMenuAtPoint_Callback_1_(mthis, __arg_0) => mthis.callMethod("showContextMenuAtPoint", [__arg_0]);
 
-  static port_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_port_Callback";
-  port_Callback_1_(mthis, __arg_0) => port_Callback_1(mthis, __arg_0);
+  showContextMenuAtPoint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("showContextMenuAtPoint", [__arg_0, __arg_1]);
 
-  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);
+  showContextMenuAtPoint_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("showContextMenuAtPoint", [__arg_0, __arg_1, __arg_2]);
 
-  static recordActionTaken_Callback_0(mthis) native "InspectorFrontendHost_recordActionTaken_Callback";
-  recordActionTaken_Callback_0_(mthis) => recordActionTaken_Callback_0(mthis);
+  showContextMenu_Callback_0_(mthis) => mthis.callMethod("showContextMenu", []);
 
-  static recordActionTaken_Callback_1(mthis, __arg_0) native "InspectorFrontendHost_recordActionTaken_Callback";
-  recordActionTaken_Callback_1_(mthis, __arg_0) => recordActionTaken_Callback_1(mthis, __arg_0);
+  showContextMenu_Callback_1_(mthis, __arg_0) => mthis.callMethod("showContextMenu", [__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);
+  showContextMenu_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("showContextMenu", [__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);
+  upgradeDraggedFileSystemPermissions_Callback_0_(mthis) => mthis.callMethod("upgradeDraggedFileSystemPermissions", []);
 
-  static recordPanelShown_Callback_0(mthis) native "InspectorFrontendHost_recordPanelShown_Callback";
-  recordPanelShown_Callback_0_(mthis) => recordPanelShown_Callback_0(mthis);
+  upgradeDraggedFileSystemPermissions_Callback_1_(mthis, __arg_0) => mthis.callMethod("upgradeDraggedFileSystemPermissions", [__arg_0]);
 
-  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);
+  zoomFactor_Callback_0_(mthis) => mthis.callMethod("zoomFactor", []);
 
 }
 
 class BlinkInspectorOverlayHost {
   static final instance = new BlinkInspectorOverlayHost();
 
-  static resume_Callback_0(mthis) native "InspectorOverlayHost_resume_Callback";
-  resume_Callback_0_(mthis) => resume_Callback_0(mthis);
+  resume_Callback_0_(mthis) => mthis.callMethod("resume", []);
 
-  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);
+  stepOver_Callback_0_(mthis) => mthis.callMethod("stepOver", []);
 
 }
 
 class BlinkInstallEvent extends BlinkExtendableEvent {
   static final instance = new BlinkInstallEvent();
 
-  static reloadAll_Callback_0(mthis) native "InstallEvent_reloadAll_Callback";
-  reloadAll_Callback_0_(mthis) => reloadAll_Callback_0(mthis);
+  reloadAll_Callback_0_(mthis) => mthis.callMethod("reloadAll", []);
 
-  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);
+  replace_Callback_0_(mthis) => mthis.callMethod("replace", []);
 
 }
 
 class BlinkIterator {
   static final instance = new BlinkIterator();
 
-  static next_Callback_0(mthis) native "Iterator_next_Callback";
-  next_Callback_0_(mthis) => next_Callback_0(mthis);
+  next_Callback_0_(mthis) => mthis.callMethod("next", []);
 
-  static next_Callback_1(mthis, __arg_0) native "Iterator_next_Callback";
-  next_Callback_1_(mthis, __arg_0) => next_Callback_1(mthis, __arg_0);
-
-  static next_Callback_2(mthis, __arg_0, __arg_1) native "Iterator_next_Callback";
-  next_Callback_2_(mthis, __arg_0, __arg_1) => next_Callback_2(mthis, __arg_0, __arg_1);
-
-  static next_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "Iterator_next_Callback";
-  next_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => next_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  next_Callback_1_(mthis, __arg_0) => mthis.callMethod("next", [__arg_0]);
 
 }
 
 class BlinkJavaScriptCallFrame {
   static final instance = new BlinkJavaScriptCallFrame();
 
-  static caller_Getter(mthis) native "JavaScriptCallFrame_caller_Getter";
-  caller_Getter_(mthis) => caller_Getter(mthis);
+  caller_Getter_(mthis) => mthis["caller"];
 
-  static column_Getter(mthis) native "JavaScriptCallFrame_column_Getter";
-  column_Getter_(mthis) => column_Getter(mthis);
+  column_Getter_(mthis) => mthis["column"];
 
-  static evaluateWithExceptionDetails_Callback_0(mthis) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
-  evaluateWithExceptionDetails_Callback_0_(mthis) => evaluateWithExceptionDetails_Callback_0(mthis);
+  evaluateWithExceptionDetails_Callback_0_(mthis) => mthis.callMethod("evaluateWithExceptionDetails", []);
 
-  static evaluateWithExceptionDetails_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_evaluateWithExceptionDetails_Callback";
-  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => evaluateWithExceptionDetails_Callback_1(mthis, __arg_0);
+  evaluateWithExceptionDetails_Callback_1_(mthis, __arg_0) => mthis.callMethod("evaluateWithExceptionDetails", [__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);
+  functionName_Getter_(mthis) => mthis["functionName"];
 
-  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);
+  isAtReturn_Getter_(mthis) => mthis["isAtReturn"];
 
-  static functionName_Getter(mthis) native "JavaScriptCallFrame_functionName_Getter";
-  functionName_Getter_(mthis) => functionName_Getter(mthis);
+  line_Getter_(mthis) => mthis["line"];
 
-  static isAtReturn_Getter(mthis) native "JavaScriptCallFrame_isAtReturn_Getter";
-  isAtReturn_Getter_(mthis) => isAtReturn_Getter(mthis);
+  restart_Callback_0_(mthis) => mthis.callMethod("restart", []);
 
-  static line_Getter(mthis) native "JavaScriptCallFrame_line_Getter";
-  line_Getter_(mthis) => line_Getter(mthis);
+  returnValue_Getter_(mthis) => mthis["returnValue"];
 
-  static restart_Callback_0(mthis) native "JavaScriptCallFrame_restart_Callback";
-  restart_Callback_0_(mthis) => restart_Callback_0(mthis);
+  scopeChain_Getter_(mthis) => mthis["scopeChain"];
 
-  static restart_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_restart_Callback";
-  restart_Callback_1_(mthis, __arg_0) => restart_Callback_1(mthis, __arg_0);
+  scopeType_Callback_0_(mthis) => mthis.callMethod("scopeType", []);
 
-  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);
+  scopeType_Callback_1_(mthis, __arg_0) => mthis.callMethod("scopeType", [__arg_0]);
 
-  static returnValue_Getter(mthis) native "JavaScriptCallFrame_returnValue_Getter";
-  returnValue_Getter_(mthis) => returnValue_Getter(mthis);
+  setVariableValue_Callback_0_(mthis) => mthis.callMethod("setVariableValue", []);
 
-  static scopeChain_Getter(mthis) native "JavaScriptCallFrame_scopeChain_Getter";
-  scopeChain_Getter_(mthis) => scopeChain_Getter(mthis);
+  setVariableValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("setVariableValue", [__arg_0]);
 
-  static scopeType_Callback_0(mthis) native "JavaScriptCallFrame_scopeType_Callback";
-  scopeType_Callback_0_(mthis) => scopeType_Callback_0(mthis);
+  setVariableValue_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setVariableValue", [__arg_0, __arg_1]);
 
-  static scopeType_Callback_1(mthis, __arg_0) native "JavaScriptCallFrame_scopeType_Callback";
-  scopeType_Callback_1_(mthis, __arg_0) => scopeType_Callback_1(mthis, __arg_0);
+  setVariableValue_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setVariableValue", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  sourceID_Getter_(mthis) => mthis["sourceID"];
 
-  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);
+  stepInPositions_Getter_(mthis) => mthis["stepInPositions"];
 
-  static setVariableValue_Callback_0(mthis) native "JavaScriptCallFrame_setVariableValue_Callback";
-  setVariableValue_Callback_0_(mthis) => setVariableValue_Callback_0(mthis);
+  thisObject_Getter_(mthis) => mthis["thisObject"];
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkKeyboardEvent extends BlinkUIEvent {
   static final instance = new BlinkKeyboardEvent();
 
-  static altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
-  altKey_Getter_(mthis) => altKey_Getter(mthis);
+  altKey_Getter_(mthis) => mthis["altKey"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "KeyboardEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["KeyboardEvent"], [__arg_0, __arg_1]);
 
-  static ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
-  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
+  ctrlKey_Getter_(mthis) => mthis["ctrlKey"];
 
-  static getModifierState_Callback_0(mthis) native "KeyboardEvent_getModifierState_Callback";
-  getModifierState_Callback_0_(mthis) => getModifierState_Callback_0(mthis);
+  getModifierState_Callback_0_(mthis) => mthis.callMethod("getModifierState", []);
 
-  static getModifierState_Callback_1(mthis, __arg_0) native "KeyboardEvent_getModifierState_Callback";
-  getModifierState_Callback_1_(mthis, __arg_0) => getModifierState_Callback_1(mthis, __arg_0);
+  getModifierState_Callback_1_(mthis, __arg_0) => mthis.callMethod("getModifierState", [__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);
+  initKeyboardEvent_Callback_0_(mthis) => mthis.callMethod("initKeyboardEvent", []);
 
-  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);
+  initKeyboardEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initKeyboardEvent", [__arg_0]);
 
-  static initKeyboardEvent_Callback_0(mthis) native "KeyboardEvent_initKeyboardEvent_Callback";
-  initKeyboardEvent_Callback_0_(mthis) => initKeyboardEvent_Callback_0(mthis);
+  initKeyboardEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9]);
 
-  static initKeyboardEvent_Callback_1(mthis, __arg_0) native "KeyboardEvent_initKeyboardEvent_Callback";
-  initKeyboardEvent_Callback_1_(mthis, __arg_0) => initKeyboardEvent_Callback_1(mthis, __arg_0);
+  initKeyboardEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1]);
 
-  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);
+  initKeyboardEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initKeyboardEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initKeyboardEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initKeyboardEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initKeyboardEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initKeyboardEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  initKeyboardEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("initKeyboardEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  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);
+  keyIdentifier_Getter_(mthis) => mthis["keyIdentifier"];
 
-  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);
+  keyLocation_Getter_(mthis) => mthis["keyLocation"];
 
-  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);
+  location_Getter_(mthis) => mthis["location"];
 
-  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);
+  metaKey_Getter_(mthis) => mthis["metaKey"];
 
-  static keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
-  keyIdentifier_Getter_(mthis) => keyIdentifier_Getter(mthis);
+  repeat_Getter_(mthis) => mthis["repeat"];
 
-  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);
+  shiftKey_Getter_(mthis) => mthis["shiftKey"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["LocalCredential"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["LocalCredential"], [__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);
+  constructorCallback_4_(__arg_0, __arg_1, __arg_2, __arg_3) => new js.JsObject(js.context["LocalCredential"], [__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);
+  password_Getter_(mthis) => mthis["password"];
 
 }
 
 class BlinkLocation {
   static final instance = new BlinkLocation();
 
-  static ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
-  ancestorOrigins_Getter_(mthis) => ancestorOrigins_Getter(mthis);
+  ancestorOrigins_Getter_(mthis) => mthis["ancestorOrigins"];
 
-  static assign_Callback_0(mthis) native "Location_assign_Callback";
-  assign_Callback_0_(mthis) => assign_Callback_0(mthis);
+  assign_Callback_0_(mthis) => mthis.callMethod("assign", []);
 
-  static assign_Callback_1(mthis, __arg_0) native "Location_assign_Callback";
-  assign_Callback_1_(mthis, __arg_0) => assign_Callback_1(mthis, __arg_0);
+  assign_Callback_1_(mthis, __arg_0) => mthis.callMethod("assign", [__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);
+  hash_Getter_(mthis) => mthis["hash"];
 
-  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);
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __arg_0;
 
-  static hash_Getter(mthis) native "Location_hash_Getter";
-  hash_Getter_(mthis) => hash_Getter(mthis);
+  host_Getter_(mthis) => mthis["host"];
 
-  static hash_Setter(mthis, __arg_0) native "Location_hash_Setter";
-  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
 
-  static host_Getter(mthis) native "Location_host_Getter";
-  host_Getter_(mthis) => host_Getter(mthis);
+  hostname_Getter_(mthis) => mthis["hostname"];
 
-  static host_Setter(mthis, __arg_0) native "Location_host_Setter";
-  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
 
-  static hostname_Getter(mthis) native "Location_hostname_Getter";
-  hostname_Getter_(mthis) => hostname_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static hostname_Setter(mthis, __arg_0) native "Location_hostname_Setter";
-  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static href_Getter(mthis) native "Location_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  static href_Setter(mthis, __arg_0) native "Location_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  pathname_Getter_(mthis) => mthis["pathname"];
 
-  static origin_Getter(mthis) native "Location_origin_Getter";
-  origin_Getter_(mthis) => origin_Getter(mthis);
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
 
-  static pathname_Getter(mthis) native "Location_pathname_Getter";
-  pathname_Getter_(mthis) => pathname_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  static pathname_Setter(mthis, __arg_0) native "Location_pathname_Setter";
-  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
 
-  static port_Getter(mthis) native "Location_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static port_Setter(mthis, __arg_0) native "Location_port_Setter";
-  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
-  static protocol_Getter(mthis) native "Location_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  reload_Callback_0_(mthis) => mthis.callMethod("reload", []);
 
-  static protocol_Setter(mthis, __arg_0) native "Location_protocol_Setter";
-  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+  replace_Callback_0_(mthis) => mthis.callMethod("replace", []);
 
-  static reload_Callback_0(mthis) native "Location_reload_Callback";
-  reload_Callback_0_(mthis) => reload_Callback_0(mthis);
+  replace_Callback_1_(mthis, __arg_0) => mthis.callMethod("replace", [__arg_0]);
 
-  static reload_Callback_1(mthis, __arg_0) native "Location_reload_Callback";
-  reload_Callback_1_(mthis, __arg_0) => reload_Callback_1(mthis, __arg_0);
+  search_Getter_(mthis) => mthis["search"];
 
-  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);
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
 
-  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, __arg_0) native "Location_search_Setter";
-  search_Setter_(mthis, __arg_0) => search_Setter(mthis, __arg_0);
-
-  static toString_Callback_0(mthis) native "Location_toString_Callback";
-  toString_Callback_0_(mthis) => toString_Callback_0(mthis);
-
-  static toString_Callback_1(mthis, __arg_0) native "Location_toString_Callback";
-  toString_Callback_1_(mthis, __arg_0) => toString_Callback_1(mthis, __arg_0);
-
-  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);
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
 }
 
 class BlinkMIDIAccess extends BlinkEventTarget {
   static final instance = new BlinkMIDIAccess();
 
-  static inputs_Getter(mthis) native "MIDIAccess_inputs_Getter";
-  inputs_Getter_(mthis) => inputs_Getter(mthis);
+  inputs_Getter_(mthis) => mthis["inputs"];
 
-  static onconnect_Getter(mthis) native "MIDIAccess_onconnect_Getter";
-  onconnect_Getter_(mthis) => onconnect_Getter(mthis);
+  onconnect_Getter_(mthis) => mthis["onconnect"];
 
-  static onconnect_Setter(mthis, __arg_0) native "MIDIAccess_onconnect_Setter";
-  onconnect_Setter_(mthis, __arg_0) => onconnect_Setter(mthis, __arg_0);
+  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
 
-  static ondisconnect_Getter(mthis) native "MIDIAccess_ondisconnect_Getter";
-  ondisconnect_Getter_(mthis) => ondisconnect_Getter(mthis);
+  ondisconnect_Getter_(mthis) => mthis["ondisconnect"];
 
-  static ondisconnect_Setter(mthis, __arg_0) native "MIDIAccess_ondisconnect_Setter";
-  ondisconnect_Setter_(mthis, __arg_0) => ondisconnect_Setter(mthis, __arg_0);
+  ondisconnect_Setter_(mthis, __arg_0) => mthis["ondisconnect"] = __arg_0;
 
-  static outputs_Getter(mthis) native "MIDIAccess_outputs_Getter";
-  outputs_Getter_(mthis) => outputs_Getter(mthis);
+  outputs_Getter_(mthis) => mthis["outputs"];
 
-  static sysexEnabled_Getter(mthis) native "MIDIAccess_sysexEnabled_Getter";
-  sysexEnabled_Getter_(mthis) => sysexEnabled_Getter(mthis);
+  sysexEnabled_Getter_(mthis) => mthis["sysexEnabled"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MIDIConnectionEvent"], [__arg_0, __arg_1]);
 
-  static port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
 }
 
 class BlinkMIDIInput extends BlinkMIDIPort {
   static final instance = new BlinkMIDIInput();
 
-  static onmidimessage_Getter(mthis) native "MIDIInput_onmidimessage_Getter";
-  onmidimessage_Getter_(mthis) => onmidimessage_Getter(mthis);
+  onmidimessage_Getter_(mthis) => mthis["onmidimessage"];
 
-  static onmidimessage_Setter(mthis, __arg_0) native "MIDIInput_onmidimessage_Setter";
-  onmidimessage_Setter_(mthis, __arg_0) => onmidimessage_Setter(mthis, __arg_0);
+  onmidimessage_Setter_(mthis, __arg_0) => mthis["onmidimessage"] = __arg_0;
 
 }
 
 class BlinkMIDIInputMap {
   static final instance = new BlinkMIDIInputMap();
 
-  static entries_Callback_0(mthis) native "MIDIInputMap_entries_Callback";
-  entries_Callback_0_(mthis) => entries_Callback_0(mthis);
+  entries_Callback_0_(mthis) => mthis.callMethod("entries", []);
 
-  static entries_Callback_1(mthis, __arg_0) native "MIDIInputMap_entries_Callback";
-  entries_Callback_1_(mthis, __arg_0) => entries_Callback_1(mthis, __arg_0);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  static entries_Callback_2(mthis, __arg_0, __arg_1) native "MIDIInputMap_entries_Callback";
-  entries_Callback_2_(mthis, __arg_0, __arg_1) => entries_Callback_2(mthis, __arg_0, __arg_1);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__arg_0]);
 
-  static get_Callback_0(mthis) native "MIDIInputMap_get_Callback";
-  get_Callback_0_(mthis) => get_Callback_0(mthis);
+  has_Callback_0_(mthis) => mthis.callMethod("has", []);
 
-  static get_Callback_1(mthis, __arg_0) native "MIDIInputMap_get_Callback";
-  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+  has_Callback_1_(mthis, __arg_0) => mthis.callMethod("has", [__arg_0]);
 
-  static get_Callback_2(mthis, __arg_0, __arg_1) native "MIDIInputMap_get_Callback";
-  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+  keys_Callback_0_(mthis) => mthis.callMethod("keys", []);
 
-  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MIDIInputMap_get_Callback";
-  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  size_Getter_(mthis) => mthis["size"];
 
-  static has_Callback_0(mthis) native "MIDIInputMap_has_Callback";
-  has_Callback_0_(mthis) => has_Callback_0(mthis);
-
-  static has_Callback_1(mthis, __arg_0) native "MIDIInputMap_has_Callback";
-  has_Callback_1_(mthis, __arg_0) => has_Callback_1(mthis, __arg_0);
-
-  static has_Callback_2(mthis, __arg_0, __arg_1) native "MIDIInputMap_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 "MIDIInputMap_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 "MIDIInputMap_keys_Callback";
-  keys_Callback_0_(mthis) => keys_Callback_0(mthis);
-
-  static keys_Callback_1(mthis, __arg_0) native "MIDIInputMap_keys_Callback";
-  keys_Callback_1_(mthis, __arg_0) => keys_Callback_1(mthis, __arg_0);
-
-  static keys_Callback_2(mthis, __arg_0, __arg_1) native "MIDIInputMap_keys_Callback";
-  keys_Callback_2_(mthis, __arg_0, __arg_1) => keys_Callback_2(mthis, __arg_0, __arg_1);
-
-  static size_Getter(mthis) native "MIDIInputMap_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
-
-  static values_Callback_0(mthis) native "MIDIInputMap_values_Callback";
-  values_Callback_0_(mthis) => values_Callback_0(mthis);
-
-  static values_Callback_1(mthis, __arg_0) native "MIDIInputMap_values_Callback";
-  values_Callback_1_(mthis, __arg_0) => values_Callback_1(mthis, __arg_0);
-
-  static values_Callback_2(mthis, __arg_0, __arg_1) native "MIDIInputMap_values_Callback";
-  values_Callback_2_(mthis, __arg_0, __arg_1) => values_Callback_2(mthis, __arg_0, __arg_1);
+  values_Callback_0_(mthis) => mthis.callMethod("values", []);
 
 }
 
 class BlinkMIDIMessageEvent extends BlinkEvent {
   static final instance = new BlinkMIDIMessageEvent();
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MIDIMessageEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MIDIMessageEvent"], [__arg_0, __arg_1]);
 
-  static data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  data_Getter_(mthis) => mthis["data"];
 
-  static receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
-  receivedTime_Getter_(mthis) => receivedTime_Getter(mthis);
+  receivedTime_Getter_(mthis) => mthis["receivedTime"];
 
 }
 
 class BlinkMIDIOutput extends BlinkMIDIPort {
   static final instance = new BlinkMIDIOutput();
 
-  static send_Callback_0(mthis) native "MIDIOutput_send_Callback";
-  send_Callback_0_(mthis) => send_Callback_0(mthis);
+  send_Callback_0_(mthis) => mthis.callMethod("send", []);
 
-  static send_Callback_1(mthis, __arg_0) native "MIDIOutput_send_Callback";
-  send_Callback_1_(mthis, __arg_0) => send_Callback_1(mthis, __arg_0);
+  send_Callback_1_(mthis, __arg_0) => mthis.callMethod("send", [__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);
+  send_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("send", [__arg_0, __arg_1]);
 
 }
 
 class BlinkMIDIOutputMap {
   static final instance = new BlinkMIDIOutputMap();
 
-  static entries_Callback_0(mthis) native "MIDIOutputMap_entries_Callback";
-  entries_Callback_0_(mthis) => entries_Callback_0(mthis);
+  entries_Callback_0_(mthis) => mthis.callMethod("entries", []);
 
-  static entries_Callback_1(mthis, __arg_0) native "MIDIOutputMap_entries_Callback";
-  entries_Callback_1_(mthis, __arg_0) => entries_Callback_1(mthis, __arg_0);
+  get_Callback_0_(mthis) => mthis.callMethod("get", []);
 
-  static entries_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutputMap_entries_Callback";
-  entries_Callback_2_(mthis, __arg_0, __arg_1) => entries_Callback_2(mthis, __arg_0, __arg_1);
+  get_Callback_1_(mthis, __arg_0) => mthis.callMethod("get", [__arg_0]);
 
-  static get_Callback_0(mthis) native "MIDIOutputMap_get_Callback";
-  get_Callback_0_(mthis) => get_Callback_0(mthis);
+  has_Callback_0_(mthis) => mthis.callMethod("has", []);
 
-  static get_Callback_1(mthis, __arg_0) native "MIDIOutputMap_get_Callback";
-  get_Callback_1_(mthis, __arg_0) => get_Callback_1(mthis, __arg_0);
+  has_Callback_1_(mthis, __arg_0) => mthis.callMethod("has", [__arg_0]);
 
-  static get_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutputMap_get_Callback";
-  get_Callback_2_(mthis, __arg_0, __arg_1) => get_Callback_2(mthis, __arg_0, __arg_1);
+  keys_Callback_0_(mthis) => mthis.callMethod("keys", []);
 
-  static get_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MIDIOutputMap_get_Callback";
-  get_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => get_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  size_Getter_(mthis) => mthis["size"];
 
-  static has_Callback_0(mthis) native "MIDIOutputMap_has_Callback";
-  has_Callback_0_(mthis) => has_Callback_0(mthis);
-
-  static has_Callback_1(mthis, __arg_0) native "MIDIOutputMap_has_Callback";
-  has_Callback_1_(mthis, __arg_0) => has_Callback_1(mthis, __arg_0);
-
-  static has_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutputMap_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 "MIDIOutputMap_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 "MIDIOutputMap_keys_Callback";
-  keys_Callback_0_(mthis) => keys_Callback_0(mthis);
-
-  static keys_Callback_1(mthis, __arg_0) native "MIDIOutputMap_keys_Callback";
-  keys_Callback_1_(mthis, __arg_0) => keys_Callback_1(mthis, __arg_0);
-
-  static keys_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutputMap_keys_Callback";
-  keys_Callback_2_(mthis, __arg_0, __arg_1) => keys_Callback_2(mthis, __arg_0, __arg_1);
-
-  static size_Getter(mthis) native "MIDIOutputMap_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
-
-  static values_Callback_0(mthis) native "MIDIOutputMap_values_Callback";
-  values_Callback_0_(mthis) => values_Callback_0(mthis);
-
-  static values_Callback_1(mthis, __arg_0) native "MIDIOutputMap_values_Callback";
-  values_Callback_1_(mthis, __arg_0) => values_Callback_1(mthis, __arg_0);
-
-  static values_Callback_2(mthis, __arg_0, __arg_1) native "MIDIOutputMap_values_Callback";
-  values_Callback_2_(mthis, __arg_0, __arg_1) => values_Callback_2(mthis, __arg_0, __arg_1);
+  values_Callback_0_(mthis) => mthis.callMethod("values", []);
 
 }
 
 class BlinkMIDIPort extends BlinkEventTarget {
   static final instance = new BlinkMIDIPort();
 
-  static id_Getter(mthis) native "MIDIPort_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
-  manufacturer_Getter_(mthis) => manufacturer_Getter(mthis);
+  manufacturer_Getter_(mthis) => mthis["manufacturer"];
 
-  static name_Getter(mthis) native "MIDIPort_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static ondisconnect_Getter(mthis) native "MIDIPort_ondisconnect_Getter";
-  ondisconnect_Getter_(mthis) => ondisconnect_Getter(mthis);
+  ondisconnect_Getter_(mthis) => mthis["ondisconnect"];
 
-  static ondisconnect_Setter(mthis, __arg_0) native "MIDIPort_ondisconnect_Setter";
-  ondisconnect_Setter_(mthis, __arg_0) => ondisconnect_Setter(mthis, __arg_0);
+  ondisconnect_Setter_(mthis, __arg_0) => mthis["ondisconnect"] = __arg_0;
 
-  static type_Getter(mthis) native "MIDIPort_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static version_Getter(mthis) native "MIDIPort_version_Getter";
-  version_Getter_(mthis) => version_Getter(mthis);
+  version_Getter_(mthis) => mthis["version"];
 
 }
 
 class BlinkMediaController extends BlinkEventTarget {
   static final instance = new BlinkMediaController();
 
-  static buffered_Getter(mthis) native "MediaController_buffered_Getter";
-  buffered_Getter_(mthis) => buffered_Getter(mthis);
+  buffered_Getter_(mthis) => mthis["buffered"];
 
-  static constructorCallback_0() native "MediaController_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["MediaController"], []);
 
-  static constructorCallback_1(__arg_0) native "MediaController_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  currentTime_Getter_(mthis) => mthis["currentTime"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MediaController_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  currentTime_Setter_(mthis, __arg_0) => mthis["currentTime"] = __arg_0;
 
-  static currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
-  currentTime_Getter_(mthis) => currentTime_Getter(mthis);
+  defaultPlaybackRate_Getter_(mthis) => mthis["defaultPlaybackRate"];
 
-  static currentTime_Setter(mthis, __arg_0) native "MediaController_currentTime_Setter";
-  currentTime_Setter_(mthis, __arg_0) => currentTime_Setter(mthis, __arg_0);
+  defaultPlaybackRate_Setter_(mthis, __arg_0) => mthis["defaultPlaybackRate"] = __arg_0;
 
-  static defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
-  defaultPlaybackRate_Getter_(mthis) => defaultPlaybackRate_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static defaultPlaybackRate_Setter(mthis, __arg_0) native "MediaController_defaultPlaybackRate_Setter";
-  defaultPlaybackRate_Setter_(mthis, __arg_0) => defaultPlaybackRate_Setter(mthis, __arg_0);
+  muted_Getter_(mthis) => mthis["muted"];
 
-  static duration_Getter(mthis) native "MediaController_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  muted_Setter_(mthis, __arg_0) => mthis["muted"] = __arg_0;
 
-  static muted_Getter(mthis) native "MediaController_muted_Getter";
-  muted_Getter_(mthis) => muted_Getter(mthis);
+  pause_Callback_0_(mthis) => mthis.callMethod("pause", []);
 
-  static muted_Setter(mthis, __arg_0) native "MediaController_muted_Setter";
-  muted_Setter_(mthis, __arg_0) => muted_Setter(mthis, __arg_0);
+  paused_Getter_(mthis) => mthis["paused"];
 
-  static pause_Callback_0(mthis) native "MediaController_pause_Callback";
-  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+  play_Callback_0_(mthis) => mthis.callMethod("play", []);
 
-  static pause_Callback_1(mthis, __arg_0) native "MediaController_pause_Callback";
-  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+  playbackRate_Getter_(mthis) => mthis["playbackRate"];
 
-  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);
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
 
-  static paused_Getter(mthis) native "MediaController_paused_Getter";
-  paused_Getter_(mthis) => paused_Getter(mthis);
+  playbackState_Getter_(mthis) => mthis["playbackState"];
 
-  static play_Callback_0(mthis) native "MediaController_play_Callback";
-  play_Callback_0_(mthis) => play_Callback_0(mthis);
+  played_Getter_(mthis) => mthis["played"];
 
-  static play_Callback_1(mthis, __arg_0) native "MediaController_play_Callback";
-  play_Callback_1_(mthis, __arg_0) => play_Callback_1(mthis, __arg_0);
+  seekable_Getter_(mthis) => mthis["seekable"];
 
-  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);
+  unpause_Callback_0_(mthis) => mthis.callMethod("unpause", []);
 
-  static playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
-  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
+  volume_Getter_(mthis) => mthis["volume"];
 
-  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, __arg_0) native "MediaController_volume_Setter";
-  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
+  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
 
 }
 
 class BlinkMediaDeviceInfo {
   static final instance = new BlinkMediaDeviceInfo();
 
-  static deviceId_Getter(mthis) native "MediaDeviceInfo_deviceId_Getter";
-  deviceId_Getter_(mthis) => deviceId_Getter(mthis);
+  deviceId_Getter_(mthis) => mthis["deviceId"];
 
-  static groupId_Getter(mthis) native "MediaDeviceInfo_groupId_Getter";
-  groupId_Getter_(mthis) => groupId_Getter(mthis);
+  groupId_Getter_(mthis) => mthis["groupId"];
 
-  static kind_Getter(mthis) native "MediaDeviceInfo_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static label_Getter(mthis) native "MediaDeviceInfo_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
 }
 
 class BlinkMediaElementAudioSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkMediaElementAudioSourceNode();
 
-  static mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
-  mediaElement_Getter_(mthis) => mediaElement_Getter(mthis);
+  mediaElement_Getter_(mthis) => mthis["mediaElement"];
 
 }
 
 class BlinkMediaError {
   static final instance = new BlinkMediaError();
 
-  static code_Getter(mthis) native "MediaError_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
 }
 
 class BlinkMediaKeyError {
   static final instance = new BlinkMediaKeyError();
 
-  static code_Getter(mthis) native "MediaKeyError_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
-  static systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
-  systemCode_Getter_(mthis) => systemCode_Getter(mthis);
+  systemCode_Getter_(mthis) => mthis["systemCode"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MediaKeyEvent"], [__arg_0, __arg_1]);
 
-  static defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
-  defaultURL_Getter_(mthis) => defaultURL_Getter(mthis);
+  defaultURL_Getter_(mthis) => mthis["defaultURL"];
 
-  static errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
-  errorCode_Getter_(mthis) => errorCode_Getter(mthis);
+  errorCode_Getter_(mthis) => mthis["errorCode"];
 
-  static initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
-  initData_Getter_(mthis) => initData_Getter(mthis);
+  initData_Getter_(mthis) => mthis["initData"];
 
-  static keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
-  keySystem_Getter_(mthis) => keySystem_Getter(mthis);
+  keySystem_Getter_(mthis) => mthis["keySystem"];
 
-  static message_Getter(mthis) native "MediaKeyEvent_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
-  static sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
-  sessionId_Getter_(mthis) => sessionId_Getter(mthis);
+  sessionId_Getter_(mthis) => mthis["sessionId"];
 
-  static systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
-  systemCode_Getter_(mthis) => systemCode_Getter(mthis);
+  systemCode_Getter_(mthis) => mthis["systemCode"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MediaKeyMessageEvent"], [__arg_0, __arg_1]);
 
-  static destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
-  destinationURL_Getter_(mthis) => destinationURL_Getter(mthis);
+  destinationURL_Getter_(mthis) => mthis["destinationURL"];
 
-  static message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MediaKeyNeededEvent"], [__arg_0, __arg_1]);
 
-  static contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
-  contentType_Getter_(mthis) => contentType_Getter(mthis);
+  contentType_Getter_(mthis) => mthis["contentType"];
 
-  static initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
-  initData_Getter_(mthis) => initData_Getter(mthis);
+  initData_Getter_(mthis) => mthis["initData"];
 
 }
 
 class BlinkMediaKeySession extends BlinkEventTarget {
   static final instance = new BlinkMediaKeySession();
 
-  static closed_Getter(mthis) native "MediaKeySession_closed_Getter";
-  closed_Getter_(mthis) => closed_Getter(mthis);
+  closed_Getter_(mthis) => mthis["closed"];
 
-  static error_Getter(mthis) native "MediaKeySession_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  error_Getter_(mthis) => mthis["error"];
 
-  static generateRequest_Callback_0(mthis) native "MediaKeySession_generateRequest_Callback";
-  generateRequest_Callback_0_(mthis) => generateRequest_Callback_0(mthis);
+  generateRequest_Callback_0_(mthis) => mthis.callMethod("generateRequest", []);
 
-  static generateRequest_Callback_1(mthis, __arg_0) native "MediaKeySession_generateRequest_Callback";
-  generateRequest_Callback_1_(mthis, __arg_0) => generateRequest_Callback_1(mthis, __arg_0);
+  generateRequest_Callback_1_(mthis, __arg_0) => mthis.callMethod("generateRequest", [__arg_0]);
 
-  static generateRequest_Callback_2(mthis, __arg_0, __arg_1) native "MediaKeySession_generateRequest_Callback";
-  generateRequest_Callback_2_(mthis, __arg_0, __arg_1) => generateRequest_Callback_2(mthis, __arg_0, __arg_1);
+  generateRequest_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("generateRequest", [__arg_0, __arg_1]);
 
-  static generateRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "MediaKeySession_generateRequest_Callback";
-  generateRequest_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => generateRequest_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  keySystem_Getter_(mthis) => mthis["keySystem"];
 
-  static generateRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "MediaKeySession_generateRequest_Callback";
-  generateRequest_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => generateRequest_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  release_Callback_0_(mthis) => mthis.callMethod("release", []);
 
-  static keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
-  keySystem_Getter_(mthis) => keySystem_Getter(mthis);
+  sessionId_Getter_(mthis) => mthis["sessionId"];
 
-  static release_Callback_0(mthis) native "MediaKeySession_release_Callback";
-  release_Callback_0_(mthis) => release_Callback_0(mthis);
+  update_Callback_0_(mthis) => mthis.callMethod("update", []);
 
-  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 update_Callback_0(mthis) native "MediaKeySession_update_Callback";
-  update_Callback_0_(mthis) => update_Callback_0(mthis);
-
-  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);
+  update_Callback_1_(mthis, __arg_0) => mthis.callMethod("update", [__arg_0]);
 
 }
 
 class BlinkMediaKeys {
   static final instance = new BlinkMediaKeys();
 
-  static createSession_Callback_0(mthis) native "MediaKeys_createSession_Callback";
-  createSession_Callback_0_(mthis) => createSession_Callback_0(mthis);
+  createSession_Callback_0_(mthis) => mthis.callMethod("createSession", []);
 
-  static createSession_Callback_1(mthis, __arg_0) native "MediaKeys_createSession_Callback";
-  createSession_Callback_1_(mthis, __arg_0) => createSession_Callback_1(mthis, __arg_0);
+  createSession_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSession", [__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);
+  create_Callback_0_() => js.context["MediaKeys"].callMethod("create", []);
 
-  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);
+  create_Callback_1_(__arg_0) => js.context["MediaKeys"].callMethod("create", [__arg_0]);
 
-  static create_Callback_0() native "MediaKeys_create_Callback";
-  create_Callback_0_() => create_Callback_0();
+  isTypeSupported_Callback_0_() => js.context["MediaKeys"].callMethod("isTypeSupported", []);
 
-  static create_Callback_1(__arg_0) native "MediaKeys_create_Callback";
-  create_Callback_1_(__arg_0) => create_Callback_1(__arg_0);
+  isTypeSupported_Callback_1_(__arg_0) => js.context["MediaKeys"].callMethod("isTypeSupported", [__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);
+  isTypeSupported_Callback_2_(__arg_0, __arg_1) => js.context["MediaKeys"].callMethod("isTypeSupported", [__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);
+  keySystem_Getter_(mthis) => mthis["keySystem"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static appendMedium_Callback_0(mthis) native "MediaList_appendMedium_Callback";
-  appendMedium_Callback_0_(mthis) => appendMedium_Callback_0(mthis);
+  appendMedium_Callback_0_(mthis) => mthis.callMethod("appendMedium", []);
 
-  static appendMedium_Callback_1(mthis, __arg_0) native "MediaList_appendMedium_Callback";
-  appendMedium_Callback_1_(mthis, __arg_0) => appendMedium_Callback_1(mthis, __arg_0);
+  appendMedium_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendMedium", [__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);
+  deleteMedium_Callback_0_(mthis) => mthis.callMethod("deleteMedium", []);
 
-  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);
+  deleteMedium_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteMedium", [__arg_0]);
 
-  static deleteMedium_Callback_0(mthis) native "MediaList_deleteMedium_Callback";
-  deleteMedium_Callback_0_(mthis) => deleteMedium_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static deleteMedium_Callback_1(mthis, __arg_0) native "MediaList_deleteMedium_Callback";
-  deleteMedium_Callback_1_(mthis, __arg_0) => deleteMedium_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  mediaText_Getter_(mthis) => mthis["mediaText"];
 
-  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, __arg_0) native "MediaList_mediaText_Setter";
-  mediaText_Setter_(mthis, __arg_0) => mediaText_Setter(mthis, __arg_0);
+  mediaText_Setter_(mthis, __arg_0) => mthis["mediaText"] = __arg_0;
 
 }
 
 class BlinkMediaQueryList extends BlinkEventTarget {
   static final instance = new BlinkMediaQueryList();
 
-  static addListener_Callback_0(mthis) native "MediaQueryList_addListener_Callback";
-  addListener_Callback_0_(mthis) => addListener_Callback_0(mthis);
+  addListener_Callback_0_(mthis) => mthis.callMethod("addListener", []);
 
-  static addListener_Callback_1(mthis, __arg_0) native "MediaQueryList_addListener_Callback";
-  addListener_Callback_1_(mthis, __arg_0) => addListener_Callback_1(mthis, __arg_0);
+  addListener_Callback_1_(mthis, __arg_0) => mthis.callMethod("addListener", [__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);
+  matches_Getter_(mthis) => mthis["matches"];
 
-  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);
+  media_Getter_(mthis) => mthis["media"];
 
-  static matches_Getter(mthis) native "MediaQueryList_matches_Getter";
-  matches_Getter_(mthis) => matches_Getter(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static media_Getter(mthis) native "MediaQueryList_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onchange_Getter(mthis) native "MediaQueryList_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  removeListener_Callback_0_(mthis) => mthis.callMethod("removeListener", []);
 
-  static onchange_Setter(mthis, __arg_0) native "MediaQueryList_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
-
-  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);
+  removeListener_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeListener", [__arg_0]);
 
 }
 
 class BlinkMediaQueryListEvent extends BlinkEvent {
   static final instance = new BlinkMediaQueryListEvent();
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MediaQueryListEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MediaQueryListEvent"], [__arg_0, __arg_1]);
 
-  static matches_Getter(mthis) native "MediaQueryListEvent_matches_Getter";
-  matches_Getter_(mthis) => matches_Getter(mthis);
+  matches_Getter_(mthis) => mthis["matches"];
 
-  static media_Getter(mthis) native "MediaQueryListEvent_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
 }
 
 class BlinkMediaSource extends BlinkEventTarget {
   static final instance = new BlinkMediaSource();
 
-  static activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
-  activeSourceBuffers_Getter_(mthis) => activeSourceBuffers_Getter(mthis);
+  activeSourceBuffers_Getter_(mthis) => mthis["activeSourceBuffers"];
 
-  static addSourceBuffer_Callback_0(mthis) native "MediaSource_addSourceBuffer_Callback";
-  addSourceBuffer_Callback_0_(mthis) => addSourceBuffer_Callback_0(mthis);
+  addSourceBuffer_Callback_0_(mthis) => mthis.callMethod("addSourceBuffer", []);
 
-  static addSourceBuffer_Callback_1(mthis, __arg_0) native "MediaSource_addSourceBuffer_Callback";
-  addSourceBuffer_Callback_1_(mthis, __arg_0) => addSourceBuffer_Callback_1(mthis, __arg_0);
+  addSourceBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("addSourceBuffer", [__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);
+  constructorCallback_0_() => new js.JsObject(js.context["MediaSource"], []);
 
-  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);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static constructorCallback_0() native "MediaSource_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  duration_Setter_(mthis, __arg_0) => mthis["duration"] = __arg_0;
 
-  static constructorCallback_1(__arg_0) native "MediaSource_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  endOfStream_Callback_0_(mthis) => mthis.callMethod("endOfStream", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MediaSource_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  endOfStream_Callback_1_(mthis, __arg_0) => mthis.callMethod("endOfStream", [__arg_0]);
 
-  static duration_Getter(mthis) native "MediaSource_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  isTypeSupported_Callback_0_() => js.context["MediaSource"].callMethod("isTypeSupported", []);
 
-  static duration_Setter(mthis, __arg_0) native "MediaSource_duration_Setter";
-  duration_Setter_(mthis, __arg_0) => duration_Setter(mthis, __arg_0);
+  isTypeSupported_Callback_1_(__arg_0) => js.context["MediaSource"].callMethod("isTypeSupported", [__arg_0]);
 
-  static endOfStream_Callback_0(mthis) native "MediaSource_endOfStream_Callback";
-  endOfStream_Callback_0_(mthis) => endOfStream_Callback_0(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static endOfStream_Callback_1(mthis, __arg_0) native "MediaSource_endOfStream_Callback";
-  endOfStream_Callback_1_(mthis, __arg_0) => endOfStream_Callback_1(mthis, __arg_0);
+  removeSourceBuffer_Callback_0_(mthis) => mthis.callMethod("removeSourceBuffer", []);
 
-  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);
+  removeSourceBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeSourceBuffer", [__arg_0]);
 
-  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);
+  sourceBuffers_Getter_(mthis) => mthis["sourceBuffers"];
 
 }
 
 class BlinkMediaStream extends BlinkEventTarget {
   static final instance = new BlinkMediaStream();
 
-  static addTrack_Callback_0(mthis) native "MediaStream_addTrack_Callback";
-  addTrack_Callback_0_(mthis) => addTrack_Callback_0(mthis);
+  addTrack_Callback_0_(mthis) => mthis.callMethod("addTrack", []);
 
-  static addTrack_Callback_1(mthis, __arg_0) native "MediaStream_addTrack_Callback";
-  addTrack_Callback_1_(mthis, __arg_0) => addTrack_Callback_1(mthis, __arg_0);
+  addTrack_Callback_1_(mthis, __arg_0) => mthis.callMethod("addTrack", [__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);
+  clone_Callback_0_(mthis) => mthis.callMethod("clone", []);
 
-  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);
+  constructorCallback_0_() => new js.JsObject(js.context["MediaStream"], []);
 
-  static clone_Callback_0(mthis) native "MediaStream_clone_Callback";
-  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["MediaStream"], [__arg_0]);
 
-  static clone_Callback_1(mthis, __arg_0) native "MediaStream_clone_Callback";
-  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+  ended_Getter_(mthis) => mthis["ended"];
 
-  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);
+  getAudioTracks_Callback_0_(mthis) => mthis.callMethod("getAudioTracks", []);
 
-  static constructorCallback_0() native "MediaStream_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  getTrackById_Callback_0_(mthis) => mthis.callMethod("getTrackById", []);
 
-  static constructorCallback_1(__arg_0) native "MediaStream_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  getTrackById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTrackById", [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MediaStream_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  getTracks_Callback_0_(mthis) => mthis.callMethod("getTracks", []);
 
-  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);
+  getVideoTracks_Callback_0_(mthis) => mthis.callMethod("getVideoTracks", []);
 
-  static ended_Getter(mthis) native "MediaStream_ended_Getter";
-  ended_Getter_(mthis) => ended_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static getAudioTracks_Callback_0(mthis) native "MediaStream_getAudioTracks_Callback";
-  getAudioTracks_Callback_0_(mthis) => getAudioTracks_Callback_0(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static getAudioTracks_Callback_1(mthis, __arg_0) native "MediaStream_getAudioTracks_Callback";
-  getAudioTracks_Callback_1_(mthis, __arg_0) => getAudioTracks_Callback_1(mthis, __arg_0);
+  onaddtrack_Getter_(mthis) => mthis["onaddtrack"];
 
-  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);
+  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
 
-  static getTrackById_Callback_0(mthis) native "MediaStream_getTrackById_Callback";
-  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static getTrackById_Callback_1(mthis, __arg_0) native "MediaStream_getTrackById_Callback";
-  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __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);
+  onremovetrack_Getter_(mthis) => mthis["onremovetrack"];
 
-  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);
+  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __arg_0;
 
-  static getTracks_Callback_0(mthis) native "MediaStream_getTracks_Callback";
-  getTracks_Callback_0_(mthis) => getTracks_Callback_0(mthis);
+  removeTrack_Callback_0_(mthis) => mthis.callMethod("removeTrack", []);
 
-  static getTracks_Callback_1(mthis, __arg_0) native "MediaStream_getTracks_Callback";
-  getTracks_Callback_1_(mthis, __arg_0) => getTracks_Callback_1(mthis, __arg_0);
+  removeTrack_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeTrack", [__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 onaddtrack_Getter(mthis) native "MediaStream_onaddtrack_Getter";
-  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
-
-  static onaddtrack_Setter(mthis, __arg_0) native "MediaStream_onaddtrack_Setter";
-  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
-
-  static onended_Getter(mthis) native "MediaStream_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
-
-  static onended_Setter(mthis, __arg_0) native "MediaStream_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
-
-  static onremovetrack_Getter(mthis) native "MediaStream_onremovetrack_Getter";
-  onremovetrack_Getter_(mthis) => onremovetrack_Getter(mthis);
-
-  static onremovetrack_Setter(mthis, __arg_0) native "MediaStream_onremovetrack_Setter";
-  onremovetrack_Setter_(mthis, __arg_0) => onremovetrack_Setter(mthis, __arg_0);
-
-  static removeTrack_Callback_0(mthis) native "MediaStream_removeTrack_Callback";
-  removeTrack_Callback_0_(mthis) => removeTrack_Callback_0(mthis);
-
-  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);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
 }
 
 class BlinkMediaStreamAudioDestinationNode extends BlinkAudioNode {
   static final instance = new BlinkMediaStreamAudioDestinationNode();
 
-  static stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
-  stream_Getter_(mthis) => stream_Getter(mthis);
+  stream_Getter_(mthis) => mthis["stream"];
 
 }
 
 class BlinkMediaStreamAudioSourceNode extends BlinkAudioSourceNode {
   static final instance = new BlinkMediaStreamAudioSourceNode();
 
-  static mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
-  mediaStream_Getter_(mthis) => mediaStream_Getter(mthis);
+  mediaStream_Getter_(mthis) => mthis["mediaStream"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MediaStreamEvent"], [__arg_0, __arg_1]);
 
-  static stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
-  stream_Getter_(mthis) => stream_Getter(mthis);
+  stream_Getter_(mthis) => mthis["stream"];
 
 }
 
 class BlinkMediaStreamTrack extends BlinkEventTarget {
   static final instance = new BlinkMediaStreamTrack();
 
-  static clone_Callback_0(mthis) native "MediaStreamTrack_clone_Callback";
-  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+  clone_Callback_0_(mthis) => mthis.callMethod("clone", []);
 
-  static clone_Callback_1(mthis, __arg_0) native "MediaStreamTrack_clone_Callback";
-  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+  enabled_Getter_(mthis) => mthis["enabled"];
 
-  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);
+  enabled_Setter_(mthis, __arg_0) => mthis["enabled"] = __arg_0;
 
-  static enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
-  enabled_Getter_(mthis) => enabled_Getter(mthis);
+  getSources_Callback_0_() => js.context["MediaStreamTrack"].callMethod("getSources", []);
 
-  static enabled_Setter(mthis, __arg_0) native "MediaStreamTrack_enabled_Setter";
-  enabled_Setter_(mthis, __arg_0) => enabled_Setter(mthis, __arg_0);
+  getSources_Callback_1_(__arg_0) => js.context["MediaStreamTrack"].callMethod("getSources", [__arg_0]);
 
-  static getSources_Callback_0() native "MediaStreamTrack_getSources_Callback";
-  getSources_Callback_0_() => getSources_Callback_0();
+  id_Getter_(mthis) => mthis["id"];
 
-  static getSources_Callback_1(__arg_0) native "MediaStreamTrack_getSources_Callback";
-  getSources_Callback_1_(__arg_0) => getSources_Callback_1(__arg_0);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  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);
+  label_Getter_(mthis) => mthis["label"];
 
-  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);
+  muted_Getter_(mthis) => mthis["muted"];
 
-  static id_Getter(mthis) native "MediaStreamTrack_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static label_Getter(mthis) native "MediaStreamTrack_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  onmute_Getter_(mthis) => mthis["onmute"];
 
-  static muted_Getter(mthis) native "MediaStreamTrack_muted_Getter";
-  muted_Getter_(mthis) => muted_Getter(mthis);
+  onmute_Setter_(mthis, __arg_0) => mthis["onmute"] = __arg_0;
 
-  static onended_Getter(mthis) native "MediaStreamTrack_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  onunmute_Getter_(mthis) => mthis["onunmute"];
 
-  static onended_Setter(mthis, __arg_0) native "MediaStreamTrack_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  onunmute_Setter_(mthis, __arg_0) => mthis["onunmute"] = __arg_0;
 
-  static onmute_Getter(mthis) native "MediaStreamTrack_onmute_Getter";
-  onmute_Getter_(mthis) => onmute_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  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 stop_Callback_0(mthis) native "MediaStreamTrack_stop_Callback";
-  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
-
-  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_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);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
 }
 
 class BlinkMediaStreamTrackEvent extends BlinkEvent {
   static final instance = new BlinkMediaStreamTrackEvent();
 
-  static track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
-  track_Getter_(mthis) => track_Getter(mthis);
+  track_Getter_(mthis) => mthis["track"];
 
 }
 
 class BlinkMemoryInfo {
   static final instance = new BlinkMemoryInfo();
 
-  static jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
-  jsHeapSizeLimit_Getter_(mthis) => jsHeapSizeLimit_Getter(mthis);
+  jsHeapSizeLimit_Getter_(mthis) => mthis["jsHeapSizeLimit"];
 
-  static totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
-  totalJSHeapSize_Getter_(mthis) => totalJSHeapSize_Getter(mthis);
+  totalJSHeapSize_Getter_(mthis) => mthis["totalJSHeapSize"];
 
-  static usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
-  usedJSHeapSize_Getter_(mthis) => usedJSHeapSize_Getter(mthis);
+  usedJSHeapSize_Getter_(mthis) => mthis["usedJSHeapSize"];
 
 }
 
 class BlinkMessageChannel {
   static final instance = new BlinkMessageChannel();
 
-  static constructorCallback_0() native "MessageChannel_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["MessageChannel"], []);
 
-  static constructorCallback_1(__arg_0) native "MessageChannel_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  port1_Getter_(mthis) => mthis["port1"];
 
-  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);
+  port2_Getter_(mthis) => mthis["port2"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MessageEvent"], [__arg_0, __arg_1]);
 
-  static data_Getter(mthis) native "MessageEvent_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  data_Getter_(mthis) => mthis["data"];
 
-  static initMessageEvent_Callback_0(mthis) native "MessageEvent_initMessageEvent_Callback";
-  initMessageEvent_Callback_0_(mthis) => initMessageEvent_Callback_0(mthis);
+  initMessageEvent_Callback_0_(mthis) => mthis.callMethod("initMessageEvent", []);
 
-  static initMessageEvent_Callback_1(mthis, __arg_0) native "MessageEvent_initMessageEvent_Callback";
-  initMessageEvent_Callback_1_(mthis, __arg_0) => initMessageEvent_Callback_1(mthis, __arg_0);
+  initMessageEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initMessageEvent", [__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);
+  initMessageEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1]);
 
-  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);
+  initMessageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initMessageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initMessageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initMessageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initMessageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initMessageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initMessageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  lastEventId_Getter_(mthis) => mthis["lastEventId"];
 
-  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);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  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);
+  source_Getter_(mthis) => mthis["source"];
 
 }
 
 class BlinkMessagePort extends BlinkEventTarget {
   static final instance = new BlinkMessagePort();
 
-  static close_Callback_0(mthis) native "MessagePort_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "MessagePort_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  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);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "MessagePort_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static onmessage_Setter(mthis, __arg_0) native "MessagePort_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__arg_0]);
 
-  static postMessage_Callback_0(mthis) native "MessagePort_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__arg_0, __arg_1]);
 
-  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);
+  start_Callback_0_(mthis) => mthis.callMethod("start", []);
 
 }
 
 class BlinkMetadata {
   static final instance = new BlinkMetadata();
 
-  static modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
-  modificationTime_Getter_(mthis) => modificationTime_Getter(mthis);
+  modificationTime_Getter_(mthis) => mthis["modificationTime"];
 
-  static size_Getter(mthis) native "Metadata_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
+  size_Getter_(mthis) => mthis["size"];
 
 }
 
 class BlinkMimeType {
   static final instance = new BlinkMimeType();
 
-  static description_Getter(mthis) native "MimeType_description_Getter";
-  description_Getter_(mthis) => description_Getter(mthis);
+  description_Getter_(mthis) => mthis["description"];
 
-  static enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
-  enabledPlugin_Getter_(mthis) => enabledPlugin_Getter(mthis);
+  enabledPlugin_Getter_(mthis) => mthis["enabledPlugin"];
 
-  static suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
-  suffixes_Getter_(mthis) => suffixes_Getter(mthis);
+  suffixes_Getter_(mthis) => mthis["suffixes"];
 
-  static type_Getter(mthis) native "MimeType_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "MimeTypeArray_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "MimeTypeArray_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static length_Getter(mthis) native "MimeTypeArray_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
-
-  static namedItem_Callback_0(mthis) native "MimeTypeArray_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
-
-  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_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);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
 }
 
 class BlinkMouseEvent extends BlinkUIEvent {
   static final instance = new BlinkMouseEvent();
 
-  static altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
-  altKey_Getter_(mthis) => altKey_Getter(mthis);
+  altKey_Getter_(mthis) => mthis["altKey"];
 
-  static button_Getter(mthis) native "MouseEvent_button_Getter";
-  button_Getter_(mthis) => button_Getter(mthis);
+  button_Getter_(mthis) => mthis["button"];
 
-  static clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
-  clientX_Getter_(mthis) => clientX_Getter(mthis);
+  clientX_Getter_(mthis) => mthis["clientX"];
 
-  static clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
-  clientY_Getter_(mthis) => clientY_Getter(mthis);
+  clientY_Getter_(mthis) => mthis["clientY"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MouseEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["MouseEvent"], [__arg_0, __arg_1]);
 
-  static ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
-  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
+  ctrlKey_Getter_(mthis) => mthis["ctrlKey"];
 
-  static dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
-  dataTransfer_Getter_(mthis) => dataTransfer_Getter(mthis);
+  dataTransfer_Getter_(mthis) => mthis["dataTransfer"];
 
-  static fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
-  fromElement_Getter_(mthis) => fromElement_Getter(mthis);
+  fromElement_Getter_(mthis) => mthis["fromElement"];
 
-  static initMouseEvent_Callback_0(mthis) native "MouseEvent_initMouseEvent_Callback";
-  initMouseEvent_Callback_0_(mthis) => initMouseEvent_Callback_0(mthis);
+  initMouseEvent_Callback_0_(mthis) => mthis.callMethod("initMouseEvent", []);
 
-  static initMouseEvent_Callback_1(mthis, __arg_0) native "MouseEvent_initMouseEvent_Callback";
-  initMouseEvent_Callback_1_(mthis, __arg_0) => initMouseEvent_Callback_1(mthis, __arg_0);
+  initMouseEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initMouseEvent", [__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);
+  initMouseEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => mthis.callMethod("initMouseEvent", [__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);
+  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) => mthis.callMethod("initMouseEvent", [__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);
+  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) => mthis.callMethod("initMouseEvent", [__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);
+  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) => mthis.callMethod("initMouseEvent", [__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);
+  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) => mthis.callMethod("initMouseEvent", [__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);
+  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) => mthis.callMethod("initMouseEvent", [__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);
+  initMouseEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1]);
 
-  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);
+  initMouseEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initMouseEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initMouseEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initMouseEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initMouseEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initMouseEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  initMouseEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("initMouseEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  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);
+  metaKey_Getter_(mthis) => mthis["metaKey"];
 
-  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);
+  movementX_Getter_(mthis) => mthis["movementX"];
 
-  static metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
-  metaKey_Getter_(mthis) => metaKey_Getter(mthis);
+  movementY_Getter_(mthis) => mthis["movementY"];
 
-  static movementX_Getter(mthis) native "MouseEvent_movementX_Getter";
-  movementX_Getter_(mthis) => movementX_Getter(mthis);
+  offsetX_Getter_(mthis) => mthis["offsetX"];
 
-  static movementY_Getter(mthis) native "MouseEvent_movementY_Getter";
-  movementY_Getter_(mthis) => movementY_Getter(mthis);
+  offsetY_Getter_(mthis) => mthis["offsetY"];
 
-  static offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
-  offsetX_Getter_(mthis) => offsetX_Getter(mthis);
+  region_Getter_(mthis) => mthis["region"];
 
-  static offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
-  offsetY_Getter_(mthis) => offsetY_Getter(mthis);
+  relatedTarget_Getter_(mthis) => mthis["relatedTarget"];
 
-  static region_Getter(mthis) native "MouseEvent_region_Getter";
-  region_Getter_(mthis) => region_Getter(mthis);
+  screenX_Getter_(mthis) => mthis["screenX"];
 
-  static relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
-  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
+  screenY_Getter_(mthis) => mthis["screenY"];
 
-  static screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
-  screenX_Getter_(mthis) => screenX_Getter(mthis);
+  shiftKey_Getter_(mthis) => mthis["shiftKey"];
 
-  static screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
-  screenY_Getter_(mthis) => screenY_Getter(mthis);
+  toElement_Getter_(mthis) => mthis["toElement"];
 
-  static shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
-  shiftKey_Getter_(mthis) => shiftKey_Getter(mthis);
+  webkitMovementX_Getter_(mthis) => mthis["webkitMovementX"];
 
-  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);
+  webkitMovementY_Getter_(mthis) => mthis["webkitMovementY"];
 
 }
 
 class BlinkMutationEvent extends BlinkEvent {
   static final instance = new BlinkMutationEvent();
 
-  static attrChange_Getter(mthis) native "MutationEvent_attrChange_Getter";
-  attrChange_Getter_(mthis) => attrChange_Getter(mthis);
+  attrChange_Getter_(mthis) => mthis["attrChange"];
 
-  static attrName_Getter(mthis) native "MutationEvent_attrName_Getter";
-  attrName_Getter_(mthis) => attrName_Getter(mthis);
+  attrName_Getter_(mthis) => mthis["attrName"];
 
-  static initMutationEvent_Callback_0(mthis) native "MutationEvent_initMutationEvent_Callback";
-  initMutationEvent_Callback_0_(mthis) => initMutationEvent_Callback_0(mthis);
+  initMutationEvent_Callback_0_(mthis) => mthis.callMethod("initMutationEvent", []);
 
-  static initMutationEvent_Callback_1(mthis, __arg_0) native "MutationEvent_initMutationEvent_Callback";
-  initMutationEvent_Callback_1_(mthis, __arg_0) => initMutationEvent_Callback_1(mthis, __arg_0);
+  initMutationEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initMutationEvent", [__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);
+  initMutationEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1]);
 
-  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);
+  initMutationEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initMutationEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initMutationEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initMutationEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initMutationEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initMutationEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initMutationEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  newValue_Getter_(mthis) => mthis["newValue"];
 
-  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);
+  prevValue_Getter_(mthis) => mthis["prevValue"];
 
-  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);
+  relatedNode_Getter_(mthis) => mthis["relatedNode"];
 
 }
 
 class BlinkMutationObserver {
   static final instance = new BlinkMutationObserver();
 
-  static constructorCallback_0() native "MutationObserver_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["MutationObserver"], []);
 
-  static constructorCallback_1(__arg_0) native "MutationObserver_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["MutationObserver"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "MutationObserver_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  disconnect_Callback_0_(mthis) => mthis.callMethod("disconnect", []);
 
-  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);
+  observe_Callback_0_(mthis) => mthis.callMethod("observe", []);
 
-  static disconnect_Callback_0(mthis) native "MutationObserver_disconnect_Callback";
-  disconnect_Callback_0_(mthis) => disconnect_Callback_0(mthis);
+  observe_Callback_1_(mthis, __arg_0) => mthis.callMethod("observe", [__arg_0]);
 
-  static disconnect_Callback_1(mthis, __arg_0) native "MutationObserver_disconnect_Callback";
-  disconnect_Callback_1_(mthis, __arg_0) => disconnect_Callback_1(mthis, __arg_0);
+  observe_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("observe", [__arg_0, __arg_1]);
 
-  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);
+  takeRecords_Callback_0_(mthis) => mthis.callMethod("takeRecords", []);
 
 }
 
 class BlinkMutationRecord {
   static final instance = new BlinkMutationRecord();
 
-  static addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
-  addedNodes_Getter_(mthis) => addedNodes_Getter(mthis);
+  addedNodes_Getter_(mthis) => mthis["addedNodes"];
 
-  static attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
-  attributeName_Getter_(mthis) => attributeName_Getter(mthis);
+  attributeName_Getter_(mthis) => mthis["attributeName"];
 
-  static attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
-  attributeNamespace_Getter_(mthis) => attributeNamespace_Getter(mthis);
+  attributeNamespace_Getter_(mthis) => mthis["attributeNamespace"];
 
-  static nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
-  nextSibling_Getter_(mthis) => nextSibling_Getter(mthis);
+  nextSibling_Getter_(mthis) => mthis["nextSibling"];
 
-  static oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
-  oldValue_Getter_(mthis) => oldValue_Getter(mthis);
+  oldValue_Getter_(mthis) => mthis["oldValue"];
 
-  static previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
-  previousSibling_Getter_(mthis) => previousSibling_Getter(mthis);
+  previousSibling_Getter_(mthis) => mthis["previousSibling"];
 
-  static removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
-  removedNodes_Getter_(mthis) => removedNodes_Getter(mthis);
+  removedNodes_Getter_(mthis) => mthis["removedNodes"];
 
-  static target_Getter(mthis) native "MutationRecord_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static type_Getter(mthis) native "MutationRecord_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getNamedItemNS_Callback_0(mthis) native "NamedNodeMap_getNamedItemNS_Callback";
-  getNamedItemNS_Callback_0_(mthis) => getNamedItemNS_Callback_0(mthis);
+  getNamedItemNS_Callback_0_(mthis) => mthis.callMethod("getNamedItemNS", []);
 
-  static getNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_getNamedItemNS_Callback";
-  getNamedItemNS_Callback_1_(mthis, __arg_0) => getNamedItemNS_Callback_1(mthis, __arg_0);
+  getNamedItemNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("getNamedItemNS", [__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);
+  getNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getNamedItemNS", [__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);
+  getNamedItem_Callback_0_(mthis) => mthis.callMethod("getNamedItem", []);
 
-  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);
+  getNamedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getNamedItem", [__arg_0]);
 
-  static getNamedItem_Callback_0(mthis) native "NamedNodeMap_getNamedItem_Callback";
-  getNamedItem_Callback_0_(mthis) => getNamedItem_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static getNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_getNamedItem_Callback";
-  getNamedItem_Callback_1_(mthis, __arg_0) => getNamedItem_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  removeNamedItemNS_Callback_0_(mthis) => mthis.callMethod("removeNamedItemNS", []);
 
-  static item_Callback_0(mthis) native "NamedNodeMap_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  removeNamedItemNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeNamedItemNS", [__arg_0]);
 
-  static item_Callback_1(mthis, __arg_0) native "NamedNodeMap_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  removeNamedItemNS_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("removeNamedItemNS", [__arg_0, __arg_1]);
 
-  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);
+  removeNamedItem_Callback_0_(mthis) => mthis.callMethod("removeNamedItem", []);
 
-  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);
+  removeNamedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeNamedItem", [__arg_0]);
 
-  static length_Getter(mthis) native "NamedNodeMap_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  setNamedItemNS_Callback_0_(mthis) => mthis.callMethod("setNamedItemNS", []);
 
-  static removeNamedItemNS_Callback_0(mthis) native "NamedNodeMap_removeNamedItemNS_Callback";
-  removeNamedItemNS_Callback_0_(mthis) => removeNamedItemNS_Callback_0(mthis);
+  setNamedItemNS_Callback_1_(mthis, __arg_0) => mthis.callMethod("setNamedItemNS", [__arg_0]);
 
-  static removeNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_removeNamedItemNS_Callback";
-  removeNamedItemNS_Callback_1_(mthis, __arg_0) => removeNamedItemNS_Callback_1(mthis, __arg_0);
+  setNamedItem_Callback_0_(mthis) => mthis.callMethod("setNamedItem", []);
 
-  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 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 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 removeNamedItem_Callback_0(mthis) native "NamedNodeMap_removeNamedItem_Callback";
-  removeNamedItem_Callback_0_(mthis) => removeNamedItem_Callback_0(mthis);
-
-  static removeNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_removeNamedItem_Callback";
-  removeNamedItem_Callback_1_(mthis, __arg_0) => removeNamedItem_Callback_1(mthis, __arg_0);
-
-  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);
-
-  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);
-
-  static setNamedItemNS_Callback_0(mthis) native "NamedNodeMap_setNamedItemNS_Callback";
-  setNamedItemNS_Callback_0_(mthis) => setNamedItemNS_Callback_0(mthis);
-
-  static setNamedItemNS_Callback_1(mthis, __arg_0) native "NamedNodeMap_setNamedItemNS_Callback";
-  setNamedItemNS_Callback_1_(mthis, __arg_0) => setNamedItemNS_Callback_1(mthis, __arg_0);
-
-  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 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 setNamedItem_Callback_0(mthis) native "NamedNodeMap_setNamedItem_Callback";
-  setNamedItem_Callback_0_(mthis) => setNamedItem_Callback_0(mthis);
-
-  static setNamedItem_Callback_1(mthis, __arg_0) native "NamedNodeMap_setNamedItem_Callback";
-  setNamedItem_Callback_1_(mthis, __arg_0) => setNamedItem_Callback_1(mthis, __arg_0);
-
-  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);
-
-  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);
+  setNamedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("setNamedItem", [__arg_0]);
 
 }
 
 class BlinkNavigator {
   static final instance = new BlinkNavigator();
 
-  static appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
-  appCodeName_Getter_(mthis) => appCodeName_Getter(mthis);
+  appCodeName_Getter_(mthis) => mthis["appCodeName"];
 
-  static appName_Getter(mthis) native "Navigator_appName_Getter";
-  appName_Getter_(mthis) => appName_Getter(mthis);
+  appName_Getter_(mthis) => mthis["appName"];
 
-  static appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
-  appVersion_Getter_(mthis) => appVersion_Getter(mthis);
+  appVersion_Getter_(mthis) => mthis["appVersion"];
 
-  static connection_Getter(mthis) native "Navigator_connection_Getter";
-  connection_Getter_(mthis) => connection_Getter(mthis);
+  connection_Getter_(mthis) => mthis["connection"];
 
-  static cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
-  cookieEnabled_Getter_(mthis) => cookieEnabled_Getter(mthis);
+  cookieEnabled_Getter_(mthis) => mthis["cookieEnabled"];
 
-  static credentials_Getter(mthis) native "Navigator_credentials_Getter";
-  credentials_Getter_(mthis) => credentials_Getter(mthis);
+  credentials_Getter_(mthis) => mthis["credentials"];
 
-  static dartEnabled_Getter(mthis) native "Navigator_dartEnabled_Getter";
-  dartEnabled_Getter_(mthis) => dartEnabled_Getter(mthis);
+  dartEnabled_Getter_(mthis) => mthis["dartEnabled"];
 
-  static doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
-  doNotTrack_Getter_(mthis) => doNotTrack_Getter(mthis);
+  doNotTrack_Getter_(mthis) => mthis["doNotTrack"];
 
-  static geofencing_Getter(mthis) native "Navigator_geofencing_Getter";
-  geofencing_Getter_(mthis) => geofencing_Getter(mthis);
+  geofencing_Getter_(mthis) => mthis["geofencing"];
 
-  static geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
-  geolocation_Getter_(mthis) => geolocation_Getter(mthis);
+  geolocation_Getter_(mthis) => mthis["geolocation"];
 
-  static getBattery_Callback_0(mthis) native "Navigator_getBattery_Callback";
-  getBattery_Callback_0_(mthis) => getBattery_Callback_0(mthis);
+  getBattery_Callback_0_(mthis) => mthis.callMethod("getBattery", []);
 
-  static getBattery_Callback_1(mthis, __arg_0) native "Navigator_getBattery_Callback";
-  getBattery_Callback_1_(mthis, __arg_0) => getBattery_Callback_1(mthis, __arg_0);
+  getGamepads_Callback_0_(mthis) => mthis.callMethod("getGamepads", []);
 
-  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);
+  getStorageUpdates_Callback_0_(mthis) => mthis.callMethod("getStorageUpdates", []);
 
-  static getGamepads_Callback_0(mthis) native "Navigator_getGamepads_Callback";
-  getGamepads_Callback_0_(mthis) => getGamepads_Callback_0(mthis);
+  hardwareConcurrency_Getter_(mthis) => mthis["hardwareConcurrency"];
 
-  static getGamepads_Callback_1(mthis, __arg_0) native "Navigator_getGamepads_Callback";
-  getGamepads_Callback_1_(mthis, __arg_0) => getGamepads_Callback_1(mthis, __arg_0);
+  isProtocolHandlerRegistered_Callback_0_(mthis) => mthis.callMethod("isProtocolHandlerRegistered", []);
 
-  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);
+  isProtocolHandlerRegistered_Callback_1_(mthis, __arg_0) => mthis.callMethod("isProtocolHandlerRegistered", [__arg_0]);
 
-  static getStorageUpdates_Callback_0(mthis) native "Navigator_getStorageUpdates_Callback";
-  getStorageUpdates_Callback_0_(mthis) => getStorageUpdates_Callback_0(mthis);
+  isProtocolHandlerRegistered_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("isProtocolHandlerRegistered", [__arg_0, __arg_1]);
 
-  static getStorageUpdates_Callback_1(mthis, __arg_0) native "Navigator_getStorageUpdates_Callback";
-  getStorageUpdates_Callback_1_(mthis, __arg_0) => getStorageUpdates_Callback_1(mthis, __arg_0);
+  javaEnabled_Callback_0_(mthis) => mthis.callMethod("javaEnabled", []);
 
-  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);
+  language_Getter_(mthis) => mthis["language"];
 
-  static hardwareConcurrency_Getter(mthis) native "Navigator_hardwareConcurrency_Getter";
-  hardwareConcurrency_Getter_(mthis) => hardwareConcurrency_Getter(mthis);
+  languages_Getter_(mthis) => mthis["languages"];
 
-  static isProtocolHandlerRegistered_Callback_0(mthis) native "Navigator_isProtocolHandlerRegistered_Callback";
-  isProtocolHandlerRegistered_Callback_0_(mthis) => isProtocolHandlerRegistered_Callback_0(mthis);
+  maxTouchPoints_Getter_(mthis) => mthis["maxTouchPoints"];
 
-  static isProtocolHandlerRegistered_Callback_1(mthis, __arg_0) native "Navigator_isProtocolHandlerRegistered_Callback";
-  isProtocolHandlerRegistered_Callback_1_(mthis, __arg_0) => isProtocolHandlerRegistered_Callback_1(mthis, __arg_0);
+  mimeTypes_Getter_(mthis) => mthis["mimeTypes"];
 
-  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);
+  onLine_Getter_(mthis) => mthis["onLine"];
 
-  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);
+  platform_Getter_(mthis) => mthis["platform"];
 
-  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);
+  plugins_Getter_(mthis) => mthis["plugins"];
 
-  static javaEnabled_Callback_0(mthis) native "Navigator_javaEnabled_Callback";
-  javaEnabled_Callback_0_(mthis) => javaEnabled_Callback_0(mthis);
+  presentation_Getter_(mthis) => mthis["presentation"];
 
-  static javaEnabled_Callback_1(mthis, __arg_0) native "Navigator_javaEnabled_Callback";
-  javaEnabled_Callback_1_(mthis, __arg_0) => javaEnabled_Callback_1(mthis, __arg_0);
+  productSub_Getter_(mthis) => mthis["productSub"];
 
-  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);
+  product_Getter_(mthis) => mthis["product"];
 
-  static language_Getter(mthis) native "Navigator_language_Getter";
-  language_Getter_(mthis) => language_Getter(mthis);
+  push_Getter_(mthis) => mthis["push"];
 
-  static languages_Getter(mthis) native "Navigator_languages_Getter";
-  languages_Getter_(mthis) => languages_Getter(mthis);
+  registerProtocolHandler_Callback_1_(mthis, __arg_0) => mthis.callMethod("registerProtocolHandler", [__arg_0]);
 
-  static maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
-  maxTouchPoints_Getter_(mthis) => maxTouchPoints_Getter(mthis);
+  registerProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("registerProtocolHandler", [__arg_0, __arg_1]);
 
-  static mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
-  mimeTypes_Getter_(mthis) => mimeTypes_Getter(mthis);
+  registerProtocolHandler_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("registerProtocolHandler", [__arg_0, __arg_1, __arg_2]);
 
-  static onLine_Getter(mthis) native "Navigator_onLine_Getter";
-  onLine_Getter_(mthis) => onLine_Getter(mthis);
+  sendBeacon_Callback_0_(mthis) => mthis.callMethod("sendBeacon", []);
 
-  static platform_Getter(mthis) native "Navigator_platform_Getter";
-  platform_Getter_(mthis) => platform_Getter(mthis);
+  sendBeacon_Callback_1_(mthis, __arg_0) => mthis.callMethod("sendBeacon", [__arg_0]);
 
-  static plugins_Getter(mthis) native "Navigator_plugins_Getter";
-  plugins_Getter_(mthis) => plugins_Getter(mthis);
+  sendBeacon_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("sendBeacon", [__arg_0, __arg_1]);
 
-  static presentation_Getter(mthis) native "Navigator_presentation_Getter";
-  presentation_Getter_(mthis) => presentation_Getter(mthis);
+  serviceWorker_Getter_(mthis) => mthis["serviceWorker"];
 
-  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);
+  storageQuota_Getter_(mthis) => mthis["storageQuota"];
 
-  static vibrate_Callback_0(mthis) native "Navigator_vibrate_Callback";
-  vibrate_Callback_0_(mthis) => vibrate_Callback_0(mthis);
+  unregisterProtocolHandler_Callback_0_(mthis) => mthis.callMethod("unregisterProtocolHandler", []);
 
-  static vibrate_Callback_1(mthis, __arg_0) native "Navigator_vibrate_Callback";
-  vibrate_Callback_1_(mthis, __arg_0) => vibrate_Callback_1(mthis, __arg_0);
+  unregisterProtocolHandler_Callback_1_(mthis, __arg_0) => mthis.callMethod("unregisterProtocolHandler", [__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);
+  unregisterProtocolHandler_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("unregisterProtocolHandler", [__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);
+  userAgent_Getter_(mthis) => mthis["userAgent"];
 
-  static webkitGetGamepads_Callback_0(mthis) native "Navigator_webkitGetGamepads_Callback";
-  webkitGetGamepads_Callback_0_(mthis) => webkitGetGamepads_Callback_0(mthis);
+  vendorSub_Getter_(mthis) => mthis["vendorSub"];
 
-  static webkitGetGamepads_Callback_1(mthis, __arg_0) native "Navigator_webkitGetGamepads_Callback";
-  webkitGetGamepads_Callback_1_(mthis, __arg_0) => webkitGetGamepads_Callback_1(mthis, __arg_0);
+  vendor_Getter_(mthis) => mthis["vendor"];
 
-  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);
+  vibrate_Callback_0_(mthis) => mthis.callMethod("vibrate", []);
 
-  static webkitGetUserMedia_Callback_1(mthis, __arg_0) native "Navigator_webkitGetUserMedia_Callback";
-  webkitGetUserMedia_Callback_1_(mthis, __arg_0) => webkitGetUserMedia_Callback_1(mthis, __arg_0);
+  vibrate_Callback_1_(mthis, __arg_0) => mthis.callMethod("vibrate", [__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);
+  webkitGetGamepads_Callback_0_(mthis) => mthis.callMethod("webkitGetGamepads", []);
 
-  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);
+  webkitGetUserMedia_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitGetUserMedia", [__arg_0]);
 
-  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);
+  webkitGetUserMedia_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitGetUserMedia", [__arg_0, __arg_1]);
 
-  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);
+  webkitGetUserMedia_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitGetUserMedia", [__arg_0, __arg_1, __arg_2]);
 
-  static webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
-  webkitPersistentStorage_Getter_(mthis) => webkitPersistentStorage_Getter(mthis);
+  webkitPersistentStorage_Getter_(mthis) => mthis["webkitPersistentStorage"];
 
-  static webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
-  webkitTemporaryStorage_Getter_(mthis) => webkitTemporaryStorage_Getter(mthis);
+  webkitTemporaryStorage_Getter_(mthis) => mthis["webkitTemporaryStorage"];
 
 }
 
 class BlinkNavigatorUserMediaError {
   static final instance = new BlinkNavigatorUserMediaError();
 
-  static constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
-  constraintName_Getter_(mthis) => constraintName_Getter(mthis);
+  constraintName_Getter_(mthis) => mthis["constraintName"];
 
-  static message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
-  static name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
 }
 
 class BlinkNetworkInformation extends BlinkEventTarget {
   static final instance = new BlinkNetworkInformation();
 
-  static ontypechange_Getter(mthis) native "NetworkInformation_ontypechange_Getter";
-  ontypechange_Getter_(mthis) => ontypechange_Getter(mthis);
+  ontypechange_Getter_(mthis) => mthis["ontypechange"];
 
-  static ontypechange_Setter(mthis, __arg_0) native "NetworkInformation_ontypechange_Setter";
-  ontypechange_Setter_(mthis, __arg_0) => ontypechange_Setter(mthis, __arg_0);
+  ontypechange_Setter_(mthis, __arg_0) => mthis["ontypechange"] = __arg_0;
 
-  static type_Getter(mthis) native "NetworkInformation_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  appendChild_Callback_0_(mthis) => mthis.callMethod("appendChild", []);
 
-  static appendChild_Callback_1(mthis, __arg_0) native "Node_appendChild_Callback";
-  appendChild_Callback_1_(mthis, __arg_0) => appendChild_Callback_1(mthis, __arg_0);
+  appendChild_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendChild", [__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);
+  baseURI_Getter_(mthis) => mthis["baseURI"];
 
-  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);
+  childNodes_Getter_(mthis) => mthis["childNodes"];
 
-  static baseURI_Getter(mthis) native "Node_baseURI_Getter";
-  baseURI_Getter_(mthis) => baseURI_Getter(mthis);
+  cloneNode_Callback_0_(mthis) => mthis.callMethod("cloneNode", []);
 
-  static childNodes_Getter(mthis) native "Node_childNodes_Getter";
-  childNodes_Getter_(mthis) => childNodes_Getter(mthis);
+  cloneNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("cloneNode", [__arg_0]);
 
-  static cloneNode_Callback_0(mthis) native "Node_cloneNode_Callback";
-  cloneNode_Callback_0_(mthis) => cloneNode_Callback_0(mthis);
+  contains_Callback_0_(mthis) => mthis.callMethod("contains", []);
 
-  static cloneNode_Callback_1(mthis, __arg_0) native "Node_cloneNode_Callback";
-  cloneNode_Callback_1_(mthis, __arg_0) => cloneNode_Callback_1(mthis, __arg_0);
+  contains_Callback_1_(mthis, __arg_0) => mthis.callMethod("contains", [__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);
+  firstChild_Getter_(mthis) => mthis["firstChild"];
 
-  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);
+  hasChildNodes_Callback_0_(mthis) => mthis.callMethod("hasChildNodes", []);
 
-  static contains_Callback_0(mthis) native "Node_contains_Callback";
-  contains_Callback_0_(mthis) => contains_Callback_0(mthis);
+  insertBefore_Callback_0_(mthis) => mthis.callMethod("insertBefore", []);
 
-  static contains_Callback_1(mthis, __arg_0) native "Node_contains_Callback";
-  contains_Callback_1_(mthis, __arg_0) => contains_Callback_1(mthis, __arg_0);
+  insertBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertBefore", [__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);
+  insertBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertBefore", [__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);
+  lastChild_Getter_(mthis) => mthis["lastChild"];
 
-  static firstChild_Getter(mthis) native "Node_firstChild_Getter";
-  firstChild_Getter_(mthis) => firstChild_Getter(mthis);
+  localName_Getter_(mthis) => mthis["localName"];
 
-  static hasChildNodes_Callback_0(mthis) native "Node_hasChildNodes_Callback";
-  hasChildNodes_Callback_0_(mthis) => hasChildNodes_Callback_0(mthis);
+  namespaceURI_Getter_(mthis) => mthis["namespaceURI"];
 
-  static hasChildNodes_Callback_1(mthis, __arg_0) native "Node_hasChildNodes_Callback";
-  hasChildNodes_Callback_1_(mthis, __arg_0) => hasChildNodes_Callback_1(mthis, __arg_0);
+  nextSibling_Getter_(mthis) => mthis["nextSibling"];
 
-  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);
+  nodeName_Getter_(mthis) => mthis["nodeName"];
 
-  static insertBefore_Callback_0(mthis) native "Node_insertBefore_Callback";
-  insertBefore_Callback_0_(mthis) => insertBefore_Callback_0(mthis);
+  nodeType_Getter_(mthis) => mthis["nodeType"];
 
-  static insertBefore_Callback_1(mthis, __arg_0) native "Node_insertBefore_Callback";
-  insertBefore_Callback_1_(mthis, __arg_0) => insertBefore_Callback_1(mthis, __arg_0);
+  nodeValue_Getter_(mthis) => mthis["nodeValue"];
 
-  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);
+  nodeValue_Setter_(mthis, __arg_0) => mthis["nodeValue"] = __arg_0;
 
-  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);
+  ownerDocument_Getter_(mthis) => mthis["ownerDocument"];
 
-  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);
+  parentElement_Getter_(mthis) => mthis["parentElement"];
 
-  static lastChild_Getter(mthis) native "Node_lastChild_Getter";
-  lastChild_Getter_(mthis) => lastChild_Getter(mthis);
+  parentNode_Getter_(mthis) => mthis["parentNode"];
 
-  static localName_Getter(mthis) native "Node_localName_Getter";
-  localName_Getter_(mthis) => localName_Getter(mthis);
+  previousSibling_Getter_(mthis) => mthis["previousSibling"];
 
-  static namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
-  namespaceURI_Getter_(mthis) => namespaceURI_Getter(mthis);
+  removeChild_Callback_0_(mthis) => mthis.callMethod("removeChild", []);
 
-  static nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
-  nextSibling_Getter_(mthis) => nextSibling_Getter(mthis);
+  removeChild_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeChild", [__arg_0]);
 
-  static nodeName_Getter(mthis) native "Node_nodeName_Getter";
-  nodeName_Getter_(mthis) => nodeName_Getter(mthis);
+  replaceChild_Callback_0_(mthis) => mthis.callMethod("replaceChild", []);
 
-  static nodeType_Getter(mthis) native "Node_nodeType_Getter";
-  nodeType_Getter_(mthis) => nodeType_Getter(mthis);
+  replaceChild_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceChild", [__arg_0]);
 
-  static nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
-  nodeValue_Getter_(mthis) => nodeValue_Getter(mthis);
+  replaceChild_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceChild", [__arg_0, __arg_1]);
 
-  static nodeValue_Setter(mthis, __arg_0) native "Node_nodeValue_Setter";
-  nodeValue_Setter_(mthis, __arg_0) => nodeValue_Setter(mthis, __arg_0);
+  textContent_Getter_(mthis) => mthis["textContent"];
 
-  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);
+  textContent_Setter_(mthis, __arg_0) => mthis["textContent"] = __arg_0;
 
 }
 
@@ -16689,153 +9230,79 @@
 class BlinkNodeIterator {
   static final instance = new BlinkNodeIterator();
 
-  static detach_Callback_0(mthis) native "NodeIterator_detach_Callback";
-  detach_Callback_0_(mthis) => detach_Callback_0(mthis);
+  detach_Callback_0_(mthis) => mthis.callMethod("detach", []);
 
-  static detach_Callback_1(mthis, __arg_0) native "NodeIterator_detach_Callback";
-  detach_Callback_1_(mthis, __arg_0) => detach_Callback_1(mthis, __arg_0);
+  nextNode_Callback_0_(mthis) => mthis.callMethod("nextNode", []);
 
-  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);
+  pointerBeforeReferenceNode_Getter_(mthis) => mthis["pointerBeforeReferenceNode"];
 
-  static nextNode_Callback_0(mthis) native "NodeIterator_nextNode_Callback";
-  nextNode_Callback_0_(mthis) => nextNode_Callback_0(mthis);
+  previousNode_Callback_0_(mthis) => mthis.callMethod("previousNode", []);
 
-  static nextNode_Callback_1(mthis, __arg_0) native "NodeIterator_nextNode_Callback";
-  nextNode_Callback_1_(mthis, __arg_0) => nextNode_Callback_1(mthis, __arg_0);
+  referenceNode_Getter_(mthis) => mthis["referenceNode"];
 
-  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);
+  root_Getter_(mthis) => mthis["root"];
 
-  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);
+  whatToShow_Getter_(mthis) => mthis["whatToShow"];
 
 }
 
 class BlinkNodeList {
   static final instance = new BlinkNodeList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "NodeList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "NodeList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "NodeList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkNotification extends BlinkEventTarget {
   static final instance = new BlinkNotification();
 
-  static body_Getter(mthis) native "Notification_body_Getter";
-  body_Getter_(mthis) => body_Getter(mthis);
+  body_Getter_(mthis) => mthis["body"];
 
-  static close_Callback_0(mthis) native "Notification_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "Notification_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["Notification"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Notification"], [__arg_0]);
 
-  static constructorCallback_0() native "Notification_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Notification"], [__arg_0, __arg_1]);
 
-  static constructorCallback_1(__arg_0) native "Notification_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  dir_Getter_(mthis) => mthis["dir"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Notification_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  icon_Getter_(mthis) => mthis["icon"];
 
-  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);
+  lang_Getter_(mthis) => mthis["lang"];
 
-  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);
+  onclick_Getter_(mthis) => mthis["onclick"];
 
-  static dir_Getter(mthis) native "Notification_dir_Getter";
-  dir_Getter_(mthis) => dir_Getter(mthis);
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
 
-  static icon_Getter(mthis) native "Notification_icon_Getter";
-  icon_Getter_(mthis) => icon_Getter(mthis);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  static lang_Getter(mthis) native "Notification_lang_Getter";
-  lang_Getter_(mthis) => lang_Getter(mthis);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static onclick_Getter(mthis) native "Notification_onclick_Getter";
-  onclick_Getter_(mthis) => onclick_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onclick_Setter(mthis, __arg_0) native "Notification_onclick_Setter";
-  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onclose_Getter(mthis) native "Notification_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onshow_Getter_(mthis) => mthis["onshow"];
 
-  static onclose_Setter(mthis, __arg_0) native "Notification_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
 
-  static onerror_Getter(mthis) native "Notification_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  permission_Getter_() => js.context["Notification"]["permission"];
 
-  static onerror_Setter(mthis, __arg_0) native "Notification_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  requestPermission_Callback_0_() => js.context["Notification"].callMethod("requestPermission", []);
 
-  static onshow_Getter(mthis) native "Notification_onshow_Getter";
-  onshow_Getter_(mthis) => onshow_Getter(mthis);
+  requestPermission_Callback_1_(__arg_0) => js.context["Notification"].callMethod("requestPermission", [__arg_0]);
 
-  static onshow_Setter(mthis, __arg_0) native "Notification_onshow_Setter";
-  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+  tag_Getter_(mthis) => mthis["tag"];
 
-  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);
+  title_Getter_(mthis) => mthis["title"];
 
 }
 
@@ -16872,724 +9339,333 @@
 class BlinkOESVertexArrayObject {
   static final instance = new BlinkOESVertexArrayObject();
 
-  static bindVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
-  bindVertexArrayOES_Callback_0_(mthis) => bindVertexArrayOES_Callback_0(mthis);
+  bindVertexArrayOES_Callback_0_(mthis) => mthis.callMethod("bindVertexArrayOES", []);
 
-  static bindVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_bindVertexArrayOES_Callback";
-  bindVertexArrayOES_Callback_1_(mthis, __arg_0) => bindVertexArrayOES_Callback_1(mthis, __arg_0);
+  bindVertexArrayOES_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindVertexArrayOES", [__arg_0]);
 
-  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);
+  createVertexArrayOES_Callback_0_(mthis) => mthis.callMethod("createVertexArrayOES", []);
 
-  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);
+  deleteVertexArrayOES_Callback_0_(mthis) => mthis.callMethod("deleteVertexArrayOES", []);
 
-  static createVertexArrayOES_Callback_0(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback";
-  createVertexArrayOES_Callback_0_(mthis) => createVertexArrayOES_Callback_0(mthis);
+  deleteVertexArrayOES_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteVertexArrayOES", [__arg_0]);
 
-  static createVertexArrayOES_Callback_1(mthis, __arg_0) native "OESVertexArrayObject_createVertexArrayOES_Callback";
-  createVertexArrayOES_Callback_1_(mthis, __arg_0) => createVertexArrayOES_Callback_1(mthis, __arg_0);
+  isVertexArrayOES_Callback_0_(mthis) => mthis.callMethod("isVertexArrayOES", []);
 
-  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);
+  isVertexArrayOES_Callback_1_(mthis, __arg_0) => mthis.callMethod("isVertexArrayOES", [__arg_0]);
 
 }
 
 class BlinkOfflineAudioCompletionEvent extends BlinkEvent {
   static final instance = new BlinkOfflineAudioCompletionEvent();
 
-  static renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
-  renderedBuffer_Getter_(mthis) => renderedBuffer_Getter(mthis);
+  renderedBuffer_Getter_(mthis) => mthis["renderedBuffer"];
 
 }
 
 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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["OfflineAudioContext"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "OfflineAudioContext_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["OfflineAudioContext"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["OfflineAudioContext"], [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkOscillatorNode extends BlinkAudioSourceNode {
   static final instance = new BlinkOscillatorNode();
 
-  static detune_Getter(mthis) native "OscillatorNode_detune_Getter";
-  detune_Getter_(mthis) => detune_Getter(mthis);
+  detune_Getter_(mthis) => mthis["detune"];
 
-  static frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
-  frequency_Getter_(mthis) => frequency_Getter(mthis);
+  frequency_Getter_(mthis) => mthis["frequency"];
 
-  static noteOff_Callback_0(mthis) native "OscillatorNode_noteOff_Callback";
-  noteOff_Callback_0_(mthis) => noteOff_Callback_0(mthis);
+  noteOff_Callback_0_(mthis) => mthis.callMethod("noteOff", []);
 
-  static noteOff_Callback_1(mthis, __arg_0) native "OscillatorNode_noteOff_Callback";
-  noteOff_Callback_1_(mthis, __arg_0) => noteOff_Callback_1(mthis, __arg_0);
+  noteOff_Callback_1_(mthis, __arg_0) => mthis.callMethod("noteOff", [__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);
+  noteOn_Callback_0_(mthis) => mthis.callMethod("noteOn", []);
 
-  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);
+  noteOn_Callback_1_(mthis, __arg_0) => mthis.callMethod("noteOn", [__arg_0]);
 
-  static noteOn_Callback_0(mthis) native "OscillatorNode_noteOn_Callback";
-  noteOn_Callback_0_(mthis) => noteOn_Callback_0(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static noteOn_Callback_1(mthis, __arg_0) native "OscillatorNode_noteOn_Callback";
-  noteOn_Callback_1_(mthis, __arg_0) => noteOn_Callback_1(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __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);
+  setPeriodicWave_Callback_0_(mthis) => mthis.callMethod("setPeriodicWave", []);
 
-  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);
+  setPeriodicWave_Callback_1_(mthis, __arg_0) => mthis.callMethod("setPeriodicWave", [__arg_0]);
 
-  static onended_Getter(mthis) native "OscillatorNode_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  start_Callback_0_(mthis) => mthis.callMethod("start", []);
 
-  static onended_Setter(mthis, __arg_0) native "OscillatorNode_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  start_Callback_1_(mthis, __arg_0) => mthis.callMethod("start", [__arg_0]);
 
-  static setPeriodicWave_Callback_0(mthis) native "OscillatorNode_setPeriodicWave_Callback";
-  setPeriodicWave_Callback_0_(mthis) => setPeriodicWave_Callback_0(mthis);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
-  static setPeriodicWave_Callback_1(mthis, __arg_0) native "OscillatorNode_setPeriodicWave_Callback";
-  setPeriodicWave_Callback_1_(mthis, __arg_0) => setPeriodicWave_Callback_1(mthis, __arg_0);
+  stop_Callback_1_(mthis, __arg_0) => mthis.callMethod("stop", [__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);
+  type_Getter_(mthis) => mthis["type"];
 
-  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, __arg_0) native "OscillatorNode_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["OverflowEvent"], [__arg_0, __arg_1]);
 
-  static horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
-  horizontalOverflow_Getter_(mthis) => horizontalOverflow_Getter(mthis);
+  horizontalOverflow_Getter_(mthis) => mthis["horizontalOverflow"];
 
-  static orient_Getter(mthis) native "OverflowEvent_orient_Getter";
-  orient_Getter_(mthis) => orient_Getter(mthis);
+  orient_Getter_(mthis) => mthis["orient"];
 
-  static verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
-  verticalOverflow_Getter_(mthis) => verticalOverflow_Getter(mthis);
+  verticalOverflow_Getter_(mthis) => mthis["verticalOverflow"];
 
 }
 
 class BlinkPagePopupController {
   static final instance = new BlinkPagePopupController();
 
-  static closePopup_Callback_0(mthis) native "PagePopupController_closePopup_Callback";
-  closePopup_Callback_0_(mthis) => closePopup_Callback_0(mthis);
+  closePopup_Callback_0_(mthis) => mthis.callMethod("closePopup", []);
 
-  static closePopup_Callback_1(mthis, __arg_0) native "PagePopupController_closePopup_Callback";
-  closePopup_Callback_1_(mthis, __arg_0) => closePopup_Callback_1(mthis, __arg_0);
+  formatMonth_Callback_0_(mthis) => mthis.callMethod("formatMonth", []);
 
-  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);
+  formatMonth_Callback_1_(mthis, __arg_0) => mthis.callMethod("formatMonth", [__arg_0]);
 
-  static formatMonth_Callback_0(mthis) native "PagePopupController_formatMonth_Callback";
-  formatMonth_Callback_0_(mthis) => formatMonth_Callback_0(mthis);
+  formatMonth_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("formatMonth", [__arg_0, __arg_1]);
 
-  static formatMonth_Callback_1(mthis, __arg_0) native "PagePopupController_formatMonth_Callback";
-  formatMonth_Callback_1_(mthis, __arg_0) => formatMonth_Callback_1(mthis, __arg_0);
+  formatShortMonth_Callback_0_(mthis) => mthis.callMethod("formatShortMonth", []);
 
-  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);
+  formatShortMonth_Callback_1_(mthis, __arg_0) => mthis.callMethod("formatShortMonth", [__arg_0]);
 
-  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);
+  formatShortMonth_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("formatShortMonth", [__arg_0, __arg_1]);
 
-  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);
+  formatWeek_Callback_1_(mthis, __arg_0) => mthis.callMethod("formatWeek", [__arg_0]);
 
-  static formatShortMonth_Callback_0(mthis) native "PagePopupController_formatShortMonth_Callback";
-  formatShortMonth_Callback_0_(mthis) => formatShortMonth_Callback_0(mthis);
+  formatWeek_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("formatWeek", [__arg_0, __arg_1]);
 
-  static formatShortMonth_Callback_1(mthis, __arg_0) native "PagePopupController_formatShortMonth_Callback";
-  formatShortMonth_Callback_1_(mthis, __arg_0) => formatShortMonth_Callback_1(mthis, __arg_0);
+  formatWeek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("formatWeek", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  histogramEnumeration_Callback_1_(mthis, __arg_0) => mthis.callMethod("histogramEnumeration", [__arg_0]);
 
-  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);
+  histogramEnumeration_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("histogramEnumeration", [__arg_0, __arg_1]);
 
-  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);
+  histogramEnumeration_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("histogramEnumeration", [__arg_0, __arg_1, __arg_2]);
 
-  static formatWeek_Callback_1(mthis, __arg_0) native "PagePopupController_formatWeek_Callback";
-  formatWeek_Callback_1_(mthis, __arg_0) => formatWeek_Callback_1(mthis, __arg_0);
+  localizeNumberString_Callback_0_(mthis) => mthis.callMethod("localizeNumberString", []);
 
-  static formatWeek_Callback_2(mthis, __arg_0, __arg_1) native "PagePopupController_formatWeek_Callback";
-  formatWeek_Callback_2_(mthis, __arg_0, __arg_1) => formatWeek_Callback_2(mthis, __arg_0, __arg_1);
+  localizeNumberString_Callback_1_(mthis, __arg_0) => mthis.callMethod("localizeNumberString", [__arg_0]);
 
-  static formatWeek_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "PagePopupController_formatWeek_Callback";
-  formatWeek_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => formatWeek_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  setValueAndClosePopup_Callback_0_(mthis) => mthis.callMethod("setValueAndClosePopup", []);
 
-  static formatWeek_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3) native "PagePopupController_formatWeek_Callback";
-  formatWeek_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => formatWeek_Callback_4(mthis, __arg_0, __arg_1, __arg_2, __arg_3);
+  setValueAndClosePopup_Callback_1_(mthis, __arg_0) => mthis.callMethod("setValueAndClosePopup", [__arg_0]);
 
-  static formatWeek_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) native "PagePopupController_formatWeek_Callback";
-  formatWeek_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => formatWeek_Callback_5(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4);
+  setValueAndClosePopup_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setValueAndClosePopup", [__arg_0, __arg_1]);
 
-  static histogramEnumeration_Callback_1(mthis, __arg_0) native "PagePopupController_histogramEnumeration_Callback";
-  histogramEnumeration_Callback_1_(mthis, __arg_0) => histogramEnumeration_Callback_1(mthis, __arg_0);
+  setValue_Callback_0_(mthis) => mthis.callMethod("setValue", []);
 
-  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);
+  setValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("setValue", [__arg_0]);
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["PageTransitionEvent"], [__arg_0, __arg_1]);
 
-  static persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
-  persisted_Getter_(mthis) => persisted_Getter(mthis);
+  persisted_Getter_(mthis) => mthis["persisted"];
 
 }
 
 class BlinkPannerNode extends BlinkAudioNode {
   static final instance = new BlinkPannerNode();
 
-  static coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
-  coneInnerAngle_Getter_(mthis) => coneInnerAngle_Getter(mthis);
+  coneInnerAngle_Getter_(mthis) => mthis["coneInnerAngle"];
 
-  static coneInnerAngle_Setter(mthis, __arg_0) native "PannerNode_coneInnerAngle_Setter";
-  coneInnerAngle_Setter_(mthis, __arg_0) => coneInnerAngle_Setter(mthis, __arg_0);
+  coneInnerAngle_Setter_(mthis, __arg_0) => mthis["coneInnerAngle"] = __arg_0;
 
-  static coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
-  coneOuterAngle_Getter_(mthis) => coneOuterAngle_Getter(mthis);
+  coneOuterAngle_Getter_(mthis) => mthis["coneOuterAngle"];
 
-  static coneOuterAngle_Setter(mthis, __arg_0) native "PannerNode_coneOuterAngle_Setter";
-  coneOuterAngle_Setter_(mthis, __arg_0) => coneOuterAngle_Setter(mthis, __arg_0);
+  coneOuterAngle_Setter_(mthis, __arg_0) => mthis["coneOuterAngle"] = __arg_0;
 
-  static coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
-  coneOuterGain_Getter_(mthis) => coneOuterGain_Getter(mthis);
+  coneOuterGain_Getter_(mthis) => mthis["coneOuterGain"];
 
-  static coneOuterGain_Setter(mthis, __arg_0) native "PannerNode_coneOuterGain_Setter";
-  coneOuterGain_Setter_(mthis, __arg_0) => coneOuterGain_Setter(mthis, __arg_0);
+  coneOuterGain_Setter_(mthis, __arg_0) => mthis["coneOuterGain"] = __arg_0;
 
-  static distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
-  distanceModel_Getter_(mthis) => distanceModel_Getter(mthis);
+  distanceModel_Getter_(mthis) => mthis["distanceModel"];
 
-  static distanceModel_Setter(mthis, __arg_0) native "PannerNode_distanceModel_Setter";
-  distanceModel_Setter_(mthis, __arg_0) => distanceModel_Setter(mthis, __arg_0);
+  distanceModel_Setter_(mthis, __arg_0) => mthis["distanceModel"] = __arg_0;
 
-  static maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
-  maxDistance_Getter_(mthis) => maxDistance_Getter(mthis);
+  maxDistance_Getter_(mthis) => mthis["maxDistance"];
 
-  static maxDistance_Setter(mthis, __arg_0) native "PannerNode_maxDistance_Setter";
-  maxDistance_Setter_(mthis, __arg_0) => maxDistance_Setter(mthis, __arg_0);
+  maxDistance_Setter_(mthis, __arg_0) => mthis["maxDistance"] = __arg_0;
 
-  static panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
-  panningModel_Getter_(mthis) => panningModel_Getter(mthis);
+  panningModel_Getter_(mthis) => mthis["panningModel"];
 
-  static panningModel_Setter(mthis, __arg_0) native "PannerNode_panningModel_Setter";
-  panningModel_Setter_(mthis, __arg_0) => panningModel_Setter(mthis, __arg_0);
+  panningModel_Setter_(mthis, __arg_0) => mthis["panningModel"] = __arg_0;
 
-  static refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
-  refDistance_Getter_(mthis) => refDistance_Getter(mthis);
+  refDistance_Getter_(mthis) => mthis["refDistance"];
 
-  static refDistance_Setter(mthis, __arg_0) native "PannerNode_refDistance_Setter";
-  refDistance_Setter_(mthis, __arg_0) => refDistance_Setter(mthis, __arg_0);
+  refDistance_Setter_(mthis, __arg_0) => mthis["refDistance"] = __arg_0;
 
-  static rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
-  rolloffFactor_Getter_(mthis) => rolloffFactor_Getter(mthis);
+  rolloffFactor_Getter_(mthis) => mthis["rolloffFactor"];
 
-  static rolloffFactor_Setter(mthis, __arg_0) native "PannerNode_rolloffFactor_Setter";
-  rolloffFactor_Setter_(mthis, __arg_0) => rolloffFactor_Setter(mthis, __arg_0);
+  rolloffFactor_Setter_(mthis, __arg_0) => mthis["rolloffFactor"] = __arg_0;
 
-  static setOrientation_Callback_1(mthis, __arg_0) native "PannerNode_setOrientation_Callback";
-  setOrientation_Callback_1_(mthis, __arg_0) => setOrientation_Callback_1(mthis, __arg_0);
+  setOrientation_Callback_1_(mthis, __arg_0) => mthis.callMethod("setOrientation", [__arg_0]);
 
-  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);
+  setOrientation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setOrientation", [__arg_0, __arg_1]);
 
-  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);
+  setOrientation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setOrientation", [__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);
+  setPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("setPosition", [__arg_0]);
 
-  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);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setPosition", [__arg_0, __arg_1]);
 
-  static setPosition_Callback_1(mthis, __arg_0) native "PannerNode_setPosition_Callback";
-  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+  setPosition_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setPosition", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setVelocity_Callback_1_(mthis, __arg_0) => mthis.callMethod("setVelocity", [__arg_0]);
 
-  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);
+  setVelocity_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setVelocity", [__arg_0, __arg_1]);
 
-  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);
+  setVelocity_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setVelocity", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkPath2D {
   static final instance = new BlinkPath2D();
 
-  static addPath_Callback_0(mthis) native "Path2D_addPath_Callback";
-  addPath_Callback_0_(mthis) => addPath_Callback_0(mthis);
+  addPath_Callback_0_(mthis) => mthis.callMethod("addPath", []);
 
-  static addPath_Callback_1(mthis, __arg_0) native "Path2D_addPath_Callback";
-  addPath_Callback_1_(mthis, __arg_0) => addPath_Callback_1(mthis, __arg_0);
+  addPath_Callback_1_(mthis, __arg_0) => mthis.callMethod("addPath", [__arg_0]);
 
-  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);
+  addPath_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addPath", [__arg_0, __arg_1]);
 
-  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);
+  arcTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  arcTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  arcTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("arcTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  arc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  arc_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  arc_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  arc_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("arc", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  bezierCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  bezierCurveTo_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  bezierCurveTo_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("bezierCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  closePath_Callback_0_(mthis) => mthis.callMethod("closePath", []);
 
-  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);
+  constructorCallback_0_() => new js.JsObject(js.context["Path2D"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Path2D"], [__arg_0]);
 
-  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);
+  ellipse_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  ellipse_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  ellipse_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  ellipse_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("ellipse", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  lineTo_Callback_0_(mthis) => mthis.callMethod("lineTo", []);
 
-  static closePath_Callback_0(mthis) native "Path2D_closePath_Callback";
-  closePath_Callback_0_(mthis) => closePath_Callback_0(mthis);
+  lineTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("lineTo", [__arg_0]);
 
-  static closePath_Callback_1(mthis, __arg_0) native "Path2D_closePath_Callback";
-  closePath_Callback_1_(mthis, __arg_0) => closePath_Callback_1(mthis, __arg_0);
+  lineTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("lineTo", [__arg_0, __arg_1]);
 
-  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);
+  moveTo_Callback_0_(mthis) => mthis.callMethod("moveTo", []);
 
-  static constructorCallback_0() native "Path2D_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  moveTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveTo", [__arg_0]);
 
-  static constructorCallback_1(__arg_0) native "Path2D_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveTo", [__arg_0, __arg_1]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Path2D_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  quadraticCurveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("quadraticCurveTo", [__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);
+  quadraticCurveTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("quadraticCurveTo", [__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);
+  quadraticCurveTo_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("quadraticCurveTo", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  rect_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("rect", [__arg_0, __arg_1]);
 
-  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);
+  rect_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("rect", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  rect_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("rect", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 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);
+  clearMarks_Callback_0_(mthis) => mthis.callMethod("clearMarks", []);
 
-  static clearMarks_Callback_1(mthis, __arg_0) native "Performance_clearMarks_Callback";
-  clearMarks_Callback_1_(mthis, __arg_0) => clearMarks_Callback_1(mthis, __arg_0);
+  clearMarks_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearMarks", [__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);
+  clearMeasures_Callback_0_(mthis) => mthis.callMethod("clearMeasures", []);
 
-  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);
+  clearMeasures_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearMeasures", [__arg_0]);
 
-  static clearMeasures_Callback_0(mthis) native "Performance_clearMeasures_Callback";
-  clearMeasures_Callback_0_(mthis) => clearMeasures_Callback_0(mthis);
+  getEntriesByName_Callback_0_(mthis) => mthis.callMethod("getEntriesByName", []);
 
-  static clearMeasures_Callback_1(mthis, __arg_0) native "Performance_clearMeasures_Callback";
-  clearMeasures_Callback_1_(mthis, __arg_0) => clearMeasures_Callback_1(mthis, __arg_0);
+  getEntriesByName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getEntriesByName", [__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);
+  getEntriesByName_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getEntriesByName", [__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);
+  getEntriesByType_Callback_0_(mthis) => mthis.callMethod("getEntriesByType", []);
 
-  static getEntriesByName_Callback_0(mthis) native "Performance_getEntriesByName_Callback";
-  getEntriesByName_Callback_0_(mthis) => getEntriesByName_Callback_0(mthis);
+  getEntriesByType_Callback_1_(mthis, __arg_0) => mthis.callMethod("getEntriesByType", [__arg_0]);
 
-  static getEntriesByName_Callback_1(mthis, __arg_0) native "Performance_getEntriesByName_Callback";
-  getEntriesByName_Callback_1_(mthis, __arg_0) => getEntriesByName_Callback_1(mthis, __arg_0);
+  getEntries_Callback_0_(mthis) => mthis.callMethod("getEntries", []);
 
-  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);
+  mark_Callback_0_(mthis) => mthis.callMethod("mark", []);
 
-  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);
+  mark_Callback_1_(mthis, __arg_0) => mthis.callMethod("mark", [__arg_0]);
 
-  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);
+  measure_Callback_0_(mthis) => mthis.callMethod("measure", []);
 
-  static getEntriesByType_Callback_0(mthis) native "Performance_getEntriesByType_Callback";
-  getEntriesByType_Callback_0_(mthis) => getEntriesByType_Callback_0(mthis);
+  measure_Callback_1_(mthis, __arg_0) => mthis.callMethod("measure", [__arg_0]);
 
-  static getEntriesByType_Callback_1(mthis, __arg_0) native "Performance_getEntriesByType_Callback";
-  getEntriesByType_Callback_1_(mthis, __arg_0) => getEntriesByType_Callback_1(mthis, __arg_0);
+  measure_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("measure", [__arg_0, __arg_1]);
 
-  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);
+  measure_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("measure", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  memory_Getter_(mthis) => mthis["memory"];
 
-  static getEntries_Callback_0(mthis) native "Performance_getEntries_Callback";
-  getEntries_Callback_0_(mthis) => getEntries_Callback_0(mthis);
+  navigation_Getter_(mthis) => mthis["navigation"];
 
-  static getEntries_Callback_1(mthis, __arg_0) native "Performance_getEntries_Callback";
-  getEntries_Callback_1_(mthis, __arg_0) => getEntries_Callback_1(mthis, __arg_0);
+  now_Callback_0_(mthis) => mthis.callMethod("now", []);
 
-  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);
+  onwebkitresourcetimingbufferfull_Getter_(mthis) => mthis["onwebkitresourcetimingbufferfull"];
 
-  static mark_Callback_0(mthis) native "Performance_mark_Callback";
-  mark_Callback_0_(mthis) => mark_Callback_0(mthis);
+  onwebkitresourcetimingbufferfull_Setter_(mthis, __arg_0) => mthis["onwebkitresourcetimingbufferfull"] = __arg_0;
 
-  static mark_Callback_1(mthis, __arg_0) native "Performance_mark_Callback";
-  mark_Callback_1_(mthis, __arg_0) => mark_Callback_1(mthis, __arg_0);
+  timing_Getter_(mthis) => mthis["timing"];
 
-  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);
+  webkitClearResourceTimings_Callback_0_(mthis) => mthis.callMethod("webkitClearResourceTimings", []);
 
-  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);
+  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => mthis.callMethod("webkitSetResourceTimingBufferSize", []);
 
-  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 webkitClearResourceTimings_Callback_0(mthis) native "Performance_webkitClearResourceTimings_Callback";
-  webkitClearResourceTimings_Callback_0_(mthis) => webkitClearResourceTimings_Callback_0(mthis);
-
-  static webkitClearResourceTimings_Callback_1(mthis, __arg_0) native "Performance_webkitClearResourceTimings_Callback";
-  webkitClearResourceTimings_Callback_1_(mthis, __arg_0) => webkitClearResourceTimings_Callback_1(mthis, __arg_0);
-
-  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 webkitSetResourceTimingBufferSize_Callback_0(mthis) native "Performance_webkitSetResourceTimingBufferSize_Callback";
-  webkitSetResourceTimingBufferSize_Callback_0_(mthis) => webkitSetResourceTimingBufferSize_Callback_0(mthis);
-
-  static webkitSetResourceTimingBufferSize_Callback_1(mthis, __arg_0) native "Performance_webkitSetResourceTimingBufferSize_Callback";
-  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => webkitSetResourceTimingBufferSize_Callback_1(mthis, __arg_0);
-
-  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 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);
+  webkitSetResourceTimingBufferSize_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitSetResourceTimingBufferSize", [__arg_0]);
 
 }
 
 class BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceEntry();
 
-  static duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
-  entryType_Getter_(mthis) => entryType_Getter(mthis);
+  entryType_Getter_(mthis) => mthis["entryType"];
 
-  static name_Getter(mthis) native "PerformanceEntry_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
-  startTime_Getter_(mthis) => startTime_Getter(mthis);
+  startTime_Getter_(mthis) => mthis["startTime"];
 
 }
 
@@ -17606,120 +9682,85 @@
 class BlinkPerformanceNavigation {
   static final instance = new BlinkPerformanceNavigation();
 
-  static redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
-  redirectCount_Getter_(mthis) => redirectCount_Getter(mthis);
+  redirectCount_Getter_(mthis) => mthis["redirectCount"];
 
-  static type_Getter(mthis) native "PerformanceNavigation_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkPerformanceResourceTiming extends BlinkPerformanceEntry {
   static final instance = new BlinkPerformanceResourceTiming();
 
-  static connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
-  connectEnd_Getter_(mthis) => connectEnd_Getter(mthis);
+  connectEnd_Getter_(mthis) => mthis["connectEnd"];
 
-  static connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
-  connectStart_Getter_(mthis) => connectStart_Getter(mthis);
+  connectStart_Getter_(mthis) => mthis["connectStart"];
 
-  static domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
-  domainLookupEnd_Getter_(mthis) => domainLookupEnd_Getter(mthis);
+  domainLookupEnd_Getter_(mthis) => mthis["domainLookupEnd"];
 
-  static domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
-  domainLookupStart_Getter_(mthis) => domainLookupStart_Getter(mthis);
+  domainLookupStart_Getter_(mthis) => mthis["domainLookupStart"];
 
-  static fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
-  fetchStart_Getter_(mthis) => fetchStart_Getter(mthis);
+  fetchStart_Getter_(mthis) => mthis["fetchStart"];
 
-  static initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
-  initiatorType_Getter_(mthis) => initiatorType_Getter(mthis);
+  initiatorType_Getter_(mthis) => mthis["initiatorType"];
 
-  static redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
-  redirectEnd_Getter_(mthis) => redirectEnd_Getter(mthis);
+  redirectEnd_Getter_(mthis) => mthis["redirectEnd"];
 
-  static redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
-  redirectStart_Getter_(mthis) => redirectStart_Getter(mthis);
+  redirectStart_Getter_(mthis) => mthis["redirectStart"];
 
-  static requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
-  requestStart_Getter_(mthis) => requestStart_Getter(mthis);
+  requestStart_Getter_(mthis) => mthis["requestStart"];
 
-  static responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
-  responseEnd_Getter_(mthis) => responseEnd_Getter(mthis);
+  responseEnd_Getter_(mthis) => mthis["responseEnd"];
 
-  static responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
-  responseStart_Getter_(mthis) => responseStart_Getter(mthis);
+  responseStart_Getter_(mthis) => mthis["responseStart"];
 
-  static secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
-  secureConnectionStart_Getter_(mthis) => secureConnectionStart_Getter(mthis);
+  secureConnectionStart_Getter_(mthis) => mthis["secureConnectionStart"];
 
 }
 
 class BlinkPerformanceTiming {
   static final instance = new BlinkPerformanceTiming();
 
-  static connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
-  connectEnd_Getter_(mthis) => connectEnd_Getter(mthis);
+  connectEnd_Getter_(mthis) => mthis["connectEnd"];
 
-  static connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
-  connectStart_Getter_(mthis) => connectStart_Getter(mthis);
+  connectStart_Getter_(mthis) => mthis["connectStart"];
 
-  static domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
-  domComplete_Getter_(mthis) => domComplete_Getter(mthis);
+  domComplete_Getter_(mthis) => mthis["domComplete"];
 
-  static domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
-  domContentLoadedEventEnd_Getter_(mthis) => domContentLoadedEventEnd_Getter(mthis);
+  domContentLoadedEventEnd_Getter_(mthis) => mthis["domContentLoadedEventEnd"];
 
-  static domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
-  domContentLoadedEventStart_Getter_(mthis) => domContentLoadedEventStart_Getter(mthis);
+  domContentLoadedEventStart_Getter_(mthis) => mthis["domContentLoadedEventStart"];
 
-  static domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
-  domInteractive_Getter_(mthis) => domInteractive_Getter(mthis);
+  domInteractive_Getter_(mthis) => mthis["domInteractive"];
 
-  static domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
-  domLoading_Getter_(mthis) => domLoading_Getter(mthis);
+  domLoading_Getter_(mthis) => mthis["domLoading"];
 
-  static domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
-  domainLookupEnd_Getter_(mthis) => domainLookupEnd_Getter(mthis);
+  domainLookupEnd_Getter_(mthis) => mthis["domainLookupEnd"];
 
-  static domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
-  domainLookupStart_Getter_(mthis) => domainLookupStart_Getter(mthis);
+  domainLookupStart_Getter_(mthis) => mthis["domainLookupStart"];
 
-  static fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
-  fetchStart_Getter_(mthis) => fetchStart_Getter(mthis);
+  fetchStart_Getter_(mthis) => mthis["fetchStart"];
 
-  static loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
-  loadEventEnd_Getter_(mthis) => loadEventEnd_Getter(mthis);
+  loadEventEnd_Getter_(mthis) => mthis["loadEventEnd"];
 
-  static loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
-  loadEventStart_Getter_(mthis) => loadEventStart_Getter(mthis);
+  loadEventStart_Getter_(mthis) => mthis["loadEventStart"];
 
-  static navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
-  navigationStart_Getter_(mthis) => navigationStart_Getter(mthis);
+  navigationStart_Getter_(mthis) => mthis["navigationStart"];
 
-  static redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
-  redirectEnd_Getter_(mthis) => redirectEnd_Getter(mthis);
+  redirectEnd_Getter_(mthis) => mthis["redirectEnd"];
 
-  static redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
-  redirectStart_Getter_(mthis) => redirectStart_Getter(mthis);
+  redirectStart_Getter_(mthis) => mthis["redirectStart"];
 
-  static requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
-  requestStart_Getter_(mthis) => requestStart_Getter(mthis);
+  requestStart_Getter_(mthis) => mthis["requestStart"];
 
-  static responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
-  responseEnd_Getter_(mthis) => responseEnd_Getter(mthis);
+  responseEnd_Getter_(mthis) => mthis["responseEnd"];
 
-  static responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
-  responseStart_Getter_(mthis) => responseStart_Getter(mthis);
+  responseStart_Getter_(mthis) => mthis["responseStart"];
 
-  static secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
-  secureConnectionStart_Getter_(mthis) => secureConnectionStart_Getter(mthis);
+  secureConnectionStart_Getter_(mthis) => mthis["secureConnectionStart"];
 
-  static unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
-  unloadEventEnd_Getter_(mthis) => unloadEventEnd_Getter(mthis);
+  unloadEventEnd_Getter_(mthis) => mthis["unloadEventEnd"];
 
-  static unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
-  unloadEventStart_Getter_(mthis) => unloadEventStart_Getter(mthis);
+  unloadEventStart_Getter_(mthis) => mthis["unloadEventStart"];
 
 }
 
@@ -17731,1471 +9772,739 @@
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static description_Getter(mthis) native "Plugin_description_Getter";
-  description_Getter_(mthis) => description_Getter(mthis);
+  description_Getter_(mthis) => mthis["description"];
 
-  static filename_Getter(mthis) native "Plugin_filename_Getter";
-  filename_Getter_(mthis) => filename_Getter(mthis);
+  filename_Getter_(mthis) => mthis["filename"];
 
-  static item_Callback_0(mthis) native "Plugin_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "Plugin_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  name_Getter_(mthis) => mthis["name"];
 
-  static length_Getter(mthis) native "Plugin_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static name_Getter(mthis) native "Plugin_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
-
-  static namedItem_Callback_0(mthis) native "Plugin_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
-
-  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_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);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "PluginArray_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "PluginArray_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static length_Getter(mthis) native "PluginArray_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__arg_0]);
 
-  static namedItem_Callback_0(mthis) native "PluginArray_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+  refresh_Callback_0_(mthis) => mthis.callMethod("refresh", []);
 
-  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_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 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);
+  refresh_Callback_1_(mthis, __arg_0) => mthis.callMethod("refresh", [__arg_0]);
 
 }
 
 class BlinkPluginPlaceholderElement extends BlinkHTMLDivElement {
   static final instance = new BlinkPluginPlaceholderElement();
 
-  static createdCallback_Callback_0(mthis) native "PluginPlaceholderElement_createdCallback_Callback";
-  createdCallback_Callback_0_(mthis) => createdCallback_Callback_0(mthis);
+  createdCallback_Callback_0_(mthis) => mthis.callMethod("createdCallback", []);
 
-  static createdCallback_Callback_1(mthis, __arg_0) native "PluginPlaceholderElement_createdCallback_Callback";
-  createdCallback_Callback_1_(mthis, __arg_0) => createdCallback_Callback_1(mthis, __arg_0);
+  message_Getter_(mthis) => mthis["message"];
 
-  static createdCallback_Callback_2(mthis, __arg_0, __arg_1) native "PluginPlaceholderElement_createdCallback_Callback";
-  createdCallback_Callback_2_(mthis, __arg_0, __arg_1) => createdCallback_Callback_2(mthis, __arg_0, __arg_1);
-
-  static message_Getter(mthis) native "PluginPlaceholderElement_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
-
-  static message_Setter(mthis, __arg_0) native "PluginPlaceholderElement_message_Setter";
-  message_Setter_(mthis, __arg_0) => message_Setter(mthis, __arg_0);
+  message_Setter_(mthis, __arg_0) => mthis["message"] = __arg_0;
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["PopStateEvent"], [__arg_0, __arg_1]);
 
-  static state_Getter(mthis) native "PopStateEvent_state_Getter";
-  state_Getter_(mthis) => state_Getter(mthis);
+  state_Getter_(mthis) => mthis["state"];
 
 }
 
 class BlinkPositionError {
   static final instance = new BlinkPositionError();
 
-  static code_Getter(mthis) native "PositionError_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
-  static message_Getter(mthis) native "PositionError_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
 }
 
 class BlinkPresentation extends BlinkEventTarget {
   static final instance = new BlinkPresentation();
 
-  static onavailablechange_Getter(mthis) native "Presentation_onavailablechange_Getter";
-  onavailablechange_Getter_(mthis) => onavailablechange_Getter(mthis);
+  onavailablechange_Getter_(mthis) => mthis["onavailablechange"];
 
-  static onavailablechange_Setter(mthis, __arg_0) native "Presentation_onavailablechange_Setter";
-  onavailablechange_Setter_(mthis, __arg_0) => onavailablechange_Setter(mthis, __arg_0);
+  onavailablechange_Setter_(mthis, __arg_0) => mthis["onavailablechange"] = __arg_0;
 
 }
 
 class BlinkProcessingInstruction extends BlinkCharacterData {
   static final instance = new BlinkProcessingInstruction();
 
-  static sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
-  sheet_Getter_(mthis) => sheet_Getter(mthis);
+  sheet_Getter_(mthis) => mthis["sheet"];
 
-  static target_Getter(mthis) native "ProcessingInstruction_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["ProgressEvent"], [__arg_0, __arg_1]);
 
-  static lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
-  lengthComputable_Getter_(mthis) => lengthComputable_Getter(mthis);
+  lengthComputable_Getter_(mthis) => mthis["lengthComputable"];
 
-  static loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
-  loaded_Getter_(mthis) => loaded_Getter(mthis);
+  loaded_Getter_(mthis) => mthis["loaded"];
 
-  static total_Getter(mthis) native "ProgressEvent_total_Getter";
-  total_Getter_(mthis) => total_Getter(mthis);
+  total_Getter_(mthis) => mthis["total"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["PushEvent"], [__arg_0, __arg_1]);
 
-  static data_Getter(mthis) native "PushEvent_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  data_Getter_(mthis) => mthis["data"];
 
 }
 
 class BlinkPushManager {
   static final instance = new BlinkPushManager();
 
-  static register_Callback_0(mthis) native "PushManager_register_Callback";
-  register_Callback_0_(mthis) => register_Callback_0(mthis);
+  register_Callback_0_(mthis) => mthis.callMethod("register", []);
 
-  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);
+  register_Callback_1_(mthis, __arg_0) => mthis.callMethod("register", [__arg_0]);
 
 }
 
 class BlinkPushRegistration {
   static final instance = new BlinkPushRegistration();
 
-  static pushEndpoint_Getter(mthis) native "PushRegistration_pushEndpoint_Getter";
-  pushEndpoint_Getter_(mthis) => pushEndpoint_Getter(mthis);
+  pushEndpoint_Getter_(mthis) => mthis["pushEndpoint"];
 
-  static pushRegistrationId_Getter(mthis) native "PushRegistration_pushRegistrationId_Getter";
-  pushRegistrationId_Getter_(mthis) => pushRegistrationId_Getter(mthis);
+  pushRegistrationId_Getter_(mthis) => mthis["pushRegistrationId"];
 
 }
 
 class BlinkRGBColor {
   static final instance = new BlinkRGBColor();
 
-  static blue_Getter(mthis) native "RGBColor_blue_Getter";
-  blue_Getter_(mthis) => blue_Getter(mthis);
+  blue_Getter_(mthis) => mthis["blue"];
 
-  static green_Getter(mthis) native "RGBColor_green_Getter";
-  green_Getter_(mthis) => green_Getter(mthis);
+  green_Getter_(mthis) => mthis["green"];
 
-  static red_Getter(mthis) native "RGBColor_red_Getter";
-  red_Getter_(mthis) => red_Getter(mthis);
+  red_Getter_(mthis) => mthis["red"];
 
 }
 
 class BlinkRTCDTMFSender extends BlinkEventTarget {
   static final instance = new BlinkRTCDTMFSender();
 
-  static canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
-  canInsertDTMF_Getter_(mthis) => canInsertDTMF_Getter(mthis);
+  canInsertDTMF_Getter_(mthis) => mthis["canInsertDTMF"];
 
-  static duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
-  duration_Getter_(mthis) => duration_Getter(mthis);
+  duration_Getter_(mthis) => mthis["duration"];
 
-  static insertDTMF_Callback_0(mthis) native "RTCDTMFSender_insertDTMF_Callback";
-  insertDTMF_Callback_0_(mthis) => insertDTMF_Callback_0(mthis);
+  insertDTMF_Callback_0_(mthis) => mthis.callMethod("insertDTMF", []);
 
-  static insertDTMF_Callback_1(mthis, __arg_0) native "RTCDTMFSender_insertDTMF_Callback";
-  insertDTMF_Callback_1_(mthis, __arg_0) => insertDTMF_Callback_1(mthis, __arg_0);
+  insertDTMF_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertDTMF", [__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);
+  insertDTMF_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertDTMF", [__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);
+  insertDTMF_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("insertDTMF", [__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);
+  interToneGap_Getter_(mthis) => mthis["interToneGap"];
 
-  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);
+  ontonechange_Getter_(mthis) => mthis["ontonechange"];
 
-  static interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
-  interToneGap_Getter_(mthis) => interToneGap_Getter(mthis);
+  ontonechange_Setter_(mthis, __arg_0) => mthis["ontonechange"] = __arg_0;
 
-  static ontonechange_Getter(mthis) native "RTCDTMFSender_ontonechange_Getter";
-  ontonechange_Getter_(mthis) => ontonechange_Getter(mthis);
+  toneBuffer_Getter_(mthis) => mthis["toneBuffer"];
 
-  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);
+  track_Getter_(mthis) => mthis["track"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["RTCDTMFToneChangeEvent"], [__arg_0, __arg_1]);
 
-  static tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
-  tone_Getter_(mthis) => tone_Getter(mthis);
+  tone_Getter_(mthis) => mthis["tone"];
 
 }
 
 class BlinkRTCDataChannel extends BlinkEventTarget {
   static final instance = new BlinkRTCDataChannel();
 
-  static binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
-  binaryType_Getter_(mthis) => binaryType_Getter(mthis);
+  binaryType_Getter_(mthis) => mthis["binaryType"];
 
-  static binaryType_Setter(mthis, __arg_0) native "RTCDataChannel_binaryType_Setter";
-  binaryType_Setter_(mthis, __arg_0) => binaryType_Setter(mthis, __arg_0);
+  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
 
-  static bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
-  bufferedAmount_Getter_(mthis) => bufferedAmount_Getter(mthis);
+  bufferedAmount_Getter_(mthis) => mthis["bufferedAmount"];
 
-  static close_Callback_0(mthis) native "RTCDataChannel_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "RTCDataChannel_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  id_Getter_(mthis) => mthis["id"];
 
-  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);
+  label_Getter_(mthis) => mthis["label"];
 
-  static id_Getter(mthis) native "RTCDataChannel_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  maxRetransmitTime_Getter_(mthis) => mthis["maxRetransmitTime"];
 
-  static label_Getter(mthis) native "RTCDataChannel_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  maxRetransmits_Getter_(mthis) => mthis["maxRetransmits"];
 
-  static maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
-  maxRetransmitTime_Getter_(mthis) => maxRetransmitTime_Getter(mthis);
+  negotiated_Getter_(mthis) => mthis["negotiated"];
 
-  static maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
-  maxRetransmits_Getter_(mthis) => maxRetransmits_Getter(mthis);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  static negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
-  negotiated_Getter_(mthis) => negotiated_Getter(mthis);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static onclose_Getter(mthis) native "RTCDataChannel_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onclose_Setter(mthis, __arg_0) native "RTCDataChannel_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "RTCDataChannel_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onerror_Setter(mthis, __arg_0) native "RTCDataChannel_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "RTCDataChannel_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  onopen_Getter_(mthis) => mthis["onopen"];
 
-  static onmessage_Setter(mthis, __arg_0) native "RTCDataChannel_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
 
-  static onopen_Getter(mthis) native "RTCDataChannel_onopen_Getter";
-  onopen_Getter_(mthis) => onopen_Getter(mthis);
+  ordered_Getter_(mthis) => mthis["ordered"];
 
-  static onopen_Setter(mthis, __arg_0) native "RTCDataChannel_onopen_Setter";
-  onopen_Setter_(mthis, __arg_0) => onopen_Setter(mthis, __arg_0);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
-  ordered_Getter_(mthis) => ordered_Getter(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  reliable_Getter_(mthis) => mthis["reliable"];
 
-  static readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  send_Callback_0_(mthis) => mthis.callMethod("send", []);
 
-  static reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
-  reliable_Getter_(mthis) => reliable_Getter(mthis);
-
-  static send_Callback_0(mthis) native "RTCDataChannel_send_Callback";
-  send_Callback_0_(mthis) => send_Callback_0(mthis);
-
-  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);
+  send_Callback_1_(mthis, __arg_0) => mthis.callMethod("send", [__arg_0]);
 
 }
 
 class BlinkRTCDataChannelEvent extends BlinkEvent {
   static final instance = new BlinkRTCDataChannelEvent();
 
-  static channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
-  channel_Getter_(mthis) => channel_Getter(mthis);
+  channel_Getter_(mthis) => mthis["channel"];
 
 }
 
 class BlinkRTCIceCandidate {
   static final instance = new BlinkRTCIceCandidate();
 
-  static candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
-  candidate_Getter_(mthis) => candidate_Getter(mthis);
+  candidate_Getter_(mthis) => mthis["candidate"];
 
-  static candidate_Setter(mthis, __arg_0) native "RTCIceCandidate_candidate_Setter";
-  candidate_Setter_(mthis, __arg_0) => candidate_Setter(mthis, __arg_0);
+  candidate_Setter_(mthis, __arg_0) => mthis["candidate"] = __arg_0;
 
-  static constructorCallback_0() native "RTCIceCandidate_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["RTCIceCandidate"], []);
 
-  static constructorCallback_1(__arg_0) native "RTCIceCandidate_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["RTCIceCandidate"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "RTCIceCandidate_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  sdpMLineIndex_Getter_(mthis) => mthis["sdpMLineIndex"];
 
-  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);
+  sdpMLineIndex_Setter_(mthis, __arg_0) => mthis["sdpMLineIndex"] = __arg_0;
 
-  static sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
-  sdpMLineIndex_Getter_(mthis) => sdpMLineIndex_Getter(mthis);
+  sdpMid_Getter_(mthis) => mthis["sdpMid"];
 
-  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, __arg_0) native "RTCIceCandidate_sdpMid_Setter";
-  sdpMid_Setter_(mthis, __arg_0) => sdpMid_Setter(mthis, __arg_0);
+  sdpMid_Setter_(mthis, __arg_0) => mthis["sdpMid"] = __arg_0;
 
 }
 
 class BlinkRTCIceCandidateEvent extends BlinkEvent {
   static final instance = new BlinkRTCIceCandidateEvent();
 
-  static candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
-  candidate_Getter_(mthis) => candidate_Getter(mthis);
+  candidate_Getter_(mthis) => mthis["candidate"];
 
 }
 
 class BlinkRTCPeerConnection extends BlinkEventTarget {
   static final instance = new BlinkRTCPeerConnection();
 
-  static addIceCandidate_Callback_1(mthis, __arg_0) native "RTCPeerConnection_addIceCandidate_Callback";
-  addIceCandidate_Callback_1_(mthis, __arg_0) => addIceCandidate_Callback_1(mthis, __arg_0);
+  addIceCandidate_Callback_1_(mthis, __arg_0) => mthis.callMethod("addIceCandidate", [__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);
+  addIceCandidate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addIceCandidate", [__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);
+  addIceCandidate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("addIceCandidate", [__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);
+  addStream_Callback_0_(mthis) => mthis.callMethod("addStream", []);
 
-  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);
+  addStream_Callback_1_(mthis, __arg_0) => mthis.callMethod("addStream", [__arg_0]);
 
-  static addStream_Callback_0(mthis) native "RTCPeerConnection_addStream_Callback";
-  addStream_Callback_0_(mthis) => addStream_Callback_0(mthis);
+  addStream_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addStream", [__arg_0, __arg_1]);
 
-  static addStream_Callback_1(mthis, __arg_0) native "RTCPeerConnection_addStream_Callback";
-  addStream_Callback_1_(mthis, __arg_0) => addStream_Callback_1(mthis, __arg_0);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  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);
+  constructorCallback_0_() => new js.JsObject(js.context["webkitRTCPeerConnection"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["webkitRTCPeerConnection"], [__arg_0]);
 
-  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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["webkitRTCPeerConnection"], [__arg_0, __arg_1]);
 
-  static close_Callback_0(mthis) native "RTCPeerConnection_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  createAnswer_Callback_0_(mthis) => mthis.callMethod("createAnswer", []);
 
-  static close_Callback_1(mthis, __arg_0) native "RTCPeerConnection_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  createAnswer_Callback_1_(mthis, __arg_0) => mthis.callMethod("createAnswer", [__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);
+  createAnswer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createAnswer", [__arg_0, __arg_1]);
 
-  static constructorCallback_0() native "RTCPeerConnection_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  createAnswer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createAnswer", [__arg_0, __arg_1, __arg_2]);
 
-  static constructorCallback_1(__arg_0) native "RTCPeerConnection_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  createDTMFSender_Callback_0_(mthis) => mthis.callMethod("createDTMFSender", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "RTCPeerConnection_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  createDTMFSender_Callback_1_(mthis, __arg_0) => mthis.callMethod("createDTMFSender", [__arg_0]);
 
-  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);
+  createDataChannel_Callback_0_(mthis) => mthis.callMethod("createDataChannel", []);
 
-  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);
+  createDataChannel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createDataChannel", [__arg_0]);
 
-  static createAnswer_Callback_0(mthis) native "RTCPeerConnection_createAnswer_Callback";
-  createAnswer_Callback_0_(mthis) => createAnswer_Callback_0(mthis);
+  createDataChannel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createDataChannel", [__arg_0, __arg_1]);
 
-  static createAnswer_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createAnswer_Callback";
-  createAnswer_Callback_1_(mthis, __arg_0) => createAnswer_Callback_1(mthis, __arg_0);
+  createOffer_Callback_0_(mthis) => mthis.callMethod("createOffer", []);
 
-  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);
+  createOffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("createOffer", [__arg_0]);
 
-  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);
+  createOffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createOffer", [__arg_0, __arg_1]);
 
-  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);
+  createOffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createOffer", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  getLocalStreams_Callback_0_(mthis) => mthis.callMethod("getLocalStreams", []);
 
-  static createDTMFSender_Callback_0(mthis) native "RTCPeerConnection_createDTMFSender_Callback";
-  createDTMFSender_Callback_0_(mthis) => createDTMFSender_Callback_0(mthis);
+  getRemoteStreams_Callback_0_(mthis) => mthis.callMethod("getRemoteStreams", []);
 
-  static createDTMFSender_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createDTMFSender_Callback";
-  createDTMFSender_Callback_1_(mthis, __arg_0) => createDTMFSender_Callback_1(mthis, __arg_0);
+  getStats_Callback_0_(mthis) => mthis.callMethod("getStats", []);
 
-  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);
+  getStats_Callback_1_(mthis, __arg_0) => mthis.callMethod("getStats", [__arg_0]);
 
-  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);
+  getStats_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getStats", [__arg_0, __arg_1]);
 
-  static createDataChannel_Callback_0(mthis) native "RTCPeerConnection_createDataChannel_Callback";
-  createDataChannel_Callback_0_(mthis) => createDataChannel_Callback_0(mthis);
+  getStreamById_Callback_0_(mthis) => mthis.callMethod("getStreamById", []);
 
-  static createDataChannel_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createDataChannel_Callback";
-  createDataChannel_Callback_1_(mthis, __arg_0) => createDataChannel_Callback_1(mthis, __arg_0);
+  getStreamById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getStreamById", [__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);
+  iceConnectionState_Getter_(mthis) => mthis["iceConnectionState"];
 
-  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);
+  iceGatheringState_Getter_(mthis) => mthis["iceGatheringState"];
 
-  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);
+  localDescription_Getter_(mthis) => mthis["localDescription"];
 
-  static createOffer_Callback_0(mthis) native "RTCPeerConnection_createOffer_Callback";
-  createOffer_Callback_0_(mthis) => createOffer_Callback_0(mthis);
+  onaddstream_Getter_(mthis) => mthis["onaddstream"];
 
-  static createOffer_Callback_1(mthis, __arg_0) native "RTCPeerConnection_createOffer_Callback";
-  createOffer_Callback_1_(mthis, __arg_0) => createOffer_Callback_1(mthis, __arg_0);
+  onaddstream_Setter_(mthis, __arg_0) => mthis["onaddstream"] = __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);
+  ondatachannel_Getter_(mthis) => mthis["ondatachannel"];
 
-  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);
+  ondatachannel_Setter_(mthis, __arg_0) => mthis["ondatachannel"] = __arg_0;
 
-  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);
+  onicecandidate_Getter_(mthis) => mthis["onicecandidate"];
 
-  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);
+  onicecandidate_Setter_(mthis, __arg_0) => mthis["onicecandidate"] = __arg_0;
 
-  static getLocalStreams_Callback_0(mthis) native "RTCPeerConnection_getLocalStreams_Callback";
-  getLocalStreams_Callback_0_(mthis) => getLocalStreams_Callback_0(mthis);
+  oniceconnectionstatechange_Getter_(mthis) => mthis["oniceconnectionstatechange"];
 
-  static getLocalStreams_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getLocalStreams_Callback";
-  getLocalStreams_Callback_1_(mthis, __arg_0) => getLocalStreams_Callback_1(mthis, __arg_0);
+  oniceconnectionstatechange_Setter_(mthis, __arg_0) => mthis["oniceconnectionstatechange"] = __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);
+  onnegotiationneeded_Getter_(mthis) => mthis["onnegotiationneeded"];
 
-  static getRemoteStreams_Callback_0(mthis) native "RTCPeerConnection_getRemoteStreams_Callback";
-  getRemoteStreams_Callback_0_(mthis) => getRemoteStreams_Callback_0(mthis);
+  onnegotiationneeded_Setter_(mthis, __arg_0) => mthis["onnegotiationneeded"] = __arg_0;
 
-  static getRemoteStreams_Callback_1(mthis, __arg_0) native "RTCPeerConnection_getRemoteStreams_Callback";
-  getRemoteStreams_Callback_1_(mthis, __arg_0) => getRemoteStreams_Callback_1(mthis, __arg_0);
+  onremovestream_Getter_(mthis) => mthis["onremovestream"];
 
-  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);
+  onremovestream_Setter_(mthis, __arg_0) => mthis["onremovestream"] = __arg_0;
 
-  static getStats_Callback_0(mthis) native "RTCPeerConnection_getStats_Callback";
-  getStats_Callback_0_(mthis) => getStats_Callback_0(mthis);
+  onsignalingstatechange_Getter_(mthis) => mthis["onsignalingstatechange"];
 
-  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);
+  onsignalingstatechange_Setter_(mthis, __arg_0) => mthis["onsignalingstatechange"] = __arg_0;
 
-  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);
+  remoteDescription_Getter_(mthis) => mthis["remoteDescription"];
 
-  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);
+  removeStream_Callback_0_(mthis) => mthis.callMethod("removeStream", []);
 
-  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);
+  removeStream_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeStream", [__arg_0]);
 
-  static setRemoteDescription_Callback_0(mthis) native "RTCPeerConnection_setRemoteDescription_Callback";
-  setRemoteDescription_Callback_0_(mthis) => setRemoteDescription_Callback_0(mthis);
+  setLocalDescription_Callback_0_(mthis) => mthis.callMethod("setLocalDescription", []);
 
-  static setRemoteDescription_Callback_1(mthis, __arg_0) native "RTCPeerConnection_setRemoteDescription_Callback";
-  setRemoteDescription_Callback_1_(mthis, __arg_0) => setRemoteDescription_Callback_1(mthis, __arg_0);
+  setLocalDescription_Callback_1_(mthis, __arg_0) => mthis.callMethod("setLocalDescription", [__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);
+  setLocalDescription_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setLocalDescription", [__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);
+  setLocalDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setLocalDescription", [__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);
+  setRemoteDescription_Callback_0_(mthis) => mthis.callMethod("setRemoteDescription", []);
 
-  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);
+  setRemoteDescription_Callback_1_(mthis, __arg_0) => mthis.callMethod("setRemoteDescription", [__arg_0]);
 
-  static signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
-  signalingState_Getter_(mthis) => signalingState_Getter(mthis);
+  setRemoteDescription_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setRemoteDescription", [__arg_0, __arg_1]);
 
-  static updateIce_Callback_0(mthis) native "RTCPeerConnection_updateIce_Callback";
-  updateIce_Callback_0_(mthis) => updateIce_Callback_0(mthis);
+  setRemoteDescription_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setRemoteDescription", [__arg_0, __arg_1, __arg_2]);
 
-  static updateIce_Callback_1(mthis, __arg_0) native "RTCPeerConnection_updateIce_Callback";
-  updateIce_Callback_1_(mthis, __arg_0) => updateIce_Callback_1(mthis, __arg_0);
+  signalingState_Getter_(mthis) => mthis["signalingState"];
 
-  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);
+  updateIce_Callback_0_(mthis) => mthis.callMethod("updateIce", []);
 
-  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);
+  updateIce_Callback_1_(mthis, __arg_0) => mthis.callMethod("updateIce", [__arg_0]);
 
-  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);
+  updateIce_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("updateIce", [__arg_0, __arg_1]);
 
 }
 
 class BlinkRTCSessionDescription {
   static final instance = new BlinkRTCSessionDescription();
 
-  static constructorCallback_0() native "RTCSessionDescription_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["RTCSessionDescription"], []);
 
-  static constructorCallback_1(__arg_0) native "RTCSessionDescription_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["RTCSessionDescription"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "RTCSessionDescription_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  sdp_Getter_(mthis) => mthis["sdp"];
 
-  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);
+  sdp_Setter_(mthis, __arg_0) => mthis["sdp"] = __arg_0;
 
-  static sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
-  sdp_Getter_(mthis) => sdp_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  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, __arg_0) native "RTCSessionDescription_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
 class BlinkRTCStatsReport {
   static final instance = new BlinkRTCStatsReport();
 
-  static id_Getter(mthis) native "RTCStatsReport_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static local_Getter(mthis) native "RTCStatsReport_local_Getter";
-  local_Getter_(mthis) => local_Getter(mthis);
+  local_Getter_(mthis) => mthis["local"];
 
-  static names_Callback_0(mthis) native "RTCStatsReport_names_Callback";
-  names_Callback_0_(mthis) => names_Callback_0(mthis);
+  names_Callback_0_(mthis) => mthis.callMethod("names", []);
 
-  static names_Callback_1(mthis, __arg_0) native "RTCStatsReport_names_Callback";
-  names_Callback_1_(mthis, __arg_0) => names_Callback_1(mthis, __arg_0);
+  remote_Getter_(mthis) => mthis["remote"];
 
-  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);
+  stat_Callback_0_(mthis) => mthis.callMethod("stat", []);
 
-  static remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
-  remote_Getter_(mthis) => remote_Getter(mthis);
+  stat_Callback_1_(mthis, __arg_0) => mthis.callMethod("stat", [__arg_0]);
 
-  static stat_Callback_0(mthis) native "RTCStatsReport_stat_Callback";
-  stat_Callback_0_(mthis) => stat_Callback_0(mthis);
+  timestamp_Getter_(mthis) => mthis["timestamp"];
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkRTCStatsResponse {
   static final instance = new BlinkRTCStatsResponse();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "RTCStatsResponse___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static namedItem_Callback_0(mthis) native "RTCStatsResponse_namedItem_Callback";
-  namedItem_Callback_0_(mthis) => namedItem_Callback_0(mthis);
+  namedItem_Callback_0_(mthis) => mthis.callMethod("namedItem", []);
 
-  static namedItem_Callback_1(mthis, __arg_0) native "RTCStatsResponse_namedItem_Callback";
-  namedItem_Callback_1_(mthis, __arg_0) => namedItem_Callback_1(mthis, __arg_0);
+  namedItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("namedItem", [__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);
+  result_Callback_0_(mthis) => mthis.callMethod("result", []);
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static value_Getter(mthis) native "RadioNodeList_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "RadioNodeList_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __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);
+  cloneContents_Callback_0_(mthis) => mthis.callMethod("cloneContents", []);
 
-  static cloneContents_Callback_1(mthis, __arg_0) native "Range_cloneContents_Callback";
-  cloneContents_Callback_1_(mthis, __arg_0) => cloneContents_Callback_1(mthis, __arg_0);
+  cloneRange_Callback_0_(mthis) => mthis.callMethod("cloneRange", []);
 
-  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);
+  collapse_Callback_0_(mthis) => mthis.callMethod("collapse", []);
 
-  static cloneRange_Callback_0(mthis) native "Range_cloneRange_Callback";
-  cloneRange_Callback_0_(mthis) => cloneRange_Callback_0(mthis);
+  collapse_Callback_1_(mthis, __arg_0) => mthis.callMethod("collapse", [__arg_0]);
 
-  static cloneRange_Callback_1(mthis, __arg_0) native "Range_cloneRange_Callback";
-  cloneRange_Callback_1_(mthis, __arg_0) => cloneRange_Callback_1(mthis, __arg_0);
+  collapsed_Getter_(mthis) => mthis["collapsed"];
 
-  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);
+  commonAncestorContainer_Getter_(mthis) => mthis["commonAncestorContainer"];
 
-  static collapse_Callback_0(mthis) native "Range_collapse_Callback";
-  collapse_Callback_0_(mthis) => collapse_Callback_0(mthis);
+  compareBoundaryPoints_Callback_0_(mthis) => mthis.callMethod("compareBoundaryPoints", []);
 
-  static collapse_Callback_1(mthis, __arg_0) native "Range_collapse_Callback";
-  collapse_Callback_1_(mthis, __arg_0) => collapse_Callback_1(mthis, __arg_0);
+  compareBoundaryPoints_Callback_1_(mthis, __arg_0) => mthis.callMethod("compareBoundaryPoints", [__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);
+  compareBoundaryPoints_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("compareBoundaryPoints", [__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);
+  compareNode_Callback_0_(mthis) => mthis.callMethod("compareNode", []);
 
-  static collapsed_Getter(mthis) native "Range_collapsed_Getter";
-  collapsed_Getter_(mthis) => collapsed_Getter(mthis);
+  compareNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("compareNode", [__arg_0]);
 
-  static commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
-  commonAncestorContainer_Getter_(mthis) => commonAncestorContainer_Getter(mthis);
+  comparePoint_Callback_0_(mthis) => mthis.callMethod("comparePoint", []);
 
-  static compareBoundaryPoints_Callback_0(mthis) native "Range_compareBoundaryPoints_Callback";
-  compareBoundaryPoints_Callback_0_(mthis) => compareBoundaryPoints_Callback_0(mthis);
+  comparePoint_Callback_1_(mthis, __arg_0) => mthis.callMethod("comparePoint", [__arg_0]);
 
-  static compareBoundaryPoints_Callback_1(mthis, __arg_0) native "Range_compareBoundaryPoints_Callback";
-  compareBoundaryPoints_Callback_1_(mthis, __arg_0) => compareBoundaryPoints_Callback_1(mthis, __arg_0);
+  comparePoint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("comparePoint", [__arg_0, __arg_1]);
 
-  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);
+  constructorCallback_0_() => new js.JsObject(js.context["Range"], []);
 
-  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);
+  createContextualFragment_Callback_0_(mthis) => mthis.callMethod("createContextualFragment", []);
 
-  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);
+  createContextualFragment_Callback_1_(mthis, __arg_0) => mthis.callMethod("createContextualFragment", [__arg_0]);
 
-  static compareNode_Callback_0(mthis) native "Range_compareNode_Callback";
-  compareNode_Callback_0_(mthis) => compareNode_Callback_0(mthis);
+  deleteContents_Callback_0_(mthis) => mthis.callMethod("deleteContents", []);
 
-  static compareNode_Callback_1(mthis, __arg_0) native "Range_compareNode_Callback";
-  compareNode_Callback_1_(mthis, __arg_0) => compareNode_Callback_1(mthis, __arg_0);
+  detach_Callback_0_(mthis) => mthis.callMethod("detach", []);
 
-  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);
+  endContainer_Getter_(mthis) => mthis["endContainer"];
 
-  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);
+  endOffset_Getter_(mthis) => mthis["endOffset"];
 
-  static comparePoint_Callback_0(mthis) native "Range_comparePoint_Callback";
-  comparePoint_Callback_0_(mthis) => comparePoint_Callback_0(mthis);
+  expand_Callback_0_(mthis) => mthis.callMethod("expand", []);
 
-  static comparePoint_Callback_1(mthis, __arg_0) native "Range_comparePoint_Callback";
-  comparePoint_Callback_1_(mthis, __arg_0) => comparePoint_Callback_1(mthis, __arg_0);
+  expand_Callback_1_(mthis, __arg_0) => mthis.callMethod("expand", [__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);
+  extractContents_Callback_0_(mthis) => mthis.callMethod("extractContents", []);
 
-  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);
+  getBoundingClientRect_Callback_0_(mthis) => mthis.callMethod("getBoundingClientRect", []);
 
-  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);
+  getClientRects_Callback_0_(mthis) => mthis.callMethod("getClientRects", []);
 
-  static constructorCallback_0() native "Range_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  insertNode_Callback_0_(mthis) => mthis.callMethod("insertNode", []);
 
-  static constructorCallback_1(__arg_0) native "Range_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  insertNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertNode", [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Range_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  intersectsNode_Callback_0_(mthis) => mthis.callMethod("intersectsNode", []);
 
-  static createContextualFragment_Callback_0(mthis) native "Range_createContextualFragment_Callback";
-  createContextualFragment_Callback_0_(mthis) => createContextualFragment_Callback_0(mthis);
+  intersectsNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("intersectsNode", [__arg_0]);
 
-  static createContextualFragment_Callback_1(mthis, __arg_0) native "Range_createContextualFragment_Callback";
-  createContextualFragment_Callback_1_(mthis, __arg_0) => createContextualFragment_Callback_1(mthis, __arg_0);
+  isPointInRange_Callback_0_(mthis) => mthis.callMethod("isPointInRange", []);
 
-  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);
+  isPointInRange_Callback_1_(mthis, __arg_0) => mthis.callMethod("isPointInRange", [__arg_0]);
 
-  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);
+  isPointInRange_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("isPointInRange", [__arg_0, __arg_1]);
 
-  static deleteContents_Callback_0(mthis) native "Range_deleteContents_Callback";
-  deleteContents_Callback_0_(mthis) => deleteContents_Callback_0(mthis);
+  selectNodeContents_Callback_0_(mthis) => mthis.callMethod("selectNodeContents", []);
 
-  static deleteContents_Callback_1(mthis, __arg_0) native "Range_deleteContents_Callback";
-  deleteContents_Callback_1_(mthis, __arg_0) => deleteContents_Callback_1(mthis, __arg_0);
+  selectNodeContents_Callback_1_(mthis, __arg_0) => mthis.callMethod("selectNodeContents", [__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);
+  selectNode_Callback_0_(mthis) => mthis.callMethod("selectNode", []);
 
-  static detach_Callback_0(mthis) native "Range_detach_Callback";
-  detach_Callback_0_(mthis) => detach_Callback_0(mthis);
+  selectNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("selectNode", [__arg_0]);
 
-  static detach_Callback_1(mthis, __arg_0) native "Range_detach_Callback";
-  detach_Callback_1_(mthis, __arg_0) => detach_Callback_1(mthis, __arg_0);
+  setEndAfter_Callback_0_(mthis) => mthis.callMethod("setEndAfter", []);
 
-  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);
+  setEndAfter_Callback_1_(mthis, __arg_0) => mthis.callMethod("setEndAfter", [__arg_0]);
 
-  static endContainer_Getter(mthis) native "Range_endContainer_Getter";
-  endContainer_Getter_(mthis) => endContainer_Getter(mthis);
+  setEndBefore_Callback_0_(mthis) => mthis.callMethod("setEndBefore", []);
 
-  static endOffset_Getter(mthis) native "Range_endOffset_Getter";
-  endOffset_Getter_(mthis) => endOffset_Getter(mthis);
+  setEndBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("setEndBefore", [__arg_0]);
 
-  static expand_Callback_0(mthis) native "Range_expand_Callback";
-  expand_Callback_0_(mthis) => expand_Callback_0(mthis);
+  setEnd_Callback_0_(mthis) => mthis.callMethod("setEnd", []);
 
-  static expand_Callback_1(mthis, __arg_0) native "Range_expand_Callback";
-  expand_Callback_1_(mthis, __arg_0) => expand_Callback_1(mthis, __arg_0);
+  setEnd_Callback_1_(mthis, __arg_0) => mthis.callMethod("setEnd", [__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);
+  setEnd_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setEnd", [__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);
+  setStartAfter_Callback_0_(mthis) => mthis.callMethod("setStartAfter", []);
 
-  static extractContents_Callback_0(mthis) native "Range_extractContents_Callback";
-  extractContents_Callback_0_(mthis) => extractContents_Callback_0(mthis);
+  setStartAfter_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStartAfter", [__arg_0]);
 
-  static extractContents_Callback_1(mthis, __arg_0) native "Range_extractContents_Callback";
-  extractContents_Callback_1_(mthis, __arg_0) => extractContents_Callback_1(mthis, __arg_0);
+  setStartBefore_Callback_0_(mthis) => mthis.callMethod("setStartBefore", []);
 
-  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);
+  setStartBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStartBefore", [__arg_0]);
 
-  static getBoundingClientRect_Callback_0(mthis) native "Range_getBoundingClientRect_Callback";
-  getBoundingClientRect_Callback_0_(mthis) => getBoundingClientRect_Callback_0(mthis);
+  setStart_Callback_0_(mthis) => mthis.callMethod("setStart", []);
 
-  static getBoundingClientRect_Callback_1(mthis, __arg_0) native "Range_getBoundingClientRect_Callback";
-  getBoundingClientRect_Callback_1_(mthis, __arg_0) => getBoundingClientRect_Callback_1(mthis, __arg_0);
+  setStart_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStart", [__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);
+  setStart_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setStart", [__arg_0, __arg_1]);
 
-  static getClientRects_Callback_0(mthis) native "Range_getClientRects_Callback";
-  getClientRects_Callback_0_(mthis) => getClientRects_Callback_0(mthis);
+  startContainer_Getter_(mthis) => mthis["startContainer"];
 
-  static getClientRects_Callback_1(mthis, __arg_0) native "Range_getClientRects_Callback";
-  getClientRects_Callback_1_(mthis, __arg_0) => getClientRects_Callback_1(mthis, __arg_0);
+  startOffset_Getter_(mthis) => mthis["startOffset"];
 
-  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 surroundContents_Callback_0(mthis) native "Range_surroundContents_Callback";
-  surroundContents_Callback_0_(mthis) => surroundContents_Callback_0(mthis);
-
-  static surroundContents_Callback_1(mthis, __arg_0) native "Range_surroundContents_Callback";
-  surroundContents_Callback_1_(mthis, __arg_0) => surroundContents_Callback_1(mthis, __arg_0);
-
-  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);
+  surroundContents_Callback_0_(mthis) => mthis.callMethod("surroundContents", []);
 
-  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);
+  surroundContents_Callback_1_(mthis, __arg_0) => mthis.callMethod("surroundContents", [__arg_0]);
 
 }
 
 class BlinkReadableStream {
   static final instance = new BlinkReadableStream();
 
-  static cancel_Callback_0(mthis) native "ReadableStream_cancel_Callback";
-  cancel_Callback_0_(mthis) => cancel_Callback_0(mthis);
+  cancel_Callback_0_(mthis) => mthis.callMethod("cancel", []);
 
-  static cancel_Callback_1(mthis, __arg_0) native "ReadableStream_cancel_Callback";
-  cancel_Callback_1_(mthis, __arg_0) => cancel_Callback_1(mthis, __arg_0);
+  cancel_Callback_1_(mthis, __arg_0) => mthis.callMethod("cancel", [__arg_0]);
 
-  static cancel_Callback_2(mthis, __arg_0, __arg_1) native "ReadableStream_cancel_Callback";
-  cancel_Callback_2_(mthis, __arg_0, __arg_1) => cancel_Callback_2(mthis, __arg_0, __arg_1);
+  closed_Getter_(mthis) => mthis["closed"];
 
-  static cancel_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ReadableStream_cancel_Callback";
-  cancel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => cancel_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  read_Callback_0_(mthis) => mthis.callMethod("read", []);
 
-  static closed_Getter(mthis) native "ReadableStream_closed_Getter";
-  closed_Getter_(mthis) => closed_Getter(mthis);
+  state_Getter_(mthis) => mthis["state"];
 
-  static read_Callback_0(mthis) native "ReadableStream_read_Callback";
-  read_Callback_0_(mthis) => read_Callback_0(mthis);
-
-  static read_Callback_1(mthis, __arg_0) native "ReadableStream_read_Callback";
-  read_Callback_1_(mthis, __arg_0) => read_Callback_1(mthis, __arg_0);
-
-  static read_Callback_2(mthis, __arg_0, __arg_1) native "ReadableStream_read_Callback";
-  read_Callback_2_(mthis, __arg_0, __arg_1) => read_Callback_2(mthis, __arg_0, __arg_1);
-
-  static state_Getter(mthis) native "ReadableStream_state_Getter";
-  state_Getter_(mthis) => state_Getter(mthis);
-
-  static wait_Callback_0(mthis) native "ReadableStream_wait_Callback";
-  wait_Callback_0_(mthis) => wait_Callback_0(mthis);
-
-  static wait_Callback_1(mthis, __arg_0) native "ReadableStream_wait_Callback";
-  wait_Callback_1_(mthis, __arg_0) => wait_Callback_1(mthis, __arg_0);
-
-  static wait_Callback_2(mthis, __arg_0, __arg_1) native "ReadableStream_wait_Callback";
-  wait_Callback_2_(mthis, __arg_0, __arg_1) => wait_Callback_2(mthis, __arg_0, __arg_1);
+  wait_Callback_0_(mthis) => mthis.callMethod("wait", []);
 
 }
 
 class BlinkRect {
   static final instance = new BlinkRect();
 
-  static bottom_Getter(mthis) native "Rect_bottom_Getter";
-  bottom_Getter_(mthis) => bottom_Getter(mthis);
+  bottom_Getter_(mthis) => mthis["bottom"];
 
-  static left_Getter(mthis) native "Rect_left_Getter";
-  left_Getter_(mthis) => left_Getter(mthis);
+  left_Getter_(mthis) => mthis["left"];
 
-  static right_Getter(mthis) native "Rect_right_Getter";
-  right_Getter_(mthis) => right_Getter(mthis);
+  right_Getter_(mthis) => mthis["right"];
 
-  static top_Getter(mthis) native "Rect_top_Getter";
-  top_Getter_(mthis) => top_Getter(mthis);
+  top_Getter_(mthis) => mthis["top"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["RelatedEvent"], [__arg_0, __arg_1]);
 
-  static relatedTarget_Getter(mthis) native "RelatedEvent_relatedTarget_Getter";
-  relatedTarget_Getter_(mthis) => relatedTarget_Getter(mthis);
+  relatedTarget_Getter_(mthis) => mthis["relatedTarget"];
 
 }
 
 class BlinkRequest {
   static final instance = new BlinkRequest();
 
-  static arrayBuffer_Callback_0(mthis) native "Request_arrayBuffer_Callback";
-  arrayBuffer_Callback_0_(mthis) => arrayBuffer_Callback_0(mthis);
+  arrayBuffer_Callback_0_(mthis) => mthis.callMethod("arrayBuffer", []);
 
-  static arrayBuffer_Callback_1(mthis, __arg_0) native "Request_arrayBuffer_Callback";
-  arrayBuffer_Callback_1_(mthis, __arg_0) => arrayBuffer_Callback_1(mthis, __arg_0);
+  blob_Callback_0_(mthis) => mthis.callMethod("blob", []);
 
-  static arrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "Request_arrayBuffer_Callback";
-  arrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => arrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+  bodyUsed_Getter_(mthis) => mthis["bodyUsed"];
 
-  static blob_Callback_0(mthis) native "Request_blob_Callback";
-  blob_Callback_0_(mthis) => blob_Callback_0(mthis);
+  clone_Callback_0_(mthis) => mthis.callMethod("clone", []);
 
-  static blob_Callback_1(mthis, __arg_0) native "Request_blob_Callback";
-  blob_Callback_1_(mthis, __arg_0) => blob_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["Request"], []);
 
-  static blob_Callback_2(mthis, __arg_0, __arg_1) native "Request_blob_Callback";
-  blob_Callback_2_(mthis, __arg_0, __arg_1) => blob_Callback_2(mthis, __arg_0, __arg_1);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Request"], [__arg_0]);
 
-  static bodyUsed_Getter(mthis) native "Request_bodyUsed_Getter";
-  bodyUsed_Getter_(mthis) => bodyUsed_Getter(mthis);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Request"], [__arg_0, __arg_1]);
 
-  static clone_Callback_0(mthis) native "Request_clone_Callback";
-  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+  credentials_Getter_(mthis) => mthis["credentials"];
 
-  static clone_Callback_1(mthis, __arg_0) native "Request_clone_Callback";
-  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+  headers_Getter_(mthis) => mthis["headers"];
 
-  static clone_Callback_2(mthis, __arg_0, __arg_1) native "Request_clone_Callback";
-  clone_Callback_2_(mthis, __arg_0, __arg_1) => clone_Callback_2(mthis, __arg_0, __arg_1);
+  json_Callback_0_(mthis) => mthis.callMethod("json", []);
 
-  static constructorCallback_0() native "Request_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  method_Getter_(mthis) => mthis["method"];
 
-  static constructorCallback_1(__arg_0) native "Request_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  mode_Getter_(mthis) => mthis["mode"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Request_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  referrer_Getter_(mthis) => mthis["referrer"];
 
-  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);
+  text_Callback_0_(mthis) => mthis.callMethod("text", []);
 
-  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 json_Callback_0(mthis) native "Request_json_Callback";
-  json_Callback_0_(mthis) => json_Callback_0(mthis);
-
-  static json_Callback_1(mthis, __arg_0) native "Request_json_Callback";
-  json_Callback_1_(mthis, __arg_0) => json_Callback_1(mthis, __arg_0);
-
-  static json_Callback_2(mthis, __arg_0, __arg_1) native "Request_json_Callback";
-  json_Callback_2_(mthis, __arg_0, __arg_1) => json_Callback_2(mthis, __arg_0, __arg_1);
-
-  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 text_Callback_0(mthis) native "Request_text_Callback";
-  text_Callback_0_(mthis) => text_Callback_0(mthis);
-
-  static text_Callback_1(mthis, __arg_0) native "Request_text_Callback";
-  text_Callback_1_(mthis, __arg_0) => text_Callback_1(mthis, __arg_0);
-
-  static text_Callback_2(mthis, __arg_0, __arg_1) native "Request_text_Callback";
-  text_Callback_2_(mthis, __arg_0, __arg_1) => text_Callback_2(mthis, __arg_0, __arg_1);
-
-  static url_Getter(mthis) native "Request_url_Getter";
-  url_Getter_(mthis) => url_Getter(mthis);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 class BlinkResourceProgressEvent extends BlinkProgressEvent {
   static final instance = new BlinkResourceProgressEvent();
 
-  static url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
-  url_Getter_(mthis) => url_Getter(mthis);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 class BlinkResponse {
   static final instance = new BlinkResponse();
 
-  static arrayBuffer_Callback_0(mthis) native "Response_arrayBuffer_Callback";
-  arrayBuffer_Callback_0_(mthis) => arrayBuffer_Callback_0(mthis);
+  arrayBuffer_Callback_0_(mthis) => mthis.callMethod("arrayBuffer", []);
 
-  static arrayBuffer_Callback_1(mthis, __arg_0) native "Response_arrayBuffer_Callback";
-  arrayBuffer_Callback_1_(mthis, __arg_0) => arrayBuffer_Callback_1(mthis, __arg_0);
+  blob_Callback_0_(mthis) => mthis.callMethod("blob", []);
 
-  static arrayBuffer_Callback_2(mthis, __arg_0, __arg_1) native "Response_arrayBuffer_Callback";
-  arrayBuffer_Callback_2_(mthis, __arg_0, __arg_1) => arrayBuffer_Callback_2(mthis, __arg_0, __arg_1);
+  bodyUsed_Getter_(mthis) => mthis["bodyUsed"];
 
-  static blob_Callback_0(mthis) native "Response_blob_Callback";
-  blob_Callback_0_(mthis) => blob_Callback_0(mthis);
+  clone_Callback_0_(mthis) => mthis.callMethod("clone", []);
 
-  static blob_Callback_1(mthis, __arg_0) native "Response_blob_Callback";
-  blob_Callback_1_(mthis, __arg_0) => blob_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["Response"], []);
 
-  static blob_Callback_2(mthis, __arg_0, __arg_1) native "Response_blob_Callback";
-  blob_Callback_2_(mthis, __arg_0, __arg_1) => blob_Callback_2(mthis, __arg_0, __arg_1);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Response"], [__arg_0]);
 
-  static bodyUsed_Getter(mthis) native "Response_bodyUsed_Getter";
-  bodyUsed_Getter_(mthis) => bodyUsed_Getter(mthis);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["Response"], [__arg_0, __arg_1]);
 
-  static clone_Callback_0(mthis) native "Response_clone_Callback";
-  clone_Callback_0_(mthis) => clone_Callback_0(mthis);
+  headers_Getter_(mthis) => mthis["headers"];
 
-  static clone_Callback_1(mthis, __arg_0) native "Response_clone_Callback";
-  clone_Callback_1_(mthis, __arg_0) => clone_Callback_1(mthis, __arg_0);
+  json_Callback_0_(mthis) => mthis.callMethod("json", []);
 
-  static clone_Callback_2(mthis, __arg_0, __arg_1) native "Response_clone_Callback";
-  clone_Callback_2_(mthis, __arg_0, __arg_1) => clone_Callback_2(mthis, __arg_0, __arg_1);
+  statusText_Getter_(mthis) => mthis["statusText"];
 
-  static constructorCallback_0() native "Response_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  status_Getter_(mthis) => mthis["status"];
 
-  static constructorCallback_1(__arg_0) native "Response_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  text_Callback_0_(mthis) => mthis.callMethod("text", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Response_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  type_Getter_(mthis) => mthis["type"];
 
-  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 json_Callback_0(mthis) native "Response_json_Callback";
-  json_Callback_0_(mthis) => json_Callback_0(mthis);
-
-  static json_Callback_1(mthis, __arg_0) native "Response_json_Callback";
-  json_Callback_1_(mthis, __arg_0) => json_Callback_1(mthis, __arg_0);
-
-  static json_Callback_2(mthis, __arg_0, __arg_1) native "Response_json_Callback";
-  json_Callback_2_(mthis, __arg_0, __arg_1) => json_Callback_2(mthis, __arg_0, __arg_1);
-
-  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 text_Callback_0(mthis) native "Response_text_Callback";
-  text_Callback_0_(mthis) => text_Callback_0(mthis);
-
-  static text_Callback_1(mthis, __arg_0) native "Response_text_Callback";
-  text_Callback_1_(mthis, __arg_0) => text_Callback_1(mthis, __arg_0);
-
-  static text_Callback_2(mthis, __arg_0, __arg_1) native "Response_text_Callback";
-  text_Callback_2_(mthis, __arg_0, __arg_1) => text_Callback_2(mthis, __arg_0, __arg_1);
-
-  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);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 class BlinkSQLError {
   static final instance = new BlinkSQLError();
 
-  static code_Getter(mthis) native "SQLError_code_Getter";
-  code_Getter_(mthis) => code_Getter(mthis);
+  code_Getter_(mthis) => mthis["code"];
 
-  static message_Getter(mthis) native "SQLError_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
 }
 
 class BlinkSQLResultSet {
   static final instance = new BlinkSQLResultSet();
 
-  static insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
-  insertId_Getter_(mthis) => insertId_Getter(mthis);
+  insertId_Getter_(mthis) => mthis["insertId"];
 
-  static rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
-  rowsAffected_Getter_(mthis) => rowsAffected_Getter(mthis);
+  rowsAffected_Getter_(mthis) => mthis["rowsAffected"];
 
-  static rows_Getter(mthis) native "SQLResultSet_rows_Getter";
-  rows_Getter_(mthis) => rows_Getter(mthis);
+  rows_Getter_(mthis) => mthis["rows"];
 
 }
 
 class BlinkSQLResultSetRowList {
   static final instance = new BlinkSQLResultSetRowList();
 
-  static item_Callback_0(mthis) native "SQLResultSetRowList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "SQLResultSetRowList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkSQLTransaction {
   static final instance = new BlinkSQLTransaction();
 
-  static executeSql_Callback_0(mthis) native "SQLTransaction_executeSql_Callback";
-  executeSql_Callback_0_(mthis) => executeSql_Callback_0(mthis);
+  executeSql_Callback_0_(mthis) => mthis.callMethod("executeSql", []);
 
-  static executeSql_Callback_1(mthis, __arg_0) native "SQLTransaction_executeSql_Callback";
-  executeSql_Callback_1_(mthis, __arg_0) => executeSql_Callback_1(mthis, __arg_0);
+  executeSql_Callback_1_(mthis, __arg_0) => mthis.callMethod("executeSql", [__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);
+  executeSql_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("executeSql", [__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);
+  executeSql_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("executeSql", [__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);
+  executeSql_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("executeSql", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkSVGAElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGAElement();
 
-  static href_Getter(mthis) native "SVGAElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static target_Getter(mthis) native "SVGAElement_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
 }
 
@@ -19207,20 +10516,15 @@
 class BlinkSVGAltGlyphElement extends BlinkSVGTextPositioningElement {
   static final instance = new BlinkSVGAltGlyphElement();
 
-  static format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
-  format_Getter_(mthis) => format_Getter(mthis);
+  format_Getter_(mthis) => mthis["format"];
 
-  static format_Setter(mthis, __arg_0) native "SVGAltGlyphElement_format_Setter";
-  format_Setter_(mthis, __arg_0) => format_Setter(mthis, __arg_0);
+  format_Setter_(mthis, __arg_0) => mthis["format"] = __arg_0;
 
-  static glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
-  glyphRef_Getter_(mthis) => glyphRef_Getter(mthis);
+  glyphRef_Getter_(mthis) => mthis["glyphRef"];
 
-  static glyphRef_Setter(mthis, __arg_0) native "SVGAltGlyphElement_glyphRef_Setter";
-  glyphRef_Setter_(mthis, __arg_0) => glyphRef_Setter(mthis, __arg_0);
+  glyphRef_Setter_(mthis, __arg_0) => mthis["glyphRef"] = __arg_0;
 
-  static href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
 }
 
@@ -19232,53 +10536,29 @@
 class BlinkSVGAngle {
   static final instance = new BlinkSVGAngle();
 
-  static convertToSpecifiedUnits_Callback_0(mthis) native "SVGAngle_convertToSpecifiedUnits_Callback";
-  convertToSpecifiedUnits_Callback_0_(mthis) => convertToSpecifiedUnits_Callback_0(mthis);
+  convertToSpecifiedUnits_Callback_0_(mthis) => mthis.callMethod("convertToSpecifiedUnits", []);
 
-  static convertToSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGAngle_convertToSpecifiedUnits_Callback";
-  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => convertToSpecifiedUnits_Callback_1(mthis, __arg_0);
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => mthis.callMethod("convertToSpecifiedUnits", [__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);
+  newValueSpecifiedUnits_Callback_0_(mthis) => mthis.callMethod("newValueSpecifiedUnits", []);
 
-  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);
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => mthis.callMethod("newValueSpecifiedUnits", [__arg_0]);
 
-  static newValueSpecifiedUnits_Callback_0(mthis) native "SVGAngle_newValueSpecifiedUnits_Callback";
-  newValueSpecifiedUnits_Callback_0_(mthis) => newValueSpecifiedUnits_Callback_0(mthis);
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
-  static newValueSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGAngle_newValueSpecifiedUnits_Callback";
-  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => newValueSpecifiedUnits_Callback_1(mthis, __arg_0);
+  unitType_Getter_(mthis) => mthis["unitType"];
 
-  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);
+  valueAsString_Getter_(mthis) => mthis["valueAsString"];
 
-  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);
+  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
 
-  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);
+  valueInSpecifiedUnits_Getter_(mthis) => mthis["valueInSpecifiedUnits"];
 
-  static unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
-  unitType_Getter_(mthis) => unitType_Getter(mthis);
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
 
-  static valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
-  valueAsString_Getter_(mthis) => valueAsString_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  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, __arg_0) native "SVGAngle_valueInSpecifiedUnits_Setter";
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => valueInSpecifiedUnits_Setter(mthis, __arg_0);
-
-  static value_Getter(mthis) native "SVGAngle_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
-
-  static value_Setter(mthis, __arg_0) native "SVGAngle_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __arg_0;
 
 }
 
@@ -19300,346 +10580,223 @@
 class BlinkSVGAnimatedAngle {
   static final instance = new BlinkSVGAnimatedAngle();
 
-  static animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedBoolean {
   static final instance = new BlinkSVGAnimatedBoolean();
 
-  static animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
-  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedBoolean_baseVal_Setter";
-  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
 
 }
 
 class BlinkSVGAnimatedEnumeration {
   static final instance = new BlinkSVGAnimatedEnumeration();
 
-  static animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
-  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedEnumeration_baseVal_Setter";
-  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
 
 }
 
 class BlinkSVGAnimatedInteger {
   static final instance = new BlinkSVGAnimatedInteger();
 
-  static animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
-  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedInteger_baseVal_Setter";
-  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
 
 }
 
 class BlinkSVGAnimatedLength {
   static final instance = new BlinkSVGAnimatedLength();
 
-  static animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedLengthList {
   static final instance = new BlinkSVGAnimatedLengthList();
 
-  static animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedNumber {
   static final instance = new BlinkSVGAnimatedNumber();
 
-  static animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
-  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedNumber_baseVal_Setter";
-  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
 
 }
 
 class BlinkSVGAnimatedNumberList {
   static final instance = new BlinkSVGAnimatedNumberList();
 
-  static animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedPreserveAspectRatio {
   static final instance = new BlinkSVGAnimatedPreserveAspectRatio();
 
-  static animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedRect {
   static final instance = new BlinkSVGAnimatedRect();
 
-  static animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimatedString {
   static final instance = new BlinkSVGAnimatedString();
 
-  static animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
-  static baseVal_Setter(mthis, __arg_0) native "SVGAnimatedString_baseVal_Setter";
-  baseVal_Setter_(mthis, __arg_0) => baseVal_Setter(mthis, __arg_0);
+  baseVal_Setter_(mthis, __arg_0) => mthis["baseVal"] = __arg_0;
 
 }
 
 class BlinkSVGAnimatedTransformList {
   static final instance = new BlinkSVGAnimatedTransformList();
 
-  static animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
-  animVal_Getter_(mthis) => animVal_Getter(mthis);
+  animVal_Getter_(mthis) => mthis["animVal"];
 
-  static baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
-  baseVal_Getter_(mthis) => baseVal_Getter(mthis);
+  baseVal_Getter_(mthis) => mthis["baseVal"];
 
 }
 
 class BlinkSVGAnimationElement extends BlinkSVGElement {
   static final instance = new BlinkSVGAnimationElement();
 
-  static beginElementAt_Callback_0(mthis) native "SVGAnimationElement_beginElementAt_Callback";
-  beginElementAt_Callback_0_(mthis) => beginElementAt_Callback_0(mthis);
+  beginElementAt_Callback_0_(mthis) => mthis.callMethod("beginElementAt", []);
 
-  static beginElementAt_Callback_1(mthis, __arg_0) native "SVGAnimationElement_beginElementAt_Callback";
-  beginElementAt_Callback_1_(mthis, __arg_0) => beginElementAt_Callback_1(mthis, __arg_0);
+  beginElementAt_Callback_1_(mthis, __arg_0) => mthis.callMethod("beginElementAt", [__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);
+  beginElement_Callback_0_(mthis) => mthis.callMethod("beginElement", []);
 
-  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);
+  endElementAt_Callback_0_(mthis) => mthis.callMethod("endElementAt", []);
 
-  static beginElement_Callback_0(mthis) native "SVGAnimationElement_beginElement_Callback";
-  beginElement_Callback_0_(mthis) => beginElement_Callback_0(mthis);
+  endElementAt_Callback_1_(mthis, __arg_0) => mthis.callMethod("endElementAt", [__arg_0]);
 
-  static beginElement_Callback_1(mthis, __arg_0) native "SVGAnimationElement_beginElement_Callback";
-  beginElement_Callback_1_(mthis, __arg_0) => beginElement_Callback_1(mthis, __arg_0);
+  endElement_Callback_0_(mthis) => mthis.callMethod("endElement", []);
 
-  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);
+  getCurrentTime_Callback_0_(mthis) => mthis.callMethod("getCurrentTime", []);
 
-  static endElementAt_Callback_0(mthis) native "SVGAnimationElement_endElementAt_Callback";
-  endElementAt_Callback_0_(mthis) => endElementAt_Callback_0(mthis);
+  getSimpleDuration_Callback_0_(mthis) => mthis.callMethod("getSimpleDuration", []);
 
-  static endElementAt_Callback_1(mthis, __arg_0) native "SVGAnimationElement_endElementAt_Callback";
-  endElementAt_Callback_1_(mthis, __arg_0) => endElementAt_Callback_1(mthis, __arg_0);
+  getStartTime_Callback_0_(mthis) => mthis.callMethod("getStartTime", []);
 
-  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);
+  hasExtension_Callback_0_(mthis) => mthis.callMethod("hasExtension", []);
 
-  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);
+  hasExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasExtension", [__arg_0]);
 
-  static endElement_Callback_0(mthis) native "SVGAnimationElement_endElement_Callback";
-  endElement_Callback_0_(mthis) => endElement_Callback_0(mthis);
+  onbegin_Getter_(mthis) => mthis["onbegin"];
 
-  static endElement_Callback_1(mthis, __arg_0) native "SVGAnimationElement_endElement_Callback";
-  endElement_Callback_1_(mthis, __arg_0) => endElement_Callback_1(mthis, __arg_0);
+  onbegin_Setter_(mthis, __arg_0) => mthis["onbegin"] = __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);
+  onend_Getter_(mthis) => mthis["onend"];
 
-  static getCurrentTime_Callback_0(mthis) native "SVGAnimationElement_getCurrentTime_Callback";
-  getCurrentTime_Callback_0_(mthis) => getCurrentTime_Callback_0(mthis);
+  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
 
-  static getCurrentTime_Callback_1(mthis, __arg_0) native "SVGAnimationElement_getCurrentTime_Callback";
-  getCurrentTime_Callback_1_(mthis, __arg_0) => getCurrentTime_Callback_1(mthis, __arg_0);
+  onrepeat_Getter_(mthis) => mthis["onrepeat"];
 
-  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);
+  onrepeat_Setter_(mthis, __arg_0) => mthis["onrepeat"] = __arg_0;
 
-  static getSimpleDuration_Callback_0(mthis) native "SVGAnimationElement_getSimpleDuration_Callback";
-  getSimpleDuration_Callback_0_(mthis) => getSimpleDuration_Callback_0(mthis);
+  requiredExtensions_Getter_(mthis) => mthis["requiredExtensions"];
 
-  static getSimpleDuration_Callback_1(mthis, __arg_0) native "SVGAnimationElement_getSimpleDuration_Callback";
-  getSimpleDuration_Callback_1_(mthis, __arg_0) => getSimpleDuration_Callback_1(mthis, __arg_0);
+  requiredFeatures_Getter_(mthis) => mthis["requiredFeatures"];
 
-  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);
+  systemLanguage_Getter_(mthis) => mthis["systemLanguage"];
 
-  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);
+  targetElement_Getter_(mthis) => mthis["targetElement"];
 
 }
 
 class BlinkSVGCircleElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGCircleElement();
 
-  static cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
-  cx_Getter_(mthis) => cx_Getter(mthis);
+  cx_Getter_(mthis) => mthis["cx"];
 
-  static cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
-  cy_Getter_(mthis) => cy_Getter(mthis);
+  cy_Getter_(mthis) => mthis["cy"];
 
-  static r_Getter(mthis) native "SVGCircleElement_r_Getter";
-  r_Getter_(mthis) => r_Getter(mthis);
+  r_Getter_(mthis) => mthis["r"];
 
 }
 
 class BlinkSVGClipPathElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGClipPathElement();
 
-  static clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
-  clipPathUnits_Getter_(mthis) => clipPathUnits_Getter(mthis);
+  clipPathUnits_Getter_(mthis) => mthis["clipPathUnits"];
 
 }
 
 class BlinkSVGComponentTransferFunctionElement extends BlinkSVGElement {
   static final instance = new BlinkSVGComponentTransferFunctionElement();
 
-  static amplitude_Getter(mthis) native "SVGComponentTransferFunctionElement_amplitude_Getter";
-  amplitude_Getter_(mthis) => amplitude_Getter(mthis);
+  amplitude_Getter_(mthis) => mthis["amplitude"];
 
-  static exponent_Getter(mthis) native "SVGComponentTransferFunctionElement_exponent_Getter";
-  exponent_Getter_(mthis) => exponent_Getter(mthis);
+  exponent_Getter_(mthis) => mthis["exponent"];
 
-  static intercept_Getter(mthis) native "SVGComponentTransferFunctionElement_intercept_Getter";
-  intercept_Getter_(mthis) => intercept_Getter(mthis);
+  intercept_Getter_(mthis) => mthis["intercept"];
 
-  static offset_Getter(mthis) native "SVGComponentTransferFunctionElement_offset_Getter";
-  offset_Getter_(mthis) => offset_Getter(mthis);
+  offset_Getter_(mthis) => mthis["offset"];
 
-  static slope_Getter(mthis) native "SVGComponentTransferFunctionElement_slope_Getter";
-  slope_Getter_(mthis) => slope_Getter(mthis);
+  slope_Getter_(mthis) => mthis["slope"];
 
-  static tableValues_Getter(mthis) native "SVGComponentTransferFunctionElement_tableValues_Getter";
-  tableValues_Getter_(mthis) => tableValues_Getter(mthis);
+  tableValues_Getter_(mthis) => mthis["tableValues"];
 
-  static type_Getter(mthis) native "SVGComponentTransferFunctionElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  hasExtension_Callback_0_(mthis) => mthis.callMethod("hasExtension", []);
 
-  static hasExtension_Callback_1(mthis, __arg_0) native "SVGCursorElement_hasExtension_Callback";
-  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+  hasExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasExtension", [__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);
+  href_Getter_(mthis) => mthis["href"];
 
-  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);
+  requiredExtensions_Getter_(mthis) => mthis["requiredExtensions"];
 
-  static href_Getter(mthis) native "SVGCursorElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  requiredFeatures_Getter_(mthis) => mthis["requiredFeatures"];
 
-  static requiredExtensions_Getter(mthis) native "SVGCursorElement_requiredExtensions_Getter";
-  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+  systemLanguage_Getter_(mthis) => mthis["systemLanguage"];
 
-  static requiredFeatures_Getter(mthis) native "SVGCursorElement_requiredFeatures_Getter";
-  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -19661,753 +10818,518 @@
 class BlinkSVGElement extends BlinkElement {
   static final instance = new BlinkSVGElement();
 
-  static className_Getter(mthis) native "SVGElement_className_Getter";
-  className_Getter_(mthis) => className_Getter(mthis);
+  className_Getter_(mthis) => mthis["className"];
 
-  static onabort_Getter(mthis) native "SVGElement_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static onabort_Setter(mthis, __arg_0) native "SVGElement_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static onautocomplete_Getter(mthis) native "SVGElement_onautocomplete_Getter";
-  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+  onautocomplete_Getter_(mthis) => mthis["onautocomplete"];
 
-  static onautocomplete_Setter(mthis, __arg_0) native "SVGElement_onautocomplete_Setter";
-  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
 
-  static onautocompleteerror_Getter(mthis) native "SVGElement_onautocompleteerror_Getter";
-  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+  onautocompleteerror_Getter_(mthis) => mthis["onautocompleteerror"];
 
-  static onautocompleteerror_Setter(mthis, __arg_0) native "SVGElement_onautocompleteerror_Setter";
-  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  static onblur_Getter(mthis) native "SVGElement_onblur_Getter";
-  onblur_Getter_(mthis) => onblur_Getter(mthis);
+  onblur_Getter_(mthis) => mthis["onblur"];
 
-  static onblur_Setter(mthis, __arg_0) native "SVGElement_onblur_Setter";
-  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
 
-  static oncancel_Getter(mthis) native "SVGElement_oncancel_Getter";
-  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+  oncancel_Getter_(mthis) => mthis["oncancel"];
 
-  static oncancel_Setter(mthis, __arg_0) native "SVGElement_oncancel_Setter";
-  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
 
-  static oncanplay_Getter(mthis) native "SVGElement_oncanplay_Getter";
-  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+  oncanplay_Getter_(mthis) => mthis["oncanplay"];
 
-  static oncanplay_Setter(mthis, __arg_0) native "SVGElement_oncanplay_Setter";
-  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
 
-  static oncanplaythrough_Getter(mthis) native "SVGElement_oncanplaythrough_Getter";
-  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+  oncanplaythrough_Getter_(mthis) => mthis["oncanplaythrough"];
 
-  static oncanplaythrough_Setter(mthis, __arg_0) native "SVGElement_oncanplaythrough_Setter";
-  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
 
-  static onchange_Getter(mthis) native "SVGElement_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static onchange_Setter(mthis, __arg_0) native "SVGElement_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onclick_Getter(mthis) native "SVGElement_onclick_Getter";
-  onclick_Getter_(mthis) => onclick_Getter(mthis);
+  onclick_Getter_(mthis) => mthis["onclick"];
 
-  static onclick_Setter(mthis, __arg_0) native "SVGElement_onclick_Setter";
-  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
 
-  static onclose_Getter(mthis) native "SVGElement_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  static onclose_Setter(mthis, __arg_0) native "SVGElement_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static oncontextmenu_Getter(mthis) native "SVGElement_oncontextmenu_Getter";
-  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+  oncontextmenu_Getter_(mthis) => mthis["oncontextmenu"];
 
-  static oncontextmenu_Setter(mthis, __arg_0) native "SVGElement_oncontextmenu_Setter";
-  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
 
-  static oncuechange_Getter(mthis) native "SVGElement_oncuechange_Getter";
-  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+  oncuechange_Getter_(mthis) => mthis["oncuechange"];
 
-  static oncuechange_Setter(mthis, __arg_0) native "SVGElement_oncuechange_Setter";
-  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
 
-  static ondblclick_Getter(mthis) native "SVGElement_ondblclick_Getter";
-  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+  ondblclick_Getter_(mthis) => mthis["ondblclick"];
 
-  static ondblclick_Setter(mthis, __arg_0) native "SVGElement_ondblclick_Setter";
-  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
 
-  static ondrag_Getter(mthis) native "SVGElement_ondrag_Getter";
-  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+  ondrag_Getter_(mthis) => mthis["ondrag"];
 
-  static ondrag_Setter(mthis, __arg_0) native "SVGElement_ondrag_Setter";
-  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
 
-  static ondragend_Getter(mthis) native "SVGElement_ondragend_Getter";
-  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+  ondragend_Getter_(mthis) => mthis["ondragend"];
 
-  static ondragend_Setter(mthis, __arg_0) native "SVGElement_ondragend_Setter";
-  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
 
-  static ondragenter_Getter(mthis) native "SVGElement_ondragenter_Getter";
-  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+  ondragenter_Getter_(mthis) => mthis["ondragenter"];
 
-  static ondragenter_Setter(mthis, __arg_0) native "SVGElement_ondragenter_Setter";
-  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
 
-  static ondragleave_Getter(mthis) native "SVGElement_ondragleave_Getter";
-  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+  ondragleave_Getter_(mthis) => mthis["ondragleave"];
 
-  static ondragleave_Setter(mthis, __arg_0) native "SVGElement_ondragleave_Setter";
-  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
 
-  static ondragover_Getter(mthis) native "SVGElement_ondragover_Getter";
-  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+  ondragover_Getter_(mthis) => mthis["ondragover"];
 
-  static ondragover_Setter(mthis, __arg_0) native "SVGElement_ondragover_Setter";
-  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
 
-  static ondragstart_Getter(mthis) native "SVGElement_ondragstart_Getter";
-  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+  ondragstart_Getter_(mthis) => mthis["ondragstart"];
 
-  static ondragstart_Setter(mthis, __arg_0) native "SVGElement_ondragstart_Setter";
-  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
 
-  static ondrop_Getter(mthis) native "SVGElement_ondrop_Getter";
-  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+  ondrop_Getter_(mthis) => mthis["ondrop"];
 
-  static ondrop_Setter(mthis, __arg_0) native "SVGElement_ondrop_Setter";
-  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
 
-  static ondurationchange_Getter(mthis) native "SVGElement_ondurationchange_Getter";
-  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+  ondurationchange_Getter_(mthis) => mthis["ondurationchange"];
 
-  static ondurationchange_Setter(mthis, __arg_0) native "SVGElement_ondurationchange_Setter";
-  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
 
-  static onemptied_Getter(mthis) native "SVGElement_onemptied_Getter";
-  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+  onemptied_Getter_(mthis) => mthis["onemptied"];
 
-  static onemptied_Setter(mthis, __arg_0) native "SVGElement_onemptied_Setter";
-  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
 
-  static onended_Getter(mthis) native "SVGElement_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static onended_Setter(mthis, __arg_0) native "SVGElement_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static onerror_Getter(mthis) native "SVGElement_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onerror_Setter(mthis, __arg_0) native "SVGElement_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onfocus_Getter(mthis) native "SVGElement_onfocus_Getter";
-  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+  onfocus_Getter_(mthis) => mthis["onfocus"];
 
-  static onfocus_Setter(mthis, __arg_0) native "SVGElement_onfocus_Setter";
-  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  static oninput_Getter(mthis) native "SVGElement_oninput_Getter";
-  oninput_Getter_(mthis) => oninput_Getter(mthis);
+  oninput_Getter_(mthis) => mthis["oninput"];
 
-  static oninput_Setter(mthis, __arg_0) native "SVGElement_oninput_Setter";
-  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
 
-  static oninvalid_Getter(mthis) native "SVGElement_oninvalid_Getter";
-  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+  oninvalid_Getter_(mthis) => mthis["oninvalid"];
 
-  static oninvalid_Setter(mthis, __arg_0) native "SVGElement_oninvalid_Setter";
-  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
 
-  static onkeydown_Getter(mthis) native "SVGElement_onkeydown_Getter";
-  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+  onkeydown_Getter_(mthis) => mthis["onkeydown"];
 
-  static onkeydown_Setter(mthis, __arg_0) native "SVGElement_onkeydown_Setter";
-  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
 
-  static onkeypress_Getter(mthis) native "SVGElement_onkeypress_Getter";
-  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+  onkeypress_Getter_(mthis) => mthis["onkeypress"];
 
-  static onkeypress_Setter(mthis, __arg_0) native "SVGElement_onkeypress_Setter";
-  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
 
-  static onkeyup_Getter(mthis) native "SVGElement_onkeyup_Getter";
-  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+  onkeyup_Getter_(mthis) => mthis["onkeyup"];
 
-  static onkeyup_Setter(mthis, __arg_0) native "SVGElement_onkeyup_Setter";
-  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
 
-  static onload_Getter(mthis) native "SVGElement_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static onload_Setter(mthis, __arg_0) native "SVGElement_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static onloadeddata_Getter(mthis) native "SVGElement_onloadeddata_Getter";
-  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+  onloadeddata_Getter_(mthis) => mthis["onloadeddata"];
 
-  static onloadeddata_Setter(mthis, __arg_0) native "SVGElement_onloadeddata_Setter";
-  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
 
-  static onloadedmetadata_Getter(mthis) native "SVGElement_onloadedmetadata_Getter";
-  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+  onloadedmetadata_Getter_(mthis) => mthis["onloadedmetadata"];
 
-  static onloadedmetadata_Setter(mthis, __arg_0) native "SVGElement_onloadedmetadata_Setter";
-  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
 
-  static onloadstart_Getter(mthis) native "SVGElement_onloadstart_Getter";
-  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static onloadstart_Setter(mthis, __arg_0) native "SVGElement_onloadstart_Setter";
-  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static onmousedown_Getter(mthis) native "SVGElement_onmousedown_Getter";
-  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+  onmousedown_Getter_(mthis) => mthis["onmousedown"];
 
-  static onmousedown_Setter(mthis, __arg_0) native "SVGElement_onmousedown_Setter";
-  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
 
-  static onmouseenter_Getter(mthis) native "SVGElement_onmouseenter_Getter";
-  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+  onmouseenter_Getter_(mthis) => mthis["onmouseenter"];
 
-  static onmouseenter_Setter(mthis, __arg_0) native "SVGElement_onmouseenter_Setter";
-  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
 
-  static onmouseleave_Getter(mthis) native "SVGElement_onmouseleave_Getter";
-  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+  onmouseleave_Getter_(mthis) => mthis["onmouseleave"];
 
-  static onmouseleave_Setter(mthis, __arg_0) native "SVGElement_onmouseleave_Setter";
-  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
 
-  static onmousemove_Getter(mthis) native "SVGElement_onmousemove_Getter";
-  onmousemove_Getter_(mthis) => onmousemove_Getter(mthis);
+  onmousemove_Getter_(mthis) => mthis["onmousemove"];
 
-  static onmousemove_Setter(mthis, __arg_0) native "SVGElement_onmousemove_Setter";
-  onmousemove_Setter_(mthis, __arg_0) => onmousemove_Setter(mthis, __arg_0);
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
 
-  static onmouseout_Getter(mthis) native "SVGElement_onmouseout_Getter";
-  onmouseout_Getter_(mthis) => onmouseout_Getter(mthis);
+  onmouseout_Getter_(mthis) => mthis["onmouseout"];
 
-  static onmouseout_Setter(mthis, __arg_0) native "SVGElement_onmouseout_Setter";
-  onmouseout_Setter_(mthis, __arg_0) => onmouseout_Setter(mthis, __arg_0);
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
 
-  static onmouseover_Getter(mthis) native "SVGElement_onmouseover_Getter";
-  onmouseover_Getter_(mthis) => onmouseover_Getter(mthis);
+  onmouseover_Getter_(mthis) => mthis["onmouseover"];
 
-  static onmouseover_Setter(mthis, __arg_0) native "SVGElement_onmouseover_Setter";
-  onmouseover_Setter_(mthis, __arg_0) => onmouseover_Setter(mthis, __arg_0);
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
 
-  static onmouseup_Getter(mthis) native "SVGElement_onmouseup_Getter";
-  onmouseup_Getter_(mthis) => onmouseup_Getter(mthis);
+  onmouseup_Getter_(mthis) => mthis["onmouseup"];
 
-  static onmouseup_Setter(mthis, __arg_0) native "SVGElement_onmouseup_Setter";
-  onmouseup_Setter_(mthis, __arg_0) => onmouseup_Setter(mthis, __arg_0);
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
 
-  static onmousewheel_Getter(mthis) native "SVGElement_onmousewheel_Getter";
-  onmousewheel_Getter_(mthis) => onmousewheel_Getter(mthis);
+  onmousewheel_Getter_(mthis) => mthis["onmousewheel"];
 
-  static onmousewheel_Setter(mthis, __arg_0) native "SVGElement_onmousewheel_Setter";
-  onmousewheel_Setter_(mthis, __arg_0) => onmousewheel_Setter(mthis, __arg_0);
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  static onpause_Getter(mthis) native "SVGElement_onpause_Getter";
-  onpause_Getter_(mthis) => onpause_Getter(mthis);
+  onpause_Getter_(mthis) => mthis["onpause"];
 
-  static onpause_Setter(mthis, __arg_0) native "SVGElement_onpause_Setter";
-  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
 
-  static onplay_Getter(mthis) native "SVGElement_onplay_Getter";
-  onplay_Getter_(mthis) => onplay_Getter(mthis);
+  onplay_Getter_(mthis) => mthis["onplay"];
 
-  static onplay_Setter(mthis, __arg_0) native "SVGElement_onplay_Setter";
-  onplay_Setter_(mthis, __arg_0) => onplay_Setter(mthis, __arg_0);
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
 
-  static onplaying_Getter(mthis) native "SVGElement_onplaying_Getter";
-  onplaying_Getter_(mthis) => onplaying_Getter(mthis);
+  onplaying_Getter_(mthis) => mthis["onplaying"];
 
-  static onplaying_Setter(mthis, __arg_0) native "SVGElement_onplaying_Setter";
-  onplaying_Setter_(mthis, __arg_0) => onplaying_Setter(mthis, __arg_0);
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "SVGElement_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onprogress_Setter(mthis, __arg_0) native "SVGElement_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onratechange_Getter(mthis) native "SVGElement_onratechange_Getter";
-  onratechange_Getter_(mthis) => onratechange_Getter(mthis);
+  onratechange_Getter_(mthis) => mthis["onratechange"];
 
-  static onratechange_Setter(mthis, __arg_0) native "SVGElement_onratechange_Setter";
-  onratechange_Setter_(mthis, __arg_0) => onratechange_Setter(mthis, __arg_0);
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
 
-  static onreset_Getter(mthis) native "SVGElement_onreset_Getter";
-  onreset_Getter_(mthis) => onreset_Getter(mthis);
+  onreset_Getter_(mthis) => mthis["onreset"];
 
-  static onreset_Setter(mthis, __arg_0) native "SVGElement_onreset_Setter";
-  onreset_Setter_(mthis, __arg_0) => onreset_Setter(mthis, __arg_0);
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
 
-  static onresize_Getter(mthis) native "SVGElement_onresize_Getter";
-  onresize_Getter_(mthis) => onresize_Getter(mthis);
+  onresize_Getter_(mthis) => mthis["onresize"];
 
-  static onresize_Setter(mthis, __arg_0) native "SVGElement_onresize_Setter";
-  onresize_Setter_(mthis, __arg_0) => onresize_Setter(mthis, __arg_0);
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __arg_0;
 
-  static onscroll_Getter(mthis) native "SVGElement_onscroll_Getter";
-  onscroll_Getter_(mthis) => onscroll_Getter(mthis);
+  onscroll_Getter_(mthis) => mthis["onscroll"];
 
-  static onscroll_Setter(mthis, __arg_0) native "SVGElement_onscroll_Setter";
-  onscroll_Setter_(mthis, __arg_0) => onscroll_Setter(mthis, __arg_0);
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  static onseeked_Getter(mthis) native "SVGElement_onseeked_Getter";
-  onseeked_Getter_(mthis) => onseeked_Getter(mthis);
+  onseeked_Getter_(mthis) => mthis["onseeked"];
 
-  static onseeked_Setter(mthis, __arg_0) native "SVGElement_onseeked_Setter";
-  onseeked_Setter_(mthis, __arg_0) => onseeked_Setter(mthis, __arg_0);
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
 
-  static onseeking_Getter(mthis) native "SVGElement_onseeking_Getter";
-  onseeking_Getter_(mthis) => onseeking_Getter(mthis);
+  onseeking_Getter_(mthis) => mthis["onseeking"];
 
-  static onseeking_Setter(mthis, __arg_0) native "SVGElement_onseeking_Setter";
-  onseeking_Setter_(mthis, __arg_0) => onseeking_Setter(mthis, __arg_0);
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
 
-  static onselect_Getter(mthis) native "SVGElement_onselect_Getter";
-  onselect_Getter_(mthis) => onselect_Getter(mthis);
+  onselect_Getter_(mthis) => mthis["onselect"];
 
-  static onselect_Setter(mthis, __arg_0) native "SVGElement_onselect_Setter";
-  onselect_Setter_(mthis, __arg_0) => onselect_Setter(mthis, __arg_0);
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
 
-  static onshow_Getter(mthis) native "SVGElement_onshow_Getter";
-  onshow_Getter_(mthis) => onshow_Getter(mthis);
+  onshow_Getter_(mthis) => mthis["onshow"];
 
-  static onshow_Setter(mthis, __arg_0) native "SVGElement_onshow_Setter";
-  onshow_Setter_(mthis, __arg_0) => onshow_Setter(mthis, __arg_0);
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
 
-  static onstalled_Getter(mthis) native "SVGElement_onstalled_Getter";
-  onstalled_Getter_(mthis) => onstalled_Getter(mthis);
+  onstalled_Getter_(mthis) => mthis["onstalled"];
 
-  static onstalled_Setter(mthis, __arg_0) native "SVGElement_onstalled_Setter";
-  onstalled_Setter_(mthis, __arg_0) => onstalled_Setter(mthis, __arg_0);
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
 
-  static onsubmit_Getter(mthis) native "SVGElement_onsubmit_Getter";
-  onsubmit_Getter_(mthis) => onsubmit_Getter(mthis);
+  onsubmit_Getter_(mthis) => mthis["onsubmit"];
 
-  static onsubmit_Setter(mthis, __arg_0) native "SVGElement_onsubmit_Setter";
-  onsubmit_Setter_(mthis, __arg_0) => onsubmit_Setter(mthis, __arg_0);
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
 
-  static onsuspend_Getter(mthis) native "SVGElement_onsuspend_Getter";
-  onsuspend_Getter_(mthis) => onsuspend_Getter(mthis);
+  onsuspend_Getter_(mthis) => mthis["onsuspend"];
 
-  static onsuspend_Setter(mthis, __arg_0) native "SVGElement_onsuspend_Setter";
-  onsuspend_Setter_(mthis, __arg_0) => onsuspend_Setter(mthis, __arg_0);
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
 
-  static ontimeupdate_Getter(mthis) native "SVGElement_ontimeupdate_Getter";
-  ontimeupdate_Getter_(mthis) => ontimeupdate_Getter(mthis);
+  ontimeupdate_Getter_(mthis) => mthis["ontimeupdate"];
 
-  static ontimeupdate_Setter(mthis, __arg_0) native "SVGElement_ontimeupdate_Setter";
-  ontimeupdate_Setter_(mthis, __arg_0) => ontimeupdate_Setter(mthis, __arg_0);
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
 
-  static ontoggle_Getter(mthis) native "SVGElement_ontoggle_Getter";
-  ontoggle_Getter_(mthis) => ontoggle_Getter(mthis);
+  ontoggle_Getter_(mthis) => mthis["ontoggle"];
 
-  static ontoggle_Setter(mthis, __arg_0) native "SVGElement_ontoggle_Setter";
-  ontoggle_Setter_(mthis, __arg_0) => ontoggle_Setter(mthis, __arg_0);
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __arg_0;
 
-  static onvolumechange_Getter(mthis) native "SVGElement_onvolumechange_Getter";
-  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+  onvolumechange_Getter_(mthis) => mthis["onvolumechange"];
 
-  static onvolumechange_Setter(mthis, __arg_0) native "SVGElement_onvolumechange_Setter";
-  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
 
-  static onwaiting_Getter(mthis) native "SVGElement_onwaiting_Getter";
-  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+  onwaiting_Getter_(mthis) => mthis["onwaiting"];
 
-  static onwaiting_Setter(mthis, __arg_0) native "SVGElement_onwaiting_Setter";
-  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __arg_0;
 
-  static ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
-  ownerSVGElement_Getter_(mthis) => ownerSVGElement_Getter(mthis);
+  ownerSVGElement_Getter_(mthis) => mthis["ownerSVGElement"];
 
-  static style_Getter(mthis) native "SVGElement_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
-  static tabIndex_Getter(mthis) native "SVGElement_tabIndex_Getter";
-  tabIndex_Getter_(mthis) => tabIndex_Getter(mthis);
+  tabIndex_Getter_(mthis) => mthis["tabIndex"];
 
-  static tabIndex_Setter(mthis, __arg_0) native "SVGElement_tabIndex_Setter";
-  tabIndex_Setter_(mthis, __arg_0) => tabIndex_Setter(mthis, __arg_0);
+  tabIndex_Setter_(mthis, __arg_0) => mthis["tabIndex"] = __arg_0;
 
-  static viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
-  viewportElement_Getter_(mthis) => viewportElement_Getter(mthis);
+  viewportElement_Getter_(mthis) => mthis["viewportElement"];
 
-  static xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
-  xmlbase_Getter_(mthis) => xmlbase_Getter(mthis);
+  xmlbase_Getter_(mthis) => mthis["xmlbase"];
 
-  static xmlbase_Setter(mthis, __arg_0) native "SVGElement_xmlbase_Setter";
-  xmlbase_Setter_(mthis, __arg_0) => xmlbase_Setter(mthis, __arg_0);
+  xmlbase_Setter_(mthis, __arg_0) => mthis["xmlbase"] = __arg_0;
 
-  static xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
-  xmllang_Getter_(mthis) => xmllang_Getter(mthis);
+  xmllang_Getter_(mthis) => mthis["xmllang"];
 
-  static xmllang_Setter(mthis, __arg_0) native "SVGElement_xmllang_Setter";
-  xmllang_Setter_(mthis, __arg_0) => xmllang_Setter(mthis, __arg_0);
+  xmllang_Setter_(mthis, __arg_0) => mthis["xmllang"] = __arg_0;
 
-  static xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
-  xmlspace_Getter_(mthis) => xmlspace_Getter(mthis);
+  xmlspace_Getter_(mthis) => mthis["xmlspace"];
 
-  static xmlspace_Setter(mthis, __arg_0) native "SVGElement_xmlspace_Setter";
-  xmlspace_Setter_(mthis, __arg_0) => xmlspace_Setter(mthis, __arg_0);
+  xmlspace_Setter_(mthis, __arg_0) => mthis["xmlspace"] = __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);
+  cx_Getter_(mthis) => mthis["cx"];
 
-  static cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
-  cy_Getter_(mthis) => cy_Getter(mthis);
+  cy_Getter_(mthis) => mthis["cy"];
 
-  static rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
-  rx_Getter_(mthis) => rx_Getter(mthis);
+  rx_Getter_(mthis) => mthis["rx"];
 
-  static ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
-  ry_Getter_(mthis) => ry_Getter(mthis);
+  ry_Getter_(mthis) => mthis["ry"];
 
 }
 
 class BlinkSVGFEBlendElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEBlendElement();
 
-  static height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
-  in2_Getter_(mthis) => in2_Getter(mthis);
+  in2_Getter_(mthis) => mthis["in2"];
 
-  static mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
-  mode_Getter_(mthis) => mode_Getter(mthis);
+  mode_Getter_(mthis) => mthis["mode"];
 
-  static result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEColorMatrixElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEColorMatrixElement();
 
-  static height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
-  values_Getter_(mthis) => values_Getter(mthis);
+  values_Getter_(mthis) => mthis["values"];
 
-  static width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEComponentTransferElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEComponentTransferElement();
 
-  static height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFECompositeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFECompositeElement();
 
-  static height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
-  in2_Getter_(mthis) => in2_Getter(mthis);
+  in2_Getter_(mthis) => mthis["in2"];
 
-  static k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
-  k1_Getter_(mthis) => k1_Getter(mthis);
+  k1_Getter_(mthis) => mthis["k1"];
 
-  static k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
-  k2_Getter_(mthis) => k2_Getter(mthis);
+  k2_Getter_(mthis) => mthis["k2"];
 
-  static k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
-  k3_Getter_(mthis) => k3_Getter(mthis);
+  k3_Getter_(mthis) => mthis["k3"];
 
-  static k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
-  k4_Getter_(mthis) => k4_Getter(mthis);
+  k4_Getter_(mthis) => mthis["k4"];
 
-  static operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
-  operator_Getter_(mthis) => operator_Getter(mthis);
+  operator_Getter_(mthis) => mthis["operator"];
 
-  static result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEConvolveMatrixElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEConvolveMatrixElement();
 
-  static bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
-  bias_Getter_(mthis) => bias_Getter(mthis);
+  bias_Getter_(mthis) => mthis["bias"];
 
-  static divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
-  divisor_Getter_(mthis) => divisor_Getter(mthis);
+  divisor_Getter_(mthis) => mthis["divisor"];
 
-  static edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
-  edgeMode_Getter_(mthis) => edgeMode_Getter(mthis);
+  edgeMode_Getter_(mthis) => mthis["edgeMode"];
 
-  static height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
-  kernelMatrix_Getter_(mthis) => kernelMatrix_Getter(mthis);
+  kernelMatrix_Getter_(mthis) => mthis["kernelMatrix"];
 
-  static kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
-  kernelUnitLengthX_Getter_(mthis) => kernelUnitLengthX_Getter(mthis);
+  kernelUnitLengthX_Getter_(mthis) => mthis["kernelUnitLengthX"];
 
-  static kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
-  kernelUnitLengthY_Getter_(mthis) => kernelUnitLengthY_Getter(mthis);
+  kernelUnitLengthY_Getter_(mthis) => mthis["kernelUnitLengthY"];
 
-  static orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
-  orderX_Getter_(mthis) => orderX_Getter(mthis);
+  orderX_Getter_(mthis) => mthis["orderX"];
 
-  static orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
-  orderY_Getter_(mthis) => orderY_Getter(mthis);
+  orderY_Getter_(mthis) => mthis["orderY"];
 
-  static preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
-  preserveAlpha_Getter_(mthis) => preserveAlpha_Getter(mthis);
+  preserveAlpha_Getter_(mthis) => mthis["preserveAlpha"];
 
-  static result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
-  targetX_Getter_(mthis) => targetX_Getter(mthis);
+  targetX_Getter_(mthis) => mthis["targetX"];
 
-  static targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
-  targetY_Getter_(mthis) => targetY_Getter(mthis);
+  targetY_Getter_(mthis) => mthis["targetY"];
 
-  static width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEDiffuseLightingElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDiffuseLightingElement();
 
-  static diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
-  diffuseConstant_Getter_(mthis) => diffuseConstant_Getter(mthis);
+  diffuseConstant_Getter_(mthis) => mthis["diffuseConstant"];
 
-  static height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
-  kernelUnitLengthX_Getter_(mthis) => kernelUnitLengthX_Getter(mthis);
+  kernelUnitLengthX_Getter_(mthis) => mthis["kernelUnitLengthX"];
 
-  static kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
-  kernelUnitLengthY_Getter_(mthis) => kernelUnitLengthY_Getter(mthis);
+  kernelUnitLengthY_Getter_(mthis) => mthis["kernelUnitLengthY"];
 
-  static result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
-  surfaceScale_Getter_(mthis) => surfaceScale_Getter(mthis);
+  surfaceScale_Getter_(mthis) => mthis["surfaceScale"];
 
-  static width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEDisplacementMapElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDisplacementMapElement();
 
-  static height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
-  in2_Getter_(mthis) => in2_Getter(mthis);
+  in2_Getter_(mthis) => mthis["in2"];
 
-  static result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
-  scale_Getter_(mthis) => scale_Getter(mthis);
+  scale_Getter_(mthis) => mthis["scale"];
 
-  static width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
-  xChannelSelector_Getter_(mthis) => xChannelSelector_Getter(mthis);
+  xChannelSelector_Getter_(mthis) => mthis["xChannelSelector"];
 
-  static x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
-  yChannelSelector_Getter_(mthis) => yChannelSelector_Getter(mthis);
+  yChannelSelector_Getter_(mthis) => mthis["yChannelSelector"];
 
-  static y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEDistantLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDistantLightElement();
 
-  static azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
-  azimuth_Getter_(mthis) => azimuth_Getter(mthis);
+  azimuth_Getter_(mthis) => mthis["azimuth"];
 
-  static elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
-  elevation_Getter_(mthis) => elevation_Getter(mthis);
+  elevation_Getter_(mthis) => mthis["elevation"];
 
 }
 
 class BlinkSVGFEDropShadowElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEDropShadowElement();
 
-  static dx_Getter(mthis) native "SVGFEDropShadowElement_dx_Getter";
-  dx_Getter_(mthis) => dx_Getter(mthis);
+  dx_Getter_(mthis) => mthis["dx"];
 
-  static dy_Getter(mthis) native "SVGFEDropShadowElement_dy_Getter";
-  dy_Getter_(mthis) => dy_Getter(mthis);
+  dy_Getter_(mthis) => mthis["dy"];
 
-  static height_Getter(mthis) native "SVGFEDropShadowElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEDropShadowElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFEDropShadowElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static setStdDeviation_Callback_0(mthis) native "SVGFEDropShadowElement_setStdDeviation_Callback";
-  setStdDeviation_Callback_0_(mthis) => setStdDeviation_Callback_0(mthis);
+  setStdDeviation_Callback_0_(mthis) => mthis.callMethod("setStdDeviation", []);
 
-  static setStdDeviation_Callback_1(mthis, __arg_0) native "SVGFEDropShadowElement_setStdDeviation_Callback";
-  setStdDeviation_Callback_1_(mthis, __arg_0) => setStdDeviation_Callback_1(mthis, __arg_0);
+  setStdDeviation_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStdDeviation", [__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);
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setStdDeviation", [__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);
+  stdDeviationX_Getter_(mthis) => mthis["stdDeviationX"];
 
-  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);
+  stdDeviationY_Getter_(mthis) => mthis["stdDeviationY"];
 
-  static stdDeviationX_Getter(mthis) native "SVGFEDropShadowElement_stdDeviationX_Getter";
-  stdDeviationX_Getter_(mthis) => stdDeviationX_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static stdDeviationY_Getter(mthis) native "SVGFEDropShadowElement_stdDeviationY_Getter";
-  stdDeviationY_Getter_(mthis) => stdDeviationY_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEFloodElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEFloodElement();
 
-  static height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -20434,342 +11356,240 @@
 class BlinkSVGFEGaussianBlurElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEGaussianBlurElement();
 
-  static height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static setStdDeviation_Callback_0(mthis) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
-  setStdDeviation_Callback_0_(mthis) => setStdDeviation_Callback_0(mthis);
+  setStdDeviation_Callback_0_(mthis) => mthis.callMethod("setStdDeviation", []);
 
-  static setStdDeviation_Callback_1(mthis, __arg_0) native "SVGFEGaussianBlurElement_setStdDeviation_Callback";
-  setStdDeviation_Callback_1_(mthis, __arg_0) => setStdDeviation_Callback_1(mthis, __arg_0);
+  setStdDeviation_Callback_1_(mthis, __arg_0) => mthis.callMethod("setStdDeviation", [__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);
+  setStdDeviation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setStdDeviation", [__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);
+  stdDeviationX_Getter_(mthis) => mthis["stdDeviationX"];
 
-  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);
+  stdDeviationY_Getter_(mthis) => mthis["stdDeviationY"];
 
-  static stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
-  stdDeviationX_Getter_(mthis) => stdDeviationX_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
-  stdDeviationY_Getter_(mthis) => stdDeviationY_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEImageElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEImageElement();
 
-  static height_Getter(mthis) native "SVGFEImageElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static href_Getter(mthis) native "SVGFEImageElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static result_Getter(mthis) native "SVGFEImageElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEImageElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEImageElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEImageElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEMergeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMergeElement();
 
-  static height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEMergeNodeElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMergeNodeElement();
 
-  static in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
 }
 
 class BlinkSVGFEMorphologyElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEMorphologyElement();
 
-  static height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
-  operator_Getter_(mthis) => operator_Getter(mthis);
+  operator_Getter_(mthis) => mthis["operator"];
 
-  static radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
-  radiusX_Getter_(mthis) => radiusX_Getter(mthis);
+  radiusX_Getter_(mthis) => mthis["radiusX"];
 
-  static radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
-  radiusY_Getter_(mthis) => radiusY_Getter(mthis);
+  radiusY_Getter_(mthis) => mthis["radiusY"];
 
-  static result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEOffsetElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEOffsetElement();
 
-  static dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
-  dx_Getter_(mthis) => dx_Getter(mthis);
+  dx_Getter_(mthis) => mthis["dx"];
 
-  static dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
-  dy_Getter_(mthis) => dy_Getter(mthis);
+  dy_Getter_(mthis) => mthis["dy"];
 
-  static height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFEPointLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFEPointLightElement();
 
-  static x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
-  z_Getter_(mthis) => z_Getter(mthis);
+  z_Getter_(mthis) => mthis["z"];
 
 }
 
 class BlinkSVGFESpecularLightingElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFESpecularLightingElement();
 
-  static height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
-  specularConstant_Getter_(mthis) => specularConstant_Getter(mthis);
+  specularConstant_Getter_(mthis) => mthis["specularConstant"];
 
-  static specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
-  specularExponent_Getter_(mthis) => specularExponent_Getter(mthis);
+  specularExponent_Getter_(mthis) => mthis["specularExponent"];
 
-  static surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
-  surfaceScale_Getter_(mthis) => surfaceScale_Getter(mthis);
+  surfaceScale_Getter_(mthis) => mthis["surfaceScale"];
 
-  static width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFESpotLightElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFESpotLightElement();
 
-  static limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
-  limitingConeAngle_Getter_(mthis) => limitingConeAngle_Getter(mthis);
+  limitingConeAngle_Getter_(mthis) => mthis["limitingConeAngle"];
 
-  static pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
-  pointsAtX_Getter_(mthis) => pointsAtX_Getter(mthis);
+  pointsAtX_Getter_(mthis) => mthis["pointsAtX"];
 
-  static pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
-  pointsAtY_Getter_(mthis) => pointsAtY_Getter(mthis);
+  pointsAtY_Getter_(mthis) => mthis["pointsAtY"];
 
-  static pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
-  pointsAtZ_Getter_(mthis) => pointsAtZ_Getter(mthis);
+  pointsAtZ_Getter_(mthis) => mthis["pointsAtZ"];
 
-  static specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
-  specularExponent_Getter_(mthis) => specularExponent_Getter(mthis);
+  specularExponent_Getter_(mthis) => mthis["specularExponent"];
 
-  static x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
-  z_Getter_(mthis) => z_Getter(mthis);
+  z_Getter_(mthis) => mthis["z"];
 
 }
 
 class BlinkSVGFETileElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFETileElement();
 
-  static height_Getter(mthis) native "SVGFETileElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
-  in1_Getter_(mthis) => in1_Getter(mthis);
+  in1_Getter_(mthis) => mthis["in1"];
 
-  static result_Getter(mthis) native "SVGFETileElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static width_Getter(mthis) native "SVGFETileElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFETileElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFETileElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFETurbulenceElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFETurbulenceElement();
 
-  static baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
-  baseFrequencyX_Getter_(mthis) => baseFrequencyX_Getter(mthis);
+  baseFrequencyX_Getter_(mthis) => mthis["baseFrequencyX"];
 
-  static baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
-  baseFrequencyY_Getter_(mthis) => baseFrequencyY_Getter(mthis);
+  baseFrequencyY_Getter_(mthis) => mthis["baseFrequencyY"];
 
-  static height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
-  numOctaves_Getter_(mthis) => numOctaves_Getter(mthis);
+  numOctaves_Getter_(mthis) => mthis["numOctaves"];
 
-  static result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
-  result_Getter_(mthis) => result_Getter(mthis);
+  result_Getter_(mthis) => mthis["result"];
 
-  static seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
-  seed_Getter_(mthis) => seed_Getter(mthis);
+  seed_Getter_(mthis) => mthis["seed"];
 
-  static stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
-  stitchTiles_Getter_(mthis) => stitchTiles_Getter(mthis);
+  stitchTiles_Getter_(mthis) => mthis["stitchTiles"];
 
-  static type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGFilterElement extends BlinkSVGElement {
   static final instance = new BlinkSVGFilterElement();
 
-  static filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
-  filterResX_Getter_(mthis) => filterResX_Getter(mthis);
+  filterResX_Getter_(mthis) => mthis["filterResX"];
 
-  static filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
-  filterResY_Getter_(mthis) => filterResY_Getter(mthis);
+  filterResY_Getter_(mthis) => mthis["filterResY"];
 
-  static filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
-  filterUnits_Getter_(mthis) => filterUnits_Getter(mthis);
+  filterUnits_Getter_(mthis) => mthis["filterUnits"];
 
-  static height_Getter(mthis) native "SVGFilterElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static href_Getter(mthis) native "SVGFilterElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
-  primitiveUnits_Getter_(mthis) => primitiveUnits_Getter(mthis);
+  primitiveUnits_Getter_(mthis) => mthis["primitiveUnits"];
 
-  static setFilterRes_Callback_0(mthis) native "SVGFilterElement_setFilterRes_Callback";
-  setFilterRes_Callback_0_(mthis) => setFilterRes_Callback_0(mthis);
+  setFilterRes_Callback_0_(mthis) => mthis.callMethod("setFilterRes", []);
 
-  static setFilterRes_Callback_1(mthis, __arg_0) native "SVGFilterElement_setFilterRes_Callback";
-  setFilterRes_Callback_1_(mthis, __arg_0) => setFilterRes_Callback_1(mthis, __arg_0);
+  setFilterRes_Callback_1_(mthis, __arg_0) => mthis.callMethod("setFilterRes", [__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);
+  setFilterRes_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setFilterRes", [__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);
+  width_Getter_(mthis) => mthis["width"];
 
-  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);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -20806,17 +11626,13 @@
 class BlinkSVGForeignObjectElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGForeignObjectElement();
 
-  static height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -20828,29 +11644,13 @@
 class BlinkSVGGeometryElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGGeometryElement();
 
-  static isPointInFill_Callback_0(mthis) native "SVGGeometryElement_isPointInFill_Callback";
-  isPointInFill_Callback_0_(mthis) => isPointInFill_Callback_0(mthis);
+  isPointInFill_Callback_0_(mthis) => mthis.callMethod("isPointInFill", []);
 
-  static isPointInFill_Callback_1(mthis, __arg_0) native "SVGGeometryElement_isPointInFill_Callback";
-  isPointInFill_Callback_1_(mthis, __arg_0) => isPointInFill_Callback_1(mthis, __arg_0);
+  isPointInFill_Callback_1_(mthis, __arg_0) => mthis.callMethod("isPointInFill", [__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);
+  isPointInStroke_Callback_0_(mthis) => mthis.callMethod("isPointInStroke", []);
 
-  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);
+  isPointInStroke_Callback_1_(mthis, __arg_0) => mthis.callMethod("isPointInStroke", [__arg_0]);
 
 }
 
@@ -20862,135 +11662,75 @@
 class BlinkSVGGlyphRefElement extends BlinkSVGElement {
   static final instance = new BlinkSVGGlyphRefElement();
 
-  static dx_Getter(mthis) native "SVGGlyphRefElement_dx_Getter";
-  dx_Getter_(mthis) => dx_Getter(mthis);
+  dx_Getter_(mthis) => mthis["dx"];
 
-  static dx_Setter(mthis, __arg_0) native "SVGGlyphRefElement_dx_Setter";
-  dx_Setter_(mthis, __arg_0) => dx_Setter(mthis, __arg_0);
+  dx_Setter_(mthis, __arg_0) => mthis["dx"] = __arg_0;
 
-  static dy_Getter(mthis) native "SVGGlyphRefElement_dy_Getter";
-  dy_Getter_(mthis) => dy_Getter(mthis);
+  dy_Getter_(mthis) => mthis["dy"];
 
-  static dy_Setter(mthis, __arg_0) native "SVGGlyphRefElement_dy_Setter";
-  dy_Setter_(mthis, __arg_0) => dy_Setter(mthis, __arg_0);
+  dy_Setter_(mthis, __arg_0) => mthis["dy"] = __arg_0;
 
-  static format_Getter(mthis) native "SVGGlyphRefElement_format_Getter";
-  format_Getter_(mthis) => format_Getter(mthis);
+  format_Getter_(mthis) => mthis["format"];
 
-  static format_Setter(mthis, __arg_0) native "SVGGlyphRefElement_format_Setter";
-  format_Setter_(mthis, __arg_0) => format_Setter(mthis, __arg_0);
+  format_Setter_(mthis, __arg_0) => mthis["format"] = __arg_0;
 
-  static glyphRef_Getter(mthis) native "SVGGlyphRefElement_glyphRef_Getter";
-  glyphRef_Getter_(mthis) => glyphRef_Getter(mthis);
+  glyphRef_Getter_(mthis) => mthis["glyphRef"];
 
-  static glyphRef_Setter(mthis, __arg_0) native "SVGGlyphRefElement_glyphRef_Setter";
-  glyphRef_Setter_(mthis, __arg_0) => glyphRef_Setter(mthis, __arg_0);
+  glyphRef_Setter_(mthis, __arg_0) => mthis["glyphRef"] = __arg_0;
 
-  static href_Getter(mthis) native "SVGGlyphRefElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static x_Getter(mthis) native "SVGGlyphRefElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGGlyphRefElement_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGGlyphRefElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGGlyphRefElement_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __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);
+  gradientTransform_Getter_(mthis) => mthis["gradientTransform"];
 
-  static gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
-  gradientUnits_Getter_(mthis) => gradientUnits_Getter(mthis);
+  gradientUnits_Getter_(mthis) => mthis["gradientUnits"];
 
-  static href_Getter(mthis) native "SVGGradientElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
-  spreadMethod_Getter_(mthis) => spreadMethod_Getter(mthis);
+  spreadMethod_Getter_(mthis) => mthis["spreadMethod"];
 
 }
 
 class BlinkSVGGraphicsElement extends BlinkSVGElement {
   static final instance = new BlinkSVGGraphicsElement();
 
-  static farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
-  farthestViewportElement_Getter_(mthis) => farthestViewportElement_Getter(mthis);
+  farthestViewportElement_Getter_(mthis) => mthis["farthestViewportElement"];
 
-  static getBBox_Callback_0(mthis) native "SVGGraphicsElement_getBBox_Callback";
-  getBBox_Callback_0_(mthis) => getBBox_Callback_0(mthis);
+  getBBox_Callback_0_(mthis) => mthis.callMethod("getBBox", []);
 
-  static getBBox_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getBBox_Callback";
-  getBBox_Callback_1_(mthis, __arg_0) => getBBox_Callback_1(mthis, __arg_0);
+  getCTM_Callback_0_(mthis) => mthis.callMethod("getCTM", []);
 
-  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);
+  getScreenCTM_Callback_0_(mthis) => mthis.callMethod("getScreenCTM", []);
 
-  static getCTM_Callback_0(mthis) native "SVGGraphicsElement_getCTM_Callback";
-  getCTM_Callback_0_(mthis) => getCTM_Callback_0(mthis);
+  getTransformToElement_Callback_0_(mthis) => mthis.callMethod("getTransformToElement", []);
 
-  static getCTM_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getCTM_Callback";
-  getCTM_Callback_1_(mthis, __arg_0) => getCTM_Callback_1(mthis, __arg_0);
+  getTransformToElement_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTransformToElement", [__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);
+  hasExtension_Callback_0_(mthis) => mthis.callMethod("hasExtension", []);
 
-  static getScreenCTM_Callback_0(mthis) native "SVGGraphicsElement_getScreenCTM_Callback";
-  getScreenCTM_Callback_0_(mthis) => getScreenCTM_Callback_0(mthis);
+  hasExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasExtension", [__arg_0]);
 
-  static getScreenCTM_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getScreenCTM_Callback";
-  getScreenCTM_Callback_1_(mthis, __arg_0) => getScreenCTM_Callback_1(mthis, __arg_0);
+  nearestViewportElement_Getter_(mthis) => mthis["nearestViewportElement"];
 
-  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);
+  requiredExtensions_Getter_(mthis) => mthis["requiredExtensions"];
 
-  static getTransformToElement_Callback_0(mthis) native "SVGGraphicsElement_getTransformToElement_Callback";
-  getTransformToElement_Callback_0_(mthis) => getTransformToElement_Callback_0(mthis);
+  requiredFeatures_Getter_(mthis) => mthis["requiredFeatures"];
 
-  static getTransformToElement_Callback_1(mthis, __arg_0) native "SVGGraphicsElement_getTransformToElement_Callback";
-  getTransformToElement_Callback_1_(mthis, __arg_0) => getTransformToElement_Callback_1(mthis, __arg_0);
+  systemLanguage_Getter_(mthis) => mthis["systemLanguage"];
 
-  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);
+  transform_Getter_(mthis) => mthis["transform"];
 
 }
 
@@ -21002,492 +11742,251 @@
 class BlinkSVGImageElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGImageElement();
 
-  static height_Getter(mthis) native "SVGImageElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static href_Getter(mthis) native "SVGImageElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static width_Getter(mthis) native "SVGImageElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGImageElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGImageElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGLength {
   static final instance = new BlinkSVGLength();
 
-  static convertToSpecifiedUnits_Callback_0(mthis) native "SVGLength_convertToSpecifiedUnits_Callback";
-  convertToSpecifiedUnits_Callback_0_(mthis) => convertToSpecifiedUnits_Callback_0(mthis);
+  convertToSpecifiedUnits_Callback_0_(mthis) => mthis.callMethod("convertToSpecifiedUnits", []);
 
-  static convertToSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGLength_convertToSpecifiedUnits_Callback";
-  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => convertToSpecifiedUnits_Callback_1(mthis, __arg_0);
+  convertToSpecifiedUnits_Callback_1_(mthis, __arg_0) => mthis.callMethod("convertToSpecifiedUnits", [__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);
+  newValueSpecifiedUnits_Callback_0_(mthis) => mthis.callMethod("newValueSpecifiedUnits", []);
 
-  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);
+  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => mthis.callMethod("newValueSpecifiedUnits", [__arg_0]);
 
-  static newValueSpecifiedUnits_Callback_0(mthis) native "SVGLength_newValueSpecifiedUnits_Callback";
-  newValueSpecifiedUnits_Callback_0_(mthis) => newValueSpecifiedUnits_Callback_0(mthis);
+  newValueSpecifiedUnits_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("newValueSpecifiedUnits", [__arg_0, __arg_1]);
 
-  static newValueSpecifiedUnits_Callback_1(mthis, __arg_0) native "SVGLength_newValueSpecifiedUnits_Callback";
-  newValueSpecifiedUnits_Callback_1_(mthis, __arg_0) => newValueSpecifiedUnits_Callback_1(mthis, __arg_0);
+  unitType_Getter_(mthis) => mthis["unitType"];
 
-  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);
+  valueAsString_Getter_(mthis) => mthis["valueAsString"];
 
-  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);
+  valueAsString_Setter_(mthis, __arg_0) => mthis["valueAsString"] = __arg_0;
 
-  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);
+  valueInSpecifiedUnits_Getter_(mthis) => mthis["valueInSpecifiedUnits"];
 
-  static unitType_Getter(mthis) native "SVGLength_unitType_Getter";
-  unitType_Getter_(mthis) => unitType_Getter(mthis);
+  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => mthis["valueInSpecifiedUnits"] = __arg_0;
 
-  static valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
-  valueAsString_Getter_(mthis) => valueAsString_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  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, __arg_0) native "SVGLength_valueInSpecifiedUnits_Setter";
-  valueInSpecifiedUnits_Setter_(mthis, __arg_0) => valueInSpecifiedUnits_Setter(mthis, __arg_0);
-
-  static value_Getter(mthis) native "SVGLength_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
-
-  static value_Setter(mthis, __arg_0) native "SVGLength_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGLengthList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGLengthList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static clear_Callback_0(mthis) native "SVGLengthList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGLengthList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "SVGLengthList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGLengthList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static initialize_Callback_0(mthis) native "SVGLengthList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static initialize_Callback_1(mthis, __arg_0) native "SVGLengthList_initialize_Callback";
-  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static insertItemBefore_Callback_0(mthis) native "SVGLengthList_insertItemBefore_Callback";
-  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGLengthList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGLengthList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGLengthList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGLengthList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGLineElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGLineElement();
 
-  static x1_Getter(mthis) native "SVGLineElement_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x2_Getter(mthis) native "SVGLineElement_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static y1_Getter(mthis) native "SVGLineElement_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y2_Getter(mthis) native "SVGLineElement_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
 }
 
 class BlinkSVGLinearGradientElement extends BlinkSVGGradientElement {
   static final instance = new BlinkSVGLinearGradientElement();
 
-  static x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
 }
 
 class BlinkSVGMPathElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMPathElement();
 
-  static href_Getter(mthis) native "SVGMPathElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
 }
 
 class BlinkSVGMarkerElement extends BlinkSVGElement {
   static final instance = new BlinkSVGMarkerElement();
 
-  static markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
-  markerHeight_Getter_(mthis) => markerHeight_Getter(mthis);
+  markerHeight_Getter_(mthis) => mthis["markerHeight"];
 
-  static markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
-  markerUnits_Getter_(mthis) => markerUnits_Getter(mthis);
+  markerUnits_Getter_(mthis) => mthis["markerUnits"];
 
-  static markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
-  markerWidth_Getter_(mthis) => markerWidth_Getter(mthis);
+  markerWidth_Getter_(mthis) => mthis["markerWidth"];
 
-  static orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
-  orientAngle_Getter_(mthis) => orientAngle_Getter(mthis);
+  orientAngle_Getter_(mthis) => mthis["orientAngle"];
 
-  static orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
-  orientType_Getter_(mthis) => orientType_Getter(mthis);
+  orientType_Getter_(mthis) => mthis["orientType"];
 
-  static preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
-  refX_Getter_(mthis) => refX_Getter(mthis);
+  refX_Getter_(mthis) => mthis["refX"];
 
-  static refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
-  refY_Getter_(mthis) => refY_Getter(mthis);
+  refY_Getter_(mthis) => mthis["refY"];
 
-  static setOrientToAngle_Callback_0(mthis) native "SVGMarkerElement_setOrientToAngle_Callback";
-  setOrientToAngle_Callback_0_(mthis) => setOrientToAngle_Callback_0(mthis);
+  setOrientToAngle_Callback_0_(mthis) => mthis.callMethod("setOrientToAngle", []);
 
-  static setOrientToAngle_Callback_1(mthis, __arg_0) native "SVGMarkerElement_setOrientToAngle_Callback";
-  setOrientToAngle_Callback_1_(mthis, __arg_0) => setOrientToAngle_Callback_1(mthis, __arg_0);
+  setOrientToAngle_Callback_1_(mthis, __arg_0) => mthis.callMethod("setOrientToAngle", [__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);
+  setOrientToAuto_Callback_0_(mthis) => mthis.callMethod("setOrientToAuto", []);
 
-  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);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
 }
 
 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);
+  hasExtension_Callback_0_(mthis) => mthis.callMethod("hasExtension", []);
 
-  static hasExtension_Callback_1(mthis, __arg_0) native "SVGMaskElement_hasExtension_Callback";
-  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+  hasExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasExtension", [__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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  maskContentUnits_Getter_(mthis) => mthis["maskContentUnits"];
 
-  static height_Getter(mthis) native "SVGMaskElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  maskUnits_Getter_(mthis) => mthis["maskUnits"];
 
-  static maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
-  maskContentUnits_Getter_(mthis) => maskContentUnits_Getter(mthis);
+  requiredExtensions_Getter_(mthis) => mthis["requiredExtensions"];
 
-  static maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
-  maskUnits_Getter_(mthis) => maskUnits_Getter(mthis);
+  requiredFeatures_Getter_(mthis) => mthis["requiredFeatures"];
 
-  static requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
-  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+  systemLanguage_Getter_(mthis) => mthis["systemLanguage"];
 
-  static requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
-  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
-  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGMatrix {
   static final instance = new BlinkSVGMatrix();
 
-  static a_Getter(mthis) native "SVGMatrix_a_Getter";
-  a_Getter_(mthis) => a_Getter(mthis);
+  a_Getter_(mthis) => mthis["a"];
 
-  static a_Setter(mthis, __arg_0) native "SVGMatrix_a_Setter";
-  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
+  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
 
-  static b_Getter(mthis) native "SVGMatrix_b_Getter";
-  b_Getter_(mthis) => b_Getter(mthis);
+  b_Getter_(mthis) => mthis["b"];
 
-  static b_Setter(mthis, __arg_0) native "SVGMatrix_b_Setter";
-  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
+  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
 
-  static c_Getter(mthis) native "SVGMatrix_c_Getter";
-  c_Getter_(mthis) => c_Getter(mthis);
+  c_Getter_(mthis) => mthis["c"];
 
-  static c_Setter(mthis, __arg_0) native "SVGMatrix_c_Setter";
-  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
+  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
 
-  static d_Getter(mthis) native "SVGMatrix_d_Getter";
-  d_Getter_(mthis) => d_Getter(mthis);
+  d_Getter_(mthis) => mthis["d"];
 
-  static d_Setter(mthis, __arg_0) native "SVGMatrix_d_Setter";
-  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
+  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
 
-  static e_Getter(mthis) native "SVGMatrix_e_Getter";
-  e_Getter_(mthis) => e_Getter(mthis);
+  e_Getter_(mthis) => mthis["e"];
 
-  static e_Setter(mthis, __arg_0) native "SVGMatrix_e_Setter";
-  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
+  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
 
-  static f_Getter(mthis) native "SVGMatrix_f_Getter";
-  f_Getter_(mthis) => f_Getter(mthis);
+  f_Getter_(mthis) => mthis["f"];
 
-  static f_Setter(mthis, __arg_0) native "SVGMatrix_f_Setter";
-  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
+  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
 
-  static flipX_Callback_0(mthis) native "SVGMatrix_flipX_Callback";
-  flipX_Callback_0_(mthis) => flipX_Callback_0(mthis);
+  flipX_Callback_0_(mthis) => mthis.callMethod("flipX", []);
 
-  static flipX_Callback_1(mthis, __arg_0) native "SVGMatrix_flipX_Callback";
-  flipX_Callback_1_(mthis, __arg_0) => flipX_Callback_1(mthis, __arg_0);
+  flipY_Callback_0_(mthis) => mthis.callMethod("flipY", []);
 
-  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);
+  inverse_Callback_0_(mthis) => mthis.callMethod("inverse", []);
 
-  static flipY_Callback_0(mthis) native "SVGMatrix_flipY_Callback";
-  flipY_Callback_0_(mthis) => flipY_Callback_0(mthis);
+  multiply_Callback_0_(mthis) => mthis.callMethod("multiply", []);
 
-  static flipY_Callback_1(mthis, __arg_0) native "SVGMatrix_flipY_Callback";
-  flipY_Callback_1_(mthis, __arg_0) => flipY_Callback_1(mthis, __arg_0);
+  multiply_Callback_1_(mthis, __arg_0) => mthis.callMethod("multiply", [__arg_0]);
 
-  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);
+  rotateFromVector_Callback_0_(mthis) => mthis.callMethod("rotateFromVector", []);
 
-  static inverse_Callback_0(mthis) native "SVGMatrix_inverse_Callback";
-  inverse_Callback_0_(mthis) => inverse_Callback_0(mthis);
+  rotateFromVector_Callback_1_(mthis, __arg_0) => mthis.callMethod("rotateFromVector", [__arg_0]);
 
-  static inverse_Callback_1(mthis, __arg_0) native "SVGMatrix_inverse_Callback";
-  inverse_Callback_1_(mthis, __arg_0) => inverse_Callback_1(mthis, __arg_0);
+  rotateFromVector_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("rotateFromVector", [__arg_0, __arg_1]);
 
-  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);
+  rotate_Callback_0_(mthis) => mthis.callMethod("rotate", []);
 
-  static multiply_Callback_0(mthis) native "SVGMatrix_multiply_Callback";
-  multiply_Callback_0_(mthis) => multiply_Callback_0(mthis);
+  rotate_Callback_1_(mthis, __arg_0) => mthis.callMethod("rotate", [__arg_0]);
 
-  static multiply_Callback_1(mthis, __arg_0) native "SVGMatrix_multiply_Callback";
-  multiply_Callback_1_(mthis, __arg_0) => multiply_Callback_1(mthis, __arg_0);
+  scaleNonUniform_Callback_0_(mthis) => mthis.callMethod("scaleNonUniform", []);
 
-  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);
+  scaleNonUniform_Callback_1_(mthis, __arg_0) => mthis.callMethod("scaleNonUniform", [__arg_0]);
 
-  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);
+  scaleNonUniform_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scaleNonUniform", [__arg_0, __arg_1]);
 
-  static rotateFromVector_Callback_0(mthis) native "SVGMatrix_rotateFromVector_Callback";
-  rotateFromVector_Callback_0_(mthis) => rotateFromVector_Callback_0(mthis);
+  scale_Callback_0_(mthis) => mthis.callMethod("scale", []);
 
-  static rotateFromVector_Callback_1(mthis, __arg_0) native "SVGMatrix_rotateFromVector_Callback";
-  rotateFromVector_Callback_1_(mthis, __arg_0) => rotateFromVector_Callback_1(mthis, __arg_0);
+  scale_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale", [__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);
+  skewX_Callback_0_(mthis) => mthis.callMethod("skewX", []);
 
-  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);
+  skewX_Callback_1_(mthis, __arg_0) => mthis.callMethod("skewX", [__arg_0]);
 
-  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);
+  skewY_Callback_0_(mthis) => mthis.callMethod("skewY", []);
 
-  static rotate_Callback_0(mthis) native "SVGMatrix_rotate_Callback";
-  rotate_Callback_0_(mthis) => rotate_Callback_0(mthis);
+  skewY_Callback_1_(mthis, __arg_0) => mthis.callMethod("skewY", [__arg_0]);
 
-  static rotate_Callback_1(mthis, __arg_0) native "SVGMatrix_rotate_Callback";
-  rotate_Callback_1_(mthis, __arg_0) => rotate_Callback_1(mthis, __arg_0);
+  translate_Callback_0_(mthis) => mthis.callMethod("translate", []);
 
-  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);
+  translate_Callback_1_(mthis, __arg_0) => mthis.callMethod("translate", [__arg_0]);
 
-  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);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("translate", [__arg_0, __arg_1]);
 
 }
 
@@ -21504,540 +12003,254 @@
 class BlinkSVGNumber {
   static final instance = new BlinkSVGNumber();
 
-  static value_Getter(mthis) native "SVGNumber_value_Getter";
-  value_Getter_(mthis) => value_Getter(mthis);
+  value_Getter_(mthis) => mthis["value"];
 
-  static value_Setter(mthis, __arg_0) native "SVGNumber_value_Setter";
-  value_Setter_(mthis, __arg_0) => value_Setter(mthis, __arg_0);
+  value_Setter_(mthis, __arg_0) => mthis["value"] = __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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGNumberList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGNumberList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static clear_Callback_0(mthis) native "SVGNumberList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGNumberList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "SVGNumberList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGNumberList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static initialize_Callback_0(mthis) native "SVGNumberList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static initialize_Callback_1(mthis, __arg_0) native "SVGNumberList_initialize_Callback";
-  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static insertItemBefore_Callback_0(mthis) native "SVGNumberList_insertItemBefore_Callback";
-  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGNumberList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGNumberList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGNumberList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGNumberList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPathElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPathElement();
 
-  static animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
-  animatedNormalizedPathSegList_Getter_(mthis) => animatedNormalizedPathSegList_Getter(mthis);
+  animatedNormalizedPathSegList_Getter_(mthis) => mthis["animatedNormalizedPathSegList"];
 
-  static animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
-  animatedPathSegList_Getter_(mthis) => animatedPathSegList_Getter(mthis);
+  animatedPathSegList_Getter_(mthis) => mthis["animatedPathSegList"];
 
-  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);
+  createSVGPathSegArcAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createSVGPathSegArcAbs", [__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);
+  createSVGPathSegArcAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createSVGPathSegArcAbs", [__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);
+  createSVGPathSegArcAbs_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("createSVGPathSegArcAbs", [__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);
+  createSVGPathSegArcRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  createSVGPathSegArcRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  createSVGPathSegArcRel_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("createSVGPathSegArcRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  createSVGPathSegClosePath_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegClosePath", []);
 
-  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);
+  createSVGPathSegCurvetoCubicAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createSVGPathSegCurvetoCubicAbs_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  createSVGPathSegCurvetoCubicAbs_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createSVGPathSegCurvetoCubicAbs", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static createSVGPathSegClosePath_Callback_0(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback";
-  createSVGPathSegClosePath_Callback_0_(mthis) => createSVGPathSegClosePath_Callback_0(mthis);
+  createSVGPathSegCurvetoCubicRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static createSVGPathSegClosePath_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegClosePath_Callback";
-  createSVGPathSegClosePath_Callback_1_(mthis, __arg_0) => createSVGPathSegClosePath_Callback_1(mthis, __arg_0);
+  createSVGPathSegCurvetoCubicRel_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  createSVGPathSegCurvetoCubicRel_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("createSVGPathSegCurvetoCubicRel", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothRel", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoCubicSmoothRel", [__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);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticAbs_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoQuadraticAbs", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticRel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticRel_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticRel_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createSVGPathSegCurvetoQuadraticRel", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothAbs", []);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothAbs", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothRel", []);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0]);
 
-  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);
+  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegCurvetoQuadraticSmoothRel", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegLinetoAbs_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoAbs", []);
 
-  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);
+  createSVGPathSegLinetoAbs_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoAbs", [__arg_0]);
 
-  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);
+  createSVGPathSegLinetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegLinetoAbs", [__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);
+  createSVGPathSegLinetoHorizontalAbs_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoHorizontalAbs", []);
 
-  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);
+  createSVGPathSegLinetoHorizontalAbs_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoHorizontalAbs", [__arg_0]);
 
-  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);
+  createSVGPathSegLinetoHorizontalRel_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoHorizontalRel", []);
 
-  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);
+  createSVGPathSegLinetoHorizontalRel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoHorizontalRel", [__arg_0]);
 
-  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);
+  createSVGPathSegLinetoRel_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoRel", []);
 
-  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);
+  createSVGPathSegLinetoRel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoRel", [__arg_0]);
 
-  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);
+  createSVGPathSegLinetoRel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegLinetoRel", [__arg_0, __arg_1]);
 
-  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);
+  createSVGPathSegLinetoVerticalAbs_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoVerticalAbs", []);
 
-  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);
+  createSVGPathSegLinetoVerticalAbs_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoVerticalAbs", [__arg_0]);
 
-  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0(mthis) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
-  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0_(mthis) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_0(mthis);
+  createSVGPathSegLinetoVerticalRel_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegLinetoVerticalRel", []);
 
-  static createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback";
-  createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1_(mthis, __arg_0) => createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_1(mthis, __arg_0);
+  createSVGPathSegLinetoVerticalRel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegLinetoVerticalRel", [__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);
+  createSVGPathSegMovetoAbs_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegMovetoAbs", []);
 
-  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);
+  createSVGPathSegMovetoAbs_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegMovetoAbs", [__arg_0]);
 
-  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);
+  createSVGPathSegMovetoAbs_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegMovetoAbs", [__arg_0, __arg_1]);
 
-  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0(mthis) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
-  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0_(mthis) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_0(mthis);
+  createSVGPathSegMovetoRel_Callback_0_(mthis) => mthis.callMethod("createSVGPathSegMovetoRel", []);
 
-  static createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1(mthis, __arg_0) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback";
-  createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1_(mthis, __arg_0) => createSVGPathSegCurvetoQuadraticSmoothRel_Callback_1(mthis, __arg_0);
+  createSVGPathSegMovetoRel_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGPathSegMovetoRel", [__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);
+  createSVGPathSegMovetoRel_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createSVGPathSegMovetoRel", [__arg_0, __arg_1]);
 
-  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);
+  getPathSegAtLength_Callback_0_(mthis) => mthis.callMethod("getPathSegAtLength", []);
 
-  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);
+  getPathSegAtLength_Callback_1_(mthis, __arg_0) => mthis.callMethod("getPathSegAtLength", [__arg_0]);
 
-  static getTotalLength_Callback_0(mthis) native "SVGPathElement_getTotalLength_Callback";
-  getTotalLength_Callback_0_(mthis) => getTotalLength_Callback_0(mthis);
+  getPointAtLength_Callback_0_(mthis) => mthis.callMethod("getPointAtLength", []);
 
-  static getTotalLength_Callback_1(mthis, __arg_0) native "SVGPathElement_getTotalLength_Callback";
-  getTotalLength_Callback_1_(mthis, __arg_0) => getTotalLength_Callback_1(mthis, __arg_0);
+  getPointAtLength_Callback_1_(mthis, __arg_0) => mthis.callMethod("getPointAtLength", [__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);
+  getTotalLength_Callback_0_(mthis) => mthis.callMethod("getTotalLength", []);
 
-  static normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
-  normalizedPathSegList_Getter_(mthis) => normalizedPathSegList_Getter(mthis);
+  normalizedPathSegList_Getter_(mthis) => mthis["normalizedPathSegList"];
 
-  static pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
-  pathLength_Getter_(mthis) => pathLength_Getter(mthis);
+  pathLength_Getter_(mthis) => mthis["pathLength"];
 
-  static pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
-  pathSegList_Getter_(mthis) => pathSegList_Getter(mthis);
+  pathSegList_Getter_(mthis) => mthis["pathSegList"];
 
 }
 
 class BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSeg();
 
-  static pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
-  pathSegTypeAsLetter_Getter_(mthis) => pathSegTypeAsLetter_Getter(mthis);
+  pathSegTypeAsLetter_Getter_(mthis) => mthis["pathSegTypeAsLetter"];
 
-  static pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
-  pathSegType_Getter_(mthis) => pathSegType_Getter(mthis);
+  pathSegType_Getter_(mthis) => mthis["pathSegType"];
 
 }
 
 class BlinkSVGPathSegArcAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegArcAbs();
 
-  static angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
-  angle_Getter_(mthis) => angle_Getter(mthis);
+  angle_Getter_(mthis) => mthis["angle"];
 
-  static angle_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_angle_Setter";
-  angle_Setter_(mthis, __arg_0) => angle_Setter(mthis, __arg_0);
+  angle_Setter_(mthis, __arg_0) => mthis["angle"] = __arg_0;
 
-  static largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
-  largeArcFlag_Getter_(mthis) => largeArcFlag_Getter(mthis);
+  largeArcFlag_Getter_(mthis) => mthis["largeArcFlag"];
 
-  static largeArcFlag_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_largeArcFlag_Setter";
-  largeArcFlag_Setter_(mthis, __arg_0) => largeArcFlag_Setter(mthis, __arg_0);
+  largeArcFlag_Setter_(mthis, __arg_0) => mthis["largeArcFlag"] = __arg_0;
 
-  static r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
-  r1_Getter_(mthis) => r1_Getter(mthis);
+  r1_Getter_(mthis) => mthis["r1"];
 
-  static r1_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_r1_Setter";
-  r1_Setter_(mthis, __arg_0) => r1_Setter(mthis, __arg_0);
+  r1_Setter_(mthis, __arg_0) => mthis["r1"] = __arg_0;
 
-  static r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
-  r2_Getter_(mthis) => r2_Getter(mthis);
+  r2_Getter_(mthis) => mthis["r2"];
 
-  static r2_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_r2_Setter";
-  r2_Setter_(mthis, __arg_0) => r2_Setter(mthis, __arg_0);
+  r2_Setter_(mthis, __arg_0) => mthis["r2"] = __arg_0;
 
-  static sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
-  sweepFlag_Getter_(mthis) => sweepFlag_Getter(mthis);
+  sweepFlag_Getter_(mthis) => mthis["sweepFlag"];
 
-  static sweepFlag_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_sweepFlag_Setter";
-  sweepFlag_Setter_(mthis, __arg_0) => sweepFlag_Setter(mthis, __arg_0);
+  sweepFlag_Setter_(mthis, __arg_0) => mthis["sweepFlag"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegArcAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegArcRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegArcRel();
 
-  static angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
-  angle_Getter_(mthis) => angle_Getter(mthis);
+  angle_Getter_(mthis) => mthis["angle"];
 
-  static angle_Setter(mthis, __arg_0) native "SVGPathSegArcRel_angle_Setter";
-  angle_Setter_(mthis, __arg_0) => angle_Setter(mthis, __arg_0);
+  angle_Setter_(mthis, __arg_0) => mthis["angle"] = __arg_0;
 
-  static largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
-  largeArcFlag_Getter_(mthis) => largeArcFlag_Getter(mthis);
+  largeArcFlag_Getter_(mthis) => mthis["largeArcFlag"];
 
-  static largeArcFlag_Setter(mthis, __arg_0) native "SVGPathSegArcRel_largeArcFlag_Setter";
-  largeArcFlag_Setter_(mthis, __arg_0) => largeArcFlag_Setter(mthis, __arg_0);
+  largeArcFlag_Setter_(mthis, __arg_0) => mthis["largeArcFlag"] = __arg_0;
 
-  static r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
-  r1_Getter_(mthis) => r1_Getter(mthis);
+  r1_Getter_(mthis) => mthis["r1"];
 
-  static r1_Setter(mthis, __arg_0) native "SVGPathSegArcRel_r1_Setter";
-  r1_Setter_(mthis, __arg_0) => r1_Setter(mthis, __arg_0);
+  r1_Setter_(mthis, __arg_0) => mthis["r1"] = __arg_0;
 
-  static r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
-  r2_Getter_(mthis) => r2_Getter(mthis);
+  r2_Getter_(mthis) => mthis["r2"];
 
-  static r2_Setter(mthis, __arg_0) native "SVGPathSegArcRel_r2_Setter";
-  r2_Setter_(mthis, __arg_0) => r2_Setter(mthis, __arg_0);
+  r2_Setter_(mthis, __arg_0) => mthis["r2"] = __arg_0;
 
-  static sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
-  sweepFlag_Getter_(mthis) => sweepFlag_Getter(mthis);
+  sweepFlag_Getter_(mthis) => mthis["sweepFlag"];
 
-  static sweepFlag_Setter(mthis, __arg_0) native "SVGPathSegArcRel_sweepFlag_Setter";
-  sweepFlag_Setter_(mthis, __arg_0) => sweepFlag_Setter(mthis, __arg_0);
+  sweepFlag_Setter_(mthis, __arg_0) => mthis["sweepFlag"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegArcRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegArcRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
@@ -22049,751 +12262,480 @@
 class BlinkSVGPathSegCurvetoCubicAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicAbs();
 
-  static x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
-  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
-  static x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
-  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
-  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
 
-  static y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
-  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
-  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoCubicRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicRel();
 
-  static x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x1_Setter";
-  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
-  static x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x2_Setter";
-  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y1_Setter";
-  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
 
-  static y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
-  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y2_Setter";
-  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothAbs();
 
-  static x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
-  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
-  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
-  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoCubicSmoothRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoCubicSmoothRel();
 
-  static x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
-  x2_Getter_(mthis) => x2_Getter(mthis);
+  x2_Getter_(mthis) => mthis["x2"];
 
-  static x2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
-  x2_Setter_(mthis, __arg_0) => x2_Setter(mthis, __arg_0);
+  x2_Setter_(mthis, __arg_0) => mthis["x2"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
-  y2_Getter_(mthis) => y2_Getter(mthis);
+  y2_Getter_(mthis) => mthis["y2"];
 
-  static y2_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
-  y2_Setter_(mthis, __arg_0) => y2_Setter(mthis, __arg_0);
+  y2_Setter_(mthis, __arg_0) => mthis["y2"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticAbs();
 
-  static x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
-  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
-  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticRel();
 
-  static x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
-  x1_Getter_(mthis) => x1_Getter(mthis);
+  x1_Getter_(mthis) => mthis["x1"];
 
-  static x1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
-  x1_Setter_(mthis, __arg_0) => x1_Setter(mthis, __arg_0);
+  x1_Setter_(mthis, __arg_0) => mthis["x1"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
-  y1_Getter_(mthis) => y1_Getter(mthis);
+  y1_Getter_(mthis) => mthis["y1"];
 
-  static y1_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
-  y1_Setter_(mthis, __arg_0) => y1_Setter(mthis, __arg_0);
+  y1_Setter_(mthis, __arg_0) => mthis["y1"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticSmoothAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothAbs();
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegCurvetoQuadraticSmoothRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegCurvetoQuadraticSmoothRel();
 
-  static x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoAbs();
 
-  static x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoHorizontalAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoHorizontalAbs();
 
-  static x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoHorizontalRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoHorizontalRel();
 
-  static x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoHorizontalRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoRel();
 
-  static x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegLinetoRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoVerticalAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoVerticalAbs();
 
-  static y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoVerticalAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegLinetoVerticalRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegLinetoVerticalRel();
 
-  static y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegLinetoVerticalRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGPathSegList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static clear_Callback_0(mthis) native "SVGPathSegList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGPathSegList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "SVGPathSegList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static initialize_Callback_0(mthis) native "SVGPathSegList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static initialize_Callback_1(mthis, __arg_0) native "SVGPathSegList_initialize_Callback";
-  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static insertItemBefore_Callback_0(mthis) native "SVGPathSegList_insertItemBefore_Callback";
-  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGPathSegList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGPathSegList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGPathSegList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPathSegMovetoAbs extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegMovetoAbs();
 
-  static x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegMovetoAbs_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegMovetoAbs_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGPathSegMovetoRel extends BlinkSVGPathSeg {
   static final instance = new BlinkSVGPathSegMovetoRel();
 
-  static x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGPathSegMovetoRel_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGPathSegMovetoRel_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 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);
+  hasExtension_Callback_0_(mthis) => mthis.callMethod("hasExtension", []);
 
-  static hasExtension_Callback_1(mthis, __arg_0) native "SVGPatternElement_hasExtension_Callback";
-  hasExtension_Callback_1_(mthis, __arg_0) => hasExtension_Callback_1(mthis, __arg_0);
+  hasExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("hasExtension", [__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);
+  height_Getter_(mthis) => mthis["height"];
 
-  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);
+  href_Getter_(mthis) => mthis["href"];
 
-  static height_Getter(mthis) native "SVGPatternElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  patternContentUnits_Getter_(mthis) => mthis["patternContentUnits"];
 
-  static href_Getter(mthis) native "SVGPatternElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  patternTransform_Getter_(mthis) => mthis["patternTransform"];
 
-  static patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
-  patternContentUnits_Getter_(mthis) => patternContentUnits_Getter(mthis);
+  patternUnits_Getter_(mthis) => mthis["patternUnits"];
 
-  static patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
-  patternTransform_Getter_(mthis) => patternTransform_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
-  patternUnits_Getter_(mthis) => patternUnits_Getter(mthis);
+  requiredExtensions_Getter_(mthis) => mthis["requiredExtensions"];
 
-  static preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  requiredFeatures_Getter_(mthis) => mthis["requiredFeatures"];
 
-  static requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
-  requiredExtensions_Getter_(mthis) => requiredExtensions_Getter(mthis);
+  systemLanguage_Getter_(mthis) => mthis["systemLanguage"];
 
-  static requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
-  requiredFeatures_Getter_(mthis) => requiredFeatures_Getter(mthis);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
-  static systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
-  systemLanguage_Getter_(mthis) => systemLanguage_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
-  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
 class BlinkSVGPoint {
   static final instance = new BlinkSVGPoint();
 
-  static matrixTransform_Callback_0(mthis) native "SVGPoint_matrixTransform_Callback";
-  matrixTransform_Callback_0_(mthis) => matrixTransform_Callback_0(mthis);
+  matrixTransform_Callback_0_(mthis) => mthis.callMethod("matrixTransform", []);
 
-  static matrixTransform_Callback_1(mthis, __arg_0) native "SVGPoint_matrixTransform_Callback";
-  matrixTransform_Callback_1_(mthis, __arg_0) => matrixTransform_Callback_1(mthis, __arg_0);
+  matrixTransform_Callback_1_(mthis, __arg_0) => mthis.callMethod("matrixTransform", [__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);
+  x_Getter_(mthis) => mthis["x"];
 
-  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);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGPoint_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  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, __arg_0) native "SVGPoint_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGPointList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGPointList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static clear_Callback_0(mthis) native "SVGPointList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGPointList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "SVGPointList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGPointList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static initialize_Callback_0(mthis) native "SVGPointList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static initialize_Callback_1(mthis, __arg_0) native "SVGPointList_initialize_Callback";
-  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static insertItemBefore_Callback_0(mthis) native "SVGPointList_insertItemBefore_Callback";
-  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGPointList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGPointList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGPointList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGPointList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGPolygonElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPolygonElement();
 
-  static animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
-  animatedPoints_Getter_(mthis) => animatedPoints_Getter(mthis);
+  animatedPoints_Getter_(mthis) => mthis["animatedPoints"];
 
-  static points_Getter(mthis) native "SVGPolygonElement_points_Getter";
-  points_Getter_(mthis) => points_Getter(mthis);
+  points_Getter_(mthis) => mthis["points"];
 
 }
 
 class BlinkSVGPolylineElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGPolylineElement();
 
-  static animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
-  animatedPoints_Getter_(mthis) => animatedPoints_Getter(mthis);
+  animatedPoints_Getter_(mthis) => mthis["animatedPoints"];
 
-  static points_Getter(mthis) native "SVGPolylineElement_points_Getter";
-  points_Getter_(mthis) => points_Getter(mthis);
+  points_Getter_(mthis) => mthis["points"];
 
 }
 
 class BlinkSVGPreserveAspectRatio {
   static final instance = new BlinkSVGPreserveAspectRatio();
 
-  static align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
-  align_Getter_(mthis) => align_Getter(mthis);
+  align_Getter_(mthis) => mthis["align"];
 
-  static align_Setter(mthis, __arg_0) native "SVGPreserveAspectRatio_align_Setter";
-  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
-  static meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
-  meetOrSlice_Getter_(mthis) => meetOrSlice_Getter(mthis);
+  meetOrSlice_Getter_(mthis) => mthis["meetOrSlice"];
 
-  static meetOrSlice_Setter(mthis, __arg_0) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
-  meetOrSlice_Setter_(mthis, __arg_0) => meetOrSlice_Setter(mthis, __arg_0);
+  meetOrSlice_Setter_(mthis, __arg_0) => mthis["meetOrSlice"] = __arg_0;
 
 }
 
 class BlinkSVGRadialGradientElement extends BlinkSVGGradientElement {
   static final instance = new BlinkSVGRadialGradientElement();
 
-  static cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
-  cx_Getter_(mthis) => cx_Getter(mthis);
+  cx_Getter_(mthis) => mthis["cx"];
 
-  static cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
-  cy_Getter_(mthis) => cy_Getter(mthis);
+  cy_Getter_(mthis) => mthis["cy"];
 
-  static fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
-  fr_Getter_(mthis) => fr_Getter(mthis);
+  fr_Getter_(mthis) => mthis["fr"];
 
-  static fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
-  fx_Getter_(mthis) => fx_Getter(mthis);
+  fx_Getter_(mthis) => mthis["fx"];
 
-  static fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
-  fy_Getter_(mthis) => fy_Getter(mthis);
+  fy_Getter_(mthis) => mthis["fy"];
 
-  static r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
-  r_Getter_(mthis) => r_Getter(mthis);
+  r_Getter_(mthis) => mthis["r"];
 
 }
 
 class BlinkSVGRect {
   static final instance = new BlinkSVGRect();
 
-  static height_Getter(mthis) native "SVGRect_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static height_Setter(mthis, __arg_0) native "SVGRect_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static width_Getter(mthis) native "SVGRect_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static width_Setter(mthis, __arg_0) native "SVGRect_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __arg_0;
 
-  static x_Getter(mthis) native "SVGRect_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static x_Setter(mthis, __arg_0) native "SVGRect_x_Setter";
-  x_Setter_(mthis, __arg_0) => x_Setter(mthis, __arg_0);
+  x_Setter_(mthis, __arg_0) => mthis["x"] = __arg_0;
 
-  static y_Getter(mthis) native "SVGRect_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static y_Setter(mthis, __arg_0) native "SVGRect_y_Setter";
-  y_Setter_(mthis, __arg_0) => y_Setter(mthis, __arg_0);
+  y_Setter_(mthis, __arg_0) => mthis["y"] = __arg_0;
 
 }
 
 class BlinkSVGRectElement extends BlinkSVGGeometryElement {
   static final instance = new BlinkSVGRectElement();
 
-  static height_Getter(mthis) native "SVGRectElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static rx_Getter(mthis) native "SVGRectElement_rx_Getter";
-  rx_Getter_(mthis) => rx_Getter(mthis);
+  rx_Getter_(mthis) => mthis["rx"];
 
-  static ry_Getter(mthis) native "SVGRectElement_ry_Getter";
-  ry_Getter_(mthis) => ry_Getter(mthis);
+  ry_Getter_(mthis) => mthis["ry"];
 
-  static width_Getter(mthis) native "SVGRectElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGRectElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGRectElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -22805,319 +12747,124 @@
 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);
+  animationsPaused_Callback_0_(mthis) => mthis.callMethod("animationsPaused", []);
 
-  static animationsPaused_Callback_1(mthis, __arg_0) native "SVGSVGElement_animationsPaused_Callback";
-  animationsPaused_Callback_1_(mthis, __arg_0) => animationsPaused_Callback_1(mthis, __arg_0);
+  checkEnclosure_Callback_0_(mthis) => mthis.callMethod("checkEnclosure", []);
 
-  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);
+  checkEnclosure_Callback_1_(mthis, __arg_0) => mthis.callMethod("checkEnclosure", [__arg_0]);
 
-  static checkEnclosure_Callback_0(mthis) native "SVGSVGElement_checkEnclosure_Callback";
-  checkEnclosure_Callback_0_(mthis) => checkEnclosure_Callback_0(mthis);
+  checkEnclosure_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("checkEnclosure", [__arg_0, __arg_1]);
 
-  static checkEnclosure_Callback_1(mthis, __arg_0) native "SVGSVGElement_checkEnclosure_Callback";
-  checkEnclosure_Callback_1_(mthis, __arg_0) => checkEnclosure_Callback_1(mthis, __arg_0);
+  checkIntersection_Callback_0_(mthis) => mthis.callMethod("checkIntersection", []);
 
-  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);
+  checkIntersection_Callback_1_(mthis, __arg_0) => mthis.callMethod("checkIntersection", [__arg_0]);
 
-  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);
+  checkIntersection_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("checkIntersection", [__arg_0, __arg_1]);
 
-  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);
+  createSVGAngle_Callback_0_(mthis) => mthis.callMethod("createSVGAngle", []);
 
-  static checkIntersection_Callback_0(mthis) native "SVGSVGElement_checkIntersection_Callback";
-  checkIntersection_Callback_0_(mthis) => checkIntersection_Callback_0(mthis);
+  createSVGLength_Callback_0_(mthis) => mthis.callMethod("createSVGLength", []);
 
-  static checkIntersection_Callback_1(mthis, __arg_0) native "SVGSVGElement_checkIntersection_Callback";
-  checkIntersection_Callback_1_(mthis, __arg_0) => checkIntersection_Callback_1(mthis, __arg_0);
+  createSVGMatrix_Callback_0_(mthis) => mthis.callMethod("createSVGMatrix", []);
 
-  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);
+  createSVGNumber_Callback_0_(mthis) => mthis.callMethod("createSVGNumber", []);
 
-  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);
+  createSVGPoint_Callback_0_(mthis) => mthis.callMethod("createSVGPoint", []);
 
-  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);
+  createSVGRect_Callback_0_(mthis) => mthis.callMethod("createSVGRect", []);
 
-  static createSVGAngle_Callback_0(mthis) native "SVGSVGElement_createSVGAngle_Callback";
-  createSVGAngle_Callback_0_(mthis) => createSVGAngle_Callback_0(mthis);
+  createSVGTransformFromMatrix_Callback_0_(mthis) => mthis.callMethod("createSVGTransformFromMatrix", []);
 
-  static createSVGAngle_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGAngle_Callback";
-  createSVGAngle_Callback_1_(mthis, __arg_0) => createSVGAngle_Callback_1(mthis, __arg_0);
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGTransformFromMatrix", [__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);
+  createSVGTransform_Callback_0_(mthis) => mthis.callMethod("createSVGTransform", []);
 
-  static createSVGLength_Callback_0(mthis) native "SVGSVGElement_createSVGLength_Callback";
-  createSVGLength_Callback_0_(mthis) => createSVGLength_Callback_0(mthis);
+  currentScale_Getter_(mthis) => mthis["currentScale"];
 
-  static createSVGLength_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGLength_Callback";
-  createSVGLength_Callback_1_(mthis, __arg_0) => createSVGLength_Callback_1(mthis, __arg_0);
+  currentScale_Setter_(mthis, __arg_0) => mthis["currentScale"] = __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);
+  currentTranslate_Getter_(mthis) => mthis["currentTranslate"];
 
-  static createSVGMatrix_Callback_0(mthis) native "SVGSVGElement_createSVGMatrix_Callback";
-  createSVGMatrix_Callback_0_(mthis) => createSVGMatrix_Callback_0(mthis);
+  currentView_Getter_(mthis) => mthis["currentView"];
 
-  static createSVGMatrix_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGMatrix_Callback";
-  createSVGMatrix_Callback_1_(mthis, __arg_0) => createSVGMatrix_Callback_1(mthis, __arg_0);
+  deselectAll_Callback_0_(mthis) => mthis.callMethod("deselectAll", []);
 
-  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);
+  forceRedraw_Callback_0_(mthis) => mthis.callMethod("forceRedraw", []);
 
-  static createSVGNumber_Callback_0(mthis) native "SVGSVGElement_createSVGNumber_Callback";
-  createSVGNumber_Callback_0_(mthis) => createSVGNumber_Callback_0(mthis);
+  getCurrentTime_Callback_0_(mthis) => mthis.callMethod("getCurrentTime", []);
 
-  static createSVGNumber_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGNumber_Callback";
-  createSVGNumber_Callback_1_(mthis, __arg_0) => createSVGNumber_Callback_1(mthis, __arg_0);
+  getElementById_Callback_0_(mthis) => mthis.callMethod("getElementById", []);
 
-  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);
+  getElementById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementById", [__arg_0]);
 
-  static createSVGPoint_Callback_0(mthis) native "SVGSVGElement_createSVGPoint_Callback";
-  createSVGPoint_Callback_0_(mthis) => createSVGPoint_Callback_0(mthis);
+  getEnclosureList_Callback_0_(mthis) => mthis.callMethod("getEnclosureList", []);
 
-  static createSVGPoint_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGPoint_Callback";
-  createSVGPoint_Callback_1_(mthis, __arg_0) => createSVGPoint_Callback_1(mthis, __arg_0);
+  getEnclosureList_Callback_1_(mthis, __arg_0) => mthis.callMethod("getEnclosureList", [__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);
+  getEnclosureList_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getEnclosureList", [__arg_0, __arg_1]);
 
-  static createSVGRect_Callback_0(mthis) native "SVGSVGElement_createSVGRect_Callback";
-  createSVGRect_Callback_0_(mthis) => createSVGRect_Callback_0(mthis);
+  getIntersectionList_Callback_0_(mthis) => mthis.callMethod("getIntersectionList", []);
 
-  static createSVGRect_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGRect_Callback";
-  createSVGRect_Callback_1_(mthis, __arg_0) => createSVGRect_Callback_1(mthis, __arg_0);
+  getIntersectionList_Callback_1_(mthis, __arg_0) => mthis.callMethod("getIntersectionList", [__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);
+  getIntersectionList_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getIntersectionList", [__arg_0, __arg_1]);
 
-  static createSVGTransformFromMatrix_Callback_0(mthis) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
-  createSVGTransformFromMatrix_Callback_0_(mthis) => createSVGTransformFromMatrix_Callback_0(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static createSVGTransformFromMatrix_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGTransformFromMatrix_Callback";
-  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => createSVGTransformFromMatrix_Callback_1(mthis, __arg_0);
+  pauseAnimations_Callback_0_(mthis) => mthis.callMethod("pauseAnimations", []);
 
-  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);
+  pixelUnitToMillimeterX_Getter_(mthis) => mthis["pixelUnitToMillimeterX"];
 
-  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);
+  pixelUnitToMillimeterY_Getter_(mthis) => mthis["pixelUnitToMillimeterY"];
 
-  static createSVGTransform_Callback_0(mthis) native "SVGSVGElement_createSVGTransform_Callback";
-  createSVGTransform_Callback_0_(mthis) => createSVGTransform_Callback_0(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static createSVGTransform_Callback_1(mthis, __arg_0) native "SVGSVGElement_createSVGTransform_Callback";
-  createSVGTransform_Callback_1_(mthis, __arg_0) => createSVGTransform_Callback_1(mthis, __arg_0);
+  screenPixelToMillimeterX_Getter_(mthis) => mthis["screenPixelToMillimeterX"];
 
-  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);
+  screenPixelToMillimeterY_Getter_(mthis) => mthis["screenPixelToMillimeterY"];
 
-  static currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
-  currentScale_Getter_(mthis) => currentScale_Getter(mthis);
+  setCurrentTime_Callback_0_(mthis) => mthis.callMethod("setCurrentTime", []);
 
-  static currentScale_Setter(mthis, __arg_0) native "SVGSVGElement_currentScale_Setter";
-  currentScale_Setter_(mthis, __arg_0) => currentScale_Setter(mthis, __arg_0);
+  setCurrentTime_Callback_1_(mthis, __arg_0) => mthis.callMethod("setCurrentTime", [__arg_0]);
 
-  static currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
-  currentTranslate_Getter_(mthis) => currentTranslate_Getter(mthis);
+  suspendRedraw_Callback_0_(mthis) => mthis.callMethod("suspendRedraw", []);
 
-  static currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
-  currentView_Getter_(mthis) => currentView_Getter(mthis);
+  suspendRedraw_Callback_1_(mthis, __arg_0) => mthis.callMethod("suspendRedraw", [__arg_0]);
 
-  static deselectAll_Callback_0(mthis) native "SVGSVGElement_deselectAll_Callback";
-  deselectAll_Callback_0_(mthis) => deselectAll_Callback_0(mthis);
+  unpauseAnimations_Callback_0_(mthis) => mthis.callMethod("unpauseAnimations", []);
 
-  static deselectAll_Callback_1(mthis, __arg_0) native "SVGSVGElement_deselectAll_Callback";
-  deselectAll_Callback_1_(mthis, __arg_0) => deselectAll_Callback_1(mthis, __arg_0);
+  unsuspendRedrawAll_Callback_0_(mthis) => mthis.callMethod("unsuspendRedrawAll", []);
 
-  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);
+  unsuspendRedraw_Callback_0_(mthis) => mthis.callMethod("unsuspendRedraw", []);
 
-  static forceRedraw_Callback_0(mthis) native "SVGSVGElement_forceRedraw_Callback";
-  forceRedraw_Callback_0_(mthis) => forceRedraw_Callback_0(mthis);
+  unsuspendRedraw_Callback_1_(mthis, __arg_0) => mthis.callMethod("unsuspendRedraw", [__arg_0]);
 
-  static forceRedraw_Callback_1(mthis, __arg_0) native "SVGSVGElement_forceRedraw_Callback";
-  forceRedraw_Callback_1_(mthis, __arg_0) => forceRedraw_Callback_1(mthis, __arg_0);
+  useCurrentView_Getter_(mthis) => mthis["useCurrentView"];
 
-  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);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
-  static getCurrentTime_Callback_0(mthis) native "SVGSVGElement_getCurrentTime_Callback";
-  getCurrentTime_Callback_0_(mthis) => getCurrentTime_Callback_0(mthis);
+  viewport_Getter_(mthis) => mthis["viewport"];
 
-  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";
-  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);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGSVGElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGSVGElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
-  static zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
-  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
+  zoomAndPan_Getter_(mthis) => mthis["zoomAndPan"];
 
-  static zoomAndPan_Setter(mthis, __arg_0) native "SVGSVGElement_zoomAndPan_Setter";
-  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
 
 }
 
 class BlinkSVGScriptElement extends BlinkSVGElement {
   static final instance = new BlinkSVGScriptElement();
 
-  static href_Getter(mthis) native "SVGScriptElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static type_Getter(mthis) native "SVGScriptElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "SVGScriptElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
@@ -23129,144 +12876,73 @@
 class BlinkSVGStopElement extends BlinkSVGElement {
   static final instance = new BlinkSVGStopElement();
 
-  static offset_Getter(mthis) native "SVGStopElement_offset_Getter";
-  offset_Getter_(mthis) => offset_Getter(mthis);
+  offset_Getter_(mthis) => mthis["offset"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGStringList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGStringList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static clear_Callback_0(mthis) native "SVGStringList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGStringList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "SVGStringList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGStringList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static initialize_Callback_0(mthis) native "SVGStringList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static initialize_Callback_1(mthis, __arg_0) native "SVGStringList_initialize_Callback";
-  initialize_Callback_1_(mthis, __arg_0) => initialize_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static insertItemBefore_Callback_0(mthis) native "SVGStringList_insertItemBefore_Callback";
-  insertItemBefore_Callback_0_(mthis) => insertItemBefore_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGStringList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGStringList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGStringList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGStringList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
 class BlinkSVGStyleElement extends BlinkSVGElement {
   static final instance = new BlinkSVGStyleElement();
 
-  static disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "SVGStyleElement_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static media_Getter(mthis) native "SVGStyleElement_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static media_Setter(mthis, __arg_0) native "SVGStyleElement_media_Setter";
-  media_Setter_(mthis, __arg_0) => media_Setter(mthis, __arg_0);
+  media_Setter_(mthis, __arg_0) => mthis["media"] = __arg_0;
 
-  static sheet_Getter(mthis) native "SVGStyleElement_sheet_Getter";
-  sheet_Getter_(mthis) => sheet_Getter(mthis);
+  sheet_Getter_(mthis) => mthis["sheet"];
 
-  static title_Getter(mthis) native "SVGStyleElement_title_Getter";
-  title_Getter_(mthis) => title_Getter(mthis);
+  title_Getter_(mthis) => mthis["title"];
 
-  static title_Setter(mthis, __arg_0) native "SVGStyleElement_title_Setter";
-  title_Setter_(mthis, __arg_0) => title_Setter(mthis, __arg_0);
+  title_Setter_(mthis, __arg_0) => mthis["title"] = __arg_0;
 
-  static type_Getter(mthis) native "SVGStyleElement_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  static type_Setter(mthis, __arg_0) native "SVGStyleElement_type_Setter";
-  type_Setter_(mthis, __arg_0) => type_Setter(mthis, __arg_0);
+  type_Setter_(mthis, __arg_0) => mthis["type"] = __arg_0;
 
 }
 
@@ -23278,11 +12954,9 @@
 class BlinkSVGSymbolElement extends BlinkSVGElement {
   static final instance = new BlinkSVGSymbolElement();
 
-  static preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
-  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
 }
 
@@ -23294,119 +12968,45 @@
 class BlinkSVGTextContentElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGTextContentElement();
 
-  static getCharNumAtPosition_Callback_0(mthis) native "SVGTextContentElement_getCharNumAtPosition_Callback";
-  getCharNumAtPosition_Callback_0_(mthis) => getCharNumAtPosition_Callback_0(mthis);
+  getCharNumAtPosition_Callback_0_(mthis) => mthis.callMethod("getCharNumAtPosition", []);
 
-  static getCharNumAtPosition_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getCharNumAtPosition_Callback";
-  getCharNumAtPosition_Callback_1_(mthis, __arg_0) => getCharNumAtPosition_Callback_1(mthis, __arg_0);
+  getCharNumAtPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("getCharNumAtPosition", [__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);
+  getComputedTextLength_Callback_0_(mthis) => mthis.callMethod("getComputedTextLength", []);
 
-  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);
+  getEndPositionOfChar_Callback_0_(mthis) => mthis.callMethod("getEndPositionOfChar", []);
 
-  static getComputedTextLength_Callback_0(mthis) native "SVGTextContentElement_getComputedTextLength_Callback";
-  getComputedTextLength_Callback_0_(mthis) => getComputedTextLength_Callback_0(mthis);
+  getEndPositionOfChar_Callback_1_(mthis, __arg_0) => mthis.callMethod("getEndPositionOfChar", [__arg_0]);
 
-  static getComputedTextLength_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getComputedTextLength_Callback";
-  getComputedTextLength_Callback_1_(mthis, __arg_0) => getComputedTextLength_Callback_1(mthis, __arg_0);
+  getExtentOfChar_Callback_0_(mthis) => mthis.callMethod("getExtentOfChar", []);
 
-  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);
+  getExtentOfChar_Callback_1_(mthis, __arg_0) => mthis.callMethod("getExtentOfChar", [__arg_0]);
 
-  static getEndPositionOfChar_Callback_0(mthis) native "SVGTextContentElement_getEndPositionOfChar_Callback";
-  getEndPositionOfChar_Callback_0_(mthis) => getEndPositionOfChar_Callback_0(mthis);
+  getNumberOfChars_Callback_0_(mthis) => mthis.callMethod("getNumberOfChars", []);
 
-  static getEndPositionOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getEndPositionOfChar_Callback";
-  getEndPositionOfChar_Callback_1_(mthis, __arg_0) => getEndPositionOfChar_Callback_1(mthis, __arg_0);
+  getRotationOfChar_Callback_0_(mthis) => mthis.callMethod("getRotationOfChar", []);
 
-  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);
+  getRotationOfChar_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRotationOfChar", [__arg_0]);
 
-  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);
+  getStartPositionOfChar_Callback_0_(mthis) => mthis.callMethod("getStartPositionOfChar", []);
 
-  static getExtentOfChar_Callback_0(mthis) native "SVGTextContentElement_getExtentOfChar_Callback";
-  getExtentOfChar_Callback_0_(mthis) => getExtentOfChar_Callback_0(mthis);
+  getStartPositionOfChar_Callback_1_(mthis, __arg_0) => mthis.callMethod("getStartPositionOfChar", [__arg_0]);
 
-  static getExtentOfChar_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getExtentOfChar_Callback";
-  getExtentOfChar_Callback_1_(mthis, __arg_0) => getExtentOfChar_Callback_1(mthis, __arg_0);
+  getSubStringLength_Callback_0_(mthis) => mthis.callMethod("getSubStringLength", []);
 
-  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);
+  getSubStringLength_Callback_1_(mthis, __arg_0) => mthis.callMethod("getSubStringLength", [__arg_0]);
 
-  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);
+  getSubStringLength_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getSubStringLength", [__arg_0, __arg_1]);
 
-  static getNumberOfChars_Callback_0(mthis) native "SVGTextContentElement_getNumberOfChars_Callback";
-  getNumberOfChars_Callback_0_(mthis) => getNumberOfChars_Callback_0(mthis);
+  lengthAdjust_Getter_(mthis) => mthis["lengthAdjust"];
 
-  static getNumberOfChars_Callback_1(mthis, __arg_0) native "SVGTextContentElement_getNumberOfChars_Callback";
-  getNumberOfChars_Callback_1_(mthis, __arg_0) => getNumberOfChars_Callback_1(mthis, __arg_0);
+  selectSubString_Callback_0_(mthis) => mthis.callMethod("selectSubString", []);
 
-  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);
+  selectSubString_Callback_1_(mthis, __arg_0) => mthis.callMethod("selectSubString", [__arg_0]);
 
-  static getRotationOfChar_Callback_0(mthis) native "SVGTextContentElement_getRotationOfChar_Callback";
-  getRotationOfChar_Callback_0_(mthis) => getRotationOfChar_Callback_0(mthis);
+  selectSubString_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("selectSubString", [__arg_0, __arg_1]);
 
-  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);
+  textLength_Getter_(mthis) => mthis["textLength"];
 
 }
 
@@ -23418,37 +13018,28 @@
 class BlinkSVGTextPathElement extends BlinkSVGTextContentElement {
   static final instance = new BlinkSVGTextPathElement();
 
-  static href_Getter(mthis) native "SVGTextPathElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static method_Getter(mthis) native "SVGTextPathElement_method_Getter";
-  method_Getter_(mthis) => method_Getter(mthis);
+  method_Getter_(mthis) => mthis["method"];
 
-  static spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
-  spacing_Getter_(mthis) => spacing_Getter(mthis);
+  spacing_Getter_(mthis) => mthis["spacing"];
 
-  static startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
-  startOffset_Getter_(mthis) => startOffset_Getter(mthis);
+  startOffset_Getter_(mthis) => mthis["startOffset"];
 
 }
 
 class BlinkSVGTextPositioningElement extends BlinkSVGTextContentElement {
   static final instance = new BlinkSVGTextPositioningElement();
 
-  static dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
-  dx_Getter_(mthis) => dx_Getter(mthis);
+  dx_Getter_(mthis) => mthis["dx"];
 
-  static dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
-  dy_Getter_(mthis) => dy_Getter(mthis);
+  dy_Getter_(mthis) => mthis["dy"];
 
-  static rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
-  rotate_Getter_(mthis) => rotate_Getter(mthis);
+  rotate_Getter_(mthis) => mthis["rotate"];
 
-  static x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -23460,220 +13051,90 @@
 class BlinkSVGTransform {
   static final instance = new BlinkSVGTransform();
 
-  static angle_Getter(mthis) native "SVGTransform_angle_Getter";
-  angle_Getter_(mthis) => angle_Getter(mthis);
+  angle_Getter_(mthis) => mthis["angle"];
 
-  static matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
-  matrix_Getter_(mthis) => matrix_Getter(mthis);
+  matrix_Getter_(mthis) => mthis["matrix"];
 
-  static setMatrix_Callback_0(mthis) native "SVGTransform_setMatrix_Callback";
-  setMatrix_Callback_0_(mthis) => setMatrix_Callback_0(mthis);
+  setMatrix_Callback_0_(mthis) => mthis.callMethod("setMatrix", []);
 
-  static setMatrix_Callback_1(mthis, __arg_0) native "SVGTransform_setMatrix_Callback";
-  setMatrix_Callback_1_(mthis, __arg_0) => setMatrix_Callback_1(mthis, __arg_0);
+  setMatrix_Callback_1_(mthis, __arg_0) => mthis.callMethod("setMatrix", [__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);
+  setRotate_Callback_1_(mthis, __arg_0) => mthis.callMethod("setRotate", [__arg_0]);
 
-  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);
+  setRotate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setRotate", [__arg_0, __arg_1]);
 
-  static setRotate_Callback_1(mthis, __arg_0) native "SVGTransform_setRotate_Callback";
-  setRotate_Callback_1_(mthis, __arg_0) => setRotate_Callback_1(mthis, __arg_0);
+  setRotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setRotate", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  setScale_Callback_0_(mthis) => mthis.callMethod("setScale", []);
 
-  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);
+  setScale_Callback_1_(mthis, __arg_0) => mthis.callMethod("setScale", [__arg_0]);
 
-  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);
+  setScale_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setScale", [__arg_0, __arg_1]);
 
-  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);
+  setSkewX_Callback_0_(mthis) => mthis.callMethod("setSkewX", []);
 
-  static setScale_Callback_0(mthis) native "SVGTransform_setScale_Callback";
-  setScale_Callback_0_(mthis) => setScale_Callback_0(mthis);
+  setSkewX_Callback_1_(mthis, __arg_0) => mthis.callMethod("setSkewX", [__arg_0]);
 
-  static setScale_Callback_1(mthis, __arg_0) native "SVGTransform_setScale_Callback";
-  setScale_Callback_1_(mthis, __arg_0) => setScale_Callback_1(mthis, __arg_0);
+  setSkewY_Callback_0_(mthis) => mthis.callMethod("setSkewY", []);
 
-  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);
+  setSkewY_Callback_1_(mthis, __arg_0) => mthis.callMethod("setSkewY", [__arg_0]);
 
-  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);
+  setTranslate_Callback_0_(mthis) => mthis.callMethod("setTranslate", []);
 
-  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);
+  setTranslate_Callback_1_(mthis, __arg_0) => mthis.callMethod("setTranslate", [__arg_0]);
 
-  static setSkewX_Callback_0(mthis) native "SVGTransform_setSkewX_Callback";
-  setSkewX_Callback_0_(mthis) => setSkewX_Callback_0(mthis);
+  setTranslate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setTranslate", [__arg_0, __arg_1]);
 
-  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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static appendItem_Callback_0(mthis) native "SVGTransformList_appendItem_Callback";
-  appendItem_Callback_0_(mthis) => appendItem_Callback_0(mthis);
+  appendItem_Callback_0_(mthis) => mthis.callMethod("appendItem", []);
 
-  static appendItem_Callback_1(mthis, __arg_0) native "SVGTransformList_appendItem_Callback";
-  appendItem_Callback_1_(mthis, __arg_0) => appendItem_Callback_1(mthis, __arg_0);
+  appendItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendItem", [__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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  consolidate_Callback_0_(mthis) => mthis.callMethod("consolidate", []);
 
-  static clear_Callback_0(mthis) native "SVGTransformList_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  createSVGTransformFromMatrix_Callback_0_(mthis) => mthis.callMethod("createSVGTransformFromMatrix", []);
 
-  static clear_Callback_1(mthis, __arg_0) native "SVGTransformList_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => mthis.callMethod("createSVGTransformFromMatrix", [__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);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  static consolidate_Callback_0(mthis) native "SVGTransformList_consolidate_Callback";
-  consolidate_Callback_0_(mthis) => consolidate_Callback_0(mthis);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static consolidate_Callback_1(mthis, __arg_0) native "SVGTransformList_consolidate_Callback";
-  consolidate_Callback_1_(mthis, __arg_0) => consolidate_Callback_1(mthis, __arg_0);
+  initialize_Callback_0_(mthis) => mthis.callMethod("initialize", []);
 
-  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);
+  initialize_Callback_1_(mthis, __arg_0) => mthis.callMethod("initialize", [__arg_0]);
 
-  static createSVGTransformFromMatrix_Callback_0(mthis) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
-  createSVGTransformFromMatrix_Callback_0_(mthis) => createSVGTransformFromMatrix_Callback_0(mthis);
+  insertItemBefore_Callback_0_(mthis) => mthis.callMethod("insertItemBefore", []);
 
-  static createSVGTransformFromMatrix_Callback_1(mthis, __arg_0) native "SVGTransformList_createSVGTransformFromMatrix_Callback";
-  createSVGTransformFromMatrix_Callback_1_(mthis, __arg_0) => createSVGTransformFromMatrix_Callback_1(mthis, __arg_0);
+  insertItemBefore_Callback_1_(mthis, __arg_0) => mthis.callMethod("insertItemBefore", [__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);
+  insertItemBefore_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("insertItemBefore", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  static getItem_Callback_0(mthis) native "SVGTransformList_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  numberOfItems_Getter_(mthis) => mthis["numberOfItems"];
 
-  static getItem_Callback_1(mthis, __arg_0) native "SVGTransformList_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  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);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  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);
+  replaceItem_Callback_0_(mthis) => mthis.callMethod("replaceItem", []);
 
-  static initialize_Callback_0(mthis) native "SVGTransformList_initialize_Callback";
-  initialize_Callback_0_(mthis) => initialize_Callback_0(mthis);
+  replaceItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "SVGTransformList_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "SVGTransformList_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 replaceItem_Callback_0(mthis) native "SVGTransformList_replaceItem_Callback";
-  replaceItem_Callback_0_(mthis) => replaceItem_Callback_0(mthis);
-
-  static replaceItem_Callback_1(mthis, __arg_0) native "SVGTransformList_replaceItem_Callback";
-  replaceItem_Callback_1_(mthis, __arg_0) => replaceItem_Callback_1(mthis, __arg_0);
-
-  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 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 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);
+  replaceItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("replaceItem", [__arg_0, __arg_1]);
 
 }
 
@@ -23685,20 +13146,15 @@
 class BlinkSVGUseElement extends BlinkSVGGraphicsElement {
   static final instance = new BlinkSVGUseElement();
 
-  static height_Getter(mthis) native "SVGUseElement_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static href_Getter(mthis) native "SVGUseElement_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static width_Getter(mthis) native "SVGUseElement_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  static x_Getter(mthis) native "SVGUseElement_x_Getter";
-  x_Getter_(mthis) => x_Getter(mthis);
+  x_Getter_(mthis) => mthis["x"];
 
-  static y_Getter(mthis) native "SVGUseElement_y_Getter";
-  y_Getter_(mthis) => y_Getter(mthis);
+  y_Getter_(mthis) => mthis["y"];
 
 }
 
@@ -23710,3126 +13166,1743 @@
 class BlinkSVGViewElement extends BlinkSVGElement {
   static final instance = new BlinkSVGViewElement();
 
-  static preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
-  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
-  static viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
-  viewTarget_Getter_(mthis) => viewTarget_Getter(mthis);
+  viewTarget_Getter_(mthis) => mthis["viewTarget"];
 
-  static zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
-  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
+  zoomAndPan_Getter_(mthis) => mthis["zoomAndPan"];
 
-  static zoomAndPan_Setter(mthis, __arg_0) native "SVGViewElement_zoomAndPan_Setter";
-  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
 
 }
 
 class BlinkSVGViewSpec {
   static final instance = new BlinkSVGViewSpec();
 
-  static preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
-  preserveAspectRatioString_Getter_(mthis) => preserveAspectRatioString_Getter(mthis);
+  preserveAspectRatioString_Getter_(mthis) => mthis["preserveAspectRatioString"];
 
-  static preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
-  preserveAspectRatio_Getter_(mthis) => preserveAspectRatio_Getter(mthis);
+  preserveAspectRatio_Getter_(mthis) => mthis["preserveAspectRatio"];
 
-  static transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
-  transformString_Getter_(mthis) => transformString_Getter(mthis);
+  transformString_Getter_(mthis) => mthis["transformString"];
 
-  static transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
-  transform_Getter_(mthis) => transform_Getter(mthis);
+  transform_Getter_(mthis) => mthis["transform"];
 
-  static viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
-  viewBoxString_Getter_(mthis) => viewBoxString_Getter(mthis);
+  viewBoxString_Getter_(mthis) => mthis["viewBoxString"];
 
-  static viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
-  viewBox_Getter_(mthis) => viewBox_Getter(mthis);
+  viewBox_Getter_(mthis) => mthis["viewBox"];
 
-  static viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
-  viewTargetString_Getter_(mthis) => viewTargetString_Getter(mthis);
+  viewTargetString_Getter_(mthis) => mthis["viewTargetString"];
 
-  static viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
-  viewTarget_Getter_(mthis) => viewTarget_Getter(mthis);
+  viewTarget_Getter_(mthis) => mthis["viewTarget"];
 
-  static zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
-  zoomAndPan_Getter_(mthis) => zoomAndPan_Getter(mthis);
+  zoomAndPan_Getter_(mthis) => mthis["zoomAndPan"];
 
-  static zoomAndPan_Setter(mthis, __arg_0) native "SVGViewSpec_zoomAndPan_Setter";
-  zoomAndPan_Setter_(mthis, __arg_0) => zoomAndPan_Setter(mthis, __arg_0);
+  zoomAndPan_Setter_(mthis, __arg_0) => mthis["zoomAndPan"] = __arg_0;
 
 }
 
 class BlinkSVGZoomEvent extends BlinkUIEvent {
   static final instance = new BlinkSVGZoomEvent();
 
-  static newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
-  newScale_Getter_(mthis) => newScale_Getter(mthis);
+  newScale_Getter_(mthis) => mthis["newScale"];
 
-  static newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
-  newTranslate_Getter_(mthis) => newTranslate_Getter(mthis);
+  newTranslate_Getter_(mthis) => mthis["newTranslate"];
 
-  static previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
-  previousScale_Getter_(mthis) => previousScale_Getter(mthis);
+  previousScale_Getter_(mthis) => mthis["previousScale"];
 
-  static previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
-  previousTranslate_Getter_(mthis) => previousTranslate_Getter(mthis);
+  previousTranslate_Getter_(mthis) => mthis["previousTranslate"];
 
-  static zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
-  zoomRectScreen_Getter_(mthis) => zoomRectScreen_Getter(mthis);
+  zoomRectScreen_Getter_(mthis) => mthis["zoomRectScreen"];
 
 }
 
 class BlinkScreen {
   static final instance = new BlinkScreen();
 
-  static availHeight_Getter(mthis) native "Screen_availHeight_Getter";
-  availHeight_Getter_(mthis) => availHeight_Getter(mthis);
+  availHeight_Getter_(mthis) => mthis["availHeight"];
 
-  static availLeft_Getter(mthis) native "Screen_availLeft_Getter";
-  availLeft_Getter_(mthis) => availLeft_Getter(mthis);
+  availLeft_Getter_(mthis) => mthis["availLeft"];
 
-  static availTop_Getter(mthis) native "Screen_availTop_Getter";
-  availTop_Getter_(mthis) => availTop_Getter(mthis);
+  availTop_Getter_(mthis) => mthis["availTop"];
 
-  static availWidth_Getter(mthis) native "Screen_availWidth_Getter";
-  availWidth_Getter_(mthis) => availWidth_Getter(mthis);
+  availWidth_Getter_(mthis) => mthis["availWidth"];
 
-  static colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
-  colorDepth_Getter_(mthis) => colorDepth_Getter(mthis);
+  colorDepth_Getter_(mthis) => mthis["colorDepth"];
 
-  static height_Getter(mthis) native "Screen_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  height_Getter_(mthis) => mthis["height"];
 
-  static orientation_Getter(mthis) native "Screen_orientation_Getter";
-  orientation_Getter_(mthis) => orientation_Getter(mthis);
+  orientation_Getter_(mthis) => mthis["orientation"];
 
-  static pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
-  pixelDepth_Getter_(mthis) => pixelDepth_Getter(mthis);
+  pixelDepth_Getter_(mthis) => mthis["pixelDepth"];
 
-  static width_Getter(mthis) native "Screen_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
 }
 
 class BlinkScreenOrientation extends BlinkEventTarget {
   static final instance = new BlinkScreenOrientation();
 
-  static angle_Getter(mthis) native "ScreenOrientation_angle_Getter";
-  angle_Getter_(mthis) => angle_Getter(mthis);
+  angle_Getter_(mthis) => mthis["angle"];
 
-  static lock_Callback_0(mthis) native "ScreenOrientation_lock_Callback";
-  lock_Callback_0_(mthis) => lock_Callback_0(mthis);
+  lock_Callback_0_(mthis) => mthis.callMethod("lock", []);
 
-  static lock_Callback_1(mthis, __arg_0) native "ScreenOrientation_lock_Callback";
-  lock_Callback_1_(mthis, __arg_0) => lock_Callback_1(mthis, __arg_0);
+  lock_Callback_1_(mthis, __arg_0) => mthis.callMethod("lock", [__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);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  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);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onchange_Getter(mthis) native "ScreenOrientation_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
-  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 unlock_Callback_0(mthis) native "ScreenOrientation_unlock_Callback";
-  unlock_Callback_0_(mthis) => unlock_Callback_0(mthis);
-
-  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);
+  unlock_Callback_0_(mthis) => mthis.callMethod("unlock", []);
 
 }
 
 class BlinkScriptProcessorNode extends BlinkAudioNode {
   static final instance = new BlinkScriptProcessorNode();
 
-  static bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
-  bufferSize_Getter_(mthis) => bufferSize_Getter(mthis);
+  bufferSize_Getter_(mthis) => mthis["bufferSize"];
 
-  static onaudioprocess_Getter(mthis) native "ScriptProcessorNode_onaudioprocess_Getter";
-  onaudioprocess_Getter_(mthis) => onaudioprocess_Getter(mthis);
+  onaudioprocess_Getter_(mthis) => mthis["onaudioprocess"];
 
-  static onaudioprocess_Setter(mthis, __arg_0) native "ScriptProcessorNode_onaudioprocess_Setter";
-  onaudioprocess_Setter_(mthis, __arg_0) => onaudioprocess_Setter(mthis, __arg_0);
+  onaudioprocess_Setter_(mthis, __arg_0) => mthis["onaudioprocess"] = __arg_0;
 
-  static setEventListener_Callback_0(mthis) native "ScriptProcessorNode_setEventListener_Callback";
-  setEventListener_Callback_0_(mthis) => setEventListener_Callback_0(mthis);
+  setEventListener_Callback_0_(mthis) => mthis.callMethod("setEventListener", []);
 
-  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);
+  setEventListener_Callback_1_(mthis, __arg_0) => mthis.callMethod("setEventListener", [__arg_0]);
 
 }
 
 class BlinkSecurityPolicyViolationEvent extends BlinkEvent {
   static final instance = new BlinkSecurityPolicyViolationEvent();
 
-  static blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
-  blockedURI_Getter_(mthis) => blockedURI_Getter(mthis);
+  blockedURI_Getter_(mthis) => mthis["blockedURI"];
 
-  static columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
-  columnNumber_Getter_(mthis) => columnNumber_Getter(mthis);
+  columnNumber_Getter_(mthis) => mthis["columnNumber"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "SecurityPolicyViolationEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["SecurityPolicyViolationEvent"], [__arg_0, __arg_1]);
 
-  static documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
-  documentURI_Getter_(mthis) => documentURI_Getter(mthis);
+  documentURI_Getter_(mthis) => mthis["documentURI"];
 
-  static effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
-  effectiveDirective_Getter_(mthis) => effectiveDirective_Getter(mthis);
+  effectiveDirective_Getter_(mthis) => mthis["effectiveDirective"];
 
-  static lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
-  lineNumber_Getter_(mthis) => lineNumber_Getter(mthis);
+  lineNumber_Getter_(mthis) => mthis["lineNumber"];
 
-  static originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
-  originalPolicy_Getter_(mthis) => originalPolicy_Getter(mthis);
+  originalPolicy_Getter_(mthis) => mthis["originalPolicy"];
 
-  static referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
-  referrer_Getter_(mthis) => referrer_Getter(mthis);
+  referrer_Getter_(mthis) => mthis["referrer"];
 
-  static sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
-  sourceFile_Getter_(mthis) => sourceFile_Getter(mthis);
+  sourceFile_Getter_(mthis) => mthis["sourceFile"];
 
-  static statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
-  statusCode_Getter_(mthis) => statusCode_Getter(mthis);
+  statusCode_Getter_(mthis) => mthis["statusCode"];
 
-  static violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
-  violatedDirective_Getter_(mthis) => violatedDirective_Getter(mthis);
+  violatedDirective_Getter_(mthis) => mthis["violatedDirective"];
 
 }
 
 class BlinkSelection {
   static final instance = new BlinkSelection();
 
-  static addRange_Callback_0(mthis) native "Selection_addRange_Callback";
-  addRange_Callback_0_(mthis) => addRange_Callback_0(mthis);
+  addRange_Callback_0_(mthis) => mthis.callMethod("addRange", []);
 
-  static addRange_Callback_1(mthis, __arg_0) native "Selection_addRange_Callback";
-  addRange_Callback_1_(mthis, __arg_0) => addRange_Callback_1(mthis, __arg_0);
+  addRange_Callback_1_(mthis, __arg_0) => mthis.callMethod("addRange", [__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);
+  anchorNode_Getter_(mthis) => mthis["anchorNode"];
 
-  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);
+  anchorOffset_Getter_(mthis) => mthis["anchorOffset"];
 
-  static anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
-  anchorNode_Getter_(mthis) => anchorNode_Getter(mthis);
+  baseNode_Getter_(mthis) => mthis["baseNode"];
 
-  static anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
-  anchorOffset_Getter_(mthis) => anchorOffset_Getter(mthis);
+  baseOffset_Getter_(mthis) => mthis["baseOffset"];
 
-  static baseNode_Getter(mthis) native "Selection_baseNode_Getter";
-  baseNode_Getter_(mthis) => baseNode_Getter(mthis);
+  collapseToEnd_Callback_0_(mthis) => mthis.callMethod("collapseToEnd", []);
 
-  static baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
-  baseOffset_Getter_(mthis) => baseOffset_Getter(mthis);
+  collapseToStart_Callback_0_(mthis) => mthis.callMethod("collapseToStart", []);
 
-  static collapseToEnd_Callback_0(mthis) native "Selection_collapseToEnd_Callback";
-  collapseToEnd_Callback_0_(mthis) => collapseToEnd_Callback_0(mthis);
+  collapse_Callback_0_(mthis) => mthis.callMethod("collapse", []);
 
-  static collapseToEnd_Callback_1(mthis, __arg_0) native "Selection_collapseToEnd_Callback";
-  collapseToEnd_Callback_1_(mthis, __arg_0) => collapseToEnd_Callback_1(mthis, __arg_0);
+  collapse_Callback_1_(mthis, __arg_0) => mthis.callMethod("collapse", [__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);
+  collapse_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("collapse", [__arg_0, __arg_1]);
 
-  static collapseToStart_Callback_0(mthis) native "Selection_collapseToStart_Callback";
-  collapseToStart_Callback_0_(mthis) => collapseToStart_Callback_0(mthis);
+  containsNode_Callback_0_(mthis) => mthis.callMethod("containsNode", []);
 
-  static collapseToStart_Callback_1(mthis, __arg_0) native "Selection_collapseToStart_Callback";
-  collapseToStart_Callback_1_(mthis, __arg_0) => collapseToStart_Callback_1(mthis, __arg_0);
+  containsNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("containsNode", [__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);
+  containsNode_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("containsNode", [__arg_0, __arg_1]);
 
-  static collapse_Callback_0(mthis) native "Selection_collapse_Callback";
-  collapse_Callback_0_(mthis) => collapse_Callback_0(mthis);
+  deleteFromDocument_Callback_0_(mthis) => mthis.callMethod("deleteFromDocument", []);
 
-  static collapse_Callback_1(mthis, __arg_0) native "Selection_collapse_Callback";
-  collapse_Callback_1_(mthis, __arg_0) => collapse_Callback_1(mthis, __arg_0);
+  empty_Callback_0_(mthis) => mthis.callMethod("empty", []);
 
-  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);
+  extend_Callback_0_(mthis) => mthis.callMethod("extend", []);
 
-  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);
+  extend_Callback_1_(mthis, __arg_0) => mthis.callMethod("extend", [__arg_0]);
 
-  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);
+  extend_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("extend", [__arg_0, __arg_1]);
 
-  static containsNode_Callback_0(mthis) native "Selection_containsNode_Callback";
-  containsNode_Callback_0_(mthis) => containsNode_Callback_0(mthis);
+  extentNode_Getter_(mthis) => mthis["extentNode"];
 
-  static containsNode_Callback_1(mthis, __arg_0) native "Selection_containsNode_Callback";
-  containsNode_Callback_1_(mthis, __arg_0) => containsNode_Callback_1(mthis, __arg_0);
+  extentOffset_Getter_(mthis) => mthis["extentOffset"];
 
-  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);
+  focusNode_Getter_(mthis) => mthis["focusNode"];
 
-  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);
+  focusOffset_Getter_(mthis) => mthis["focusOffset"];
 
-  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);
+  getRangeAt_Callback_0_(mthis) => mthis.callMethod("getRangeAt", []);
 
-  static deleteFromDocument_Callback_0(mthis) native "Selection_deleteFromDocument_Callback";
-  deleteFromDocument_Callback_0_(mthis) => deleteFromDocument_Callback_0(mthis);
+  getRangeAt_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRangeAt", [__arg_0]);
 
-  static deleteFromDocument_Callback_1(mthis, __arg_0) native "Selection_deleteFromDocument_Callback";
-  deleteFromDocument_Callback_1_(mthis, __arg_0) => deleteFromDocument_Callback_1(mthis, __arg_0);
+  isCollapsed_Getter_(mthis) => mthis["isCollapsed"];
 
-  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);
+  modify_Callback_0_(mthis) => mthis.callMethod("modify", []);
 
-  static empty_Callback_0(mthis) native "Selection_empty_Callback";
-  empty_Callback_0_(mthis) => empty_Callback_0(mthis);
+  modify_Callback_1_(mthis, __arg_0) => mthis.callMethod("modify", [__arg_0]);
 
-  static empty_Callback_1(mthis, __arg_0) native "Selection_empty_Callback";
-  empty_Callback_1_(mthis, __arg_0) => empty_Callback_1(mthis, __arg_0);
+  modify_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("modify", [__arg_0, __arg_1]);
 
-  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);
+  modify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("modify", [__arg_0, __arg_1, __arg_2]);
 
-  static extend_Callback_0(mthis) native "Selection_extend_Callback";
-  extend_Callback_0_(mthis) => extend_Callback_0(mthis);
+  rangeCount_Getter_(mthis) => mthis["rangeCount"];
 
-  static extend_Callback_1(mthis, __arg_0) native "Selection_extend_Callback";
-  extend_Callback_1_(mthis, __arg_0) => extend_Callback_1(mthis, __arg_0);
+  removeAllRanges_Callback_0_(mthis) => mthis.callMethod("removeAllRanges", []);
 
-  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);
+  selectAllChildren_Callback_0_(mthis) => mthis.callMethod("selectAllChildren", []);
 
-  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);
+  selectAllChildren_Callback_1_(mthis, __arg_0) => mthis.callMethod("selectAllChildren", [__arg_0]);
 
-  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);
+  setBaseAndExtent_Callback_0_(mthis) => mthis.callMethod("setBaseAndExtent", []);
 
-  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);
+  setBaseAndExtent_Callback_1_(mthis, __arg_0) => mthis.callMethod("setBaseAndExtent", [__arg_0]);
 
-  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);
+  setBaseAndExtent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setBaseAndExtent", [__arg_0, __arg_1]);
 
-  static setPosition_Callback_0(mthis) native "Selection_setPosition_Callback";
-  setPosition_Callback_0_(mthis) => setPosition_Callback_0(mthis);
+  setBaseAndExtent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setBaseAndExtent", [__arg_0, __arg_1, __arg_2]);
 
-  static setPosition_Callback_1(mthis, __arg_0) native "Selection_setPosition_Callback";
-  setPosition_Callback_1_(mthis, __arg_0) => setPosition_Callback_1(mthis, __arg_0);
+  setBaseAndExtent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("setBaseAndExtent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  setPosition_Callback_0_(mthis) => mthis.callMethod("setPosition", []);
 
-  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);
+  setPosition_Callback_1_(mthis, __arg_0) => mthis.callMethod("setPosition", [__arg_0]);
 
-  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);
+  setPosition_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setPosition", [__arg_0, __arg_1]);
 
-  static type_Getter(mthis) native "Selection_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkServiceWorker extends BlinkEventTarget {
   static final instance = new BlinkServiceWorker();
 
-  static onerror_Getter(mthis) native "ServiceWorker_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onerror_Setter(mthis, __arg_0) native "ServiceWorker_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onstatechange_Getter(mthis) native "ServiceWorker_onstatechange_Getter";
-  onstatechange_Getter_(mthis) => onstatechange_Getter(mthis);
+  onstatechange_Getter_(mthis) => mthis["onstatechange"];
 
-  static onstatechange_Setter(mthis, __arg_0) native "ServiceWorker_onstatechange_Setter";
-  onstatechange_Setter_(mthis, __arg_0) => onstatechange_Setter(mthis, __arg_0);
+  onstatechange_Setter_(mthis, __arg_0) => mthis["onstatechange"] = __arg_0;
 
-  static postMessage_Callback_0(mthis) native "ServiceWorker_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static postMessage_Callback_1(mthis, __arg_0) native "ServiceWorker_postMessage_Callback";
-  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__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);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__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);
+  scriptURL_Getter_(mthis) => mthis["scriptURL"];
 
-  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);
+  state_Getter_(mthis) => mthis["state"];
 
-  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);
-
-  static terminate_Callback_0(mthis) native "ServiceWorker_terminate_Callback";
-  terminate_Callback_0_(mthis) => terminate_Callback_0(mthis);
-
-  static terminate_Callback_1(mthis, __arg_0) native "ServiceWorker_terminate_Callback";
-  terminate_Callback_1_(mthis, __arg_0) => terminate_Callback_1(mthis, __arg_0);
-
-  static terminate_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorker_terminate_Callback";
-  terminate_Callback_2_(mthis, __arg_0, __arg_1) => terminate_Callback_2(mthis, __arg_0, __arg_1);
+  terminate_Callback_0_(mthis) => mthis.callMethod("terminate", []);
 
 }
 
 class BlinkServiceWorkerClient {
   static final instance = new BlinkServiceWorkerClient();
 
-  static id_Getter(mthis) native "ServiceWorkerClient_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static postMessage_Callback_0(mthis) native "ServiceWorkerClient_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static postMessage_Callback_1(mthis, __arg_0) native "ServiceWorkerClient_postMessage_Callback";
-  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__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);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__arg_0, __arg_1]);
 
 }
 
 class BlinkServiceWorkerClients {
   static final instance = new BlinkServiceWorkerClients();
 
-  static getAll_Callback_0(mthis) native "ServiceWorkerClients_getAll_Callback";
-  getAll_Callback_0_(mthis) => getAll_Callback_0(mthis);
+  getAll_Callback_0_(mthis) => mthis.callMethod("getAll", []);
 
-  static getAll_Callback_1(mthis, __arg_0) native "ServiceWorkerClients_getAll_Callback";
-  getAll_Callback_1_(mthis, __arg_0) => getAll_Callback_1(mthis, __arg_0);
-
-  static getAll_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerClients_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 "ServiceWorkerClients_getAll_Callback";
-  getAll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getAll_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  getAll_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAll", [__arg_0]);
 
 }
 
 class BlinkServiceWorkerContainer {
   static final instance = new BlinkServiceWorkerContainer();
 
-  static controller_Getter(mthis) native "ServiceWorkerContainer_controller_Getter";
-  controller_Getter_(mthis) => controller_Getter(mthis);
+  controller_Getter_(mthis) => mthis["controller"];
 
-  static getRegistration_Callback_0(mthis) native "ServiceWorkerContainer_getRegistration_Callback";
-  getRegistration_Callback_0_(mthis) => getRegistration_Callback_0(mthis);
+  getRegistration_Callback_0_(mthis) => mthis.callMethod("getRegistration", []);
 
-  static getRegistration_Callback_1(mthis, __arg_0) native "ServiceWorkerContainer_getRegistration_Callback";
-  getRegistration_Callback_1_(mthis, __arg_0) => getRegistration_Callback_1(mthis, __arg_0);
+  getRegistration_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRegistration", [__arg_0]);
 
-  static getRegistration_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerContainer_getRegistration_Callback";
-  getRegistration_Callback_2_(mthis, __arg_0, __arg_1) => getRegistration_Callback_2(mthis, __arg_0, __arg_1);
+  ready_Getter_(mthis) => mthis["ready"];
 
-  static getRegistration_Callback_3(mthis, __arg_0, __arg_1, __arg_2) native "ServiceWorkerContainer_getRegistration_Callback";
-  getRegistration_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => getRegistration_Callback_3(mthis, __arg_0, __arg_1, __arg_2);
+  register_Callback_0_(mthis) => mthis.callMethod("register", []);
 
-  static ready_Getter(mthis) native "ServiceWorkerContainer_ready_Getter";
-  ready_Getter_(mthis) => ready_Getter(mthis);
+  register_Callback_1_(mthis, __arg_0) => mthis.callMethod("register", [__arg_0]);
 
-  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);
+  register_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("register", [__arg_0, __arg_1]);
 
 }
 
 class BlinkServiceWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkServiceWorkerGlobalScope();
 
-  static caches_Getter(mthis) native "ServiceWorkerGlobalScope_caches_Getter";
-  caches_Getter_(mthis) => caches_Getter(mthis);
+  caches_Getter_(mthis) => mthis["caches"];
 
-  static clients_Getter(mthis) native "ServiceWorkerGlobalScope_clients_Getter";
-  clients_Getter_(mthis) => clients_Getter(mthis);
+  clients_Getter_(mthis) => mthis["clients"];
 
-  static close_Callback_0(mthis) native "ServiceWorkerGlobalScope_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "ServiceWorkerGlobalScope_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  fetch_Callback_0_(mthis) => mthis.callMethod("fetch", []);
 
-  static close_Callback_2(mthis, __arg_0, __arg_1) native "ServiceWorkerGlobalScope_close_Callback";
-  close_Callback_2_(mthis, __arg_0, __arg_1) => close_Callback_2(mthis, __arg_0, __arg_1);
+  fetch_Callback_1_(mthis, __arg_0) => mthis.callMethod("fetch", [__arg_0]);
 
-  static fetch_Callback_0(mthis) native "ServiceWorkerGlobalScope_fetch_Callback";
-  fetch_Callback_0_(mthis) => fetch_Callback_0(mthis);
+  fetch_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("fetch", [__arg_0, __arg_1]);
 
-  static fetch_Callback_1(mthis, __arg_0) native "ServiceWorkerGlobalScope_fetch_Callback";
-  fetch_Callback_1_(mthis, __arg_0) => fetch_Callback_1(mthis, __arg_0);
+  onactivate_Getter_(mthis) => mthis["onactivate"];
 
-  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);
+  onactivate_Setter_(mthis, __arg_0) => mthis["onactivate"] = __arg_0;
 
-  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);
+  onfetch_Getter_(mthis) => mthis["onfetch"];
 
-  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);
+  onfetch_Setter_(mthis, __arg_0) => mthis["onfetch"] = __arg_0;
 
-  static onactivate_Getter(mthis) native "ServiceWorkerGlobalScope_onactivate_Getter";
-  onactivate_Getter_(mthis) => onactivate_Getter(mthis);
+  oninstall_Getter_(mthis) => mthis["oninstall"];
 
-  static onactivate_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onactivate_Setter";
-  onactivate_Setter_(mthis, __arg_0) => onactivate_Setter(mthis, __arg_0);
+  oninstall_Setter_(mthis, __arg_0) => mthis["oninstall"] = __arg_0;
 
-  static onfetch_Getter(mthis) native "ServiceWorkerGlobalScope_onfetch_Getter";
-  onfetch_Getter_(mthis) => onfetch_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onfetch_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onfetch_Setter";
-  onfetch_Setter_(mthis, __arg_0) => onfetch_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static oninstall_Getter(mthis) native "ServiceWorkerGlobalScope_oninstall_Getter";
-  oninstall_Getter_(mthis) => oninstall_Getter(mthis);
+  onpush_Getter_(mthis) => mthis["onpush"];
 
-  static oninstall_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_oninstall_Setter";
-  oninstall_Setter_(mthis, __arg_0) => oninstall_Setter(mthis, __arg_0);
+  onpush_Setter_(mthis, __arg_0) => mthis["onpush"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "ServiceWorkerGlobalScope_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  onsync_Getter_(mthis) => mthis["onsync"];
 
-  static onmessage_Setter(mthis, __arg_0) native "ServiceWorkerGlobalScope_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  onsync_Setter_(mthis, __arg_0) => mthis["onsync"] = __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);
+  scope_Getter_(mthis) => mthis["scope"];
 
 }
 
 class BlinkServiceWorkerRegistration extends BlinkEventTarget {
   static final instance = new BlinkServiceWorkerRegistration();
 
-  static active_Getter(mthis) native "ServiceWorkerRegistration_active_Getter";
-  active_Getter_(mthis) => active_Getter(mthis);
+  active_Getter_(mthis) => mthis["active"];
 
-  static installing_Getter(mthis) native "ServiceWorkerRegistration_installing_Getter";
-  installing_Getter_(mthis) => installing_Getter(mthis);
+  installing_Getter_(mthis) => mthis["installing"];
 
-  static onupdatefound_Getter(mthis) native "ServiceWorkerRegistration_onupdatefound_Getter";
-  onupdatefound_Getter_(mthis) => onupdatefound_Getter(mthis);
+  onupdatefound_Getter_(mthis) => mthis["onupdatefound"];
 
-  static onupdatefound_Setter(mthis, __arg_0) native "ServiceWorkerRegistration_onupdatefound_Setter";
-  onupdatefound_Setter_(mthis, __arg_0) => onupdatefound_Setter(mthis, __arg_0);
+  onupdatefound_Setter_(mthis, __arg_0) => mthis["onupdatefound"] = __arg_0;
 
-  static scope_Getter(mthis) native "ServiceWorkerRegistration_scope_Getter";
-  scope_Getter_(mthis) => scope_Getter(mthis);
+  scope_Getter_(mthis) => mthis["scope"];
 
-  static unregister_Callback_0(mthis) native "ServiceWorkerRegistration_unregister_Callback";
-  unregister_Callback_0_(mthis) => unregister_Callback_0(mthis);
+  unregister_Callback_0_(mthis) => mthis.callMethod("unregister", []);
 
-  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);
+  waiting_Getter_(mthis) => mthis["waiting"];
 
 }
 
 class BlinkShadowRoot extends BlinkDocumentFragment {
   static final instance = new BlinkShadowRoot();
 
-  static activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
-  activeElement_Getter_(mthis) => activeElement_Getter(mthis);
+  activeElement_Getter_(mthis) => mthis["activeElement"];
 
-  static cloneNode_Callback_0(mthis) native "ShadowRoot_cloneNode_Callback";
-  cloneNode_Callback_0_(mthis) => cloneNode_Callback_0(mthis);
+  cloneNode_Callback_0_(mthis) => mthis.callMethod("cloneNode", []);
 
-  static cloneNode_Callback_1(mthis, __arg_0) native "ShadowRoot_cloneNode_Callback";
-  cloneNode_Callback_1_(mthis, __arg_0) => cloneNode_Callback_1(mthis, __arg_0);
+  cloneNode_Callback_1_(mthis, __arg_0) => mthis.callMethod("cloneNode", [__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);
+  elementFromPoint_Callback_0_(mthis) => mthis.callMethod("elementFromPoint", []);
 
-  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);
+  elementFromPoint_Callback_1_(mthis, __arg_0) => mthis.callMethod("elementFromPoint", [__arg_0]);
 
-  static elementFromPoint_Callback_0(mthis) native "ShadowRoot_elementFromPoint_Callback";
-  elementFromPoint_Callback_0_(mthis) => elementFromPoint_Callback_0(mthis);
+  elementFromPoint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("elementFromPoint", [__arg_0, __arg_1]);
 
-  static elementFromPoint_Callback_1(mthis, __arg_0) native "ShadowRoot_elementFromPoint_Callback";
-  elementFromPoint_Callback_1_(mthis, __arg_0) => elementFromPoint_Callback_1(mthis, __arg_0);
+  getElementById_Callback_0_(mthis) => mthis.callMethod("getElementById", []);
 
-  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);
+  getElementById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementById", [__arg_0]);
 
-  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);
+  getElementsByClassName_Callback_0_(mthis) => mthis.callMethod("getElementsByClassName", []);
 
-  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);
+  getElementsByClassName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByClassName", [__arg_0]);
 
-  static getElementById_Callback_0(mthis) native "ShadowRoot_getElementById_Callback";
-  getElementById_Callback_0_(mthis) => getElementById_Callback_0(mthis);
+  getElementsByTagName_Callback_0_(mthis) => mthis.callMethod("getElementsByTagName", []);
 
-  static getElementById_Callback_1(mthis, __arg_0) native "ShadowRoot_getElementById_Callback";
-  getElementById_Callback_1_(mthis, __arg_0) => getElementById_Callback_1(mthis, __arg_0);
+  getElementsByTagName_Callback_1_(mthis, __arg_0) => mthis.callMethod("getElementsByTagName", [__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);
+  getSelection_Callback_0_(mthis) => mthis.callMethod("getSelection", []);
 
-  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);
+  host_Getter_(mthis) => mthis["host"];
 
-  static getElementsByClassName_Callback_0(mthis) native "ShadowRoot_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_0_(mthis) => getElementsByClassName_Callback_0(mthis);
+  innerHTML_Getter_(mthis) => mthis["innerHTML"];
 
-  static getElementsByClassName_Callback_1(mthis, __arg_0) native "ShadowRoot_getElementsByClassName_Callback";
-  getElementsByClassName_Callback_1_(mthis, __arg_0) => getElementsByClassName_Callback_1(mthis, __arg_0);
+  innerHTML_Setter_(mthis, __arg_0) => mthis["innerHTML"] = __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);
+  olderShadowRoot_Getter_(mthis) => mthis["olderShadowRoot"];
 
-  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, __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);
+  styleSheets_Getter_(mthis) => mthis["styleSheets"];
 
 }
 
 class BlinkSharedWorker extends BlinkEventTarget {
   static final instance = new BlinkSharedWorker();
 
-  static constructorCallback_0() native "SharedWorker_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["SharedWorker"], []);
 
-  static constructorCallback_1(__arg_0) native "SharedWorker_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["SharedWorker"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "SharedWorker_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["SharedWorker"], [__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);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  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);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "SharedWorker_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  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);
+  workerStart_Getter_(mthis) => mthis["workerStart"];
 
 }
 
 class BlinkSharedWorkerGlobalScope extends BlinkWorkerGlobalScope {
   static final instance = new BlinkSharedWorkerGlobalScope();
 
-  static name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static onconnect_Getter(mthis) native "SharedWorkerGlobalScope_onconnect_Getter";
-  onconnect_Getter_(mthis) => onconnect_Getter(mthis);
+  onconnect_Getter_(mthis) => mthis["onconnect"];
 
-  static onconnect_Setter(mthis, __arg_0) native "SharedWorkerGlobalScope_onconnect_Setter";
-  onconnect_Setter_(mthis, __arg_0) => onconnect_Setter(mthis, __arg_0);
+  onconnect_Setter_(mthis, __arg_0) => mthis["onconnect"] = __arg_0;
 
 }
 
 class BlinkSourceBuffer extends BlinkEventTarget {
   static final instance = new BlinkSourceBuffer();
 
-  static abort_Callback_0(mthis) native "SourceBuffer_abort_Callback";
-  abort_Callback_0_(mthis) => abort_Callback_0(mthis);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "SourceBuffer_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  appendBuffer_Callback_0_(mthis) => mthis.callMethod("appendBuffer", []);
 
-  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);
+  appendBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendBuffer", [__arg_0]);
 
-  static appendBuffer_Callback_0(mthis) native "SourceBuffer_appendBuffer_Callback";
-  appendBuffer_Callback_0_(mthis) => appendBuffer_Callback_0(mthis);
+  appendStream_Callback_0_(mthis) => mthis.callMethod("appendStream", []);
 
-  static appendBuffer_Callback_1(mthis, __arg_0) native "SourceBuffer_appendBuffer_Callback";
-  appendBuffer_Callback_1_(mthis, __arg_0) => appendBuffer_Callback_1(mthis, __arg_0);
+  appendStream_Callback_1_(mthis, __arg_0) => mthis.callMethod("appendStream", [__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);
+  appendStream_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("appendStream", [__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);
+  appendWindowEnd_Getter_(mthis) => mthis["appendWindowEnd"];
 
-  static appendStream_Callback_0(mthis) native "SourceBuffer_appendStream_Callback";
-  appendStream_Callback_0_(mthis) => appendStream_Callback_0(mthis);
+  appendWindowEnd_Setter_(mthis, __arg_0) => mthis["appendWindowEnd"] = __arg_0;
 
-  static appendStream_Callback_1(mthis, __arg_0) native "SourceBuffer_appendStream_Callback";
-  appendStream_Callback_1_(mthis, __arg_0) => appendStream_Callback_1(mthis, __arg_0);
+  appendWindowStart_Getter_(mthis) => mthis["appendWindowStart"];
 
-  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);
+  appendWindowStart_Setter_(mthis, __arg_0) => mthis["appendWindowStart"] = __arg_0;
 
-  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);
+  buffered_Getter_(mthis) => mthis["buffered"];
 
-  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);
+  mode_Getter_(mthis) => mthis["mode"];
 
-  static appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
-  appendWindowEnd_Getter_(mthis) => appendWindowEnd_Getter(mthis);
+  mode_Setter_(mthis, __arg_0) => mthis["mode"] = __arg_0;
 
-  static appendWindowEnd_Setter(mthis, __arg_0) native "SourceBuffer_appendWindowEnd_Setter";
-  appendWindowEnd_Setter_(mthis, __arg_0) => appendWindowEnd_Setter(mthis, __arg_0);
+  remove_Callback_0_(mthis) => mthis.callMethod("remove", []);
 
-  static appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
-  appendWindowStart_Getter_(mthis) => appendWindowStart_Getter(mthis);
+  remove_Callback_1_(mthis, __arg_0) => mthis.callMethod("remove", [__arg_0]);
 
-  static appendWindowStart_Setter(mthis, __arg_0) native "SourceBuffer_appendWindowStart_Setter";
-  appendWindowStart_Setter_(mthis, __arg_0) => appendWindowStart_Setter(mthis, __arg_0);
+  remove_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("remove", [__arg_0, __arg_1]);
 
-  static buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
-  buffered_Getter_(mthis) => buffered_Getter(mthis);
+  timestampOffset_Getter_(mthis) => mthis["timestampOffset"];
 
-  static mode_Getter(mthis) native "SourceBuffer_mode_Getter";
-  mode_Getter_(mthis) => mode_Getter(mthis);
+  timestampOffset_Setter_(mthis, __arg_0) => mthis["timestampOffset"] = __arg_0;
 
-  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, __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);
+  updating_Getter_(mthis) => mthis["updating"];
 
 }
 
 class BlinkSourceBufferList extends BlinkEventTarget {
   static final instance = new BlinkSourceBufferList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "SourceBufferList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "SourceBufferList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "SourceBufferList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkSourceInfo {
   static final instance = new BlinkSourceInfo();
 
-  static facing_Getter(mthis) native "SourceInfo_facing_Getter";
-  facing_Getter_(mthis) => facing_Getter(mthis);
+  facing_Getter_(mthis) => mthis["facing"];
 
-  static id_Getter(mthis) native "SourceInfo_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static kind_Getter(mthis) native "SourceInfo_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static label_Getter(mthis) native "SourceInfo_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
 }
 
 class BlinkSpeechGrammar {
   static final instance = new BlinkSpeechGrammar();
 
-  static constructorCallback_0() native "SpeechGrammar_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["SpeechGrammar"], []);
 
-  static constructorCallback_1(__arg_0) native "SpeechGrammar_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  src_Getter_(mthis) => mthis["src"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "SpeechGrammar_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  src_Setter_(mthis, __arg_0) => mthis["src"] = __arg_0;
 
-  static src_Getter(mthis) native "SpeechGrammar_src_Getter";
-  src_Getter_(mthis) => src_Getter(mthis);
+  weight_Getter_(mthis) => mthis["weight"];
 
-  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, __arg_0) native "SpeechGrammar_weight_Setter";
-  weight_Setter_(mthis, __arg_0) => weight_Setter(mthis, __arg_0);
+  weight_Setter_(mthis, __arg_0) => mthis["weight"] = __arg_0;
 
 }
 
 class BlinkSpeechGrammarList {
   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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static addFromString_Callback_0(mthis) native "SpeechGrammarList_addFromString_Callback";
-  addFromString_Callback_0_(mthis) => addFromString_Callback_0(mthis);
+  addFromString_Callback_0_(mthis) => mthis.callMethod("addFromString", []);
 
-  static addFromString_Callback_1(mthis, __arg_0) native "SpeechGrammarList_addFromString_Callback";
-  addFromString_Callback_1_(mthis, __arg_0) => addFromString_Callback_1(mthis, __arg_0);
+  addFromString_Callback_1_(mthis, __arg_0) => mthis.callMethod("addFromString", [__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);
+  addFromString_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addFromString", [__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);
+  addFromUri_Callback_0_(mthis) => mthis.callMethod("addFromUri", []);
 
-  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);
+  addFromUri_Callback_1_(mthis, __arg_0) => mthis.callMethod("addFromUri", [__arg_0]);
 
-  static addFromUri_Callback_0(mthis) native "SpeechGrammarList_addFromUri_Callback";
-  addFromUri_Callback_0_(mthis) => addFromUri_Callback_0(mthis);
+  addFromUri_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("addFromUri", [__arg_0, __arg_1]);
 
-  static addFromUri_Callback_1(mthis, __arg_0) native "SpeechGrammarList_addFromUri_Callback";
-  addFromUri_Callback_1_(mthis, __arg_0) => addFromUri_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["SpeechGrammarList"], []);
 
-  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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  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);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 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);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "SpeechRecognition_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["SpeechRecognition"], []);
 
-  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);
+  continuous_Getter_(mthis) => mthis["continuous"];
 
-  static constructorCallback_0() native "SpeechRecognition_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  continuous_Setter_(mthis, __arg_0) => mthis["continuous"] = __arg_0;
 
-  static constructorCallback_1(__arg_0) native "SpeechRecognition_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  grammars_Getter_(mthis) => mthis["grammars"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "SpeechRecognition_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  grammars_Setter_(mthis, __arg_0) => mthis["grammars"] = __arg_0;
 
-  static continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
-  continuous_Getter_(mthis) => continuous_Getter(mthis);
+  interimResults_Getter_(mthis) => mthis["interimResults"];
 
-  static continuous_Setter(mthis, __arg_0) native "SpeechRecognition_continuous_Setter";
-  continuous_Setter_(mthis, __arg_0) => continuous_Setter(mthis, __arg_0);
+  interimResults_Setter_(mthis, __arg_0) => mthis["interimResults"] = __arg_0;
 
-  static grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
-  grammars_Getter_(mthis) => grammars_Getter(mthis);
+  lang_Getter_(mthis) => mthis["lang"];
 
-  static grammars_Setter(mthis, __arg_0) native "SpeechRecognition_grammars_Setter";
-  grammars_Setter_(mthis, __arg_0) => grammars_Setter(mthis, __arg_0);
+  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
 
-  static interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
-  interimResults_Getter_(mthis) => interimResults_Getter(mthis);
+  maxAlternatives_Getter_(mthis) => mthis["maxAlternatives"];
 
-  static interimResults_Setter(mthis, __arg_0) native "SpeechRecognition_interimResults_Setter";
-  interimResults_Setter_(mthis, __arg_0) => interimResults_Setter(mthis, __arg_0);
+  maxAlternatives_Setter_(mthis, __arg_0) => mthis["maxAlternatives"] = __arg_0;
 
-  static lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
-  lang_Getter_(mthis) => lang_Getter(mthis);
+  onaudioend_Getter_(mthis) => mthis["onaudioend"];
 
-  static lang_Setter(mthis, __arg_0) native "SpeechRecognition_lang_Setter";
-  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
+  onaudioend_Setter_(mthis, __arg_0) => mthis["onaudioend"] = __arg_0;
 
-  static maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
-  maxAlternatives_Getter_(mthis) => maxAlternatives_Getter(mthis);
+  onaudiostart_Getter_(mthis) => mthis["onaudiostart"];
 
-  static maxAlternatives_Setter(mthis, __arg_0) native "SpeechRecognition_maxAlternatives_Setter";
-  maxAlternatives_Setter_(mthis, __arg_0) => maxAlternatives_Setter(mthis, __arg_0);
+  onaudiostart_Setter_(mthis, __arg_0) => mthis["onaudiostart"] = __arg_0;
 
-  static onaudioend_Getter(mthis) native "SpeechRecognition_onaudioend_Getter";
-  onaudioend_Getter_(mthis) => onaudioend_Getter(mthis);
+  onend_Getter_(mthis) => mthis["onend"];
 
-  static onaudioend_Setter(mthis, __arg_0) native "SpeechRecognition_onaudioend_Setter";
-  onaudioend_Setter_(mthis, __arg_0) => onaudioend_Setter(mthis, __arg_0);
+  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
 
-  static onaudiostart_Getter(mthis) native "SpeechRecognition_onaudiostart_Getter";
-  onaudiostart_Getter_(mthis) => onaudiostart_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onaudiostart_Setter(mthis, __arg_0) native "SpeechRecognition_onaudiostart_Setter";
-  onaudiostart_Setter_(mthis, __arg_0) => onaudiostart_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onend_Getter(mthis) native "SpeechRecognition_onend_Getter";
-  onend_Getter_(mthis) => onend_Getter(mthis);
+  onnomatch_Getter_(mthis) => mthis["onnomatch"];
 
-  static onend_Setter(mthis, __arg_0) native "SpeechRecognition_onend_Setter";
-  onend_Setter_(mthis, __arg_0) => onend_Setter(mthis, __arg_0);
+  onnomatch_Setter_(mthis, __arg_0) => mthis["onnomatch"] = __arg_0;
 
-  static onerror_Getter(mthis) native "SpeechRecognition_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onresult_Getter_(mthis) => mthis["onresult"];
 
-  static onerror_Setter(mthis, __arg_0) native "SpeechRecognition_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onresult_Setter_(mthis, __arg_0) => mthis["onresult"] = __arg_0;
 
-  static onnomatch_Getter(mthis) native "SpeechRecognition_onnomatch_Getter";
-  onnomatch_Getter_(mthis) => onnomatch_Getter(mthis);
+  onsoundend_Getter_(mthis) => mthis["onsoundend"];
 
-  static onnomatch_Setter(mthis, __arg_0) native "SpeechRecognition_onnomatch_Setter";
-  onnomatch_Setter_(mthis, __arg_0) => onnomatch_Setter(mthis, __arg_0);
+  onsoundend_Setter_(mthis, __arg_0) => mthis["onsoundend"] = __arg_0;
 
-  static onresult_Getter(mthis) native "SpeechRecognition_onresult_Getter";
-  onresult_Getter_(mthis) => onresult_Getter(mthis);
+  onsoundstart_Getter_(mthis) => mthis["onsoundstart"];
 
-  static onresult_Setter(mthis, __arg_0) native "SpeechRecognition_onresult_Setter";
-  onresult_Setter_(mthis, __arg_0) => onresult_Setter(mthis, __arg_0);
+  onsoundstart_Setter_(mthis, __arg_0) => mthis["onsoundstart"] = __arg_0;
 
-  static onsoundend_Getter(mthis) native "SpeechRecognition_onsoundend_Getter";
-  onsoundend_Getter_(mthis) => onsoundend_Getter(mthis);
+  onspeechend_Getter_(mthis) => mthis["onspeechend"];
 
-  static onsoundend_Setter(mthis, __arg_0) native "SpeechRecognition_onsoundend_Setter";
-  onsoundend_Setter_(mthis, __arg_0) => onsoundend_Setter(mthis, __arg_0);
+  onspeechend_Setter_(mthis, __arg_0) => mthis["onspeechend"] = __arg_0;
 
-  static onsoundstart_Getter(mthis) native "SpeechRecognition_onsoundstart_Getter";
-  onsoundstart_Getter_(mthis) => onsoundstart_Getter(mthis);
+  onspeechstart_Getter_(mthis) => mthis["onspeechstart"];
 
-  static onsoundstart_Setter(mthis, __arg_0) native "SpeechRecognition_onsoundstart_Setter";
-  onsoundstart_Setter_(mthis, __arg_0) => onsoundstart_Setter(mthis, __arg_0);
+  onspeechstart_Setter_(mthis, __arg_0) => mthis["onspeechstart"] = __arg_0;
 
-  static onspeechend_Getter(mthis) native "SpeechRecognition_onspeechend_Getter";
-  onspeechend_Getter_(mthis) => onspeechend_Getter(mthis);
+  onstart_Getter_(mthis) => mthis["onstart"];
 
-  static onspeechend_Setter(mthis, __arg_0) native "SpeechRecognition_onspeechend_Setter";
-  onspeechend_Setter_(mthis, __arg_0) => onspeechend_Setter(mthis, __arg_0);
+  onstart_Setter_(mthis, __arg_0) => mthis["onstart"] = __arg_0;
 
-  static onspeechstart_Getter(mthis) native "SpeechRecognition_onspeechstart_Getter";
-  onspeechstart_Getter_(mthis) => onspeechstart_Getter(mthis);
+  start_Callback_0_(mthis) => mthis.callMethod("start", []);
 
-  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);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
 }
 
 class BlinkSpeechRecognitionAlternative {
   static final instance = new BlinkSpeechRecognitionAlternative();
 
-  static confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
-  confidence_Getter_(mthis) => confidence_Getter(mthis);
+  confidence_Getter_(mthis) => mthis["confidence"];
 
-  static transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
-  transcript_Getter_(mthis) => transcript_Getter(mthis);
+  transcript_Getter_(mthis) => mthis["transcript"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["SpeechRecognitionError"], [__arg_0, __arg_1]);
 
-  static error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
-  error_Getter_(mthis) => error_Getter(mthis);
+  error_Getter_(mthis) => mthis["error"];
 
-  static message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
-  message_Getter_(mthis) => message_Getter(mthis);
+  message_Getter_(mthis) => mthis["message"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["SpeechRecognitionEvent"], [__arg_0, __arg_1]);
 
-  static emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
-  emma_Getter_(mthis) => emma_Getter(mthis);
+  emma_Getter_(mthis) => mthis["emma"];
 
-  static interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
-  interpretation_Getter_(mthis) => interpretation_Getter(mthis);
+  interpretation_Getter_(mthis) => mthis["interpretation"];
 
-  static resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
-  resultIndex_Getter_(mthis) => resultIndex_Getter(mthis);
+  resultIndex_Getter_(mthis) => mthis["resultIndex"];
 
-  static results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
-  results_Getter_(mthis) => results_Getter(mthis);
+  results_Getter_(mthis) => mthis["results"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
-  isFinal_Getter_(mthis) => isFinal_Getter(mthis);
+  isFinal_Getter_(mthis) => mthis["isFinal"];
 
-  static item_Callback_0(mthis) native "SpeechRecognitionResult_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "SpeechRecognitionResult_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkSpeechRecognitionResultList {
   static final instance = new BlinkSpeechRecognitionResultList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "SpeechRecognitionResultList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "SpeechRecognitionResultList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "SpeechRecognitionResultList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 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);
+  cancel_Callback_0_(mthis) => mthis.callMethod("cancel", []);
 
-  static cancel_Callback_1(mthis, __arg_0) native "SpeechSynthesis_cancel_Callback";
-  cancel_Callback_1_(mthis, __arg_0) => cancel_Callback_1(mthis, __arg_0);
+  getVoices_Callback_0_(mthis) => mthis.callMethod("getVoices", []);
 
-  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);
+  onvoiceschanged_Getter_(mthis) => mthis["onvoiceschanged"];
 
-  static getVoices_Callback_0(mthis) native "SpeechSynthesis_getVoices_Callback";
-  getVoices_Callback_0_(mthis) => getVoices_Callback_0(mthis);
+  onvoiceschanged_Setter_(mthis, __arg_0) => mthis["onvoiceschanged"] = __arg_0;
 
-  static getVoices_Callback_1(mthis, __arg_0) native "SpeechSynthesis_getVoices_Callback";
-  getVoices_Callback_1_(mthis, __arg_0) => getVoices_Callback_1(mthis, __arg_0);
+  pause_Callback_0_(mthis) => mthis.callMethod("pause", []);
 
-  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);
+  paused_Getter_(mthis) => mthis["paused"];
 
-  static onvoiceschanged_Getter(mthis) native "SpeechSynthesis_onvoiceschanged_Getter";
-  onvoiceschanged_Getter_(mthis) => onvoiceschanged_Getter(mthis);
+  pending_Getter_(mthis) => mthis["pending"];
 
-  static onvoiceschanged_Setter(mthis, __arg_0) native "SpeechSynthesis_onvoiceschanged_Setter";
-  onvoiceschanged_Setter_(mthis, __arg_0) => onvoiceschanged_Setter(mthis, __arg_0);
+  resume_Callback_0_(mthis) => mthis.callMethod("resume", []);
 
-  static pause_Callback_0(mthis) native "SpeechSynthesis_pause_Callback";
-  pause_Callback_0_(mthis) => pause_Callback_0(mthis);
+  speak_Callback_0_(mthis) => mthis.callMethod("speak", []);
 
-  static pause_Callback_1(mthis, __arg_0) native "SpeechSynthesis_pause_Callback";
-  pause_Callback_1_(mthis, __arg_0) => pause_Callback_1(mthis, __arg_0);
+  speak_Callback_1_(mthis, __arg_0) => mthis.callMethod("speak", [__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);
+  speaking_Getter_(mthis) => mthis["speaking"];
 
 }
 
 class BlinkSpeechSynthesisEvent extends BlinkEvent {
   static final instance = new BlinkSpeechSynthesisEvent();
 
-  static charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
-  charIndex_Getter_(mthis) => charIndex_Getter(mthis);
+  charIndex_Getter_(mthis) => mthis["charIndex"];
 
-  static elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
-  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
+  elapsedTime_Getter_(mthis) => mthis["elapsedTime"];
 
-  static name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
 }
 
 class BlinkSpeechSynthesisUtterance extends BlinkEventTarget {
   static final instance = new BlinkSpeechSynthesisUtterance();
 
-  static constructorCallback_0() native "SpeechSynthesisUtterance_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["SpeechSynthesisUtterance"], []);
 
-  static constructorCallback_1(__arg_0) native "SpeechSynthesisUtterance_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["SpeechSynthesisUtterance"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "SpeechSynthesisUtterance_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  lang_Getter_(mthis) => mthis["lang"];
 
-  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);
+  lang_Setter_(mthis, __arg_0) => mthis["lang"] = __arg_0;
 
-  static lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
-  lang_Getter_(mthis) => lang_Getter(mthis);
+  onboundary_Getter_(mthis) => mthis["onboundary"];
 
-  static lang_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_lang_Setter";
-  lang_Setter_(mthis, __arg_0) => lang_Setter(mthis, __arg_0);
+  onboundary_Setter_(mthis, __arg_0) => mthis["onboundary"] = __arg_0;
 
-  static onboundary_Getter(mthis) native "SpeechSynthesisUtterance_onboundary_Getter";
-  onboundary_Getter_(mthis) => onboundary_Getter(mthis);
+  onend_Getter_(mthis) => mthis["onend"];
 
-  static onboundary_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onboundary_Setter";
-  onboundary_Setter_(mthis, __arg_0) => onboundary_Setter(mthis, __arg_0);
+  onend_Setter_(mthis, __arg_0) => mthis["onend"] = __arg_0;
 
-  static onend_Getter(mthis) native "SpeechSynthesisUtterance_onend_Getter";
-  onend_Getter_(mthis) => onend_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onend_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onend_Setter";
-  onend_Setter_(mthis, __arg_0) => onend_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "SpeechSynthesisUtterance_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onmark_Getter_(mthis) => mthis["onmark"];
 
-  static onerror_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onmark_Setter_(mthis, __arg_0) => mthis["onmark"] = __arg_0;
 
-  static onmark_Getter(mthis) native "SpeechSynthesisUtterance_onmark_Getter";
-  onmark_Getter_(mthis) => onmark_Getter(mthis);
+  onpause_Getter_(mthis) => mthis["onpause"];
 
-  static onmark_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onmark_Setter";
-  onmark_Setter_(mthis, __arg_0) => onmark_Setter(mthis, __arg_0);
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
 
-  static onpause_Getter(mthis) native "SpeechSynthesisUtterance_onpause_Getter";
-  onpause_Getter_(mthis) => onpause_Getter(mthis);
+  onresume_Getter_(mthis) => mthis["onresume"];
 
-  static onpause_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onpause_Setter";
-  onpause_Setter_(mthis, __arg_0) => onpause_Setter(mthis, __arg_0);
+  onresume_Setter_(mthis, __arg_0) => mthis["onresume"] = __arg_0;
 
-  static onresume_Getter(mthis) native "SpeechSynthesisUtterance_onresume_Getter";
-  onresume_Getter_(mthis) => onresume_Getter(mthis);
+  onstart_Getter_(mthis) => mthis["onstart"];
 
-  static onresume_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onresume_Setter";
-  onresume_Setter_(mthis, __arg_0) => onresume_Setter(mthis, __arg_0);
+  onstart_Setter_(mthis, __arg_0) => mthis["onstart"] = __arg_0;
 
-  static onstart_Getter(mthis) native "SpeechSynthesisUtterance_onstart_Getter";
-  onstart_Getter_(mthis) => onstart_Getter(mthis);
+  pitch_Getter_(mthis) => mthis["pitch"];
 
-  static onstart_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_onstart_Setter";
-  onstart_Setter_(mthis, __arg_0) => onstart_Setter(mthis, __arg_0);
+  pitch_Setter_(mthis, __arg_0) => mthis["pitch"] = __arg_0;
 
-  static pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
-  pitch_Getter_(mthis) => pitch_Getter(mthis);
+  rate_Getter_(mthis) => mthis["rate"];
 
-  static pitch_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_pitch_Setter";
-  pitch_Setter_(mthis, __arg_0) => pitch_Setter(mthis, __arg_0);
+  rate_Setter_(mthis, __arg_0) => mthis["rate"] = __arg_0;
 
-  static rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
-  rate_Getter_(mthis) => rate_Getter(mthis);
+  text_Getter_(mthis) => mthis["text"];
 
-  static rate_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_rate_Setter";
-  rate_Setter_(mthis, __arg_0) => rate_Setter(mthis, __arg_0);
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
 
-  static text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
-  text_Getter_(mthis) => text_Getter(mthis);
+  voice_Getter_(mthis) => mthis["voice"];
 
-  static text_Setter(mthis, __arg_0) native "SpeechSynthesisUtterance_text_Setter";
-  text_Setter_(mthis, __arg_0) => text_Setter(mthis, __arg_0);
+  voice_Setter_(mthis, __arg_0) => mthis["voice"] = __arg_0;
 
-  static voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
-  voice_Getter_(mthis) => voice_Getter(mthis);
+  volume_Getter_(mthis) => mthis["volume"];
 
-  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, __arg_0) native "SpeechSynthesisUtterance_volume_Setter";
-  volume_Setter_(mthis, __arg_0) => volume_Setter(mthis, __arg_0);
+  volume_Setter_(mthis, __arg_0) => mthis["volume"] = __arg_0;
 
 }
 
 class BlinkSpeechSynthesisVoice {
   static final instance = new BlinkSpeechSynthesisVoice();
 
-  static default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
-  default_Getter_(mthis) => default_Getter(mthis);
+  default_Getter_(mthis) => mthis["default"];
 
-  static lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
-  lang_Getter_(mthis) => lang_Getter(mthis);
+  lang_Getter_(mthis) => mthis["lang"];
 
-  static localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
-  localService_Getter_(mthis) => localService_Getter(mthis);
+  localService_Getter_(mthis) => mthis["localService"];
 
-  static name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
-  voiceURI_Getter_(mthis) => voiceURI_Getter(mthis);
+  voiceURI_Getter_(mthis) => mthis["voiceURI"];
 
 }
 
 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);
+  $__delete___Callback_1_(mthis, __arg_0) => mthis.callMethod("__delete__", [__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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static clear_Callback_0(mthis) native "Storage_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  static clear_Callback_1(mthis, __arg_0) native "Storage_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  getItem_Callback_0_(mthis) => mthis.callMethod("getItem", []);
 
-  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);
+  getItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("getItem", [__arg_0]);
 
-  static getItem_Callback_0(mthis) native "Storage_getItem_Callback";
-  getItem_Callback_0_(mthis) => getItem_Callback_0(mthis);
+  key_Callback_0_(mthis) => mthis.callMethod("key", []);
 
-  static getItem_Callback_1(mthis, __arg_0) native "Storage_getItem_Callback";
-  getItem_Callback_1_(mthis, __arg_0) => getItem_Callback_1(mthis, __arg_0);
+  key_Callback_1_(mthis, __arg_0) => mthis.callMethod("key", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  removeItem_Callback_0_(mthis) => mthis.callMethod("removeItem", []);
 
-  static key_Callback_0(mthis) native "Storage_key_Callback";
-  key_Callback_0_(mthis) => key_Callback_0(mthis);
+  removeItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeItem", [__arg_0]);
 
-  static key_Callback_1(mthis, __arg_0) native "Storage_key_Callback";
-  key_Callback_1_(mthis, __arg_0) => key_Callback_1(mthis, __arg_0);
+  setItem_Callback_0_(mthis) => mthis.callMethod("setItem", []);
 
-  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);
+  setItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("setItem", [__arg_0]);
 
-  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 removeItem_Callback_0(mthis) native "Storage_removeItem_Callback";
-  removeItem_Callback_0_(mthis) => removeItem_Callback_0(mthis);
-
-  static removeItem_Callback_1(mthis, __arg_0) native "Storage_removeItem_Callback";
-  removeItem_Callback_1_(mthis, __arg_0) => removeItem_Callback_1(mthis, __arg_0);
-
-  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 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 setItem_Callback_0(mthis) native "Storage_setItem_Callback";
-  setItem_Callback_0_(mthis) => setItem_Callback_0(mthis);
-
-  static setItem_Callback_1(mthis, __arg_0) native "Storage_setItem_Callback";
-  setItem_Callback_1_(mthis, __arg_0) => setItem_Callback_1(mthis, __arg_0);
-
-  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_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);
+  setItem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setItem", [__arg_0, __arg_1]);
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["StorageEvent"], [__arg_0, __arg_1]);
 
-  static initStorageEvent_Callback_0(mthis) native "StorageEvent_initStorageEvent_Callback";
-  initStorageEvent_Callback_0_(mthis) => initStorageEvent_Callback_0(mthis);
+  initStorageEvent_Callback_0_(mthis) => mthis.callMethod("initStorageEvent", []);
 
-  static initStorageEvent_Callback_1(mthis, __arg_0) native "StorageEvent_initStorageEvent_Callback";
-  initStorageEvent_Callback_1_(mthis, __arg_0) => initStorageEvent_Callback_1(mthis, __arg_0);
+  initStorageEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initStorageEvent", [__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);
+  initStorageEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1]);
 
-  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);
+  initStorageEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initStorageEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initStorageEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initStorageEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initStorageEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initStorageEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initStorageEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  key_Getter_(mthis) => mthis["key"];
 
-  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);
+  newValue_Getter_(mthis) => mthis["newValue"];
 
-  static key_Getter(mthis) native "StorageEvent_key_Getter";
-  key_Getter_(mthis) => key_Getter(mthis);
+  oldValue_Getter_(mthis) => mthis["oldValue"];
 
-  static newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
-  newValue_Getter_(mthis) => newValue_Getter(mthis);
+  storageArea_Getter_(mthis) => mthis["storageArea"];
 
-  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);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 class BlinkStorageInfo {
   static final instance = new BlinkStorageInfo();
 
-  static quota_Getter(mthis) native "StorageInfo_quota_Getter";
-  quota_Getter_(mthis) => quota_Getter(mthis);
+  quota_Getter_(mthis) => mthis["quota"];
 
-  static usage_Getter(mthis) native "StorageInfo_usage_Getter";
-  usage_Getter_(mthis) => usage_Getter(mthis);
+  usage_Getter_(mthis) => mthis["usage"];
 
 }
 
 class BlinkStorageQuota {
   static final instance = new BlinkStorageQuota();
 
-  static queryInfo_Callback_0(mthis) native "StorageQuota_queryInfo_Callback";
-  queryInfo_Callback_0_(mthis) => queryInfo_Callback_0(mthis);
+  queryInfo_Callback_0_(mthis) => mthis.callMethod("queryInfo", []);
 
-  static queryInfo_Callback_1(mthis, __arg_0) native "StorageQuota_queryInfo_Callback";
-  queryInfo_Callback_1_(mthis, __arg_0) => queryInfo_Callback_1(mthis, __arg_0);
+  queryInfo_Callback_1_(mthis, __arg_0) => mthis.callMethod("queryInfo", [__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);
+  requestPersistentQuota_Callback_0_(mthis) => mthis.callMethod("requestPersistentQuota", []);
 
-  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);
+  requestPersistentQuota_Callback_1_(mthis, __arg_0) => mthis.callMethod("requestPersistentQuota", [__arg_0]);
 
-  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);
+  supportedTypes_Getter_(mthis) => mthis["supportedTypes"];
 
 }
 
 class BlinkStream {
   static final instance = new BlinkStream();
 
-  static type_Getter(mthis) native "Stream_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkStyleMedia {
   static final instance = new BlinkStyleMedia();
 
-  static matchMedium_Callback_0(mthis) native "StyleMedia_matchMedium_Callback";
-  matchMedium_Callback_0_(mthis) => matchMedium_Callback_0(mthis);
+  matchMedium_Callback_0_(mthis) => mthis.callMethod("matchMedium", []);
 
-  static matchMedium_Callback_1(mthis, __arg_0) native "StyleMedia_matchMedium_Callback";
-  matchMedium_Callback_1_(mthis, __arg_0) => matchMedium_Callback_1(mthis, __arg_0);
+  matchMedium_Callback_1_(mthis, __arg_0) => mthis.callMethod("matchMedium", [__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);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 class BlinkStyleSheet {
   static final instance = new BlinkStyleSheet();
 
-  static disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
-  disabled_Getter_(mthis) => disabled_Getter(mthis);
+  disabled_Getter_(mthis) => mthis["disabled"];
 
-  static disabled_Setter(mthis, __arg_0) native "StyleSheet_disabled_Setter";
-  disabled_Setter_(mthis, __arg_0) => disabled_Setter(mthis, __arg_0);
+  disabled_Setter_(mthis, __arg_0) => mthis["disabled"] = __arg_0;
 
-  static href_Getter(mthis) native "StyleSheet_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static media_Getter(mthis) native "StyleSheet_media_Getter";
-  media_Getter_(mthis) => media_Getter(mthis);
+  media_Getter_(mthis) => mthis["media"];
 
-  static ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
-  ownerNode_Getter_(mthis) => ownerNode_Getter(mthis);
+  ownerNode_Getter_(mthis) => mthis["ownerNode"];
 
-  static parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
-  parentStyleSheet_Getter_(mthis) => parentStyleSheet_Getter(mthis);
+  parentStyleSheet_Getter_(mthis) => mthis["parentStyleSheet"];
 
-  static title_Getter(mthis) native "StyleSheet_title_Getter";
-  title_Getter_(mthis) => title_Getter(mthis);
+  title_Getter_(mthis) => mthis["title"];
 
-  static type_Getter(mthis) native "StyleSheet_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "StyleSheetList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "StyleSheetList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkSubtleCrypto {
   static final instance = new BlinkSubtleCrypto();
 
-  static decrypt_Callback_1(mthis, __arg_0) native "SubtleCrypto_decrypt_Callback";
-  decrypt_Callback_1_(mthis, __arg_0) => decrypt_Callback_1(mthis, __arg_0);
+  decrypt_Callback_1_(mthis, __arg_0) => mthis.callMethod("decrypt", [__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);
+  decrypt_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("decrypt", [__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);
+  decrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("decrypt", [__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);
+  digest_Callback_0_(mthis) => mthis.callMethod("digest", []);
 
-  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);
+  digest_Callback_1_(mthis, __arg_0) => mthis.callMethod("digest", [__arg_0]);
 
-  static digest_Callback_0(mthis) native "SubtleCrypto_digest_Callback";
-  digest_Callback_0_(mthis) => digest_Callback_0(mthis);
+  digest_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("digest", [__arg_0, __arg_1]);
 
-  static digest_Callback_1(mthis, __arg_0) native "SubtleCrypto_digest_Callback";
-  digest_Callback_1_(mthis, __arg_0) => digest_Callback_1(mthis, __arg_0);
+  encrypt_Callback_1_(mthis, __arg_0) => mthis.callMethod("encrypt", [__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);
+  encrypt_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("encrypt", [__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);
+  encrypt_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("encrypt", [__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);
+  exportKey_Callback_0_(mthis) => mthis.callMethod("exportKey", []);
 
-  static encrypt_Callback_1(mthis, __arg_0) native "SubtleCrypto_encrypt_Callback";
-  encrypt_Callback_1_(mthis, __arg_0) => encrypt_Callback_1(mthis, __arg_0);
+  exportKey_Callback_1_(mthis, __arg_0) => mthis.callMethod("exportKey", [__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);
+  exportKey_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("exportKey", [__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);
+  generateKey_Callback_1_(mthis, __arg_0) => mthis.callMethod("generateKey", [__arg_0]);
 
-  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);
+  generateKey_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("generateKey", [__arg_0, __arg_1]);
 
-  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);
+  generateKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("generateKey", [__arg_0, __arg_1, __arg_2]);
 
-  static exportKey_Callback_0(mthis) native "SubtleCrypto_exportKey_Callback";
-  exportKey_Callback_0_(mthis) => exportKey_Callback_0(mthis);
+  importKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("importKey", [__arg_0, __arg_1, __arg_2]);
 
-  static exportKey_Callback_1(mthis, __arg_0) native "SubtleCrypto_exportKey_Callback";
-  exportKey_Callback_1_(mthis, __arg_0) => exportKey_Callback_1(mthis, __arg_0);
+  importKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("importKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  importKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("importKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  sign_Callback_1_(mthis, __arg_0) => mthis.callMethod("sign", [__arg_0]);
 
-  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);
+  sign_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("sign", [__arg_0, __arg_1]);
 
-  static generateKey_Callback_1(mthis, __arg_0) native "SubtleCrypto_generateKey_Callback";
-  generateKey_Callback_1_(mthis, __arg_0) => generateKey_Callback_1(mthis, __arg_0);
+  sign_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("sign", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  unwrapKey_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  unwrapKey_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  unwrapKey_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("unwrapKey", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  verify_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("verify", [__arg_0, __arg_1]);
 
-  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);
+  verify_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("verify", [__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);
+  verify_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("verify", [__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);
+  wrapKey_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("wrapKey", [__arg_0, __arg_1]);
 
-  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);
+  wrapKey_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("wrapKey", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  wrapKey_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("wrapKey", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
 class BlinkText extends BlinkCharacterData {
   static final instance = new BlinkText();
 
-  static constructorCallback_0() native "Text_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Text"], []);
 
-  static constructorCallback_1(__arg_0) native "Text_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Text"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Text_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  getDestinationInsertionPoints_Callback_0_(mthis) => mthis.callMethod("getDestinationInsertionPoints", []);
 
-  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);
+  replaceWholeText_Callback_0_(mthis) => mthis.callMethod("replaceWholeText", []);
 
-  static getDestinationInsertionPoints_Callback_0(mthis) native "Text_getDestinationInsertionPoints_Callback";
-  getDestinationInsertionPoints_Callback_0_(mthis) => getDestinationInsertionPoints_Callback_0(mthis);
+  replaceWholeText_Callback_1_(mthis, __arg_0) => mthis.callMethod("replaceWholeText", [__arg_0]);
 
-  static getDestinationInsertionPoints_Callback_1(mthis, __arg_0) native "Text_getDestinationInsertionPoints_Callback";
-  getDestinationInsertionPoints_Callback_1_(mthis, __arg_0) => getDestinationInsertionPoints_Callback_1(mthis, __arg_0);
+  splitText_Callback_0_(mthis) => mthis.callMethod("splitText", []);
 
-  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);
+  splitText_Callback_1_(mthis, __arg_0) => mthis.callMethod("splitText", [__arg_0]);
 
-  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);
+  wholeText_Getter_(mthis) => mthis["wholeText"];
 
 }
 
 class BlinkTextDecoder {
   static final instance = new BlinkTextDecoder();
 
-  static constructorCallback_0() native "TextDecoder_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["TextDecoder"], []);
 
-  static constructorCallback_1(__arg_0) native "TextDecoder_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["TextDecoder"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "TextDecoder_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["TextDecoder"], [__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);
+  decode_Callback_0_(mthis) => mthis.callMethod("decode", []);
 
-  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);
+  decode_Callback_1_(mthis, __arg_0) => mthis.callMethod("decode", [__arg_0]);
 
-  static decode_Callback_0(mthis) native "TextDecoder_decode_Callback";
-  decode_Callback_0_(mthis) => decode_Callback_0(mthis);
+  decode_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("decode", [__arg_0, __arg_1]);
 
-  static decode_Callback_1(mthis, __arg_0) native "TextDecoder_decode_Callback";
-  decode_Callback_1_(mthis, __arg_0) => decode_Callback_1(mthis, __arg_0);
+  encoding_Getter_(mthis) => mthis["encoding"];
 
-  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);
+  fatal_Getter_(mthis) => mthis["fatal"];
 
-  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);
+  ignoreBOM_Getter_(mthis) => mthis["ignoreBOM"];
 
 }
 
 class BlinkTextEncoder {
   static final instance = new BlinkTextEncoder();
 
-  static constructorCallback_0() native "TextEncoder_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["TextEncoder"], []);
 
-  static constructorCallback_1(__arg_0) native "TextEncoder_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["TextEncoder"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "TextEncoder_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  encode_Callback_0_(mthis) => mthis.callMethod("encode", []);
 
-  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);
+  encode_Callback_1_(mthis, __arg_0) => mthis.callMethod("encode", [__arg_0]);
 
-  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);
+  encoding_Getter_(mthis) => mthis["encoding"];
 
 }
 
 class BlinkTextEvent extends BlinkUIEvent {
   static final instance = new BlinkTextEvent();
 
-  static data_Getter(mthis) native "TextEvent_data_Getter";
-  data_Getter_(mthis) => data_Getter(mthis);
+  data_Getter_(mthis) => mthis["data"];
 
-  static initTextEvent_Callback_0(mthis) native "TextEvent_initTextEvent_Callback";
-  initTextEvent_Callback_0_(mthis) => initTextEvent_Callback_0(mthis);
+  initTextEvent_Callback_0_(mthis) => mthis.callMethod("initTextEvent", []);
 
-  static initTextEvent_Callback_1(mthis, __arg_0) native "TextEvent_initTextEvent_Callback";
-  initTextEvent_Callback_1_(mthis, __arg_0) => initTextEvent_Callback_1(mthis, __arg_0);
+  initTextEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initTextEvent", [__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);
+  initTextEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initTextEvent", [__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);
+  initTextEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initTextEvent", [__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);
+  initTextEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initTextEvent", [__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);
+  initTextEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initTextEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkTextMetrics {
   static final instance = new BlinkTextMetrics();
 
-  static actualBoundingBoxAscent_Getter(mthis) native "TextMetrics_actualBoundingBoxAscent_Getter";
-  actualBoundingBoxAscent_Getter_(mthis) => actualBoundingBoxAscent_Getter(mthis);
+  actualBoundingBoxAscent_Getter_(mthis) => mthis["actualBoundingBoxAscent"];
 
-  static actualBoundingBoxDescent_Getter(mthis) native "TextMetrics_actualBoundingBoxDescent_Getter";
-  actualBoundingBoxDescent_Getter_(mthis) => actualBoundingBoxDescent_Getter(mthis);
+  actualBoundingBoxDescent_Getter_(mthis) => mthis["actualBoundingBoxDescent"];
 
-  static actualBoundingBoxLeft_Getter(mthis) native "TextMetrics_actualBoundingBoxLeft_Getter";
-  actualBoundingBoxLeft_Getter_(mthis) => actualBoundingBoxLeft_Getter(mthis);
+  actualBoundingBoxLeft_Getter_(mthis) => mthis["actualBoundingBoxLeft"];
 
-  static actualBoundingBoxRight_Getter(mthis) native "TextMetrics_actualBoundingBoxRight_Getter";
-  actualBoundingBoxRight_Getter_(mthis) => actualBoundingBoxRight_Getter(mthis);
+  actualBoundingBoxRight_Getter_(mthis) => mthis["actualBoundingBoxRight"];
 
-  static alphabeticBaseline_Getter(mthis) native "TextMetrics_alphabeticBaseline_Getter";
-  alphabeticBaseline_Getter_(mthis) => alphabeticBaseline_Getter(mthis);
+  alphabeticBaseline_Getter_(mthis) => mthis["alphabeticBaseline"];
 
-  static emHeightAscent_Getter(mthis) native "TextMetrics_emHeightAscent_Getter";
-  emHeightAscent_Getter_(mthis) => emHeightAscent_Getter(mthis);
+  emHeightAscent_Getter_(mthis) => mthis["emHeightAscent"];
 
-  static emHeightDescent_Getter(mthis) native "TextMetrics_emHeightDescent_Getter";
-  emHeightDescent_Getter_(mthis) => emHeightDescent_Getter(mthis);
+  emHeightDescent_Getter_(mthis) => mthis["emHeightDescent"];
 
-  static fontBoundingBoxAscent_Getter(mthis) native "TextMetrics_fontBoundingBoxAscent_Getter";
-  fontBoundingBoxAscent_Getter_(mthis) => fontBoundingBoxAscent_Getter(mthis);
+  fontBoundingBoxAscent_Getter_(mthis) => mthis["fontBoundingBoxAscent"];
 
-  static fontBoundingBoxDescent_Getter(mthis) native "TextMetrics_fontBoundingBoxDescent_Getter";
-  fontBoundingBoxDescent_Getter_(mthis) => fontBoundingBoxDescent_Getter(mthis);
+  fontBoundingBoxDescent_Getter_(mthis) => mthis["fontBoundingBoxDescent"];
 
-  static hangingBaseline_Getter(mthis) native "TextMetrics_hangingBaseline_Getter";
-  hangingBaseline_Getter_(mthis) => hangingBaseline_Getter(mthis);
+  hangingBaseline_Getter_(mthis) => mthis["hangingBaseline"];
 
-  static ideographicBaseline_Getter(mthis) native "TextMetrics_ideographicBaseline_Getter";
-  ideographicBaseline_Getter_(mthis) => ideographicBaseline_Getter(mthis);
+  ideographicBaseline_Getter_(mthis) => mthis["ideographicBaseline"];
 
-  static width_Getter(mthis) native "TextMetrics_width_Getter";
-  width_Getter_(mthis) => width_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
 }
 
 class BlinkTextTrack extends BlinkEventTarget {
   static final instance = new BlinkTextTrack();
 
-  static activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
-  activeCues_Getter_(mthis) => activeCues_Getter(mthis);
+  activeCues_Getter_(mthis) => mthis["activeCues"];
 
-  static addCue_Callback_0(mthis) native "TextTrack_addCue_Callback";
-  addCue_Callback_0_(mthis) => addCue_Callback_0(mthis);
+  addCue_Callback_0_(mthis) => mthis.callMethod("addCue", []);
 
-  static addCue_Callback_1(mthis, __arg_0) native "TextTrack_addCue_Callback";
-  addCue_Callback_1_(mthis, __arg_0) => addCue_Callback_1(mthis, __arg_0);
+  addCue_Callback_1_(mthis, __arg_0) => mthis.callMethod("addCue", [__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);
+  addRegion_Callback_0_(mthis) => mthis.callMethod("addRegion", []);
 
-  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);
+  addRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("addRegion", [__arg_0]);
 
-  static addRegion_Callback_0(mthis) native "TextTrack_addRegion_Callback";
-  addRegion_Callback_0_(mthis) => addRegion_Callback_0(mthis);
+  cues_Getter_(mthis) => mthis["cues"];
 
-  static addRegion_Callback_1(mthis, __arg_0) native "TextTrack_addRegion_Callback";
-  addRegion_Callback_1_(mthis, __arg_0) => addRegion_Callback_1(mthis, __arg_0);
+  id_Getter_(mthis) => mthis["id"];
 
-  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);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  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);
+  label_Getter_(mthis) => mthis["label"];
 
-  static cues_Getter(mthis) native "TextTrack_cues_Getter";
-  cues_Getter_(mthis) => cues_Getter(mthis);
+  language_Getter_(mthis) => mthis["language"];
 
-  static id_Getter(mthis) native "TextTrack_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  mode_Getter_(mthis) => mthis["mode"];
 
-  static kind_Getter(mthis) native "TextTrack_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  mode_Setter_(mthis, __arg_0) => mthis["mode"] = __arg_0;
 
-  static label_Getter(mthis) native "TextTrack_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  oncuechange_Getter_(mthis) => mthis["oncuechange"];
 
-  static language_Getter(mthis) native "TextTrack_language_Getter";
-  language_Getter_(mthis) => language_Getter(mthis);
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
 
-  static mode_Getter(mthis) native "TextTrack_mode_Getter";
-  mode_Getter_(mthis) => mode_Getter(mthis);
+  regions_Getter_(mthis) => mthis["regions"];
 
-  static mode_Setter(mthis, __arg_0) native "TextTrack_mode_Setter";
-  mode_Setter_(mthis, __arg_0) => mode_Setter(mthis, __arg_0);
+  removeCue_Callback_0_(mthis) => mthis.callMethod("removeCue", []);
 
-  static oncuechange_Getter(mthis) native "TextTrack_oncuechange_Getter";
-  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+  removeCue_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeCue", [__arg_0]);
 
-  static oncuechange_Setter(mthis, __arg_0) native "TextTrack_oncuechange_Setter";
-  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+  removeRegion_Callback_0_(mthis) => mthis.callMethod("removeRegion", []);
 
-  static regions_Getter(mthis) native "TextTrack_regions_Getter";
-  regions_Getter_(mthis) => regions_Getter(mthis);
-
-  static removeCue_Callback_0(mthis) native "TextTrack_removeCue_Callback";
-  removeCue_Callback_0_(mthis) => removeCue_Callback_0(mthis);
-
-  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_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 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);
+  removeRegion_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeRegion", [__arg_0]);
 
 }
 
 class BlinkTextTrackCue extends BlinkEventTarget {
   static final instance = new BlinkTextTrackCue();
 
-  static endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
-  endTime_Getter_(mthis) => endTime_Getter(mthis);
+  endTime_Getter_(mthis) => mthis["endTime"];
 
-  static endTime_Setter(mthis, __arg_0) native "TextTrackCue_endTime_Setter";
-  endTime_Setter_(mthis, __arg_0) => endTime_Setter(mthis, __arg_0);
+  endTime_Setter_(mthis, __arg_0) => mthis["endTime"] = __arg_0;
 
-  static id_Getter(mthis) native "TextTrackCue_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static id_Setter(mthis, __arg_0) native "TextTrackCue_id_Setter";
-  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
+  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
 
-  static onenter_Getter(mthis) native "TextTrackCue_onenter_Getter";
-  onenter_Getter_(mthis) => onenter_Getter(mthis);
+  onenter_Getter_(mthis) => mthis["onenter"];
 
-  static onenter_Setter(mthis, __arg_0) native "TextTrackCue_onenter_Setter";
-  onenter_Setter_(mthis, __arg_0) => onenter_Setter(mthis, __arg_0);
+  onenter_Setter_(mthis, __arg_0) => mthis["onenter"] = __arg_0;
 
-  static onexit_Getter(mthis) native "TextTrackCue_onexit_Getter";
-  onexit_Getter_(mthis) => onexit_Getter(mthis);
+  onexit_Getter_(mthis) => mthis["onexit"];
 
-  static onexit_Setter(mthis, __arg_0) native "TextTrackCue_onexit_Setter";
-  onexit_Setter_(mthis, __arg_0) => onexit_Setter(mthis, __arg_0);
+  onexit_Setter_(mthis, __arg_0) => mthis["onexit"] = __arg_0;
 
-  static pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
-  pauseOnExit_Getter_(mthis) => pauseOnExit_Getter(mthis);
+  pauseOnExit_Getter_(mthis) => mthis["pauseOnExit"];
 
-  static pauseOnExit_Setter(mthis, __arg_0) native "TextTrackCue_pauseOnExit_Setter";
-  pauseOnExit_Setter_(mthis, __arg_0) => pauseOnExit_Setter(mthis, __arg_0);
+  pauseOnExit_Setter_(mthis, __arg_0) => mthis["pauseOnExit"] = __arg_0;
 
-  static startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
-  startTime_Getter_(mthis) => startTime_Getter(mthis);
+  startTime_Getter_(mthis) => mthis["startTime"];
 
-  static startTime_Setter(mthis, __arg_0) native "TextTrackCue_startTime_Setter";
-  startTime_Setter_(mthis, __arg_0) => startTime_Setter(mthis, __arg_0);
+  startTime_Setter_(mthis, __arg_0) => mthis["startTime"] = __arg_0;
 
-  static track_Getter(mthis) native "TextTrackCue_track_Getter";
-  track_Getter_(mthis) => track_Getter(mthis);
+  track_Getter_(mthis) => mthis["track"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getCueById_Callback_0(mthis) native "TextTrackCueList_getCueById_Callback";
-  getCueById_Callback_0_(mthis) => getCueById_Callback_0(mthis);
+  getCueById_Callback_0_(mthis) => mthis.callMethod("getCueById", []);
 
-  static getCueById_Callback_1(mthis, __arg_0) native "TextTrackCueList_getCueById_Callback";
-  getCueById_Callback_1_(mthis, __arg_0) => getCueById_Callback_1(mthis, __arg_0);
+  getCueById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getCueById", [__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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  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);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getTrackById_Callback_0(mthis) native "TextTrackList_getTrackById_Callback";
-  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+  getTrackById_Callback_0_(mthis) => mthis.callMethod("getTrackById", []);
 
-  static getTrackById_Callback_1(mthis, __arg_0) native "TextTrackList_getTrackById_Callback";
-  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+  getTrackById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTrackById", [__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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  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);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  static item_Callback_0(mthis) native "TextTrackList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  length_Getter_(mthis) => mthis["length"];
 
-  static item_Callback_1(mthis, __arg_0) native "TextTrackList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  onaddtrack_Getter_(mthis) => mthis["onaddtrack"];
 
-  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);
+  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
 
-  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);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static length_Getter(mthis) native "TextTrackList_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onaddtrack_Getter(mthis) native "TextTrackList_onaddtrack_Getter";
-  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
+  onremovetrack_Getter_(mthis) => mthis["onremovetrack"];
 
-  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);
+  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __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);
+  end_Callback_0_(mthis) => mthis.callMethod("end", []);
 
-  static end_Callback_1(mthis, __arg_0) native "TimeRanges_end_Callback";
-  end_Callback_1_(mthis, __arg_0) => end_Callback_1(mthis, __arg_0);
+  end_Callback_1_(mthis, __arg_0) => mthis.callMethod("end", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  start_Callback_0_(mthis) => mthis.callMethod("start", []);
 
-  static length_Getter(mthis) native "TimeRanges_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
-
-  static start_Callback_0(mthis) native "TimeRanges_start_Callback";
-  start_Callback_0_(mthis) => start_Callback_0(mthis);
-
-  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);
+  start_Callback_1_(mthis, __arg_0) => mthis.callMethod("start", [__arg_0]);
 
 }
 
 class BlinkTiming {
   static final instance = new BlinkTiming();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "Timing___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__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);
+  $__setter___Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("__setter__", [__arg_0, __arg_1]);
 
-  static delay_Getter(mthis) native "Timing_delay_Getter";
-  delay_Getter_(mthis) => delay_Getter(mthis);
+  delay_Getter_(mthis) => mthis["delay"];
 
-  static delay_Setter(mthis, __arg_0) native "Timing_delay_Setter";
-  delay_Setter_(mthis, __arg_0) => delay_Setter(mthis, __arg_0);
+  delay_Setter_(mthis, __arg_0) => mthis["delay"] = __arg_0;
 
-  static direction_Getter(mthis) native "Timing_direction_Getter";
-  direction_Getter_(mthis) => direction_Getter(mthis);
+  direction_Getter_(mthis) => mthis["direction"];
 
-  static direction_Setter(mthis, __arg_0) native "Timing_direction_Setter";
-  direction_Setter_(mthis, __arg_0) => direction_Setter(mthis, __arg_0);
+  direction_Setter_(mthis, __arg_0) => mthis["direction"] = __arg_0;
 
-  static easing_Getter(mthis) native "Timing_easing_Getter";
-  easing_Getter_(mthis) => easing_Getter(mthis);
+  easing_Getter_(mthis) => mthis["easing"];
 
-  static easing_Setter(mthis, __arg_0) native "Timing_easing_Setter";
-  easing_Setter_(mthis, __arg_0) => easing_Setter(mthis, __arg_0);
+  easing_Setter_(mthis, __arg_0) => mthis["easing"] = __arg_0;
 
-  static endDelay_Getter(mthis) native "Timing_endDelay_Getter";
-  endDelay_Getter_(mthis) => endDelay_Getter(mthis);
+  endDelay_Getter_(mthis) => mthis["endDelay"];
 
-  static endDelay_Setter(mthis, __arg_0) native "Timing_endDelay_Setter";
-  endDelay_Setter_(mthis, __arg_0) => endDelay_Setter(mthis, __arg_0);
+  endDelay_Setter_(mthis, __arg_0) => mthis["endDelay"] = __arg_0;
 
-  static fill_Getter(mthis) native "Timing_fill_Getter";
-  fill_Getter_(mthis) => fill_Getter(mthis);
+  fill_Getter_(mthis) => mthis["fill"];
 
-  static fill_Setter(mthis, __arg_0) native "Timing_fill_Setter";
-  fill_Setter_(mthis, __arg_0) => fill_Setter(mthis, __arg_0);
+  fill_Setter_(mthis, __arg_0) => mthis["fill"] = __arg_0;
 
-  static iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
-  iterationStart_Getter_(mthis) => iterationStart_Getter(mthis);
+  iterationStart_Getter_(mthis) => mthis["iterationStart"];
 
-  static iterationStart_Setter(mthis, __arg_0) native "Timing_iterationStart_Setter";
-  iterationStart_Setter_(mthis, __arg_0) => iterationStart_Setter(mthis, __arg_0);
+  iterationStart_Setter_(mthis, __arg_0) => mthis["iterationStart"] = __arg_0;
 
-  static iterations_Getter(mthis) native "Timing_iterations_Getter";
-  iterations_Getter_(mthis) => iterations_Getter(mthis);
+  iterations_Getter_(mthis) => mthis["iterations"];
 
-  static iterations_Setter(mthis, __arg_0) native "Timing_iterations_Setter";
-  iterations_Setter_(mthis, __arg_0) => iterations_Setter(mthis, __arg_0);
+  iterations_Setter_(mthis, __arg_0) => mthis["iterations"] = __arg_0;
 
-  static playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
-  playbackRate_Getter_(mthis) => playbackRate_Getter(mthis);
+  playbackRate_Getter_(mthis) => mthis["playbackRate"];
 
-  static playbackRate_Setter(mthis, __arg_0) native "Timing_playbackRate_Setter";
-  playbackRate_Setter_(mthis, __arg_0) => playbackRate_Setter(mthis, __arg_0);
+  playbackRate_Setter_(mthis, __arg_0) => mthis["playbackRate"] = __arg_0;
 
 }
 
 class BlinkTouch {
   static final instance = new BlinkTouch();
 
-  static clientX_Getter(mthis) native "Touch_clientX_Getter";
-  clientX_Getter_(mthis) => clientX_Getter(mthis);
+  clientX_Getter_(mthis) => mthis["clientX"];
 
-  static clientY_Getter(mthis) native "Touch_clientY_Getter";
-  clientY_Getter_(mthis) => clientY_Getter(mthis);
+  clientY_Getter_(mthis) => mthis["clientY"];
 
-  static force_Getter(mthis) native "Touch_force_Getter";
-  force_Getter_(mthis) => force_Getter(mthis);
+  force_Getter_(mthis) => mthis["force"];
 
-  static identifier_Getter(mthis) native "Touch_identifier_Getter";
-  identifier_Getter_(mthis) => identifier_Getter(mthis);
+  identifier_Getter_(mthis) => mthis["identifier"];
 
-  static pageX_Getter(mthis) native "Touch_pageX_Getter";
-  pageX_Getter_(mthis) => pageX_Getter(mthis);
+  pageX_Getter_(mthis) => mthis["pageX"];
 
-  static pageY_Getter(mthis) native "Touch_pageY_Getter";
-  pageY_Getter_(mthis) => pageY_Getter(mthis);
+  pageY_Getter_(mthis) => mthis["pageY"];
 
-  static radiusX_Getter(mthis) native "Touch_radiusX_Getter";
-  radiusX_Getter_(mthis) => radiusX_Getter(mthis);
+  radiusX_Getter_(mthis) => mthis["radiusX"];
 
-  static radiusY_Getter(mthis) native "Touch_radiusY_Getter";
-  radiusY_Getter_(mthis) => radiusY_Getter(mthis);
+  radiusY_Getter_(mthis) => mthis["radiusY"];
 
-  static screenX_Getter(mthis) native "Touch_screenX_Getter";
-  screenX_Getter_(mthis) => screenX_Getter(mthis);
+  screenX_Getter_(mthis) => mthis["screenX"];
 
-  static screenY_Getter(mthis) native "Touch_screenY_Getter";
-  screenY_Getter_(mthis) => screenY_Getter(mthis);
+  screenY_Getter_(mthis) => mthis["screenY"];
 
-  static target_Getter(mthis) native "Touch_target_Getter";
-  target_Getter_(mthis) => target_Getter(mthis);
+  target_Getter_(mthis) => mthis["target"];
 
-  static webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
-  webkitForce_Getter_(mthis) => webkitForce_Getter(mthis);
+  webkitForce_Getter_(mthis) => mthis["webkitForce"];
 
-  static webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
-  webkitRadiusX_Getter_(mthis) => webkitRadiusX_Getter(mthis);
+  webkitRadiusX_Getter_(mthis) => mthis["webkitRadiusX"];
 
-  static webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
-  webkitRadiusY_Getter_(mthis) => webkitRadiusY_Getter(mthis);
+  webkitRadiusY_Getter_(mthis) => mthis["webkitRadiusY"];
 
-  static webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
-  webkitRotationAngle_Getter_(mthis) => webkitRotationAngle_Getter(mthis);
+  webkitRotationAngle_Getter_(mthis) => mthis["webkitRotationAngle"];
 
 }
 
 class BlinkTouchEvent extends BlinkUIEvent {
   static final instance = new BlinkTouchEvent();
 
-  static altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
-  altKey_Getter_(mthis) => altKey_Getter(mthis);
+  altKey_Getter_(mthis) => mthis["altKey"];
 
-  static changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
-  changedTouches_Getter_(mthis) => changedTouches_Getter(mthis);
+  changedTouches_Getter_(mthis) => mthis["changedTouches"];
 
-  static ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
-  ctrlKey_Getter_(mthis) => ctrlKey_Getter(mthis);
+  ctrlKey_Getter_(mthis) => mthis["ctrlKey"];
 
-  static initTouchEvent_Callback_0(mthis) native "TouchEvent_initTouchEvent_Callback";
-  initTouchEvent_Callback_0_(mthis) => initTouchEvent_Callback_0(mthis);
+  initTouchEvent_Callback_0_(mthis) => mthis.callMethod("initTouchEvent", []);
 
-  static initTouchEvent_Callback_1(mthis, __arg_0) native "TouchEvent_initTouchEvent_Callback";
-  initTouchEvent_Callback_1_(mthis, __arg_0) => initTouchEvent_Callback_1(mthis, __arg_0);
+  initTouchEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initTouchEvent", [__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);
+  initTouchEvent_Callback_10_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8, __arg_9) => mthis.callMethod("initTouchEvent", [__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);
+  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) => mthis.callMethod("initTouchEvent", [__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);
+  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) => mthis.callMethod("initTouchEvent", [__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);
+  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) => mthis.callMethod("initTouchEvent", [__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);
+  initTouchEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1]);
 
-  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);
+  initTouchEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  initTouchEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  initTouchEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  initTouchEvent_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  initTouchEvent_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  initTouchEvent_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  initTouchEvent_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("initTouchEvent", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  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);
+  metaKey_Getter_(mthis) => mthis["metaKey"];
 
-  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);
+  shiftKey_Getter_(mthis) => mthis["shiftKey"];
 
-  static metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
-  metaKey_Getter_(mthis) => metaKey_Getter(mthis);
+  targetTouches_Getter_(mthis) => mthis["targetTouches"];
 
-  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);
+  touches_Getter_(mthis) => mthis["touches"];
 
 }
 
 class BlinkTouchList {
   static final instance = new BlinkTouchList();
 
-  static $__getter___Callback_1(mthis, __arg_0) native "TouchList___getter___Callback";
-  $__getter___Callback_1_(mthis, __arg_0) => $__getter___Callback_1(mthis, __arg_0);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "TouchList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "TouchList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["TrackEvent"], [__arg_0, __arg_1]);
 
-  static track_Getter(mthis) native "TrackEvent_track_Getter";
-  track_Getter_(mthis) => track_Getter(mthis);
+  track_Getter_(mthis) => mthis["track"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["TransitionEvent"], [__arg_0, __arg_1]);
 
-  static elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
-  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
+  elapsedTime_Getter_(mthis) => mthis["elapsedTime"];
 
-  static propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
-  propertyName_Getter_(mthis) => propertyName_Getter(mthis);
+  propertyName_Getter_(mthis) => mthis["propertyName"];
 
-  static pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
-  pseudoElement_Getter_(mthis) => pseudoElement_Getter(mthis);
+  pseudoElement_Getter_(mthis) => mthis["pseudoElement"];
 
 }
 
 class BlinkTreeWalker {
   static final instance = new BlinkTreeWalker();
 
-  static currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
-  currentNode_Getter_(mthis) => currentNode_Getter(mthis);
+  currentNode_Getter_(mthis) => mthis["currentNode"];
 
-  static currentNode_Setter(mthis, __arg_0) native "TreeWalker_currentNode_Setter";
-  currentNode_Setter_(mthis, __arg_0) => currentNode_Setter(mthis, __arg_0);
+  currentNode_Setter_(mthis, __arg_0) => mthis["currentNode"] = __arg_0;
 
-  static expandEntityReferences_Getter(mthis) native "TreeWalker_expandEntityReferences_Getter";
-  expandEntityReferences_Getter_(mthis) => expandEntityReferences_Getter(mthis);
+  expandEntityReferences_Getter_(mthis) => mthis["expandEntityReferences"];
 
-  static filter_Getter(mthis) native "TreeWalker_filter_Getter";
-  filter_Getter_(mthis) => filter_Getter(mthis);
+  filter_Getter_(mthis) => mthis["filter"];
 
-  static firstChild_Callback_0(mthis) native "TreeWalker_firstChild_Callback";
-  firstChild_Callback_0_(mthis) => firstChild_Callback_0(mthis);
+  firstChild_Callback_0_(mthis) => mthis.callMethod("firstChild", []);
 
-  static firstChild_Callback_1(mthis, __arg_0) native "TreeWalker_firstChild_Callback";
-  firstChild_Callback_1_(mthis, __arg_0) => firstChild_Callback_1(mthis, __arg_0);
+  lastChild_Callback_0_(mthis) => mthis.callMethod("lastChild", []);
 
-  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);
+  nextNode_Callback_0_(mthis) => mthis.callMethod("nextNode", []);
 
-  static lastChild_Callback_0(mthis) native "TreeWalker_lastChild_Callback";
-  lastChild_Callback_0_(mthis) => lastChild_Callback_0(mthis);
+  nextSibling_Callback_0_(mthis) => mthis.callMethod("nextSibling", []);
 
-  static lastChild_Callback_1(mthis, __arg_0) native "TreeWalker_lastChild_Callback";
-  lastChild_Callback_1_(mthis, __arg_0) => lastChild_Callback_1(mthis, __arg_0);
+  parentNode_Callback_0_(mthis) => mthis.callMethod("parentNode", []);
 
-  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);
+  previousNode_Callback_0_(mthis) => mthis.callMethod("previousNode", []);
 
-  static nextNode_Callback_0(mthis) native "TreeWalker_nextNode_Callback";
-  nextNode_Callback_0_(mthis) => nextNode_Callback_0(mthis);
+  previousSibling_Callback_0_(mthis) => mthis.callMethod("previousSibling", []);
 
-  static nextNode_Callback_1(mthis, __arg_0) native "TreeWalker_nextNode_Callback";
-  nextNode_Callback_1_(mthis, __arg_0) => nextNode_Callback_1(mthis, __arg_0);
+  root_Getter_(mthis) => mthis["root"];
 
-  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);
+  whatToShow_Getter_(mthis) => mthis["whatToShow"];
 
 }
 
 class BlinkUIEvent extends BlinkEvent {
   static final instance = new BlinkUIEvent();
 
-  static charCode_Getter(mthis) native "UIEvent_charCode_Getter";
-  charCode_Getter_(mthis) => charCode_Getter(mthis);
+  charCode_Getter_(mthis) => mthis["charCode"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "UIEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["UIEvent"], [__arg_0, __arg_1]);
 
-  static detail_Getter(mthis) native "UIEvent_detail_Getter";
-  detail_Getter_(mthis) => detail_Getter(mthis);
+  detail_Getter_(mthis) => mthis["detail"];
 
-  static initUIEvent_Callback_0(mthis) native "UIEvent_initUIEvent_Callback";
-  initUIEvent_Callback_0_(mthis) => initUIEvent_Callback_0(mthis);
+  initUIEvent_Callback_0_(mthis) => mthis.callMethod("initUIEvent", []);
 
-  static initUIEvent_Callback_1(mthis, __arg_0) native "UIEvent_initUIEvent_Callback";
-  initUIEvent_Callback_1_(mthis, __arg_0) => initUIEvent_Callback_1(mthis, __arg_0);
+  initUIEvent_Callback_1_(mthis, __arg_0) => mthis.callMethod("initUIEvent", [__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);
+  initUIEvent_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("initUIEvent", [__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);
+  initUIEvent_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("initUIEvent", [__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);
+  initUIEvent_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("initUIEvent", [__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);
+  initUIEvent_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("initUIEvent", [__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);
+  keyCode_Getter_(mthis) => mthis["keyCode"];
 
-  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);
+  layerX_Getter_(mthis) => mthis["layerX"];
 
-  static keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
-  keyCode_Getter_(mthis) => keyCode_Getter(mthis);
+  layerY_Getter_(mthis) => mthis["layerY"];
 
-  static layerX_Getter(mthis) native "UIEvent_layerX_Getter";
-  layerX_Getter_(mthis) => layerX_Getter(mthis);
+  pageX_Getter_(mthis) => mthis["pageX"];
 
-  static layerY_Getter(mthis) native "UIEvent_layerY_Getter";
-  layerY_Getter_(mthis) => layerY_Getter(mthis);
+  pageY_Getter_(mthis) => mthis["pageY"];
 
-  static pageX_Getter(mthis) native "UIEvent_pageX_Getter";
-  pageX_Getter_(mthis) => pageX_Getter(mthis);
+  view_Getter_(mthis) => mthis["view"];
 
-  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);
+  which_Getter_(mthis) => mthis["which"];
 
 }
 
 class BlinkURL {
   static final instance = new BlinkURL();
 
-  static constructorCallback_0() native "URL_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["URL"], []);
 
-  static constructorCallback_1(__arg_0) native "URL_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["URL"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "URL_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["URL"], [__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);
+  createObjectURL_Callback_0_() => js.context["URL"].callMethod("createObjectURL", []);
 
-  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);
+  createObjectURL_Callback_1_(__arg_0) => js.context["URL"].callMethod("createObjectURL", [__arg_0]);
 
-  static createObjectURL_Callback_0() native "URL_createObjectURL_Callback";
-  createObjectURL_Callback_0_() => createObjectURL_Callback_0();
+  hash_Getter_(mthis) => mthis["hash"];
 
-  static createObjectURL_Callback_1(__arg_0) native "URL_createObjectURL_Callback";
-  createObjectURL_Callback_1_(__arg_0) => createObjectURL_Callback_1(__arg_0);
+  hash_Setter_(mthis, __arg_0) => mthis["hash"] = __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);
+  host_Getter_(mthis) => mthis["host"];
 
-  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);
+  host_Setter_(mthis, __arg_0) => mthis["host"] = __arg_0;
 
-  static hash_Getter(mthis) native "URL_hash_Getter";
-  hash_Getter_(mthis) => hash_Getter(mthis);
+  hostname_Getter_(mthis) => mthis["hostname"];
 
-  static hash_Setter(mthis, __arg_0) native "URL_hash_Setter";
-  hash_Setter_(mthis, __arg_0) => hash_Setter(mthis, __arg_0);
+  hostname_Setter_(mthis, __arg_0) => mthis["hostname"] = __arg_0;
 
-  static host_Getter(mthis) native "URL_host_Getter";
-  host_Getter_(mthis) => host_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static host_Setter(mthis, __arg_0) native "URL_host_Setter";
-  host_Setter_(mthis, __arg_0) => host_Setter(mthis, __arg_0);
+  href_Setter_(mthis, __arg_0) => mthis["href"] = __arg_0;
 
-  static hostname_Getter(mthis) native "URL_hostname_Getter";
-  hostname_Getter_(mthis) => hostname_Getter(mthis);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  static hostname_Setter(mthis, __arg_0) native "URL_hostname_Setter";
-  hostname_Setter_(mthis, __arg_0) => hostname_Setter(mthis, __arg_0);
+  password_Getter_(mthis) => mthis["password"];
 
-  static href_Getter(mthis) native "URL_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  password_Setter_(mthis, __arg_0) => mthis["password"] = __arg_0;
 
-  static href_Setter(mthis, __arg_0) native "URL_href_Setter";
-  href_Setter_(mthis, __arg_0) => href_Setter(mthis, __arg_0);
+  pathname_Getter_(mthis) => mthis["pathname"];
 
-  static origin_Getter(mthis) native "URL_origin_Getter";
-  origin_Getter_(mthis) => origin_Getter(mthis);
+  pathname_Setter_(mthis, __arg_0) => mthis["pathname"] = __arg_0;
 
-  static password_Getter(mthis) native "URL_password_Getter";
-  password_Getter_(mthis) => password_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  static password_Setter(mthis, __arg_0) native "URL_password_Setter";
-  password_Setter_(mthis, __arg_0) => password_Setter(mthis, __arg_0);
+  port_Setter_(mthis, __arg_0) => mthis["port"] = __arg_0;
 
-  static pathname_Getter(mthis) native "URL_pathname_Getter";
-  pathname_Getter_(mthis) => pathname_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static pathname_Setter(mthis, __arg_0) native "URL_pathname_Setter";
-  pathname_Setter_(mthis, __arg_0) => pathname_Setter(mthis, __arg_0);
+  protocol_Setter_(mthis, __arg_0) => mthis["protocol"] = __arg_0;
 
-  static port_Getter(mthis) native "URL_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  revokeObjectURL_Callback_0_() => js.context["URL"].callMethod("revokeObjectURL", []);
 
-  static port_Setter(mthis, __arg_0) native "URL_port_Setter";
-  port_Setter_(mthis, __arg_0) => port_Setter(mthis, __arg_0);
+  revokeObjectURL_Callback_1_(__arg_0) => js.context["URL"].callMethod("revokeObjectURL", [__arg_0]);
 
-  static protocol_Getter(mthis) native "URL_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  search_Getter_(mthis) => mthis["search"];
 
-  static protocol_Setter(mthis, __arg_0) native "URL_protocol_Setter";
-  protocol_Setter_(mthis, __arg_0) => protocol_Setter(mthis, __arg_0);
+  search_Setter_(mthis, __arg_0) => mthis["search"] = __arg_0;
 
-  static revokeObjectURL_Callback_0() native "URL_revokeObjectURL_Callback";
-  revokeObjectURL_Callback_0_() => revokeObjectURL_Callback_0();
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
-  static revokeObjectURL_Callback_1(__arg_0) native "URL_revokeObjectURL_Callback";
-  revokeObjectURL_Callback_1_(__arg_0) => revokeObjectURL_Callback_1(__arg_0);
+  username_Getter_(mthis) => mthis["username"];
 
-  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, __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, __arg_0) native "URL_username_Setter";
-  username_Setter_(mthis, __arg_0) => username_Setter(mthis, __arg_0);
+  username_Setter_(mthis, __arg_0) => mthis["username"] = __arg_0;
 
 }
 
 class BlinkVTTCue extends BlinkTextTrackCue {
   static final instance = new BlinkVTTCue();
 
-  static align_Getter(mthis) native "VTTCue_align_Getter";
-  align_Getter_(mthis) => align_Getter(mthis);
+  align_Getter_(mthis) => mthis["align"];
 
-  static align_Setter(mthis, __arg_0) native "VTTCue_align_Setter";
-  align_Setter_(mthis, __arg_0) => align_Setter(mthis, __arg_0);
+  align_Setter_(mthis, __arg_0) => mthis["align"] = __arg_0;
 
-  static constructorCallback_1(__arg_0) native "VTTCue_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["VTTCue"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "VTTCue_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["VTTCue"], [__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);
+  constructorCallback_3_(__arg_0, __arg_1, __arg_2) => new js.JsObject(js.context["VTTCue"], [__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);
+  getCueAsHTML_Callback_0_(mthis) => mthis.callMethod("getCueAsHTML", []);
 
-  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);
+  line_Getter_(mthis) => mthis["line"];
 
-  static getCueAsHTML_Callback_0(mthis) native "VTTCue_getCueAsHTML_Callback";
-  getCueAsHTML_Callback_0_(mthis) => getCueAsHTML_Callback_0(mthis);
+  line_Setter_(mthis, __arg_0) => mthis["line"] = __arg_0;
 
-  static getCueAsHTML_Callback_1(mthis, __arg_0) native "VTTCue_getCueAsHTML_Callback";
-  getCueAsHTML_Callback_1_(mthis, __arg_0) => getCueAsHTML_Callback_1(mthis, __arg_0);
+  position_Getter_(mthis) => mthis["position"];
 
-  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);
+  position_Setter_(mthis, __arg_0) => mthis["position"] = __arg_0;
 
-  static line_Getter(mthis) native "VTTCue_line_Getter";
-  line_Getter_(mthis) => line_Getter(mthis);
+  regionId_Getter_(mthis) => mthis["regionId"];
 
-  static line_Setter(mthis, __arg_0) native "VTTCue_line_Setter";
-  line_Setter_(mthis, __arg_0) => line_Setter(mthis, __arg_0);
+  regionId_Setter_(mthis, __arg_0) => mthis["regionId"] = __arg_0;
 
-  static position_Getter(mthis) native "VTTCue_position_Getter";
-  position_Getter_(mthis) => position_Getter(mthis);
+  size_Getter_(mthis) => mthis["size"];
 
-  static position_Setter(mthis, __arg_0) native "VTTCue_position_Setter";
-  position_Setter_(mthis, __arg_0) => position_Setter(mthis, __arg_0);
+  size_Setter_(mthis, __arg_0) => mthis["size"] = __arg_0;
 
-  static regionId_Getter(mthis) native "VTTCue_regionId_Getter";
-  regionId_Getter_(mthis) => regionId_Getter(mthis);
+  snapToLines_Getter_(mthis) => mthis["snapToLines"];
 
-  static regionId_Setter(mthis, __arg_0) native "VTTCue_regionId_Setter";
-  regionId_Setter_(mthis, __arg_0) => regionId_Setter(mthis, __arg_0);
+  snapToLines_Setter_(mthis, __arg_0) => mthis["snapToLines"] = __arg_0;
 
-  static size_Getter(mthis) native "VTTCue_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
+  text_Getter_(mthis) => mthis["text"];
 
-  static size_Setter(mthis, __arg_0) native "VTTCue_size_Setter";
-  size_Setter_(mthis, __arg_0) => size_Setter(mthis, __arg_0);
+  text_Setter_(mthis, __arg_0) => mthis["text"] = __arg_0;
 
-  static snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
-  snapToLines_Getter_(mthis) => snapToLines_Getter(mthis);
+  vertical_Getter_(mthis) => mthis["vertical"];
 
-  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, __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, __arg_0) native "VTTCue_vertical_Setter";
-  vertical_Setter_(mthis, __arg_0) => vertical_Setter(mthis, __arg_0);
+  vertical_Setter_(mthis, __arg_0) => mthis["vertical"] = __arg_0;
 
 }
 
 class BlinkVTTRegion {
   static final instance = new BlinkVTTRegion();
 
-  static constructorCallback_0() native "VTTRegion_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["VTTRegion"], []);
 
-  static constructorCallback_1(__arg_0) native "VTTRegion_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  height_Getter_(mthis) => mthis["height"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "VTTRegion_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  height_Setter_(mthis, __arg_0) => mthis["height"] = __arg_0;
 
-  static height_Getter(mthis) native "VTTRegion_height_Getter";
-  height_Getter_(mthis) => height_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static height_Setter(mthis, __arg_0) native "VTTRegion_height_Setter";
-  height_Setter_(mthis, __arg_0) => height_Setter(mthis, __arg_0);
+  id_Setter_(mthis, __arg_0) => mthis["id"] = __arg_0;
 
-  static id_Getter(mthis) native "VTTRegion_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  regionAnchorX_Getter_(mthis) => mthis["regionAnchorX"];
 
-  static id_Setter(mthis, __arg_0) native "VTTRegion_id_Setter";
-  id_Setter_(mthis, __arg_0) => id_Setter(mthis, __arg_0);
+  regionAnchorX_Setter_(mthis, __arg_0) => mthis["regionAnchorX"] = __arg_0;
 
-  static regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
-  regionAnchorX_Getter_(mthis) => regionAnchorX_Getter(mthis);
+  regionAnchorY_Getter_(mthis) => mthis["regionAnchorY"];
 
-  static regionAnchorX_Setter(mthis, __arg_0) native "VTTRegion_regionAnchorX_Setter";
-  regionAnchorX_Setter_(mthis, __arg_0) => regionAnchorX_Setter(mthis, __arg_0);
+  regionAnchorY_Setter_(mthis, __arg_0) => mthis["regionAnchorY"] = __arg_0;
 
-  static regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
-  regionAnchorY_Getter_(mthis) => regionAnchorY_Getter(mthis);
+  scroll_Getter_(mthis) => mthis["scroll"];
 
-  static regionAnchorY_Setter(mthis, __arg_0) native "VTTRegion_regionAnchorY_Setter";
-  regionAnchorY_Setter_(mthis, __arg_0) => regionAnchorY_Setter(mthis, __arg_0);
+  scroll_Setter_(mthis, __arg_0) => mthis["scroll"] = __arg_0;
 
-  static scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
-  scroll_Getter_(mthis) => scroll_Getter(mthis);
+  track_Getter_(mthis) => mthis["track"];
 
-  static scroll_Setter(mthis, __arg_0) native "VTTRegion_scroll_Setter";
-  scroll_Setter_(mthis, __arg_0) => scroll_Setter(mthis, __arg_0);
+  viewportAnchorX_Getter_(mthis) => mthis["viewportAnchorX"];
 
-  static track_Getter(mthis) native "VTTRegion_track_Getter";
-  track_Getter_(mthis) => track_Getter(mthis);
+  viewportAnchorX_Setter_(mthis, __arg_0) => mthis["viewportAnchorX"] = __arg_0;
 
-  static viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
-  viewportAnchorX_Getter_(mthis) => viewportAnchorX_Getter(mthis);
+  viewportAnchorY_Getter_(mthis) => mthis["viewportAnchorY"];
 
-  static viewportAnchorX_Setter(mthis, __arg_0) native "VTTRegion_viewportAnchorX_Setter";
-  viewportAnchorX_Setter_(mthis, __arg_0) => viewportAnchorX_Setter(mthis, __arg_0);
+  viewportAnchorY_Setter_(mthis, __arg_0) => mthis["viewportAnchorY"] = __arg_0;
 
-  static viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
-  viewportAnchorY_Getter_(mthis) => viewportAnchorY_Getter(mthis);
+  width_Getter_(mthis) => mthis["width"];
 
-  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, __arg_0) native "VTTRegion_width_Setter";
-  width_Setter_(mthis, __arg_0) => width_Setter(mthis, __arg_0);
+  width_Setter_(mthis, __arg_0) => mthis["width"] = __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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getRegionById_Callback_0(mthis) native "VTTRegionList_getRegionById_Callback";
-  getRegionById_Callback_0_(mthis) => getRegionById_Callback_0(mthis);
+  getRegionById_Callback_0_(mthis) => mthis.callMethod("getRegionById", []);
 
-  static getRegionById_Callback_1(mthis, __arg_0) native "VTTRegionList_getRegionById_Callback";
-  getRegionById_Callback_1_(mthis, __arg_0) => getRegionById_Callback_1(mthis, __arg_0);
+  getRegionById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRegionById", [__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);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  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);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__arg_0]);
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkValidityState {
   static final instance = new BlinkValidityState();
 
-  static badInput_Getter(mthis) native "ValidityState_badInput_Getter";
-  badInput_Getter_(mthis) => badInput_Getter(mthis);
+  badInput_Getter_(mthis) => mthis["badInput"];
 
-  static customError_Getter(mthis) native "ValidityState_customError_Getter";
-  customError_Getter_(mthis) => customError_Getter(mthis);
+  customError_Getter_(mthis) => mthis["customError"];
 
-  static patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
-  patternMismatch_Getter_(mthis) => patternMismatch_Getter(mthis);
+  patternMismatch_Getter_(mthis) => mthis["patternMismatch"];
 
-  static rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
-  rangeOverflow_Getter_(mthis) => rangeOverflow_Getter(mthis);
+  rangeOverflow_Getter_(mthis) => mthis["rangeOverflow"];
 
-  static rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
-  rangeUnderflow_Getter_(mthis) => rangeUnderflow_Getter(mthis);
+  rangeUnderflow_Getter_(mthis) => mthis["rangeUnderflow"];
 
-  static stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
-  stepMismatch_Getter_(mthis) => stepMismatch_Getter(mthis);
+  stepMismatch_Getter_(mthis) => mthis["stepMismatch"];
 
-  static tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
-  tooLong_Getter_(mthis) => tooLong_Getter(mthis);
+  tooLong_Getter_(mthis) => mthis["tooLong"];
 
-  static typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
-  typeMismatch_Getter_(mthis) => typeMismatch_Getter(mthis);
+  typeMismatch_Getter_(mthis) => mthis["typeMismatch"];
 
-  static valid_Getter(mthis) native "ValidityState_valid_Getter";
-  valid_Getter_(mthis) => valid_Getter(mthis);
+  valid_Getter_(mthis) => mthis["valid"];
 
-  static valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
-  valueMissing_Getter_(mthis) => valueMissing_Getter(mthis);
+  valueMissing_Getter_(mthis) => mthis["valueMissing"];
 
 }
 
 class BlinkVideoPlaybackQuality {
   static final instance = new BlinkVideoPlaybackQuality();
 
-  static corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
-  corruptedVideoFrames_Getter_(mthis) => corruptedVideoFrames_Getter(mthis);
+  corruptedVideoFrames_Getter_(mthis) => mthis["corruptedVideoFrames"];
 
-  static creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
-  creationTime_Getter_(mthis) => creationTime_Getter(mthis);
+  creationTime_Getter_(mthis) => mthis["creationTime"];
 
-  static droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
-  droppedVideoFrames_Getter_(mthis) => droppedVideoFrames_Getter(mthis);
+  droppedVideoFrames_Getter_(mthis) => mthis["droppedVideoFrames"];
 
-  static totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
-  totalVideoFrames_Getter_(mthis) => totalVideoFrames_Getter(mthis);
+  totalVideoFrames_Getter_(mthis) => mthis["totalVideoFrames"];
 
 }
 
 class BlinkVideoTrack {
   static final instance = new BlinkVideoTrack();
 
-  static id_Getter(mthis) native "VideoTrack_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static kind_Getter(mthis) native "VideoTrack_kind_Getter";
-  kind_Getter_(mthis) => kind_Getter(mthis);
+  kind_Getter_(mthis) => mthis["kind"];
 
-  static label_Getter(mthis) native "VideoTrack_label_Getter";
-  label_Getter_(mthis) => label_Getter(mthis);
+  label_Getter_(mthis) => mthis["label"];
 
-  static language_Getter(mthis) native "VideoTrack_language_Getter";
-  language_Getter_(mthis) => language_Getter(mthis);
+  language_Getter_(mthis) => mthis["language"];
 
-  static selected_Getter(mthis) native "VideoTrack_selected_Getter";
-  selected_Getter_(mthis) => selected_Getter(mthis);
+  selected_Getter_(mthis) => mthis["selected"];
 
-  static selected_Setter(mthis, __arg_0) native "VideoTrack_selected_Setter";
-  selected_Setter_(mthis, __arg_0) => selected_Setter(mthis, __arg_0);
+  selected_Setter_(mthis, __arg_0) => mthis["selected"] = __arg_0;
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static getTrackById_Callback_0(mthis) native "VideoTrackList_getTrackById_Callback";
-  getTrackById_Callback_0_(mthis) => getTrackById_Callback_0(mthis);
+  getTrackById_Callback_0_(mthis) => mthis.callMethod("getTrackById", []);
 
-  static getTrackById_Callback_1(mthis, __arg_0) native "VideoTrackList_getTrackById_Callback";
-  getTrackById_Callback_1_(mthis, __arg_0) => getTrackById_Callback_1(mthis, __arg_0);
+  getTrackById_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTrackById", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  onaddtrack_Getter_(mthis) => mthis["onaddtrack"];
 
-  static length_Getter(mthis) native "VideoTrackList_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  onaddtrack_Setter_(mthis, __arg_0) => mthis["onaddtrack"] = __arg_0;
 
-  static onaddtrack_Getter(mthis) native "VideoTrackList_onaddtrack_Getter";
-  onaddtrack_Getter_(mthis) => onaddtrack_Getter(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static onaddtrack_Setter(mthis, __arg_0) native "VideoTrackList_onaddtrack_Setter";
-  onaddtrack_Setter_(mthis, __arg_0) => onaddtrack_Setter(mthis, __arg_0);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __arg_0;
 
-  static onchange_Getter(mthis) native "VideoTrackList_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  onremovetrack_Getter_(mthis) => mthis["onremovetrack"];
 
-  static onchange_Setter(mthis, __arg_0) native "VideoTrackList_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+  onremovetrack_Setter_(mthis, __arg_0) => mthis["onremovetrack"] = __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);
+  selectedIndex_Getter_(mthis) => mthis["selectedIndex"];
 
 }
 
 class BlinkWaveShaperNode extends BlinkAudioNode {
   static final instance = new BlinkWaveShaperNode();
 
-  static curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
-  curve_Getter_(mthis) => curve_Getter(mthis);
+  curve_Getter_(mthis) => mthis["curve"];
 
-  static curve_Setter(mthis, __arg_0) native "WaveShaperNode_curve_Setter";
-  curve_Setter_(mthis, __arg_0) => curve_Setter(mthis, __arg_0);
+  curve_Setter_(mthis, __arg_0) => mthis["curve"] = __arg_0;
 
-  static oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
-  oversample_Getter_(mthis) => oversample_Getter(mthis);
+  oversample_Getter_(mthis) => mthis["oversample"];
 
-  static oversample_Setter(mthis, __arg_0) native "WaveShaperNode_oversample_Setter";
-  oversample_Setter_(mthis, __arg_0) => oversample_Setter(mthis, __arg_0);
+  oversample_Setter_(mthis, __arg_0) => mthis["oversample"] = __arg_0;
 
 }
 
 class BlinkWebGLActiveInfo {
   static final instance = new BlinkWebGLActiveInfo();
 
-  static name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  name_Getter_(mthis) => mthis["name"];
 
-  static size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
-  size_Getter_(mthis) => size_Getter(mthis);
+  size_Getter_(mthis) => mthis["size"];
 
-  static type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
-  type_Getter_(mthis) => type_Getter(mthis);
+  type_Getter_(mthis) => mthis["type"];
 
 }
 
@@ -26861,58 +14934,42 @@
 class BlinkWebGLContextAttributes {
   static final instance = new BlinkWebGLContextAttributes();
 
-  static alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
-  alpha_Getter_(mthis) => alpha_Getter(mthis);
+  alpha_Getter_(mthis) => mthis["alpha"];
 
-  static alpha_Setter(mthis, __arg_0) native "WebGLContextAttributes_alpha_Setter";
-  alpha_Setter_(mthis, __arg_0) => alpha_Setter(mthis, __arg_0);
+  alpha_Setter_(mthis, __arg_0) => mthis["alpha"] = __arg_0;
 
-  static antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
-  antialias_Getter_(mthis) => antialias_Getter(mthis);
+  antialias_Getter_(mthis) => mthis["antialias"];
 
-  static antialias_Setter(mthis, __arg_0) native "WebGLContextAttributes_antialias_Setter";
-  antialias_Setter_(mthis, __arg_0) => antialias_Setter(mthis, __arg_0);
+  antialias_Setter_(mthis, __arg_0) => mthis["antialias"] = __arg_0;
 
-  static depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
-  depth_Getter_(mthis) => depth_Getter(mthis);
+  depth_Getter_(mthis) => mthis["depth"];
 
-  static depth_Setter(mthis, __arg_0) native "WebGLContextAttributes_depth_Setter";
-  depth_Setter_(mthis, __arg_0) => depth_Setter(mthis, __arg_0);
+  depth_Setter_(mthis, __arg_0) => mthis["depth"] = __arg_0;
 
-  static failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
-  failIfMajorPerformanceCaveat_Getter_(mthis) => failIfMajorPerformanceCaveat_Getter(mthis);
+  failIfMajorPerformanceCaveat_Getter_(mthis) => mthis["failIfMajorPerformanceCaveat"];
 
-  static failIfMajorPerformanceCaveat_Setter(mthis, __arg_0) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
-  failIfMajorPerformanceCaveat_Setter_(mthis, __arg_0) => failIfMajorPerformanceCaveat_Setter(mthis, __arg_0);
+  failIfMajorPerformanceCaveat_Setter_(mthis, __arg_0) => mthis["failIfMajorPerformanceCaveat"] = __arg_0;
 
-  static premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
-  premultipliedAlpha_Getter_(mthis) => premultipliedAlpha_Getter(mthis);
+  premultipliedAlpha_Getter_(mthis) => mthis["premultipliedAlpha"];
 
-  static premultipliedAlpha_Setter(mthis, __arg_0) native "WebGLContextAttributes_premultipliedAlpha_Setter";
-  premultipliedAlpha_Setter_(mthis, __arg_0) => premultipliedAlpha_Setter(mthis, __arg_0);
+  premultipliedAlpha_Setter_(mthis, __arg_0) => mthis["premultipliedAlpha"] = __arg_0;
 
-  static preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
-  preserveDrawingBuffer_Getter_(mthis) => preserveDrawingBuffer_Getter(mthis);
+  preserveDrawingBuffer_Getter_(mthis) => mthis["preserveDrawingBuffer"];
 
-  static preserveDrawingBuffer_Setter(mthis, __arg_0) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
-  preserveDrawingBuffer_Setter_(mthis, __arg_0) => preserveDrawingBuffer_Setter(mthis, __arg_0);
+  preserveDrawingBuffer_Setter_(mthis, __arg_0) => mthis["preserveDrawingBuffer"] = __arg_0;
 
-  static stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
-  stencil_Getter_(mthis) => stencil_Getter(mthis);
+  stencil_Getter_(mthis) => mthis["stencil"];
 
-  static stencil_Setter(mthis, __arg_0) native "WebGLContextAttributes_stencil_Setter";
-  stencil_Setter_(mthis, __arg_0) => stencil_Setter(mthis, __arg_0);
+  stencil_Setter_(mthis, __arg_0) => mthis["stencil"] = __arg_0;
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["WebGLContextEvent"], [__arg_0, __arg_1]);
 
-  static statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
-  statusMessage_Getter_(mthis) => statusMessage_Getter(mthis);
+  statusMessage_Getter_(mthis) => mthis["statusMessage"];
 
 }
 
@@ -26924,17 +14981,9 @@
 class BlinkWebGLDebugShaders {
   static final instance = new BlinkWebGLDebugShaders();
 
-  static getTranslatedShaderSource_Callback_0(mthis) native "WebGLDebugShaders_getTranslatedShaderSource_Callback";
-  getTranslatedShaderSource_Callback_0_(mthis) => getTranslatedShaderSource_Callback_0(mthis);
+  getTranslatedShaderSource_Callback_0_(mthis) => mthis.callMethod("getTranslatedShaderSource", []);
 
-  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);
+  getTranslatedShaderSource_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTranslatedShaderSource", [__arg_0]);
 
 }
 
@@ -26946,17 +14995,9 @@
 class BlinkWebGLDrawBuffers {
   static final instance = new BlinkWebGLDrawBuffers();
 
-  static drawBuffersWEBGL_Callback_0(mthis) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback";
-  drawBuffersWEBGL_Callback_0_(mthis) => drawBuffersWEBGL_Callback_0(mthis);
+  drawBuffersWEBGL_Callback_0_(mthis) => mthis.callMethod("drawBuffersWEBGL", []);
 
-  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);
+  drawBuffersWEBGL_Callback_1_(mthis, __arg_0) => mthis.callMethod("drawBuffersWEBGL", [__arg_0]);
 
 }
 
@@ -26968,23 +15009,9 @@
 class BlinkWebGLLoseContext {
   static final instance = new BlinkWebGLLoseContext();
 
-  static loseContext_Callback_0(mthis) native "WebGLLoseContext_loseContext_Callback";
-  loseContext_Callback_0_(mthis) => loseContext_Callback_0(mthis);
+  loseContext_Callback_0_(mthis) => mthis.callMethod("loseContext", []);
 
-  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);
+  restoreContext_Callback_0_(mthis) => mthis.callMethod("restoreContext", []);
 
 }
 
@@ -27001,1880 +15028,711 @@
 class BlinkWebGLRenderingContext {
   static final instance = new BlinkWebGLRenderingContext();
 
-  static activeTexture_Callback_0(mthis) native "WebGLRenderingContext_activeTexture_Callback";
-  activeTexture_Callback_0_(mthis) => activeTexture_Callback_0(mthis);
+  activeTexture_Callback_0_(mthis) => mthis.callMethod("activeTexture", []);
 
-  static activeTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_activeTexture_Callback";
-  activeTexture_Callback_1_(mthis, __arg_0) => activeTexture_Callback_1(mthis, __arg_0);
+  activeTexture_Callback_1_(mthis, __arg_0) => mthis.callMethod("activeTexture", [__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);
+  attachShader_Callback_0_(mthis) => mthis.callMethod("attachShader", []);
 
-  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);
+  attachShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("attachShader", [__arg_0]);
 
-  static attachShader_Callback_0(mthis) native "WebGLRenderingContext_attachShader_Callback";
-  attachShader_Callback_0_(mthis) => attachShader_Callback_0(mthis);
+  attachShader_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("attachShader", [__arg_0, __arg_1]);
 
-  static attachShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_attachShader_Callback";
-  attachShader_Callback_1_(mthis, __arg_0) => attachShader_Callback_1(mthis, __arg_0);
+  bindAttribLocation_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindAttribLocation", [__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);
+  bindAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bindAttribLocation", [__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);
+  bindAttribLocation_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("bindAttribLocation", [__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);
+  bindBuffer_Callback_0_(mthis) => mthis.callMethod("bindBuffer", []);
 
-  static bindAttribLocation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindAttribLocation_Callback";
-  bindAttribLocation_Callback_1_(mthis, __arg_0) => bindAttribLocation_Callback_1(mthis, __arg_0);
+  bindBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindBuffer", [__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);
+  bindBuffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bindBuffer", [__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);
+  bindFramebuffer_Callback_0_(mthis) => mthis.callMethod("bindFramebuffer", []);
 
-  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);
+  bindFramebuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindFramebuffer", [__arg_0]);
 
-  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);
+  bindFramebuffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bindFramebuffer", [__arg_0, __arg_1]);
 
-  static bindBuffer_Callback_0(mthis) native "WebGLRenderingContext_bindBuffer_Callback";
-  bindBuffer_Callback_0_(mthis) => bindBuffer_Callback_0(mthis);
+  bindRenderbuffer_Callback_0_(mthis) => mthis.callMethod("bindRenderbuffer", []);
 
-  static bindBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindBuffer_Callback";
-  bindBuffer_Callback_1_(mthis, __arg_0) => bindBuffer_Callback_1(mthis, __arg_0);
+  bindRenderbuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindRenderbuffer", [__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);
+  bindRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bindRenderbuffer", [__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);
+  bindTexture_Callback_0_(mthis) => mthis.callMethod("bindTexture", []);
 
-  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);
+  bindTexture_Callback_1_(mthis, __arg_0) => mthis.callMethod("bindTexture", [__arg_0]);
 
-  static bindFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_bindFramebuffer_Callback";
-  bindFramebuffer_Callback_0_(mthis) => bindFramebuffer_Callback_0(mthis);
+  bindTexture_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bindTexture", [__arg_0, __arg_1]);
 
-  static bindFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindFramebuffer_Callback";
-  bindFramebuffer_Callback_1_(mthis, __arg_0) => bindFramebuffer_Callback_1(mthis, __arg_0);
+  blendColor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("blendColor", [__arg_0, __arg_1]);
 
-  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);
+  blendColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("blendColor", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  blendColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("blendColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  blendEquationSeparate_Callback_0_(mthis) => mthis.callMethod("blendEquationSeparate", []);
 
-  static bindRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_bindRenderbuffer_Callback";
-  bindRenderbuffer_Callback_0_(mthis) => bindRenderbuffer_Callback_0(mthis);
+  blendEquationSeparate_Callback_1_(mthis, __arg_0) => mthis.callMethod("blendEquationSeparate", [__arg_0]);
 
-  static bindRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindRenderbuffer_Callback";
-  bindRenderbuffer_Callback_1_(mthis, __arg_0) => bindRenderbuffer_Callback_1(mthis, __arg_0);
+  blendEquationSeparate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("blendEquationSeparate", [__arg_0, __arg_1]);
 
-  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);
+  blendEquation_Callback_0_(mthis) => mthis.callMethod("blendEquation", []);
 
-  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);
+  blendEquation_Callback_1_(mthis, __arg_0) => mthis.callMethod("blendEquation", [__arg_0]);
 
-  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);
+  blendFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("blendFuncSeparate", [__arg_0, __arg_1]);
 
-  static bindTexture_Callback_0(mthis) native "WebGLRenderingContext_bindTexture_Callback";
-  bindTexture_Callback_0_(mthis) => bindTexture_Callback_0(mthis);
+  blendFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("blendFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  static bindTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bindTexture_Callback";
-  bindTexture_Callback_1_(mthis, __arg_0) => bindTexture_Callback_1(mthis, __arg_0);
+  blendFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("blendFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  blendFunc_Callback_0_(mthis) => mthis.callMethod("blendFunc", []);
 
-  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);
+  blendFunc_Callback_1_(mthis, __arg_0) => mthis.callMethod("blendFunc", [__arg_0]);
 
-  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);
+  blendFunc_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("blendFunc", [__arg_0, __arg_1]);
 
-  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);
+  bufferData_Callback_1_(mthis, __arg_0) => mthis.callMethod("bufferData", [__arg_0]);
 
-  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);
+  bufferData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bufferData", [__arg_0, __arg_1]);
 
-  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);
+  bufferData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("bufferData", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  bufferSubData_Callback_1_(mthis, __arg_0) => mthis.callMethod("bufferSubData", [__arg_0]);
 
-  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);
+  bufferSubData_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("bufferSubData", [__arg_0, __arg_1]);
 
-  static blendEquationSeparate_Callback_0(mthis) native "WebGLRenderingContext_blendEquationSeparate_Callback";
-  blendEquationSeparate_Callback_0_(mthis) => blendEquationSeparate_Callback_0(mthis);
+  bufferSubData_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("bufferSubData", [__arg_0, __arg_1, __arg_2]);
 
-  static blendEquationSeparate_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendEquationSeparate_Callback";
-  blendEquationSeparate_Callback_1_(mthis, __arg_0) => blendEquationSeparate_Callback_1(mthis, __arg_0);
+  canvas_Getter_(mthis) => mthis["canvas"];
 
-  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);
+  checkFramebufferStatus_Callback_0_(mthis) => mthis.callMethod("checkFramebufferStatus", []);
 
-  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);
+  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => mthis.callMethod("checkFramebufferStatus", [__arg_0]);
 
-  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);
+  clearColor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("clearColor", [__arg_0, __arg_1]);
 
-  static blendEquation_Callback_0(mthis) native "WebGLRenderingContext_blendEquation_Callback";
-  blendEquation_Callback_0_(mthis) => blendEquation_Callback_0(mthis);
+  clearColor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("clearColor", [__arg_0, __arg_1, __arg_2]);
 
-  static blendEquation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendEquation_Callback";
-  blendEquation_Callback_1_(mthis, __arg_0) => blendEquation_Callback_1(mthis, __arg_0);
+  clearColor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("clearColor", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  clearDepth_Callback_0_(mthis) => mthis.callMethod("clearDepth", []);
 
-  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);
+  clearDepth_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearDepth", [__arg_0]);
 
-  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);
+  clearStencil_Callback_0_(mthis) => mthis.callMethod("clearStencil", []);
 
-  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);
+  clearStencil_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearStencil", [__arg_0]);
 
-  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);
+  clear_Callback_0_(mthis) => mthis.callMethod("clear", []);
 
-  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);
+  clear_Callback_1_(mthis, __arg_0) => mthis.callMethod("clear", [__arg_0]);
 
-  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);
+  colorMask_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("colorMask", [__arg_0, __arg_1]);
 
-  static blendFunc_Callback_0(mthis) native "WebGLRenderingContext_blendFunc_Callback";
-  blendFunc_Callback_0_(mthis) => blendFunc_Callback_0(mthis);
+  colorMask_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("colorMask", [__arg_0, __arg_1, __arg_2]);
 
-  static blendFunc_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_blendFunc_Callback";
-  blendFunc_Callback_1_(mthis, __arg_0) => blendFunc_Callback_1(mthis, __arg_0);
+  colorMask_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("colorMask", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  compileShader_Callback_0_(mthis) => mthis.callMethod("compileShader", []);
 
-  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);
+  compileShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("compileShader", [__arg_0]);
 
-  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);
+  compressedTexImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static bufferData_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bufferData_Callback";
-  bufferData_Callback_1_(mthis, __arg_0) => bufferData_Callback_1(mthis, __arg_0);
+  compressedTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  compressedTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("compressedTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  compressedTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  compressedTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  compressedTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("compressedTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  static bufferSubData_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_bufferSubData_Callback";
-  bufferSubData_Callback_1_(mthis, __arg_0) => bufferSubData_Callback_1(mthis, __arg_0);
+  copyTexImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  copyTexImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  copyTexImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("copyTexImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  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);
+  copyTexSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  copyTexSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  static canvas_Getter(mthis) native "WebGLRenderingContext_canvas_Getter";
-  canvas_Getter_(mthis) => canvas_Getter(mthis);
+  copyTexSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("copyTexSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  static checkFramebufferStatus_Callback_0(mthis) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
-  checkFramebufferStatus_Callback_0_(mthis) => checkFramebufferStatus_Callback_0(mthis);
+  createBuffer_Callback_0_(mthis) => mthis.callMethod("createBuffer", []);
 
-  static checkFramebufferStatus_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_checkFramebufferStatus_Callback";
-  checkFramebufferStatus_Callback_1_(mthis, __arg_0) => checkFramebufferStatus_Callback_1(mthis, __arg_0);
+  createFramebuffer_Callback_0_(mthis) => mthis.callMethod("createFramebuffer", []);
 
-  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);
+  createProgram_Callback_0_(mthis) => mthis.callMethod("createProgram", []);
 
-  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);
+  createRenderbuffer_Callback_0_(mthis) => mthis.callMethod("createRenderbuffer", []);
 
-  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);
+  createShader_Callback_0_(mthis) => mthis.callMethod("createShader", []);
 
-  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);
+  createShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("createShader", [__arg_0]);
 
-  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);
+  createTexture_Callback_0_(mthis) => mthis.callMethod("createTexture", []);
 
-  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);
+  cullFace_Callback_0_(mthis) => mthis.callMethod("cullFace", []);
 
-  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);
+  cullFace_Callback_1_(mthis, __arg_0) => mthis.callMethod("cullFace", [__arg_0]);
 
-  static clearDepth_Callback_0(mthis) native "WebGLRenderingContext_clearDepth_Callback";
-  clearDepth_Callback_0_(mthis) => clearDepth_Callback_0(mthis);
+  deleteBuffer_Callback_0_(mthis) => mthis.callMethod("deleteBuffer", []);
 
-  static clearDepth_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clearDepth_Callback";
-  clearDepth_Callback_1_(mthis, __arg_0) => clearDepth_Callback_1(mthis, __arg_0);
+  deleteBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteBuffer", [__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);
+  deleteFramebuffer_Callback_0_(mthis) => mthis.callMethod("deleteFramebuffer", []);
 
-  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);
+  deleteFramebuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteFramebuffer", [__arg_0]);
 
-  static clearStencil_Callback_0(mthis) native "WebGLRenderingContext_clearStencil_Callback";
-  clearStencil_Callback_0_(mthis) => clearStencil_Callback_0(mthis);
+  deleteProgram_Callback_0_(mthis) => mthis.callMethod("deleteProgram", []);
 
-  static clearStencil_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clearStencil_Callback";
-  clearStencil_Callback_1_(mthis, __arg_0) => clearStencil_Callback_1(mthis, __arg_0);
+  deleteProgram_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteProgram", [__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);
+  deleteRenderbuffer_Callback_0_(mthis) => mthis.callMethod("deleteRenderbuffer", []);
 
-  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);
+  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteRenderbuffer", [__arg_0]);
 
-  static clear_Callback_0(mthis) native "WebGLRenderingContext_clear_Callback";
-  clear_Callback_0_(mthis) => clear_Callback_0(mthis);
+  deleteShader_Callback_0_(mthis) => mthis.callMethod("deleteShader", []);
 
-  static clear_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_clear_Callback";
-  clear_Callback_1_(mthis, __arg_0) => clear_Callback_1(mthis, __arg_0);
+  deleteShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteShader", [__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);
+  deleteTexture_Callback_0_(mthis) => mthis.callMethod("deleteTexture", []);
 
-  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);
+  deleteTexture_Callback_1_(mthis, __arg_0) => mthis.callMethod("deleteTexture", [__arg_0]);
 
-  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);
+  depthFunc_Callback_0_(mthis) => mthis.callMethod("depthFunc", []);
 
-  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);
+  depthFunc_Callback_1_(mthis, __arg_0) => mthis.callMethod("depthFunc", [__arg_0]);
 
-  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);
+  depthMask_Callback_0_(mthis) => mthis.callMethod("depthMask", []);
 
-  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);
+  depthMask_Callback_1_(mthis, __arg_0) => mthis.callMethod("depthMask", [__arg_0]);
 
-  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);
+  depthRange_Callback_0_(mthis) => mthis.callMethod("depthRange", []);
 
-  static compileShader_Callback_0(mthis) native "WebGLRenderingContext_compileShader_Callback";
-  compileShader_Callback_0_(mthis) => compileShader_Callback_0(mthis);
+  depthRange_Callback_1_(mthis, __arg_0) => mthis.callMethod("depthRange", [__arg_0]);
 
-  static compileShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_compileShader_Callback";
-  compileShader_Callback_1_(mthis, __arg_0) => compileShader_Callback_1(mthis, __arg_0);
+  depthRange_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("depthRange", [__arg_0, __arg_1]);
 
-  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);
+  detachShader_Callback_0_(mthis) => mthis.callMethod("detachShader", []);
 
-  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);
+  detachShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("detachShader", [__arg_0]);
 
-  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);
+  detachShader_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("detachShader", [__arg_0, __arg_1]);
 
-  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);
+  disableVertexAttribArray_Callback_0_(mthis) => mthis.callMethod("disableVertexAttribArray", []);
 
-  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);
+  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => mthis.callMethod("disableVertexAttribArray", [__arg_0]);
 
-  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);
+  disable_Callback_0_(mthis) => mthis.callMethod("disable", []);
 
-  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);
+  disable_Callback_1_(mthis, __arg_0) => mthis.callMethod("disable", [__arg_0]);
 
-  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);
+  drawArrays_Callback_1_(mthis, __arg_0) => mthis.callMethod("drawArrays", [__arg_0]);
 
-  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);
+  drawArrays_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("drawArrays", [__arg_0, __arg_1]);
 
-  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);
+  drawArrays_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("drawArrays", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  drawElements_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("drawElements", [__arg_0, __arg_1]);
 
-  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);
+  drawElements_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("drawElements", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  drawElements_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("drawElements", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  drawingBufferHeight_Getter_(mthis) => mthis["drawingBufferHeight"];
 
-  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);
+  drawingBufferWidth_Getter_(mthis) => mthis["drawingBufferWidth"];
 
-  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);
+  enableVertexAttribArray_Callback_0_(mthis) => mthis.callMethod("enableVertexAttribArray", []);
 
-  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);
+  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => mthis.callMethod("enableVertexAttribArray", [__arg_0]);
 
-  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);
+  enable_Callback_0_(mthis) => mthis.callMethod("enable", []);
 
-  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);
+  enable_Callback_1_(mthis, __arg_0) => mthis.callMethod("enable", [__arg_0]);
 
-  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);
+  finish_Callback_0_(mthis) => mthis.callMethod("finish", []);
 
-  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);
+  flush_Callback_0_(mthis) => mthis.callMethod("flush", []);
 
-  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);
+  framebufferRenderbuffer_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("framebufferRenderbuffer", [__arg_0, __arg_1]);
 
-  static createBuffer_Callback_0(mthis) native "WebGLRenderingContext_createBuffer_Callback";
-  createBuffer_Callback_0_(mthis) => createBuffer_Callback_0(mthis);
+  framebufferRenderbuffer_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2]);
 
-  static createBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createBuffer_Callback";
-  createBuffer_Callback_1_(mthis, __arg_0) => createBuffer_Callback_1(mthis, __arg_0);
+  framebufferRenderbuffer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("framebufferRenderbuffer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  framebufferTexture2D_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("framebufferTexture2D", [__arg_0, __arg_1, __arg_2]);
 
-  static createFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_createFramebuffer_Callback";
-  createFramebuffer_Callback_0_(mthis) => createFramebuffer_Callback_0(mthis);
+  framebufferTexture2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static createFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createFramebuffer_Callback";
-  createFramebuffer_Callback_1_(mthis, __arg_0) => createFramebuffer_Callback_1(mthis, __arg_0);
+  framebufferTexture2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("framebufferTexture2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  frontFace_Callback_0_(mthis) => mthis.callMethod("frontFace", []);
 
-  static createProgram_Callback_0(mthis) native "WebGLRenderingContext_createProgram_Callback";
-  createProgram_Callback_0_(mthis) => createProgram_Callback_0(mthis);
+  frontFace_Callback_1_(mthis, __arg_0) => mthis.callMethod("frontFace", [__arg_0]);
 
-  static createProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createProgram_Callback";
-  createProgram_Callback_1_(mthis, __arg_0) => createProgram_Callback_1(mthis, __arg_0);
+  generateMipmap_Callback_0_(mthis) => mthis.callMethod("generateMipmap", []);
 
-  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);
+  generateMipmap_Callback_1_(mthis, __arg_0) => mthis.callMethod("generateMipmap", [__arg_0]);
 
-  static createRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback";
-  createRenderbuffer_Callback_0_(mthis) => createRenderbuffer_Callback_0(mthis);
+  getActiveAttrib_Callback_0_(mthis) => mthis.callMethod("getActiveAttrib", []);
 
-  static createRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createRenderbuffer_Callback";
-  createRenderbuffer_Callback_1_(mthis, __arg_0) => createRenderbuffer_Callback_1(mthis, __arg_0);
+  getActiveAttrib_Callback_1_(mthis, __arg_0) => mthis.callMethod("getActiveAttrib", [__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);
+  getActiveAttrib_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getActiveAttrib", [__arg_0, __arg_1]);
 
-  static createShader_Callback_0(mthis) native "WebGLRenderingContext_createShader_Callback";
-  createShader_Callback_0_(mthis) => createShader_Callback_0(mthis);
+  getActiveUniform_Callback_0_(mthis) => mthis.callMethod("getActiveUniform", []);
 
-  static createShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createShader_Callback";
-  createShader_Callback_1_(mthis, __arg_0) => createShader_Callback_1(mthis, __arg_0);
+  getActiveUniform_Callback_1_(mthis, __arg_0) => mthis.callMethod("getActiveUniform", [__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);
+  getActiveUniform_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getActiveUniform", [__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);
+  getAttachedShaders_Callback_0_(mthis) => mthis.callMethod("getAttachedShaders", []);
 
-  static createTexture_Callback_0(mthis) native "WebGLRenderingContext_createTexture_Callback";
-  createTexture_Callback_0_(mthis) => createTexture_Callback_0(mthis);
+  getAttachedShaders_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAttachedShaders", [__arg_0]);
 
-  static createTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_createTexture_Callback";
-  createTexture_Callback_1_(mthis, __arg_0) => createTexture_Callback_1(mthis, __arg_0);
+  getAttribLocation_Callback_0_(mthis) => mthis.callMethod("getAttribLocation", []);
 
-  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);
+  getAttribLocation_Callback_1_(mthis, __arg_0) => mthis.callMethod("getAttribLocation", [__arg_0]);
 
-  static cullFace_Callback_0(mthis) native "WebGLRenderingContext_cullFace_Callback";
-  cullFace_Callback_0_(mthis) => cullFace_Callback_0(mthis);
+  getAttribLocation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getAttribLocation", [__arg_0, __arg_1]);
 
-  static cullFace_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_cullFace_Callback";
-  cullFace_Callback_1_(mthis, __arg_0) => cullFace_Callback_1(mthis, __arg_0);
+  getBufferParameter_Callback_0_(mthis) => mthis.callMethod("getBufferParameter", []);
 
-  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);
+  getBufferParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getBufferParameter", [__arg_0]);
 
-  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);
+  getBufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getBufferParameter", [__arg_0, __arg_1]);
 
-  static deleteBuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteBuffer_Callback";
-  deleteBuffer_Callback_0_(mthis) => deleteBuffer_Callback_0(mthis);
+  getContextAttributes_Callback_0_(mthis) => mthis.callMethod("getContextAttributes", []);
 
-  static deleteBuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteBuffer_Callback";
-  deleteBuffer_Callback_1_(mthis, __arg_0) => deleteBuffer_Callback_1(mthis, __arg_0);
+  getError_Callback_0_(mthis) => mthis.callMethod("getError", []);
 
-  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);
+  getExtension_Callback_0_(mthis) => mthis.callMethod("getExtension", []);
 
-  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);
+  getExtension_Callback_1_(mthis, __arg_0) => mthis.callMethod("getExtension", [__arg_0]);
 
-  static deleteFramebuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteFramebuffer_Callback";
-  deleteFramebuffer_Callback_0_(mthis) => deleteFramebuffer_Callback_0(mthis);
+  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getFramebufferAttachmentParameter", [__arg_0]);
 
-  static deleteFramebuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteFramebuffer_Callback";
-  deleteFramebuffer_Callback_1_(mthis, __arg_0) => deleteFramebuffer_Callback_1(mthis, __arg_0);
+  getFramebufferAttachmentParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getFramebufferAttachmentParameter", [__arg_0, __arg_1]);
 
-  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);
+  getFramebufferAttachmentParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("getFramebufferAttachmentParameter", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  getParameter_Callback_0_(mthis) => mthis.callMethod("getParameter", []);
 
-  static deleteProgram_Callback_0(mthis) native "WebGLRenderingContext_deleteProgram_Callback";
-  deleteProgram_Callback_0_(mthis) => deleteProgram_Callback_0(mthis);
+  getParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getParameter", [__arg_0]);
 
-  static deleteProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteProgram_Callback";
-  deleteProgram_Callback_1_(mthis, __arg_0) => deleteProgram_Callback_1(mthis, __arg_0);
+  getProgramInfoLog_Callback_0_(mthis) => mthis.callMethod("getProgramInfoLog", []);
 
-  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);
+  getProgramInfoLog_Callback_1_(mthis, __arg_0) => mthis.callMethod("getProgramInfoLog", [__arg_0]);
 
-  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);
+  getProgramParameter_Callback_0_(mthis) => mthis.callMethod("getProgramParameter", []);
 
-  static deleteRenderbuffer_Callback_0(mthis) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
-  deleteRenderbuffer_Callback_0_(mthis) => deleteRenderbuffer_Callback_0(mthis);
+  getProgramParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getProgramParameter", [__arg_0]);
 
-  static deleteRenderbuffer_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteRenderbuffer_Callback";
-  deleteRenderbuffer_Callback_1_(mthis, __arg_0) => deleteRenderbuffer_Callback_1(mthis, __arg_0);
+  getProgramParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getProgramParameter", [__arg_0, __arg_1]);
 
-  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);
+  getRenderbufferParameter_Callback_0_(mthis) => mthis.callMethod("getRenderbufferParameter", []);
 
-  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);
+  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getRenderbufferParameter", [__arg_0]);
 
-  static deleteShader_Callback_0(mthis) native "WebGLRenderingContext_deleteShader_Callback";
-  deleteShader_Callback_0_(mthis) => deleteShader_Callback_0(mthis);
+  getRenderbufferParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getRenderbufferParameter", [__arg_0, __arg_1]);
 
-  static deleteShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteShader_Callback";
-  deleteShader_Callback_1_(mthis, __arg_0) => deleteShader_Callback_1(mthis, __arg_0);
+  getShaderInfoLog_Callback_0_(mthis) => mthis.callMethod("getShaderInfoLog", []);
 
-  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);
+  getShaderInfoLog_Callback_1_(mthis, __arg_0) => mthis.callMethod("getShaderInfoLog", [__arg_0]);
 
-  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);
+  getShaderParameter_Callback_0_(mthis) => mthis.callMethod("getShaderParameter", []);
 
-  static deleteTexture_Callback_0(mthis) native "WebGLRenderingContext_deleteTexture_Callback";
-  deleteTexture_Callback_0_(mthis) => deleteTexture_Callback_0(mthis);
+  getShaderParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getShaderParameter", [__arg_0]);
 
-  static deleteTexture_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_deleteTexture_Callback";
-  deleteTexture_Callback_1_(mthis, __arg_0) => deleteTexture_Callback_1(mthis, __arg_0);
+  getShaderParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getShaderParameter", [__arg_0, __arg_1]);
 
-  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);
+  getShaderPrecisionFormat_Callback_0_(mthis) => mthis.callMethod("getShaderPrecisionFormat", []);
 
-  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);
+  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => mthis.callMethod("getShaderPrecisionFormat", [__arg_0]);
 
-  static depthFunc_Callback_0(mthis) native "WebGLRenderingContext_depthFunc_Callback";
-  depthFunc_Callback_0_(mthis) => depthFunc_Callback_0(mthis);
+  getShaderPrecisionFormat_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getShaderPrecisionFormat", [__arg_0, __arg_1]);
 
-  static depthFunc_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthFunc_Callback";
-  depthFunc_Callback_1_(mthis, __arg_0) => depthFunc_Callback_1(mthis, __arg_0);
+  getShaderSource_Callback_0_(mthis) => mthis.callMethod("getShaderSource", []);
 
-  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);
+  getShaderSource_Callback_1_(mthis, __arg_0) => mthis.callMethod("getShaderSource", [__arg_0]);
 
-  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);
+  getSupportedExtensions_Callback_0_(mthis) => mthis.callMethod("getSupportedExtensions", []);
 
-  static depthMask_Callback_0(mthis) native "WebGLRenderingContext_depthMask_Callback";
-  depthMask_Callback_0_(mthis) => depthMask_Callback_0(mthis);
+  getTexParameter_Callback_0_(mthis) => mthis.callMethod("getTexParameter", []);
 
-  static depthMask_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthMask_Callback";
-  depthMask_Callback_1_(mthis, __arg_0) => depthMask_Callback_1(mthis, __arg_0);
+  getTexParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getTexParameter", [__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);
+  getTexParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getTexParameter", [__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);
+  getUniformLocation_Callback_0_(mthis) => mthis.callMethod("getUniformLocation", []);
 
-  static depthRange_Callback_0(mthis) native "WebGLRenderingContext_depthRange_Callback";
-  depthRange_Callback_0_(mthis) => depthRange_Callback_0(mthis);
+  getUniformLocation_Callback_1_(mthis, __arg_0) => mthis.callMethod("getUniformLocation", [__arg_0]);
 
-  static depthRange_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_depthRange_Callback";
-  depthRange_Callback_1_(mthis, __arg_0) => depthRange_Callback_1(mthis, __arg_0);
+  getUniformLocation_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getUniformLocation", [__arg_0, __arg_1]);
 
-  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);
+  getUniform_Callback_0_(mthis) => mthis.callMethod("getUniform", []);
 
-  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);
+  getUniform_Callback_1_(mthis, __arg_0) => mthis.callMethod("getUniform", [__arg_0]);
 
-  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);
+  getUniform_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getUniform", [__arg_0, __arg_1]);
 
-  static detachShader_Callback_0(mthis) native "WebGLRenderingContext_detachShader_Callback";
-  detachShader_Callback_0_(mthis) => detachShader_Callback_0(mthis);
+  getVertexAttribOffset_Callback_0_(mthis) => mthis.callMethod("getVertexAttribOffset", []);
 
-  static detachShader_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_detachShader_Callback";
-  detachShader_Callback_1_(mthis, __arg_0) => detachShader_Callback_1(mthis, __arg_0);
+  getVertexAttribOffset_Callback_1_(mthis, __arg_0) => mthis.callMethod("getVertexAttribOffset", [__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);
+  getVertexAttribOffset_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getVertexAttribOffset", [__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);
+  getVertexAttrib_Callback_0_(mthis) => mthis.callMethod("getVertexAttrib", []);
 
-  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);
+  getVertexAttrib_Callback_1_(mthis, __arg_0) => mthis.callMethod("getVertexAttrib", [__arg_0]);
 
-  static disableVertexAttribArray_Callback_0(mthis) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
-  disableVertexAttribArray_Callback_0_(mthis) => disableVertexAttribArray_Callback_0(mthis);
+  getVertexAttrib_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getVertexAttrib", [__arg_0, __arg_1]);
 
-  static disableVertexAttribArray_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_disableVertexAttribArray_Callback";
-  disableVertexAttribArray_Callback_1_(mthis, __arg_0) => disableVertexAttribArray_Callback_1(mthis, __arg_0);
+  hint_Callback_0_(mthis) => mthis.callMethod("hint", []);
 
-  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);
+  hint_Callback_1_(mthis, __arg_0) => mthis.callMethod("hint", [__arg_0]);
 
-  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);
+  hint_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("hint", [__arg_0, __arg_1]);
 
-  static disable_Callback_0(mthis) native "WebGLRenderingContext_disable_Callback";
-  disable_Callback_0_(mthis) => disable_Callback_0(mthis);
+  isBuffer_Callback_0_(mthis) => mthis.callMethod("isBuffer", []);
 
-  static disable_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_disable_Callback";
-  disable_Callback_1_(mthis, __arg_0) => disable_Callback_1(mthis, __arg_0);
+  isBuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("isBuffer", [__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);
+  isContextLost_Callback_0_(mthis) => mthis.callMethod("isContextLost", []);
 
-  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);
+  isEnabled_Callback_0_(mthis) => mthis.callMethod("isEnabled", []);
 
-  static drawArrays_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_drawArrays_Callback";
-  drawArrays_Callback_1_(mthis, __arg_0) => drawArrays_Callback_1(mthis, __arg_0);
+  isEnabled_Callback_1_(mthis, __arg_0) => mthis.callMethod("isEnabled", [__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);
+  isFramebuffer_Callback_0_(mthis) => mthis.callMethod("isFramebuffer", []);
 
-  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);
+  isFramebuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("isFramebuffer", [__arg_0]);
 
-  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);
+  isProgram_Callback_0_(mthis) => mthis.callMethod("isProgram", []);
 
-  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);
+  isProgram_Callback_1_(mthis, __arg_0) => mthis.callMethod("isProgram", [__arg_0]);
 
-  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);
+  isRenderbuffer_Callback_0_(mthis) => mthis.callMethod("isRenderbuffer", []);
 
-  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);
+  isRenderbuffer_Callback_1_(mthis, __arg_0) => mthis.callMethod("isRenderbuffer", [__arg_0]);
 
-  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);
+  isShader_Callback_0_(mthis) => mthis.callMethod("isShader", []);
 
-  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);
+  isShader_Callback_1_(mthis, __arg_0) => mthis.callMethod("isShader", [__arg_0]);
 
-  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);
+  isTexture_Callback_0_(mthis) => mthis.callMethod("isTexture", []);
 
-  static drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
-  drawingBufferHeight_Getter_(mthis) => drawingBufferHeight_Getter(mthis);
+  isTexture_Callback_1_(mthis, __arg_0) => mthis.callMethod("isTexture", [__arg_0]);
 
-  static drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
-  drawingBufferWidth_Getter_(mthis) => drawingBufferWidth_Getter(mthis);
+  lineWidth_Callback_0_(mthis) => mthis.callMethod("lineWidth", []);
 
-  static enableVertexAttribArray_Callback_0(mthis) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
-  enableVertexAttribArray_Callback_0_(mthis) => enableVertexAttribArray_Callback_0(mthis);
+  lineWidth_Callback_1_(mthis, __arg_0) => mthis.callMethod("lineWidth", [__arg_0]);
 
-  static enableVertexAttribArray_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_enableVertexAttribArray_Callback";
-  enableVertexAttribArray_Callback_1_(mthis, __arg_0) => enableVertexAttribArray_Callback_1(mthis, __arg_0);
+  linkProgram_Callback_0_(mthis) => mthis.callMethod("linkProgram", []);
 
-  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);
+  linkProgram_Callback_1_(mthis, __arg_0) => mthis.callMethod("linkProgram", [__arg_0]);
 
-  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);
+  pixelStorei_Callback_0_(mthis) => mthis.callMethod("pixelStorei", []);
 
-  static enable_Callback_0(mthis) native "WebGLRenderingContext_enable_Callback";
-  enable_Callback_0_(mthis) => enable_Callback_0(mthis);
+  pixelStorei_Callback_1_(mthis, __arg_0) => mthis.callMethod("pixelStorei", [__arg_0]);
 
-  static enable_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_enable_Callback";
-  enable_Callback_1_(mthis, __arg_0) => enable_Callback_1(mthis, __arg_0);
+  pixelStorei_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("pixelStorei", [__arg_0, __arg_1]);
 
-  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);
+  polygonOffset_Callback_0_(mthis) => mthis.callMethod("polygonOffset", []);
 
-  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);
+  polygonOffset_Callback_1_(mthis, __arg_0) => mthis.callMethod("polygonOffset", [__arg_0]);
 
-  static finish_Callback_0(mthis) native "WebGLRenderingContext_finish_Callback";
-  finish_Callback_0_(mthis) => finish_Callback_0(mthis);
+  polygonOffset_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("polygonOffset", [__arg_0, __arg_1]);
 
-  static finish_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_finish_Callback";
-  finish_Callback_1_(mthis, __arg_0) => finish_Callback_1(mthis, __arg_0);
+  readPixels_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  readPixels_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static flush_Callback_0(mthis) native "WebGLRenderingContext_flush_Callback";
-  flush_Callback_0_(mthis) => flush_Callback_0(mthis);
+  readPixels_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("readPixels", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  static flush_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_flush_Callback";
-  flush_Callback_1_(mthis, __arg_0) => flush_Callback_1(mthis, __arg_0);
+  renderbufferStorage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("renderbufferStorage", [__arg_0, __arg_1]);
 
-  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);
+  renderbufferStorage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("renderbufferStorage", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  renderbufferStorage_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("renderbufferStorage", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  sampleCoverage_Callback_0_(mthis) => mthis.callMethod("sampleCoverage", []);
 
-  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);
+  sampleCoverage_Callback_1_(mthis, __arg_0) => mthis.callMethod("sampleCoverage", [__arg_0]);
 
-  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);
+  sampleCoverage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("sampleCoverage", [__arg_0, __arg_1]);
 
-  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);
+  scissor_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scissor", [__arg_0, __arg_1]);
 
-  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);
+  scissor_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scissor", [__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);
+  scissor_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("scissor", [__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);
+  shaderSource_Callback_0_(mthis) => mthis.callMethod("shaderSource", []);
 
-  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);
+  shaderSource_Callback_1_(mthis, __arg_0) => mthis.callMethod("shaderSource", [__arg_0]);
 
-  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);
+  shaderSource_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("shaderSource", [__arg_0, __arg_1]);
 
-  static frontFace_Callback_0(mthis) native "WebGLRenderingContext_frontFace_Callback";
-  frontFace_Callback_0_(mthis) => frontFace_Callback_0(mthis);
+  stencilFuncSeparate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("stencilFuncSeparate", [__arg_0, __arg_1]);
 
-  static frontFace_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_frontFace_Callback";
-  frontFace_Callback_1_(mthis, __arg_0) => frontFace_Callback_1(mthis, __arg_0);
+  stencilFuncSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("stencilFuncSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  stencilFuncSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("stencilFuncSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  stencilFunc_Callback_1_(mthis, __arg_0) => mthis.callMethod("stencilFunc", [__arg_0]);
 
-  static generateMipmap_Callback_0(mthis) native "WebGLRenderingContext_generateMipmap_Callback";
-  generateMipmap_Callback_0_(mthis) => generateMipmap_Callback_0(mthis);
+  stencilFunc_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("stencilFunc", [__arg_0, __arg_1]);
 
-  static generateMipmap_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_generateMipmap_Callback";
-  generateMipmap_Callback_1_(mthis, __arg_0) => generateMipmap_Callback_1(mthis, __arg_0);
+  stencilFunc_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("stencilFunc", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  stencilMaskSeparate_Callback_0_(mthis) => mthis.callMethod("stencilMaskSeparate", []);
 
-  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);
+  stencilMaskSeparate_Callback_1_(mthis, __arg_0) => mthis.callMethod("stencilMaskSeparate", [__arg_0]);
 
-  static getActiveAttrib_Callback_0(mthis) native "WebGLRenderingContext_getActiveAttrib_Callback";
-  getActiveAttrib_Callback_0_(mthis) => getActiveAttrib_Callback_0(mthis);
+  stencilMaskSeparate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("stencilMaskSeparate", [__arg_0, __arg_1]);
 
-  static getActiveAttrib_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getActiveAttrib_Callback";
-  getActiveAttrib_Callback_1_(mthis, __arg_0) => getActiveAttrib_Callback_1(mthis, __arg_0);
+  stencilMask_Callback_0_(mthis) => mthis.callMethod("stencilMask", []);
 
-  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);
+  stencilMask_Callback_1_(mthis, __arg_0) => mthis.callMethod("stencilMask", [__arg_0]);
 
-  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);
+  stencilOpSeparate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("stencilOpSeparate", [__arg_0, __arg_1]);
 
-  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);
+  stencilOpSeparate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("stencilOpSeparate", [__arg_0, __arg_1, __arg_2]);
 
-  static getActiveUniform_Callback_0(mthis) native "WebGLRenderingContext_getActiveUniform_Callback";
-  getActiveUniform_Callback_0_(mthis) => getActiveUniform_Callback_0(mthis);
+  stencilOpSeparate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("stencilOpSeparate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static getActiveUniform_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getActiveUniform_Callback";
-  getActiveUniform_Callback_1_(mthis, __arg_0) => getActiveUniform_Callback_1(mthis, __arg_0);
+  stencilOp_Callback_1_(mthis, __arg_0) => mthis.callMethod("stencilOp", [__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);
+  stencilOp_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("stencilOp", [__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);
+  stencilOp_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("stencilOp", [__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);
+  texImage2D_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("texImage2D", [__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);
+  texImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static getAttachedShaders_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getAttachedShaders_Callback";
-  getAttachedShaders_Callback_1_(mthis, __arg_0) => getAttachedShaders_Callback_1(mthis, __arg_0);
+  texImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  texImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  texImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  static getAttribLocation_Callback_0(mthis) native "WebGLRenderingContext_getAttribLocation_Callback";
-  getAttribLocation_Callback_0_(mthis) => getAttribLocation_Callback_0(mthis);
+  texImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("texImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  static getAttribLocation_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getAttribLocation_Callback";
-  getAttribLocation_Callback_1_(mthis, __arg_0) => getAttribLocation_Callback_1(mthis, __arg_0);
+  texParameterf_Callback_1_(mthis, __arg_0) => mthis.callMethod("texParameterf", [__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);
+  texParameterf_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("texParameterf", [__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);
+  texParameterf_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("texParameterf", [__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);
+  texParameteri_Callback_1_(mthis, __arg_0) => mthis.callMethod("texParameteri", [__arg_0]);
 
-  static getBufferParameter_Callback_0(mthis) native "WebGLRenderingContext_getBufferParameter_Callback";
-  getBufferParameter_Callback_0_(mthis) => getBufferParameter_Callback_0(mthis);
+  texParameteri_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("texParameteri", [__arg_0, __arg_1]);
 
-  static getBufferParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getBufferParameter_Callback";
-  getBufferParameter_Callback_1_(mthis, __arg_0) => getBufferParameter_Callback_1(mthis, __arg_0);
+  texParameteri_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("texParameteri", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  texSubImage2D_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  texSubImage2D_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  texSubImage2D_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  static getContextAttributes_Callback_0(mthis) native "WebGLRenderingContext_getContextAttributes_Callback";
-  getContextAttributes_Callback_0_(mthis) => getContextAttributes_Callback_0(mthis);
+  texSubImage2D_Callback_8_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7) => mthis.callMethod("texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7]);
 
-  static getContextAttributes_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getContextAttributes_Callback";
-  getContextAttributes_Callback_1_(mthis, __arg_0) => getContextAttributes_Callback_1(mthis, __arg_0);
+  texSubImage2D_Callback_9_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8) => mthis.callMethod("texSubImage2D", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6, __arg_7, __arg_8]);
 
-  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);
+  uniform1f_Callback_0_(mthis) => mthis.callMethod("uniform1f", []);
 
-  static getError_Callback_0(mthis) native "WebGLRenderingContext_getError_Callback";
-  getError_Callback_0_(mthis) => getError_Callback_0(mthis);
+  uniform1f_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform1f", [__arg_0]);
 
-  static getError_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getError_Callback";
-  getError_Callback_1_(mthis, __arg_0) => getError_Callback_1(mthis, __arg_0);
+  uniform1f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform1f", [__arg_0, __arg_1]);
 
-  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);
+  uniform1fv_Callback_0_(mthis) => mthis.callMethod("uniform1fv", []);
 
-  static getExtension_Callback_0(mthis) native "WebGLRenderingContext_getExtension_Callback";
-  getExtension_Callback_0_(mthis) => getExtension_Callback_0(mthis);
+  uniform1fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform1fv", [__arg_0]);
 
-  static getExtension_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getExtension_Callback";
-  getExtension_Callback_1_(mthis, __arg_0) => getExtension_Callback_1(mthis, __arg_0);
+  uniform1fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform1fv", [__arg_0, __arg_1]);
 
-  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);
+  uniform1i_Callback_0_(mthis) => mthis.callMethod("uniform1i", []);
 
-  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);
+  uniform1i_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform1i", [__arg_0]);
 
-  static getFramebufferAttachmentParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
-  getFramebufferAttachmentParameter_Callback_1_(mthis, __arg_0) => getFramebufferAttachmentParameter_Callback_1(mthis, __arg_0);
+  uniform1i_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform1i", [__arg_0, __arg_1]);
 
-  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);
+  uniform1iv_Callback_0_(mthis) => mthis.callMethod("uniform1iv", []);
 
-  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);
+  uniform1iv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform1iv", [__arg_0]);
 
-  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);
+  uniform1iv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform1iv", [__arg_0, __arg_1]);
 
-  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);
+  uniform2f_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform2f", [__arg_0]);
 
-  static getParameter_Callback_0(mthis) native "WebGLRenderingContext_getParameter_Callback";
-  getParameter_Callback_0_(mthis) => getParameter_Callback_0(mthis);
+  uniform2f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform2f", [__arg_0, __arg_1]);
 
-  static getParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getParameter_Callback";
-  getParameter_Callback_1_(mthis, __arg_0) => getParameter_Callback_1(mthis, __arg_0);
+  uniform2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform2f", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  uniform2fv_Callback_0_(mthis) => mthis.callMethod("uniform2fv", []);
 
-  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);
+  uniform2fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform2fv", [__arg_0]);
 
-  static getProgramInfoLog_Callback_0(mthis) native "WebGLRenderingContext_getProgramInfoLog_Callback";
-  getProgramInfoLog_Callback_0_(mthis) => getProgramInfoLog_Callback_0(mthis);
+  uniform2fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform2fv", [__arg_0, __arg_1]);
 
-  static getProgramInfoLog_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getProgramInfoLog_Callback";
-  getProgramInfoLog_Callback_1_(mthis, __arg_0) => getProgramInfoLog_Callback_1(mthis, __arg_0);
+  uniform2i_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform2i", [__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);
+  uniform2i_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform2i", [__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);
+  uniform2i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform2i", [__arg_0, __arg_1, __arg_2]);
 
-  static getProgramParameter_Callback_0(mthis) native "WebGLRenderingContext_getProgramParameter_Callback";
-  getProgramParameter_Callback_0_(mthis) => getProgramParameter_Callback_0(mthis);
+  uniform2iv_Callback_0_(mthis) => mthis.callMethod("uniform2iv", []);
 
-  static getProgramParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getProgramParameter_Callback";
-  getProgramParameter_Callback_1_(mthis, __arg_0) => getProgramParameter_Callback_1(mthis, __arg_0);
+  uniform2iv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform2iv", [__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);
+  uniform2iv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform2iv", [__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);
+  uniform3f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform3f", [__arg_0, __arg_1]);
 
-  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);
+  uniform3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform3f", [__arg_0, __arg_1, __arg_2]);
 
-  static getRenderbufferParameter_Callback_0(mthis) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
-  getRenderbufferParameter_Callback_0_(mthis) => getRenderbufferParameter_Callback_0(mthis);
+  uniform3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("uniform3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static getRenderbufferParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
-  getRenderbufferParameter_Callback_1_(mthis, __arg_0) => getRenderbufferParameter_Callback_1(mthis, __arg_0);
+  uniform3fv_Callback_0_(mthis) => mthis.callMethod("uniform3fv", []);
 
-  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);
+  uniform3fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform3fv", [__arg_0]);
 
-  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);
+  uniform3fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform3fv", [__arg_0, __arg_1]);
 
-  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);
+  uniform3i_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform3i", [__arg_0, __arg_1]);
 
-  static getShaderInfoLog_Callback_0(mthis) native "WebGLRenderingContext_getShaderInfoLog_Callback";
-  getShaderInfoLog_Callback_0_(mthis) => getShaderInfoLog_Callback_0(mthis);
+  uniform3i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform3i", [__arg_0, __arg_1, __arg_2]);
 
-  static getShaderInfoLog_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderInfoLog_Callback";
-  getShaderInfoLog_Callback_1_(mthis, __arg_0) => getShaderInfoLog_Callback_1(mthis, __arg_0);
+  uniform3i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("uniform3i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  uniform3iv_Callback_0_(mthis) => mthis.callMethod("uniform3iv", []);
 
-  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);
+  uniform3iv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform3iv", [__arg_0]);
 
-  static getShaderParameter_Callback_0(mthis) native "WebGLRenderingContext_getShaderParameter_Callback";
-  getShaderParameter_Callback_0_(mthis) => getShaderParameter_Callback_0(mthis);
+  uniform3iv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform3iv", [__arg_0, __arg_1]);
 
-  static getShaderParameter_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderParameter_Callback";
-  getShaderParameter_Callback_1_(mthis, __arg_0) => getShaderParameter_Callback_1(mthis, __arg_0);
+  uniform4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform4f", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  uniform4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  uniform4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("uniform4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  uniform4fv_Callback_0_(mthis) => mthis.callMethod("uniform4fv", []);
 
-  static getShaderPrecisionFormat_Callback_0(mthis) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
-  getShaderPrecisionFormat_Callback_0_(mthis) => getShaderPrecisionFormat_Callback_0(mthis);
+  uniform4fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform4fv", [__arg_0]);
 
-  static getShaderPrecisionFormat_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback";
-  getShaderPrecisionFormat_Callback_1_(mthis, __arg_0) => getShaderPrecisionFormat_Callback_1(mthis, __arg_0);
+  uniform4fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform4fv", [__arg_0, __arg_1]);
 
-  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);
+  uniform4i_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniform4i", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  uniform4i_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  uniform4i_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("uniform4i", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static getShaderSource_Callback_0(mthis) native "WebGLRenderingContext_getShaderSource_Callback";
-  getShaderSource_Callback_0_(mthis) => getShaderSource_Callback_0(mthis);
+  uniform4iv_Callback_0_(mthis) => mthis.callMethod("uniform4iv", []);
 
-  static getShaderSource_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_getShaderSource_Callback";
-  getShaderSource_Callback_1_(mthis, __arg_0) => getShaderSource_Callback_1(mthis, __arg_0);
+  uniform4iv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniform4iv", [__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);
+  uniform4iv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniform4iv", [__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);
+  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniformMatrix2fv", [__arg_0]);
 
-  static getSupportedExtensions_Callback_0(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
-  getSupportedExtensions_Callback_0_(mthis) => getSupportedExtensions_Callback_0(mthis);
+  uniformMatrix2fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniformMatrix2fv", [__arg_0, __arg_1]);
 
-  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 uniform1iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform1iv_Callback";
-  uniform1iv_Callback_1_(mthis, __arg_0) => uniform1iv_Callback_1(mthis, __arg_0);
-
-  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 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 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 uniform2f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2f_Callback";
-  uniform2f_Callback_1_(mthis, __arg_0) => uniform2f_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 uniform2fv_Callback_0(mthis) native "WebGLRenderingContext_uniform2fv_Callback";
-  uniform2fv_Callback_0_(mthis) => uniform2fv_Callback_0(mthis);
-
-  static uniform2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2fv_Callback";
-  uniform2fv_Callback_1_(mthis, __arg_0) => uniform2fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 uniform2i_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2i_Callback";
-  uniform2i_Callback_1_(mthis, __arg_0) => uniform2i_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 uniform2iv_Callback_0(mthis) native "WebGLRenderingContext_uniform2iv_Callback";
-  uniform2iv_Callback_0_(mthis) => uniform2iv_Callback_0(mthis);
-
-  static uniform2iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform2iv_Callback";
-  uniform2iv_Callback_1_(mthis, __arg_0) => uniform2iv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 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 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 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 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 uniform3fv_Callback_0(mthis) native "WebGLRenderingContext_uniform3fv_Callback";
-  uniform3fv_Callback_0_(mthis) => uniform3fv_Callback_0(mthis);
-
-  static uniform3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform3fv_Callback";
-  uniform3fv_Callback_1_(mthis, __arg_0) => uniform3fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 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 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 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 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 uniform3iv_Callback_0(mthis) native "WebGLRenderingContext_uniform3iv_Callback";
-  uniform3iv_Callback_0_(mthis) => uniform3iv_Callback_0(mthis);
-
-  static uniform3iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform3iv_Callback";
-  uniform3iv_Callback_1_(mthis, __arg_0) => uniform3iv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 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 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 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 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 uniform4fv_Callback_0(mthis) native "WebGLRenderingContext_uniform4fv_Callback";
-  uniform4fv_Callback_0_(mthis) => uniform4fv_Callback_0(mthis);
-
-  static uniform4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform4fv_Callback";
-  uniform4fv_Callback_1_(mthis, __arg_0) => uniform4fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 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 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 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 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 uniform4iv_Callback_0(mthis) native "WebGLRenderingContext_uniform4iv_Callback";
-  uniform4iv_Callback_0_(mthis) => uniform4iv_Callback_0(mthis);
-
-  static uniform4iv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniform4iv_Callback";
-  uniform4iv_Callback_1_(mthis, __arg_0) => uniform4iv_Callback_1(mthis, __arg_0);
-
-  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 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 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 uniformMatrix2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
-  uniformMatrix2fv_Callback_1_(mthis, __arg_0) => uniformMatrix2fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 uniformMatrix3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
-  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => uniformMatrix3fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 uniformMatrix4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
-  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => uniformMatrix4fv_Callback_1(mthis, __arg_0);
-
-  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 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 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 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 useProgram_Callback_0(mthis) native "WebGLRenderingContext_useProgram_Callback";
-  useProgram_Callback_0_(mthis) => useProgram_Callback_0(mthis);
-
-  static useProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_useProgram_Callback";
-  useProgram_Callback_1_(mthis, __arg_0) => useProgram_Callback_1(mthis, __arg_0);
-
-  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 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 validateProgram_Callback_0(mthis) native "WebGLRenderingContext_validateProgram_Callback";
-  validateProgram_Callback_0_(mthis) => validateProgram_Callback_0(mthis);
-
-  static validateProgram_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_validateProgram_Callback";
-  validateProgram_Callback_1_(mthis, __arg_0) => validateProgram_Callback_1(mthis, __arg_0);
-
-  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 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 vertexAttrib1f_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib1f_Callback";
-  vertexAttrib1f_Callback_0_(mthis) => vertexAttrib1f_Callback_0(mthis);
-
-  static vertexAttrib1f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib1f_Callback";
-  vertexAttrib1f_Callback_1_(mthis, __arg_0) => vertexAttrib1f_Callback_1(mthis, __arg_0);
-
-  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 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 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 vertexAttrib1fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
-  vertexAttrib1fv_Callback_0_(mthis) => vertexAttrib1fv_Callback_0(mthis);
-
-  static vertexAttrib1fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
-  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => vertexAttrib1fv_Callback_1(mthis, __arg_0);
-
-  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 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 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);
+  uniformMatrix2fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniformMatrix2fv", [__arg_0, __arg_1, __arg_2]);
 
-  static vertexAttrib2f_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib2f_Callback";
-  vertexAttrib2f_Callback_1_(mthis, __arg_0) => vertexAttrib2f_Callback_1(mthis, __arg_0);
+  uniformMatrix3fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniformMatrix3fv", [__arg_0]);
 
-  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);
+  uniformMatrix3fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniformMatrix3fv", [__arg_0, __arg_1]);
 
-  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);
+  uniformMatrix3fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniformMatrix3fv", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  uniformMatrix4fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("uniformMatrix4fv", [__arg_0]);
 
-  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);
+  uniformMatrix4fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("uniformMatrix4fv", [__arg_0, __arg_1]);
 
-  static vertexAttrib2fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
-  vertexAttrib2fv_Callback_0_(mthis) => vertexAttrib2fv_Callback_0(mthis);
+  uniformMatrix4fv_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("uniformMatrix4fv", [__arg_0, __arg_1, __arg_2]);
 
-  static vertexAttrib2fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
-  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => vertexAttrib2fv_Callback_1(mthis, __arg_0);
+  useProgram_Callback_0_(mthis) => mthis.callMethod("useProgram", []);
 
-  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);
+  useProgram_Callback_1_(mthis, __arg_0) => mthis.callMethod("useProgram", [__arg_0]);
 
-  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);
+  validateProgram_Callback_0_(mthis) => mthis.callMethod("validateProgram", []);
 
-  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);
+  validateProgram_Callback_1_(mthis, __arg_0) => mthis.callMethod("validateProgram", [__arg_0]);
 
-  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);
+  vertexAttrib1f_Callback_0_(mthis) => mthis.callMethod("vertexAttrib1f", []);
 
-  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);
+  vertexAttrib1f_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib1f", [__arg_0]);
 
-  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);
+  vertexAttrib1f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib1f", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttrib1fv_Callback_0_(mthis) => mthis.callMethod("vertexAttrib1fv", []);
 
-  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);
+  vertexAttrib1fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib1fv", [__arg_0]);
 
-  static vertexAttrib3fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
-  vertexAttrib3fv_Callback_0_(mthis) => vertexAttrib3fv_Callback_0(mthis);
+  vertexAttrib1fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib1fv", [__arg_0, __arg_1]);
 
-  static vertexAttrib3fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
-  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => vertexAttrib3fv_Callback_1(mthis, __arg_0);
+  vertexAttrib2f_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib2f", [__arg_0]);
 
-  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);
+  vertexAttrib2f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib2f", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttrib2f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("vertexAttrib2f", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  vertexAttrib2fv_Callback_0_(mthis) => mthis.callMethod("vertexAttrib2fv", []);
 
-  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);
+  vertexAttrib2fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib2fv", [__arg_0]);
 
-  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);
+  vertexAttrib2fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib2fv", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttrib3f_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib3f", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttrib3f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("vertexAttrib3f", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  vertexAttrib3f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("vertexAttrib3f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static vertexAttrib4fv_Callback_0(mthis) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
-  vertexAttrib4fv_Callback_0_(mthis) => vertexAttrib4fv_Callback_0(mthis);
+  vertexAttrib3fv_Callback_0_(mthis) => mthis.callMethod("vertexAttrib3fv", []);
 
-  static vertexAttrib4fv_Callback_1(mthis, __arg_0) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
-  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => vertexAttrib4fv_Callback_1(mthis, __arg_0);
+  vertexAttrib3fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib3fv", [__arg_0]);
 
-  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);
+  vertexAttrib3fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib3fv", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttrib4f_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("vertexAttrib4f", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  vertexAttrib4f_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  vertexAttrib4f_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("vertexAttrib4f", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  vertexAttrib4fv_Callback_0_(mthis) => mthis.callMethod("vertexAttrib4fv", []);
 
-  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);
+  vertexAttrib4fv_Callback_1_(mthis, __arg_0) => mthis.callMethod("vertexAttrib4fv", [__arg_0]);
 
-  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);
+  vertexAttrib4fv_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("vertexAttrib4fv", [__arg_0, __arg_1]);
 
-  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);
+  vertexAttribPointer_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  vertexAttribPointer_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  vertexAttribPointer_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("vertexAttribPointer", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  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);
+  viewport_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("viewport", [__arg_0, __arg_1]);
 
-  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);
+  viewport_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("viewport", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  viewport_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("viewport", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
 }
 
@@ -28886,14 +15744,11 @@
 class BlinkWebGLShaderPrecisionFormat {
   static final instance = new BlinkWebGLShaderPrecisionFormat();
 
-  static precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
-  precision_Getter_(mthis) => precision_Getter(mthis);
+  precision_Getter_(mthis) => mthis["precision"];
 
-  static rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
-  rangeMax_Getter_(mthis) => rangeMax_Getter(mthis);
+  rangeMax_Getter_(mthis) => mthis["rangeMax"];
 
-  static rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
-  rangeMin_Getter_(mthis) => rangeMin_Getter(mthis);
+  rangeMin_Getter_(mthis) => mthis["rangeMin"];
 
 }
 
@@ -28915,1762 +15770,985 @@
 class BlinkWebKitAnimationEvent extends BlinkEvent {
   static final instance = new BlinkWebKitAnimationEvent();
 
-  static animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
-  animationName_Getter_(mthis) => animationName_Getter(mthis);
+  animationName_Getter_(mthis) => mthis["animationName"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "WebKitAnimationEvent_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["WebKitAnimationEvent"], [__arg_0, __arg_1]);
 
-  static elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
-  elapsedTime_Getter_(mthis) => elapsedTime_Getter(mthis);
+  elapsedTime_Getter_(mthis) => mthis["elapsedTime"];
 
 }
 
 class BlinkWebKitCSSFilterRule extends BlinkCSSRule {
   static final instance = new BlinkWebKitCSSFilterRule();
 
-  static style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
-  style_Getter_(mthis) => style_Getter(mthis);
+  style_Getter_(mthis) => mthis["style"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static operationType_Getter(mthis) native "WebKitCSSFilterValue_operationType_Getter";
-  operationType_Getter_(mthis) => operationType_Getter(mthis);
+  operationType_Getter_(mthis) => mthis["operationType"];
 
 }
 
 class BlinkWebKitCSSMatrix {
   static final instance = new BlinkWebKitCSSMatrix();
 
-  static a_Getter(mthis) native "WebKitCSSMatrix_a_Getter";
-  a_Getter_(mthis) => a_Getter(mthis);
+  a_Getter_(mthis) => mthis["a"];
 
-  static a_Setter(mthis, __arg_0) native "WebKitCSSMatrix_a_Setter";
-  a_Setter_(mthis, __arg_0) => a_Setter(mthis, __arg_0);
+  a_Setter_(mthis, __arg_0) => mthis["a"] = __arg_0;
 
-  static b_Getter(mthis) native "WebKitCSSMatrix_b_Getter";
-  b_Getter_(mthis) => b_Getter(mthis);
+  b_Getter_(mthis) => mthis["b"];
 
-  static b_Setter(mthis, __arg_0) native "WebKitCSSMatrix_b_Setter";
-  b_Setter_(mthis, __arg_0) => b_Setter(mthis, __arg_0);
+  b_Setter_(mthis, __arg_0) => mthis["b"] = __arg_0;
 
-  static c_Getter(mthis) native "WebKitCSSMatrix_c_Getter";
-  c_Getter_(mthis) => c_Getter(mthis);
+  c_Getter_(mthis) => mthis["c"];
 
-  static c_Setter(mthis, __arg_0) native "WebKitCSSMatrix_c_Setter";
-  c_Setter_(mthis, __arg_0) => c_Setter(mthis, __arg_0);
+  c_Setter_(mthis, __arg_0) => mthis["c"] = __arg_0;
 
-  static constructorCallback_0() native "WebKitCSSMatrix_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["WebKitCSSMatrix"], []);
 
-  static constructorCallback_1(__arg_0) native "WebKitCSSMatrix_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["WebKitCSSMatrix"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "WebKitCSSMatrix_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  d_Getter_(mthis) => mthis["d"];
 
-  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);
+  d_Setter_(mthis, __arg_0) => mthis["d"] = __arg_0;
 
-  static d_Getter(mthis) native "WebKitCSSMatrix_d_Getter";
-  d_Getter_(mthis) => d_Getter(mthis);
+  e_Getter_(mthis) => mthis["e"];
 
-  static d_Setter(mthis, __arg_0) native "WebKitCSSMatrix_d_Setter";
-  d_Setter_(mthis, __arg_0) => d_Setter(mthis, __arg_0);
+  e_Setter_(mthis, __arg_0) => mthis["e"] = __arg_0;
 
-  static e_Getter(mthis) native "WebKitCSSMatrix_e_Getter";
-  e_Getter_(mthis) => e_Getter(mthis);
+  f_Getter_(mthis) => mthis["f"];
 
-  static e_Setter(mthis, __arg_0) native "WebKitCSSMatrix_e_Setter";
-  e_Setter_(mthis, __arg_0) => e_Setter(mthis, __arg_0);
+  f_Setter_(mthis, __arg_0) => mthis["f"] = __arg_0;
 
-  static f_Getter(mthis) native "WebKitCSSMatrix_f_Getter";
-  f_Getter_(mthis) => f_Getter(mthis);
+  inverse_Callback_0_(mthis) => mthis.callMethod("inverse", []);
 
-  static f_Setter(mthis, __arg_0) native "WebKitCSSMatrix_f_Setter";
-  f_Setter_(mthis, __arg_0) => f_Setter(mthis, __arg_0);
+  m11_Getter_(mthis) => mthis["m11"];
 
-  static inverse_Callback_0(mthis) native "WebKitCSSMatrix_inverse_Callback";
-  inverse_Callback_0_(mthis) => inverse_Callback_0(mthis);
+  m11_Setter_(mthis, __arg_0) => mthis["m11"] = __arg_0;
 
-  static inverse_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_inverse_Callback";
-  inverse_Callback_1_(mthis, __arg_0) => inverse_Callback_1(mthis, __arg_0);
+  m12_Getter_(mthis) => mthis["m12"];
 
-  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);
+  m12_Setter_(mthis, __arg_0) => mthis["m12"] = __arg_0;
 
-  static m11_Getter(mthis) native "WebKitCSSMatrix_m11_Getter";
-  m11_Getter_(mthis) => m11_Getter(mthis);
+  m13_Getter_(mthis) => mthis["m13"];
 
-  static m11_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m11_Setter";
-  m11_Setter_(mthis, __arg_0) => m11_Setter(mthis, __arg_0);
+  m13_Setter_(mthis, __arg_0) => mthis["m13"] = __arg_0;
 
-  static m12_Getter(mthis) native "WebKitCSSMatrix_m12_Getter";
-  m12_Getter_(mthis) => m12_Getter(mthis);
+  m14_Getter_(mthis) => mthis["m14"];
 
-  static m12_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m12_Setter";
-  m12_Setter_(mthis, __arg_0) => m12_Setter(mthis, __arg_0);
+  m14_Setter_(mthis, __arg_0) => mthis["m14"] = __arg_0;
 
-  static m13_Getter(mthis) native "WebKitCSSMatrix_m13_Getter";
-  m13_Getter_(mthis) => m13_Getter(mthis);
+  m21_Getter_(mthis) => mthis["m21"];
 
-  static m13_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m13_Setter";
-  m13_Setter_(mthis, __arg_0) => m13_Setter(mthis, __arg_0);
+  m21_Setter_(mthis, __arg_0) => mthis["m21"] = __arg_0;
 
-  static m14_Getter(mthis) native "WebKitCSSMatrix_m14_Getter";
-  m14_Getter_(mthis) => m14_Getter(mthis);
+  m22_Getter_(mthis) => mthis["m22"];
 
-  static m14_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m14_Setter";
-  m14_Setter_(mthis, __arg_0) => m14_Setter(mthis, __arg_0);
+  m22_Setter_(mthis, __arg_0) => mthis["m22"] = __arg_0;
 
-  static m21_Getter(mthis) native "WebKitCSSMatrix_m21_Getter";
-  m21_Getter_(mthis) => m21_Getter(mthis);
+  m23_Getter_(mthis) => mthis["m23"];
 
-  static m21_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m21_Setter";
-  m21_Setter_(mthis, __arg_0) => m21_Setter(mthis, __arg_0);
+  m23_Setter_(mthis, __arg_0) => mthis["m23"] = __arg_0;
 
-  static m22_Getter(mthis) native "WebKitCSSMatrix_m22_Getter";
-  m22_Getter_(mthis) => m22_Getter(mthis);
+  m24_Getter_(mthis) => mthis["m24"];
 
-  static m22_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m22_Setter";
-  m22_Setter_(mthis, __arg_0) => m22_Setter(mthis, __arg_0);
+  m24_Setter_(mthis, __arg_0) => mthis["m24"] = __arg_0;
 
-  static m23_Getter(mthis) native "WebKitCSSMatrix_m23_Getter";
-  m23_Getter_(mthis) => m23_Getter(mthis);
+  m31_Getter_(mthis) => mthis["m31"];
 
-  static m23_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m23_Setter";
-  m23_Setter_(mthis, __arg_0) => m23_Setter(mthis, __arg_0);
+  m31_Setter_(mthis, __arg_0) => mthis["m31"] = __arg_0;
 
-  static m24_Getter(mthis) native "WebKitCSSMatrix_m24_Getter";
-  m24_Getter_(mthis) => m24_Getter(mthis);
+  m32_Getter_(mthis) => mthis["m32"];
 
-  static m24_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m24_Setter";
-  m24_Setter_(mthis, __arg_0) => m24_Setter(mthis, __arg_0);
+  m32_Setter_(mthis, __arg_0) => mthis["m32"] = __arg_0;
 
-  static m31_Getter(mthis) native "WebKitCSSMatrix_m31_Getter";
-  m31_Getter_(mthis) => m31_Getter(mthis);
+  m33_Getter_(mthis) => mthis["m33"];
 
-  static m31_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m31_Setter";
-  m31_Setter_(mthis, __arg_0) => m31_Setter(mthis, __arg_0);
+  m33_Setter_(mthis, __arg_0) => mthis["m33"] = __arg_0;
 
-  static m32_Getter(mthis) native "WebKitCSSMatrix_m32_Getter";
-  m32_Getter_(mthis) => m32_Getter(mthis);
+  m34_Getter_(mthis) => mthis["m34"];
 
-  static m32_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m32_Setter";
-  m32_Setter_(mthis, __arg_0) => m32_Setter(mthis, __arg_0);
+  m34_Setter_(mthis, __arg_0) => mthis["m34"] = __arg_0;
 
-  static m33_Getter(mthis) native "WebKitCSSMatrix_m33_Getter";
-  m33_Getter_(mthis) => m33_Getter(mthis);
+  m41_Getter_(mthis) => mthis["m41"];
 
-  static m33_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m33_Setter";
-  m33_Setter_(mthis, __arg_0) => m33_Setter(mthis, __arg_0);
+  m41_Setter_(mthis, __arg_0) => mthis["m41"] = __arg_0;
 
-  static m34_Getter(mthis) native "WebKitCSSMatrix_m34_Getter";
-  m34_Getter_(mthis) => m34_Getter(mthis);
+  m42_Getter_(mthis) => mthis["m42"];
 
-  static m34_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m34_Setter";
-  m34_Setter_(mthis, __arg_0) => m34_Setter(mthis, __arg_0);
+  m42_Setter_(mthis, __arg_0) => mthis["m42"] = __arg_0;
 
-  static m41_Getter(mthis) native "WebKitCSSMatrix_m41_Getter";
-  m41_Getter_(mthis) => m41_Getter(mthis);
+  m43_Getter_(mthis) => mthis["m43"];
 
-  static m41_Setter(mthis, __arg_0) native "WebKitCSSMatrix_m41_Setter";
-  m41_Setter_(mthis, __arg_0) => m41_Setter(mthis, __arg_0);
+  m43_Setter_(mthis, __arg_0) => mthis["m43"] = __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);
+  m44_Getter_(mthis) => mthis["m44"];
 
-  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);
+  m44_Setter_(mthis, __arg_0) => mthis["m44"] = __arg_0;
 
-  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);
+  multiply_Callback_0_(mthis) => mthis.callMethod("multiply", []);
 
-  static scale_Callback_0(mthis) native "WebKitCSSMatrix_scale_Callback";
-  scale_Callback_0_(mthis) => scale_Callback_0(mthis);
+  multiply_Callback_1_(mthis, __arg_0) => mthis.callMethod("multiply", [__arg_0]);
 
-  static scale_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_scale_Callback";
-  scale_Callback_1_(mthis, __arg_0) => scale_Callback_1(mthis, __arg_0);
+  rotateAxisAngle_Callback_0_(mthis) => mthis.callMethod("rotateAxisAngle", []);
 
-  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);
+  rotateAxisAngle_Callback_1_(mthis, __arg_0) => mthis.callMethod("rotateAxisAngle", [__arg_0]);
 
-  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);
+  rotateAxisAngle_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("rotateAxisAngle", [__arg_0, __arg_1]);
 
-  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);
+  rotateAxisAngle_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("rotateAxisAngle", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  rotateAxisAngle_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("rotateAxisAngle", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static setMatrixValue_Callback_0(mthis) native "WebKitCSSMatrix_setMatrixValue_Callback";
-  setMatrixValue_Callback_0_(mthis) => setMatrixValue_Callback_0(mthis);
+  rotate_Callback_0_(mthis) => mthis.callMethod("rotate", []);
 
-  static setMatrixValue_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_setMatrixValue_Callback";
-  setMatrixValue_Callback_1_(mthis, __arg_0) => setMatrixValue_Callback_1(mthis, __arg_0);
+  rotate_Callback_1_(mthis, __arg_0) => mthis.callMethod("rotate", [__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);
+  rotate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("rotate", [__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);
+  rotate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("rotate", [__arg_0, __arg_1, __arg_2]);
 
-  static skewX_Callback_0(mthis) native "WebKitCSSMatrix_skewX_Callback";
-  skewX_Callback_0_(mthis) => skewX_Callback_0(mthis);
+  scale_Callback_0_(mthis) => mthis.callMethod("scale", []);
 
-  static skewX_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_skewX_Callback";
-  skewX_Callback_1_(mthis, __arg_0) => skewX_Callback_1(mthis, __arg_0);
+  scale_Callback_1_(mthis, __arg_0) => mthis.callMethod("scale", [__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);
+  scale_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scale", [__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);
+  scale_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scale", [__arg_0, __arg_1, __arg_2]);
 
-  static skewY_Callback_0(mthis) native "WebKitCSSMatrix_skewY_Callback";
-  skewY_Callback_0_(mthis) => skewY_Callback_0(mthis);
+  setMatrixValue_Callback_0_(mthis) => mthis.callMethod("setMatrixValue", []);
 
-  static skewY_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_skewY_Callback";
-  skewY_Callback_1_(mthis, __arg_0) => skewY_Callback_1(mthis, __arg_0);
+  setMatrixValue_Callback_1_(mthis, __arg_0) => mthis.callMethod("setMatrixValue", [__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);
+  skewX_Callback_0_(mthis) => mthis.callMethod("skewX", []);
 
-  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);
+  skewX_Callback_1_(mthis, __arg_0) => mthis.callMethod("skewX", [__arg_0]);
 
-  static translate_Callback_0(mthis) native "WebKitCSSMatrix_translate_Callback";
-  translate_Callback_0_(mthis) => translate_Callback_0(mthis);
+  skewY_Callback_0_(mthis) => mthis.callMethod("skewY", []);
 
-  static translate_Callback_1(mthis, __arg_0) native "WebKitCSSMatrix_translate_Callback";
-  translate_Callback_1_(mthis, __arg_0) => translate_Callback_1(mthis, __arg_0);
+  skewY_Callback_1_(mthis, __arg_0) => mthis.callMethod("skewY", [__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);
+  translate_Callback_0_(mthis) => mthis.callMethod("translate", []);
 
-  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);
+  translate_Callback_1_(mthis, __arg_0) => mthis.callMethod("translate", [__arg_0]);
 
-  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);
+  translate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("translate", [__arg_0, __arg_1]);
 
-  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);
+  translate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("translate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static operationType_Getter(mthis) native "WebKitCSSTransformValue_operationType_Getter";
-  operationType_Getter_(mthis) => operationType_Getter(mthis);
+  operationType_Getter_(mthis) => mthis["operationType"];
 
 }
 
 class BlinkWebKitGamepad {
   static final instance = new BlinkWebKitGamepad();
 
-  static axes_Getter(mthis) native "WebKitGamepad_axes_Getter";
-  axes_Getter_(mthis) => axes_Getter(mthis);
+  axes_Getter_(mthis) => mthis["axes"];
 
-  static buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
-  buttons_Getter_(mthis) => buttons_Getter(mthis);
+  buttons_Getter_(mthis) => mthis["buttons"];
 
-  static connected_Getter(mthis) native "WebKitGamepad_connected_Getter";
-  connected_Getter_(mthis) => connected_Getter(mthis);
+  connected_Getter_(mthis) => mthis["connected"];
 
-  static id_Getter(mthis) native "WebKitGamepad_id_Getter";
-  id_Getter_(mthis) => id_Getter(mthis);
+  id_Getter_(mthis) => mthis["id"];
 
-  static index_Getter(mthis) native "WebKitGamepad_index_Getter";
-  index_Getter_(mthis) => index_Getter(mthis);
+  index_Getter_(mthis) => mthis["index"];
 
-  static mapping_Getter(mthis) native "WebKitGamepad_mapping_Getter";
-  mapping_Getter_(mthis) => mapping_Getter(mthis);
+  mapping_Getter_(mthis) => mthis["mapping"];
 
-  static timestamp_Getter(mthis) native "WebKitGamepad_timestamp_Getter";
-  timestamp_Getter_(mthis) => timestamp_Getter(mthis);
+  timestamp_Getter_(mthis) => mthis["timestamp"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static item_Callback_0(mthis) native "WebKitGamepadList_item_Callback";
-  item_Callback_0_(mthis) => item_Callback_0(mthis);
+  item_Callback_0_(mthis) => mthis.callMethod("item", []);
 
-  static item_Callback_1(mthis, __arg_0) native "WebKitGamepadList_item_Callback";
-  item_Callback_1_(mthis, __arg_0) => item_Callback_1(mthis, __arg_0);
+  item_Callback_1_(mthis, __arg_0) => mthis.callMethod("item", [__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);
+  length_Getter_(mthis) => mthis["length"];
 
 }
 
 class BlinkWebSocket extends BlinkEventTarget {
   static final instance = new BlinkWebSocket();
 
-  static URL_Getter(mthis) native "WebSocket_URL_Getter";
-  URL_Getter_(mthis) => URL_Getter(mthis);
+  URL_Getter_(mthis) => mthis["URL"];
 
-  static binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
-  binaryType_Getter_(mthis) => binaryType_Getter(mthis);
+  binaryType_Getter_(mthis) => mthis["binaryType"];
 
-  static binaryType_Setter(mthis, __arg_0) native "WebSocket_binaryType_Setter";
-  binaryType_Setter_(mthis, __arg_0) => binaryType_Setter(mthis, __arg_0);
+  binaryType_Setter_(mthis, __arg_0) => mthis["binaryType"] = __arg_0;
 
-  static bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
-  bufferedAmount_Getter_(mthis) => bufferedAmount_Getter(mthis);
+  bufferedAmount_Getter_(mthis) => mthis["bufferedAmount"];
 
-  static close_Callback_0(mthis) native "WebSocket_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static close_Callback_1(mthis, __arg_0) native "WebSocket_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  close_Callback_1_(mthis, __arg_0) => mthis.callMethod("close", [__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);
+  close_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("close", [__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);
+  constructorCallback_0_() => new js.JsObject(js.context["WebSocket"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["WebSocket"], [__arg_0]);
 
-  static constructorCallback_0() native "WebSocket_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["WebSocket"], [__arg_0, __arg_1]);
 
-  static constructorCallback_1(__arg_0) native "WebSocket_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  extensions_Getter_(mthis) => mthis["extensions"];
 
-  static constructorCallback_2(__arg_0, __arg_1) native "WebSocket_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  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);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  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);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static extensions_Getter(mthis) native "WebSocket_extensions_Getter";
-  extensions_Getter_(mthis) => extensions_Getter(mthis);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onclose_Getter(mthis) native "WebSocket_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onclose_Setter(mthis, __arg_0) native "WebSocket_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onerror_Getter(mthis) native "WebSocket_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onopen_Getter_(mthis) => mthis["onopen"];
 
-  static onerror_Setter(mthis, __arg_0) native "WebSocket_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onopen_Setter_(mthis, __arg_0) => mthis["onopen"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "WebSocket_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static onmessage_Setter(mthis, __arg_0) native "WebSocket_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static onopen_Getter(mthis) native "WebSocket_onopen_Getter";
-  onopen_Getter_(mthis) => onopen_Getter(mthis);
+  send_Callback_0_(mthis) => mthis.callMethod("send", []);
 
-  static onopen_Setter(mthis, __arg_0) native "WebSocket_onopen_Setter";
-  onopen_Setter_(mthis, __arg_0) => onopen_Setter(mthis, __arg_0);
+  send_Callback_1_(mthis, __arg_0) => mthis.callMethod("send", [__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);
+  url_Getter_(mthis) => mthis["url"];
 
 }
 
 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);
+  constructorCallback_2_(__arg_0, __arg_1) => new js.JsObject(js.context["WheelEvent"], [__arg_0, __arg_1]);
 
-  static deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
-  deltaMode_Getter_(mthis) => deltaMode_Getter(mthis);
+  deltaMode_Getter_(mthis) => mthis["deltaMode"];
 
-  static deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
-  deltaX_Getter_(mthis) => deltaX_Getter(mthis);
+  deltaX_Getter_(mthis) => mthis["deltaX"];
 
-  static deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
-  deltaY_Getter_(mthis) => deltaY_Getter(mthis);
+  deltaY_Getter_(mthis) => mthis["deltaY"];
 
-  static deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
-  deltaZ_Getter_(mthis) => deltaZ_Getter(mthis);
+  deltaZ_Getter_(mthis) => mthis["deltaZ"];
 
-  static wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
-  wheelDeltaX_Getter_(mthis) => wheelDeltaX_Getter(mthis);
+  wheelDeltaX_Getter_(mthis) => mthis["wheelDeltaX"];
 
-  static wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
-  wheelDeltaY_Getter_(mthis) => wheelDeltaY_Getter(mthis);
+  wheelDeltaY_Getter_(mthis) => mthis["wheelDeltaY"];
 
 }
 
 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);
+  $__getter___Callback_1_(mthis, __arg_0) => mthis.callMethod("__getter__", [__arg_0]);
 
-  static CSS_Getter(mthis) native "Window_CSS_Getter";
-  CSS_Getter_(mthis) => CSS_Getter(mthis);
+  CSS_Getter_(mthis) => mthis["CSS"];
 
-  static alert_Callback_0(mthis) native "Window_alert_Callback";
-  alert_Callback_0_(mthis) => alert_Callback_0(mthis);
+  alert_Callback_0_(mthis) => mthis.callMethod("alert", []);
 
-  static alert_Callback_1(mthis, __arg_0) native "Window_alert_Callback";
-  alert_Callback_1_(mthis, __arg_0) => alert_Callback_1(mthis, __arg_0);
+  alert_Callback_1_(mthis, __arg_0) => mthis.callMethod("alert", [__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);
+  applicationCache_Getter_(mthis) => mthis["applicationCache"];
 
-  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);
+  atob_Callback_0_(mthis) => mthis.callMethod("atob", []);
 
-  static applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
-  applicationCache_Getter_(mthis) => applicationCache_Getter(mthis);
+  atob_Callback_1_(mthis, __arg_0) => mthis.callMethod("atob", [__arg_0]);
 
-  static atob_Callback_0(mthis) native "Window_atob_Callback";
-  atob_Callback_0_(mthis) => atob_Callback_0(mthis);
+  blur_Callback_0_(mthis) => mthis.callMethod("blur", []);
 
-  static atob_Callback_1(mthis, __arg_0) native "Window_atob_Callback";
-  atob_Callback_1_(mthis, __arg_0) => atob_Callback_1(mthis, __arg_0);
+  btoa_Callback_0_(mthis) => mthis.callMethod("btoa", []);
 
-  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);
+  btoa_Callback_1_(mthis, __arg_0) => mthis.callMethod("btoa", [__arg_0]);
 
-  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);
+  cancelAnimationFrame_Callback_0_(mthis) => mthis.callMethod("cancelAnimationFrame", []);
 
-  static blur_Callback_0(mthis) native "Window_blur_Callback";
-  blur_Callback_0_(mthis) => blur_Callback_0(mthis);
+  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => mthis.callMethod("cancelAnimationFrame", [__arg_0]);
 
-  static blur_Callback_1(mthis, __arg_0) native "Window_blur_Callback";
-  blur_Callback_1_(mthis, __arg_0) => blur_Callback_1(mthis, __arg_0);
+  captureEvents_Callback_0_(mthis) => mthis.callMethod("captureEvents", []);
 
-  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);
+  clearInterval_Callback_0_(mthis) => mthis.callMethod("clearInterval", []);
 
-  static btoa_Callback_0(mthis) native "Window_btoa_Callback";
-  btoa_Callback_0_(mthis) => btoa_Callback_0(mthis);
+  clearInterval_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearInterval", [__arg_0]);
 
-  static btoa_Callback_1(mthis, __arg_0) native "Window_btoa_Callback";
-  btoa_Callback_1_(mthis, __arg_0) => btoa_Callback_1(mthis, __arg_0);
+  clearTimeout_Callback_0_(mthis) => mthis.callMethod("clearTimeout", []);
 
-  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);
+  clearTimeout_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearTimeout", [__arg_0]);
 
-  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);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static cancelAnimationFrame_Callback_0(mthis) native "Window_cancelAnimationFrame_Callback";
-  cancelAnimationFrame_Callback_0_(mthis) => cancelAnimationFrame_Callback_0(mthis);
+  closed_Getter_(mthis) => mthis["closed"];
 
-  static cancelAnimationFrame_Callback_1(mthis, __arg_0) native "Window_cancelAnimationFrame_Callback";
-  cancelAnimationFrame_Callback_1_(mthis, __arg_0) => cancelAnimationFrame_Callback_1(mthis, __arg_0);
+  confirm_Callback_0_(mthis) => mthis.callMethod("confirm", []);
 
-  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);
+  confirm_Callback_1_(mthis, __arg_0) => mthis.callMethod("confirm", [__arg_0]);
 
-  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);
+  console_Getter_(mthis) => mthis["console"];
 
-  static captureEvents_Callback_0(mthis) native "Window_captureEvents_Callback";
-  captureEvents_Callback_0_(mthis) => captureEvents_Callback_0(mthis);
+  crypto_Getter_(mthis) => mthis["crypto"];
 
-  static captureEvents_Callback_1(mthis, __arg_0) native "Window_captureEvents_Callback";
-  captureEvents_Callback_1_(mthis, __arg_0) => captureEvents_Callback_1(mthis, __arg_0);
+  defaultStatus_Getter_(mthis) => mthis["defaultStatus"];
 
-  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);
+  defaultStatus_Setter_(mthis, __arg_0) => mthis["defaultStatus"] = __arg_0;
 
-  static clearInterval_Callback_0(mthis) native "Window_clearInterval_Callback";
-  clearInterval_Callback_0_(mthis) => clearInterval_Callback_0(mthis);
+  defaultstatus_Getter_(mthis) => mthis["defaultstatus"];
 
-  static clearInterval_Callback_1(mthis, __arg_0) native "Window_clearInterval_Callback";
-  clearInterval_Callback_1_(mthis, __arg_0) => clearInterval_Callback_1(mthis, __arg_0);
+  defaultstatus_Setter_(mthis, __arg_0) => mthis["defaultstatus"] = __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);
+  devicePixelRatio_Getter_(mthis) => mthis["devicePixelRatio"];
 
-  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);
+  document_Getter_(mthis) => mthis["document"];
 
-  static clearTimeout_Callback_0(mthis) native "Window_clearTimeout_Callback";
-  clearTimeout_Callback_0_(mthis) => clearTimeout_Callback_0(mthis);
+  event_Getter_(mthis) => mthis["event"];
 
-  static clearTimeout_Callback_1(mthis, __arg_0) native "Window_clearTimeout_Callback";
-  clearTimeout_Callback_1_(mthis, __arg_0) => clearTimeout_Callback_1(mthis, __arg_0);
+  event_Setter_(mthis, __arg_0) => mthis["event"] = __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);
+  find_Callback_0_(mthis) => mthis.callMethod("find", []);
 
-  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);
+  find_Callback_1_(mthis, __arg_0) => mthis.callMethod("find", [__arg_0]);
 
-  static close_Callback_0(mthis) native "Window_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  find_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("find", [__arg_0, __arg_1]);
 
-  static close_Callback_1(mthis, __arg_0) native "Window_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  find_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("find", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  find_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("find", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static closed_Getter(mthis) native "Window_closed_Getter";
-  closed_Getter_(mthis) => closed_Getter(mthis);
+  find_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static confirm_Callback_0(mthis) native "Window_confirm_Callback";
-  confirm_Callback_0_(mthis) => confirm_Callback_0(mthis);
+  find_Callback_6_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5) => mthis.callMethod("find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5]);
 
-  static confirm_Callback_1(mthis, __arg_0) native "Window_confirm_Callback";
-  confirm_Callback_1_(mthis, __arg_0) => confirm_Callback_1(mthis, __arg_0);
+  find_Callback_7_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6) => mthis.callMethod("find", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4, __arg_5, __arg_6]);
 
-  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);
+  focus_Callback_0_(mthis) => mthis.callMethod("focus", []);
 
-  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);
+  frameElement_Getter_(mthis) => mthis["frameElement"];
 
-  static console_Getter(mthis) native "Window_console_Getter";
-  console_Getter_(mthis) => console_Getter(mthis);
+  frames_Getter_(mthis) => mthis["frames"];
 
-  static crypto_Getter(mthis) native "Window_crypto_Getter";
-  crypto_Getter_(mthis) => crypto_Getter(mthis);
+  getComputedStyle_Callback_0_(mthis) => mthis.callMethod("getComputedStyle", []);
 
-  static defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
-  defaultStatus_Getter_(mthis) => defaultStatus_Getter(mthis);
+  getComputedStyle_Callback_1_(mthis, __arg_0) => mthis.callMethod("getComputedStyle", [__arg_0]);
 
-  static defaultStatus_Setter(mthis, __arg_0) native "Window_defaultStatus_Setter";
-  defaultStatus_Setter_(mthis, __arg_0) => defaultStatus_Setter(mthis, __arg_0);
+  getComputedStyle_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getComputedStyle", [__arg_0, __arg_1]);
 
-  static defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
-  defaultstatus_Getter_(mthis) => defaultstatus_Getter(mthis);
+  getMatchedCSSRules_Callback_0_(mthis) => mthis.callMethod("getMatchedCSSRules", []);
 
-  static defaultstatus_Setter(mthis, __arg_0) native "Window_defaultstatus_Setter";
-  defaultstatus_Setter_(mthis, __arg_0) => defaultstatus_Setter(mthis, __arg_0);
+  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => mthis.callMethod("getMatchedCSSRules", [__arg_0]);
 
-  static devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
-  devicePixelRatio_Getter_(mthis) => devicePixelRatio_Getter(mthis);
+  getMatchedCSSRules_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getMatchedCSSRules", [__arg_0, __arg_1]);
 
-  static document_Getter(mthis) native "Window_document_Getter";
-  document_Getter_(mthis) => document_Getter(mthis);
+  getSelection_Callback_0_(mthis) => mthis.callMethod("getSelection", []);
 
-  static event_Getter(mthis) native "Window_event_Getter";
-  event_Getter_(mthis) => event_Getter(mthis);
+  history_Getter_(mthis) => mthis["history"];
 
-  static event_Setter(mthis, __arg_0) native "Window_event_Setter";
-  event_Setter_(mthis, __arg_0) => event_Setter(mthis, __arg_0);
+  indexedDB_Getter_(mthis) => mthis["indexedDB"];
 
-  static find_Callback_0(mthis) native "Window_find_Callback";
-  find_Callback_0_(mthis) => find_Callback_0(mthis);
+  innerHeight_Getter_(mthis) => mthis["innerHeight"];
 
-  static find_Callback_1(mthis, __arg_0) native "Window_find_Callback";
-  find_Callback_1_(mthis, __arg_0) => find_Callback_1(mthis, __arg_0);
+  innerWidth_Getter_(mthis) => mthis["innerWidth"];
 
-  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);
+  length_Getter_(mthis) => mthis["length"];
 
-  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);
+  localStorage_Getter_(mthis) => mthis["localStorage"];
 
-  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);
+  location_Getter_(mthis) => mthis["location"];
 
-  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);
+  location_Setter_(mthis, __arg_0) => mthis["location"] = __arg_0;
 
-  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);
+  locationbar_Getter_(mthis) => mthis["locationbar"];
 
-  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);
+  matchMedia_Callback_0_(mthis) => mthis.callMethod("matchMedia", []);
 
-  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);
+  matchMedia_Callback_1_(mthis, __arg_0) => mthis.callMethod("matchMedia", [__arg_0]);
 
-  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);
+  menubar_Getter_(mthis) => mthis["menubar"];
 
-  static focus_Callback_0(mthis) native "Window_focus_Callback";
-  focus_Callback_0_(mthis) => focus_Callback_0(mthis);
+  moveBy_Callback_0_(mthis) => mthis.callMethod("moveBy", []);
 
-  static focus_Callback_1(mthis, __arg_0) native "Window_focus_Callback";
-  focus_Callback_1_(mthis, __arg_0) => focus_Callback_1(mthis, __arg_0);
+  moveBy_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveBy", [__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);
+  moveBy_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveBy", [__arg_0, __arg_1]);
 
-  static frameElement_Getter(mthis) native "Window_frameElement_Getter";
-  frameElement_Getter_(mthis) => frameElement_Getter(mthis);
+  moveTo_Callback_0_(mthis) => mthis.callMethod("moveTo", []);
 
-  static frames_Getter(mthis) native "Window_frames_Getter";
-  frames_Getter_(mthis) => frames_Getter(mthis);
+  moveTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("moveTo", [__arg_0]);
 
-  static getComputedStyle_Callback_0(mthis) native "Window_getComputedStyle_Callback";
-  getComputedStyle_Callback_0_(mthis) => getComputedStyle_Callback_0(mthis);
+  moveTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("moveTo", [__arg_0, __arg_1]);
 
-  static getComputedStyle_Callback_1(mthis, __arg_0) native "Window_getComputedStyle_Callback";
-  getComputedStyle_Callback_1_(mthis, __arg_0) => getComputedStyle_Callback_1(mthis, __arg_0);
+  name_Getter_(mthis) => mthis["name"];
 
-  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);
+  name_Setter_(mthis, __arg_0) => mthis["name"] = __arg_0;
 
-  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);
+  navigator_Getter_(mthis) => mthis["navigator"];
 
-  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);
+  offscreenBuffering_Getter_(mthis) => mthis["offscreenBuffering"];
 
-  static getMatchedCSSRules_Callback_0(mthis) native "Window_getMatchedCSSRules_Callback";
-  getMatchedCSSRules_Callback_0_(mthis) => getMatchedCSSRules_Callback_0(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static getMatchedCSSRules_Callback_1(mthis, __arg_0) native "Window_getMatchedCSSRules_Callback";
-  getMatchedCSSRules_Callback_1_(mthis, __arg_0) => getMatchedCSSRules_Callback_1(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __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);
+  onanimationend_Getter_(mthis) => mthis["onanimationend"];
 
-  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);
+  onanimationend_Setter_(mthis, __arg_0) => mthis["onanimationend"] = __arg_0;
 
-  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);
+  onanimationiteration_Getter_(mthis) => mthis["onanimationiteration"];
 
-  static getSelection_Callback_0(mthis) native "Window_getSelection_Callback";
-  getSelection_Callback_0_(mthis) => getSelection_Callback_0(mthis);
+  onanimationiteration_Setter_(mthis, __arg_0) => mthis["onanimationiteration"] = __arg_0;
 
-  static getSelection_Callback_1(mthis, __arg_0) native "Window_getSelection_Callback";
-  getSelection_Callback_1_(mthis, __arg_0) => getSelection_Callback_1(mthis, __arg_0);
+  onanimationstart_Getter_(mthis) => mthis["onanimationstart"];
 
-  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);
+  onanimationstart_Setter_(mthis, __arg_0) => mthis["onanimationstart"] = __arg_0;
 
-  static history_Getter(mthis) native "Window_history_Getter";
-  history_Getter_(mthis) => history_Getter(mthis);
+  onautocomplete_Getter_(mthis) => mthis["onautocomplete"];
 
-  static indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
-  indexedDB_Getter_(mthis) => indexedDB_Getter(mthis);
+  onautocomplete_Setter_(mthis, __arg_0) => mthis["onautocomplete"] = __arg_0;
 
-  static innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
-  innerHeight_Getter_(mthis) => innerHeight_Getter(mthis);
+  onautocompleteerror_Getter_(mthis) => mthis["onautocompleteerror"];
 
-  static innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
-  innerWidth_Getter_(mthis) => innerWidth_Getter(mthis);
+  onautocompleteerror_Setter_(mthis, __arg_0) => mthis["onautocompleteerror"] = __arg_0;
 
-  static length_Getter(mthis) native "Window_length_Getter";
-  length_Getter_(mthis) => length_Getter(mthis);
+  onbeforeunload_Getter_(mthis) => mthis["onbeforeunload"];
 
-  static localStorage_Getter(mthis) native "Window_localStorage_Getter";
-  localStorage_Getter_(mthis) => localStorage_Getter(mthis);
+  onbeforeunload_Setter_(mthis, __arg_0) => mthis["onbeforeunload"] = __arg_0;
 
-  static location_Getter(mthis) native "Window_location_Getter";
-  location_Getter_(mthis) => location_Getter(mthis);
+  onblur_Getter_(mthis) => mthis["onblur"];
 
-  static location_Setter(mthis, __arg_0) native "Window_location_Setter";
-  location_Setter_(mthis, __arg_0) => location_Setter(mthis, __arg_0);
+  onblur_Setter_(mthis, __arg_0) => mthis["onblur"] = __arg_0;
 
-  static locationbar_Getter(mthis) native "Window_locationbar_Getter";
-  locationbar_Getter_(mthis) => locationbar_Getter(mthis);
+  oncancel_Getter_(mthis) => mthis["oncancel"];
 
-  static matchMedia_Callback_0(mthis) native "Window_matchMedia_Callback";
-  matchMedia_Callback_0_(mthis) => matchMedia_Callback_0(mthis);
+  oncancel_Setter_(mthis, __arg_0) => mthis["oncancel"] = __arg_0;
 
-  static matchMedia_Callback_1(mthis, __arg_0) native "Window_matchMedia_Callback";
-  matchMedia_Callback_1_(mthis, __arg_0) => matchMedia_Callback_1(mthis, __arg_0);
+  oncanplay_Getter_(mthis) => mthis["oncanplay"];
 
-  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);
+  oncanplay_Setter_(mthis, __arg_0) => mthis["oncanplay"] = __arg_0;
 
-  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);
+  oncanplaythrough_Getter_(mthis) => mthis["oncanplaythrough"];
 
-  static menubar_Getter(mthis) native "Window_menubar_Getter";
-  menubar_Getter_(mthis) => menubar_Getter(mthis);
+  oncanplaythrough_Setter_(mthis, __arg_0) => mthis["oncanplaythrough"] = __arg_0;
 
-  static moveBy_Callback_0(mthis) native "Window_moveBy_Callback";
-  moveBy_Callback_0_(mthis) => moveBy_Callback_0(mthis);
+  onchange_Getter_(mthis) => mthis["onchange"];
 
-  static moveBy_Callback_1(mthis, __arg_0) native "Window_moveBy_Callback";
-  moveBy_Callback_1_(mthis, __arg_0) => moveBy_Callback_1(mthis, __arg_0);
+  onchange_Setter_(mthis, __arg_0) => mthis["onchange"] = __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);
+  onclick_Getter_(mthis) => mthis["onclick"];
 
-  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);
+  onclick_Setter_(mthis, __arg_0) => mthis["onclick"] = __arg_0;
 
-  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);
+  onclose_Getter_(mthis) => mthis["onclose"];
 
-  static moveTo_Callback_0(mthis) native "Window_moveTo_Callback";
-  moveTo_Callback_0_(mthis) => moveTo_Callback_0(mthis);
+  onclose_Setter_(mthis, __arg_0) => mthis["onclose"] = __arg_0;
 
-  static moveTo_Callback_1(mthis, __arg_0) native "Window_moveTo_Callback";
-  moveTo_Callback_1_(mthis, __arg_0) => moveTo_Callback_1(mthis, __arg_0);
+  oncontextmenu_Getter_(mthis) => mthis["oncontextmenu"];
 
-  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);
+  oncontextmenu_Setter_(mthis, __arg_0) => mthis["oncontextmenu"] = __arg_0;
 
-  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);
+  oncuechange_Getter_(mthis) => mthis["oncuechange"];
 
-  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);
+  oncuechange_Setter_(mthis, __arg_0) => mthis["oncuechange"] = __arg_0;
 
-  static name_Getter(mthis) native "Window_name_Getter";
-  name_Getter_(mthis) => name_Getter(mthis);
+  ondblclick_Getter_(mthis) => mthis["ondblclick"];
 
-  static name_Setter(mthis, __arg_0) native "Window_name_Setter";
-  name_Setter_(mthis, __arg_0) => name_Setter(mthis, __arg_0);
+  ondblclick_Setter_(mthis, __arg_0) => mthis["ondblclick"] = __arg_0;
 
-  static navigator_Getter(mthis) native "Window_navigator_Getter";
-  navigator_Getter_(mthis) => navigator_Getter(mthis);
+  ondevicelight_Getter_(mthis) => mthis["ondevicelight"];
 
-  static offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
-  offscreenBuffering_Getter_(mthis) => offscreenBuffering_Getter(mthis);
+  ondevicelight_Setter_(mthis, __arg_0) => mthis["ondevicelight"] = __arg_0;
 
-  static onabort_Getter(mthis) native "Window_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  ondevicemotion_Getter_(mthis) => mthis["ondevicemotion"];
 
-  static onabort_Setter(mthis, __arg_0) native "Window_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  ondevicemotion_Setter_(mthis, __arg_0) => mthis["ondevicemotion"] = __arg_0;
 
-  static onanimationend_Getter(mthis) native "Window_onanimationend_Getter";
-  onanimationend_Getter_(mthis) => onanimationend_Getter(mthis);
+  ondeviceorientation_Getter_(mthis) => mthis["ondeviceorientation"];
 
-  static onanimationend_Setter(mthis, __arg_0) native "Window_onanimationend_Setter";
-  onanimationend_Setter_(mthis, __arg_0) => onanimationend_Setter(mthis, __arg_0);
+  ondeviceorientation_Setter_(mthis, __arg_0) => mthis["ondeviceorientation"] = __arg_0;
 
-  static onanimationiteration_Getter(mthis) native "Window_onanimationiteration_Getter";
-  onanimationiteration_Getter_(mthis) => onanimationiteration_Getter(mthis);
+  ondrag_Getter_(mthis) => mthis["ondrag"];
 
-  static onanimationiteration_Setter(mthis, __arg_0) native "Window_onanimationiteration_Setter";
-  onanimationiteration_Setter_(mthis, __arg_0) => onanimationiteration_Setter(mthis, __arg_0);
+  ondrag_Setter_(mthis, __arg_0) => mthis["ondrag"] = __arg_0;
 
-  static onanimationstart_Getter(mthis) native "Window_onanimationstart_Getter";
-  onanimationstart_Getter_(mthis) => onanimationstart_Getter(mthis);
+  ondragend_Getter_(mthis) => mthis["ondragend"];
 
-  static onanimationstart_Setter(mthis, __arg_0) native "Window_onanimationstart_Setter";
-  onanimationstart_Setter_(mthis, __arg_0) => onanimationstart_Setter(mthis, __arg_0);
+  ondragend_Setter_(mthis, __arg_0) => mthis["ondragend"] = __arg_0;
 
-  static onautocomplete_Getter(mthis) native "Window_onautocomplete_Getter";
-  onautocomplete_Getter_(mthis) => onautocomplete_Getter(mthis);
+  ondragenter_Getter_(mthis) => mthis["ondragenter"];
 
-  static onautocomplete_Setter(mthis, __arg_0) native "Window_onautocomplete_Setter";
-  onautocomplete_Setter_(mthis, __arg_0) => onautocomplete_Setter(mthis, __arg_0);
+  ondragenter_Setter_(mthis, __arg_0) => mthis["ondragenter"] = __arg_0;
 
-  static onautocompleteerror_Getter(mthis) native "Window_onautocompleteerror_Getter";
-  onautocompleteerror_Getter_(mthis) => onautocompleteerror_Getter(mthis);
+  ondragleave_Getter_(mthis) => mthis["ondragleave"];
 
-  static onautocompleteerror_Setter(mthis, __arg_0) native "Window_onautocompleteerror_Setter";
-  onautocompleteerror_Setter_(mthis, __arg_0) => onautocompleteerror_Setter(mthis, __arg_0);
+  ondragleave_Setter_(mthis, __arg_0) => mthis["ondragleave"] = __arg_0;
 
-  static onbeforeunload_Getter(mthis) native "Window_onbeforeunload_Getter";
-  onbeforeunload_Getter_(mthis) => onbeforeunload_Getter(mthis);
+  ondragover_Getter_(mthis) => mthis["ondragover"];
 
-  static onbeforeunload_Setter(mthis, __arg_0) native "Window_onbeforeunload_Setter";
-  onbeforeunload_Setter_(mthis, __arg_0) => onbeforeunload_Setter(mthis, __arg_0);
+  ondragover_Setter_(mthis, __arg_0) => mthis["ondragover"] = __arg_0;
 
-  static onblur_Getter(mthis) native "Window_onblur_Getter";
-  onblur_Getter_(mthis) => onblur_Getter(mthis);
+  ondragstart_Getter_(mthis) => mthis["ondragstart"];
 
-  static onblur_Setter(mthis, __arg_0) native "Window_onblur_Setter";
-  onblur_Setter_(mthis, __arg_0) => onblur_Setter(mthis, __arg_0);
+  ondragstart_Setter_(mthis, __arg_0) => mthis["ondragstart"] = __arg_0;
 
-  static oncancel_Getter(mthis) native "Window_oncancel_Getter";
-  oncancel_Getter_(mthis) => oncancel_Getter(mthis);
+  ondrop_Getter_(mthis) => mthis["ondrop"];
 
-  static oncancel_Setter(mthis, __arg_0) native "Window_oncancel_Setter";
-  oncancel_Setter_(mthis, __arg_0) => oncancel_Setter(mthis, __arg_0);
+  ondrop_Setter_(mthis, __arg_0) => mthis["ondrop"] = __arg_0;
 
-  static oncanplay_Getter(mthis) native "Window_oncanplay_Getter";
-  oncanplay_Getter_(mthis) => oncanplay_Getter(mthis);
+  ondurationchange_Getter_(mthis) => mthis["ondurationchange"];
 
-  static oncanplay_Setter(mthis, __arg_0) native "Window_oncanplay_Setter";
-  oncanplay_Setter_(mthis, __arg_0) => oncanplay_Setter(mthis, __arg_0);
+  ondurationchange_Setter_(mthis, __arg_0) => mthis["ondurationchange"] = __arg_0;
 
-  static oncanplaythrough_Getter(mthis) native "Window_oncanplaythrough_Getter";
-  oncanplaythrough_Getter_(mthis) => oncanplaythrough_Getter(mthis);
+  onemptied_Getter_(mthis) => mthis["onemptied"];
 
-  static oncanplaythrough_Setter(mthis, __arg_0) native "Window_oncanplaythrough_Setter";
-  oncanplaythrough_Setter_(mthis, __arg_0) => oncanplaythrough_Setter(mthis, __arg_0);
+  onemptied_Setter_(mthis, __arg_0) => mthis["onemptied"] = __arg_0;
 
-  static onchange_Getter(mthis) native "Window_onchange_Getter";
-  onchange_Getter_(mthis) => onchange_Getter(mthis);
+  onended_Getter_(mthis) => mthis["onended"];
 
-  static onchange_Setter(mthis, __arg_0) native "Window_onchange_Setter";
-  onchange_Setter_(mthis, __arg_0) => onchange_Setter(mthis, __arg_0);
+  onended_Setter_(mthis, __arg_0) => mthis["onended"] = __arg_0;
 
-  static onclick_Getter(mthis) native "Window_onclick_Getter";
-  onclick_Getter_(mthis) => onclick_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onclick_Setter(mthis, __arg_0) native "Window_onclick_Setter";
-  onclick_Setter_(mthis, __arg_0) => onclick_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onclose_Getter(mthis) native "Window_onclose_Getter";
-  onclose_Getter_(mthis) => onclose_Getter(mthis);
+  onfocus_Getter_(mthis) => mthis["onfocus"];
 
-  static onclose_Setter(mthis, __arg_0) native "Window_onclose_Setter";
-  onclose_Setter_(mthis, __arg_0) => onclose_Setter(mthis, __arg_0);
+  onfocus_Setter_(mthis, __arg_0) => mthis["onfocus"] = __arg_0;
 
-  static oncontextmenu_Getter(mthis) native "Window_oncontextmenu_Getter";
-  oncontextmenu_Getter_(mthis) => oncontextmenu_Getter(mthis);
+  onhashchange_Getter_(mthis) => mthis["onhashchange"];
 
-  static oncontextmenu_Setter(mthis, __arg_0) native "Window_oncontextmenu_Setter";
-  oncontextmenu_Setter_(mthis, __arg_0) => oncontextmenu_Setter(mthis, __arg_0);
+  onhashchange_Setter_(mthis, __arg_0) => mthis["onhashchange"] = __arg_0;
 
-  static oncuechange_Getter(mthis) native "Window_oncuechange_Getter";
-  oncuechange_Getter_(mthis) => oncuechange_Getter(mthis);
+  oninput_Getter_(mthis) => mthis["oninput"];
 
-  static oncuechange_Setter(mthis, __arg_0) native "Window_oncuechange_Setter";
-  oncuechange_Setter_(mthis, __arg_0) => oncuechange_Setter(mthis, __arg_0);
+  oninput_Setter_(mthis, __arg_0) => mthis["oninput"] = __arg_0;
 
-  static ondblclick_Getter(mthis) native "Window_ondblclick_Getter";
-  ondblclick_Getter_(mthis) => ondblclick_Getter(mthis);
+  oninvalid_Getter_(mthis) => mthis["oninvalid"];
 
-  static ondblclick_Setter(mthis, __arg_0) native "Window_ondblclick_Setter";
-  ondblclick_Setter_(mthis, __arg_0) => ondblclick_Setter(mthis, __arg_0);
+  oninvalid_Setter_(mthis, __arg_0) => mthis["oninvalid"] = __arg_0;
 
-  static ondevicelight_Getter(mthis) native "Window_ondevicelight_Getter";
-  ondevicelight_Getter_(mthis) => ondevicelight_Getter(mthis);
+  onkeydown_Getter_(mthis) => mthis["onkeydown"];
 
-  static ondevicelight_Setter(mthis, __arg_0) native "Window_ondevicelight_Setter";
-  ondevicelight_Setter_(mthis, __arg_0) => ondevicelight_Setter(mthis, __arg_0);
+  onkeydown_Setter_(mthis, __arg_0) => mthis["onkeydown"] = __arg_0;
 
-  static ondevicemotion_Getter(mthis) native "Window_ondevicemotion_Getter";
-  ondevicemotion_Getter_(mthis) => ondevicemotion_Getter(mthis);
+  onkeypress_Getter_(mthis) => mthis["onkeypress"];
 
-  static ondevicemotion_Setter(mthis, __arg_0) native "Window_ondevicemotion_Setter";
-  ondevicemotion_Setter_(mthis, __arg_0) => ondevicemotion_Setter(mthis, __arg_0);
+  onkeypress_Setter_(mthis, __arg_0) => mthis["onkeypress"] = __arg_0;
 
-  static ondeviceorientation_Getter(mthis) native "Window_ondeviceorientation_Getter";
-  ondeviceorientation_Getter_(mthis) => ondeviceorientation_Getter(mthis);
+  onkeyup_Getter_(mthis) => mthis["onkeyup"];
 
-  static ondeviceorientation_Setter(mthis, __arg_0) native "Window_ondeviceorientation_Setter";
-  ondeviceorientation_Setter_(mthis, __arg_0) => ondeviceorientation_Setter(mthis, __arg_0);
+  onkeyup_Setter_(mthis, __arg_0) => mthis["onkeyup"] = __arg_0;
 
-  static ondrag_Getter(mthis) native "Window_ondrag_Getter";
-  ondrag_Getter_(mthis) => ondrag_Getter(mthis);
+  onlanguagechange_Getter_(mthis) => mthis["onlanguagechange"];
 
-  static ondrag_Setter(mthis, __arg_0) native "Window_ondrag_Setter";
-  ondrag_Setter_(mthis, __arg_0) => ondrag_Setter(mthis, __arg_0);
+  onlanguagechange_Setter_(mthis, __arg_0) => mthis["onlanguagechange"] = __arg_0;
 
-  static ondragend_Getter(mthis) native "Window_ondragend_Getter";
-  ondragend_Getter_(mthis) => ondragend_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static ondragend_Setter(mthis, __arg_0) native "Window_ondragend_Setter";
-  ondragend_Setter_(mthis, __arg_0) => ondragend_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static ondragenter_Getter(mthis) native "Window_ondragenter_Getter";
-  ondragenter_Getter_(mthis) => ondragenter_Getter(mthis);
+  onloadeddata_Getter_(mthis) => mthis["onloadeddata"];
 
-  static ondragenter_Setter(mthis, __arg_0) native "Window_ondragenter_Setter";
-  ondragenter_Setter_(mthis, __arg_0) => ondragenter_Setter(mthis, __arg_0);
+  onloadeddata_Setter_(mthis, __arg_0) => mthis["onloadeddata"] = __arg_0;
 
-  static ondragleave_Getter(mthis) native "Window_ondragleave_Getter";
-  ondragleave_Getter_(mthis) => ondragleave_Getter(mthis);
+  onloadedmetadata_Getter_(mthis) => mthis["onloadedmetadata"];
 
-  static ondragleave_Setter(mthis, __arg_0) native "Window_ondragleave_Setter";
-  ondragleave_Setter_(mthis, __arg_0) => ondragleave_Setter(mthis, __arg_0);
+  onloadedmetadata_Setter_(mthis, __arg_0) => mthis["onloadedmetadata"] = __arg_0;
 
-  static ondragover_Getter(mthis) native "Window_ondragover_Getter";
-  ondragover_Getter_(mthis) => ondragover_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static ondragover_Setter(mthis, __arg_0) native "Window_ondragover_Setter";
-  ondragover_Setter_(mthis, __arg_0) => ondragover_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static ondragstart_Getter(mthis) native "Window_ondragstart_Getter";
-  ondragstart_Getter_(mthis) => ondragstart_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static ondragstart_Setter(mthis, __arg_0) native "Window_ondragstart_Setter";
-  ondragstart_Setter_(mthis, __arg_0) => ondragstart_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static ondrop_Getter(mthis) native "Window_ondrop_Getter";
-  ondrop_Getter_(mthis) => ondrop_Getter(mthis);
+  onmousedown_Getter_(mthis) => mthis["onmousedown"];
 
-  static ondrop_Setter(mthis, __arg_0) native "Window_ondrop_Setter";
-  ondrop_Setter_(mthis, __arg_0) => ondrop_Setter(mthis, __arg_0);
+  onmousedown_Setter_(mthis, __arg_0) => mthis["onmousedown"] = __arg_0;
 
-  static ondurationchange_Getter(mthis) native "Window_ondurationchange_Getter";
-  ondurationchange_Getter_(mthis) => ondurationchange_Getter(mthis);
+  onmouseenter_Getter_(mthis) => mthis["onmouseenter"];
 
-  static ondurationchange_Setter(mthis, __arg_0) native "Window_ondurationchange_Setter";
-  ondurationchange_Setter_(mthis, __arg_0) => ondurationchange_Setter(mthis, __arg_0);
+  onmouseenter_Setter_(mthis, __arg_0) => mthis["onmouseenter"] = __arg_0;
 
-  static onemptied_Getter(mthis) native "Window_onemptied_Getter";
-  onemptied_Getter_(mthis) => onemptied_Getter(mthis);
+  onmouseleave_Getter_(mthis) => mthis["onmouseleave"];
 
-  static onemptied_Setter(mthis, __arg_0) native "Window_onemptied_Setter";
-  onemptied_Setter_(mthis, __arg_0) => onemptied_Setter(mthis, __arg_0);
+  onmouseleave_Setter_(mthis, __arg_0) => mthis["onmouseleave"] = __arg_0;
 
-  static onended_Getter(mthis) native "Window_onended_Getter";
-  onended_Getter_(mthis) => onended_Getter(mthis);
+  onmousemove_Getter_(mthis) => mthis["onmousemove"];
 
-  static onended_Setter(mthis, __arg_0) native "Window_onended_Setter";
-  onended_Setter_(mthis, __arg_0) => onended_Setter(mthis, __arg_0);
+  onmousemove_Setter_(mthis, __arg_0) => mthis["onmousemove"] = __arg_0;
 
-  static onerror_Getter(mthis) native "Window_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onmouseout_Getter_(mthis) => mthis["onmouseout"];
 
-  static onerror_Setter(mthis, __arg_0) native "Window_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onmouseout_Setter_(mthis, __arg_0) => mthis["onmouseout"] = __arg_0;
 
-  static onfocus_Getter(mthis) native "Window_onfocus_Getter";
-  onfocus_Getter_(mthis) => onfocus_Getter(mthis);
+  onmouseover_Getter_(mthis) => mthis["onmouseover"];
 
-  static onfocus_Setter(mthis, __arg_0) native "Window_onfocus_Setter";
-  onfocus_Setter_(mthis, __arg_0) => onfocus_Setter(mthis, __arg_0);
+  onmouseover_Setter_(mthis, __arg_0) => mthis["onmouseover"] = __arg_0;
 
-  static onhashchange_Getter(mthis) native "Window_onhashchange_Getter";
-  onhashchange_Getter_(mthis) => onhashchange_Getter(mthis);
+  onmouseup_Getter_(mthis) => mthis["onmouseup"];
 
-  static onhashchange_Setter(mthis, __arg_0) native "Window_onhashchange_Setter";
-  onhashchange_Setter_(mthis, __arg_0) => onhashchange_Setter(mthis, __arg_0);
+  onmouseup_Setter_(mthis, __arg_0) => mthis["onmouseup"] = __arg_0;
 
-  static oninput_Getter(mthis) native "Window_oninput_Getter";
-  oninput_Getter_(mthis) => oninput_Getter(mthis);
+  onmousewheel_Getter_(mthis) => mthis["onmousewheel"];
 
-  static oninput_Setter(mthis, __arg_0) native "Window_oninput_Setter";
-  oninput_Setter_(mthis, __arg_0) => oninput_Setter(mthis, __arg_0);
+  onmousewheel_Setter_(mthis, __arg_0) => mthis["onmousewheel"] = __arg_0;
 
-  static oninvalid_Getter(mthis) native "Window_oninvalid_Getter";
-  oninvalid_Getter_(mthis) => oninvalid_Getter(mthis);
+  onoffline_Getter_(mthis) => mthis["onoffline"];
 
-  static oninvalid_Setter(mthis, __arg_0) native "Window_oninvalid_Setter";
-  oninvalid_Setter_(mthis, __arg_0) => oninvalid_Setter(mthis, __arg_0);
+  onoffline_Setter_(mthis, __arg_0) => mthis["onoffline"] = __arg_0;
 
-  static onkeydown_Getter(mthis) native "Window_onkeydown_Getter";
-  onkeydown_Getter_(mthis) => onkeydown_Getter(mthis);
+  ononline_Getter_(mthis) => mthis["ononline"];
 
-  static onkeydown_Setter(mthis, __arg_0) native "Window_onkeydown_Setter";
-  onkeydown_Setter_(mthis, __arg_0) => onkeydown_Setter(mthis, __arg_0);
+  ononline_Setter_(mthis, __arg_0) => mthis["ononline"] = __arg_0;
 
-  static onkeypress_Getter(mthis) native "Window_onkeypress_Getter";
-  onkeypress_Getter_(mthis) => onkeypress_Getter(mthis);
+  onorientationchange_Getter_(mthis) => mthis["onorientationchange"];
 
-  static onkeypress_Setter(mthis, __arg_0) native "Window_onkeypress_Setter";
-  onkeypress_Setter_(mthis, __arg_0) => onkeypress_Setter(mthis, __arg_0);
+  onorientationchange_Setter_(mthis, __arg_0) => mthis["onorientationchange"] = __arg_0;
 
-  static onkeyup_Getter(mthis) native "Window_onkeyup_Getter";
-  onkeyup_Getter_(mthis) => onkeyup_Getter(mthis);
+  onpagehide_Getter_(mthis) => mthis["onpagehide"];
 
-  static onkeyup_Setter(mthis, __arg_0) native "Window_onkeyup_Setter";
-  onkeyup_Setter_(mthis, __arg_0) => onkeyup_Setter(mthis, __arg_0);
+  onpagehide_Setter_(mthis, __arg_0) => mthis["onpagehide"] = __arg_0;
 
-  static onlanguagechange_Getter(mthis) native "Window_onlanguagechange_Getter";
-  onlanguagechange_Getter_(mthis) => onlanguagechange_Getter(mthis);
+  onpageshow_Getter_(mthis) => mthis["onpageshow"];
 
-  static onlanguagechange_Setter(mthis, __arg_0) native "Window_onlanguagechange_Setter";
-  onlanguagechange_Setter_(mthis, __arg_0) => onlanguagechange_Setter(mthis, __arg_0);
+  onpageshow_Setter_(mthis, __arg_0) => mthis["onpageshow"] = __arg_0;
 
-  static onload_Getter(mthis) native "Window_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onpause_Getter_(mthis) => mthis["onpause"];
 
-  static onload_Setter(mthis, __arg_0) native "Window_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onpause_Setter_(mthis, __arg_0) => mthis["onpause"] = __arg_0;
 
-  static onloadeddata_Getter(mthis) native "Window_onloadeddata_Getter";
-  onloadeddata_Getter_(mthis) => onloadeddata_Getter(mthis);
+  onplay_Getter_(mthis) => mthis["onplay"];
 
-  static onloadeddata_Setter(mthis, __arg_0) native "Window_onloadeddata_Setter";
-  onloadeddata_Setter_(mthis, __arg_0) => onloadeddata_Setter(mthis, __arg_0);
+  onplay_Setter_(mthis, __arg_0) => mthis["onplay"] = __arg_0;
 
-  static onloadedmetadata_Getter(mthis) native "Window_onloadedmetadata_Getter";
-  onloadedmetadata_Getter_(mthis) => onloadedmetadata_Getter(mthis);
+  onplaying_Getter_(mthis) => mthis["onplaying"];
 
-  static onloadedmetadata_Setter(mthis, __arg_0) native "Window_onloadedmetadata_Setter";
-  onloadedmetadata_Setter_(mthis, __arg_0) => onloadedmetadata_Setter(mthis, __arg_0);
+  onplaying_Setter_(mthis, __arg_0) => mthis["onplaying"] = __arg_0;
 
-  static onloadstart_Getter(mthis) native "Window_onloadstart_Getter";
-  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+  onpopstate_Getter_(mthis) => mthis["onpopstate"];
 
-  static onloadstart_Setter(mthis, __arg_0) native "Window_onloadstart_Setter";
-  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+  onpopstate_Setter_(mthis, __arg_0) => mthis["onpopstate"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "Window_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onmessage_Setter(mthis, __arg_0) native "Window_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static onmousedown_Getter(mthis) native "Window_onmousedown_Getter";
-  onmousedown_Getter_(mthis) => onmousedown_Getter(mthis);
+  onratechange_Getter_(mthis) => mthis["onratechange"];
 
-  static onmousedown_Setter(mthis, __arg_0) native "Window_onmousedown_Setter";
-  onmousedown_Setter_(mthis, __arg_0) => onmousedown_Setter(mthis, __arg_0);
+  onratechange_Setter_(mthis, __arg_0) => mthis["onratechange"] = __arg_0;
 
-  static onmouseenter_Getter(mthis) native "Window_onmouseenter_Getter";
-  onmouseenter_Getter_(mthis) => onmouseenter_Getter(mthis);
+  onreset_Getter_(mthis) => mthis["onreset"];
 
-  static onmouseenter_Setter(mthis, __arg_0) native "Window_onmouseenter_Setter";
-  onmouseenter_Setter_(mthis, __arg_0) => onmouseenter_Setter(mthis, __arg_0);
+  onreset_Setter_(mthis, __arg_0) => mthis["onreset"] = __arg_0;
 
-  static onmouseleave_Getter(mthis) native "Window_onmouseleave_Getter";
-  onmouseleave_Getter_(mthis) => onmouseleave_Getter(mthis);
+  onresize_Getter_(mthis) => mthis["onresize"];
 
-  static onmouseleave_Setter(mthis, __arg_0) native "Window_onmouseleave_Setter";
-  onmouseleave_Setter_(mthis, __arg_0) => onmouseleave_Setter(mthis, __arg_0);
+  onresize_Setter_(mthis, __arg_0) => mthis["onresize"] = __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);
+  onscroll_Getter_(mthis) => mthis["onscroll"];
 
-  static onunload_Setter(mthis, __arg_0) native "Window_onunload_Setter";
-  onunload_Setter_(mthis, __arg_0) => onunload_Setter(mthis, __arg_0);
+  onscroll_Setter_(mthis, __arg_0) => mthis["onscroll"] = __arg_0;
 
-  static onvolumechange_Getter(mthis) native "Window_onvolumechange_Getter";
-  onvolumechange_Getter_(mthis) => onvolumechange_Getter(mthis);
+  onsearch_Getter_(mthis) => mthis["onsearch"];
 
-  static onvolumechange_Setter(mthis, __arg_0) native "Window_onvolumechange_Setter";
-  onvolumechange_Setter_(mthis, __arg_0) => onvolumechange_Setter(mthis, __arg_0);
+  onsearch_Setter_(mthis, __arg_0) => mthis["onsearch"] = __arg_0;
 
-  static onwaiting_Getter(mthis) native "Window_onwaiting_Getter";
-  onwaiting_Getter_(mthis) => onwaiting_Getter(mthis);
+  onseeked_Getter_(mthis) => mthis["onseeked"];
 
-  static onwaiting_Setter(mthis, __arg_0) native "Window_onwaiting_Setter";
-  onwaiting_Setter_(mthis, __arg_0) => onwaiting_Setter(mthis, __arg_0);
+  onseeked_Setter_(mthis, __arg_0) => mthis["onseeked"] = __arg_0;
 
-  static onwebkitanimationend_Getter(mthis) native "Window_onwebkitanimationend_Getter";
-  onwebkitanimationend_Getter_(mthis) => onwebkitanimationend_Getter(mthis);
+  onseeking_Getter_(mthis) => mthis["onseeking"];
 
-  static onwebkitanimationend_Setter(mthis, __arg_0) native "Window_onwebkitanimationend_Setter";
-  onwebkitanimationend_Setter_(mthis, __arg_0) => onwebkitanimationend_Setter(mthis, __arg_0);
+  onseeking_Setter_(mthis, __arg_0) => mthis["onseeking"] = __arg_0;
 
-  static onwebkitanimationiteration_Getter(mthis) native "Window_onwebkitanimationiteration_Getter";
-  onwebkitanimationiteration_Getter_(mthis) => onwebkitanimationiteration_Getter(mthis);
+  onselect_Getter_(mthis) => mthis["onselect"];
 
-  static onwebkitanimationiteration_Setter(mthis, __arg_0) native "Window_onwebkitanimationiteration_Setter";
-  onwebkitanimationiteration_Setter_(mthis, __arg_0) => onwebkitanimationiteration_Setter(mthis, __arg_0);
+  onselect_Setter_(mthis, __arg_0) => mthis["onselect"] = __arg_0;
 
-  static onwebkitanimationstart_Getter(mthis) native "Window_onwebkitanimationstart_Getter";
-  onwebkitanimationstart_Getter_(mthis) => onwebkitanimationstart_Getter(mthis);
+  onshow_Getter_(mthis) => mthis["onshow"];
 
-  static onwebkitanimationstart_Setter(mthis, __arg_0) native "Window_onwebkitanimationstart_Setter";
-  onwebkitanimationstart_Setter_(mthis, __arg_0) => onwebkitanimationstart_Setter(mthis, __arg_0);
+  onshow_Setter_(mthis, __arg_0) => mthis["onshow"] = __arg_0;
 
-  static onwebkittransitionend_Getter(mthis) native "Window_onwebkittransitionend_Getter";
-  onwebkittransitionend_Getter_(mthis) => onwebkittransitionend_Getter(mthis);
+  onstalled_Getter_(mthis) => mthis["onstalled"];
 
-  static onwebkittransitionend_Setter(mthis, __arg_0) native "Window_onwebkittransitionend_Setter";
-  onwebkittransitionend_Setter_(mthis, __arg_0) => onwebkittransitionend_Setter(mthis, __arg_0);
+  onstalled_Setter_(mthis, __arg_0) => mthis["onstalled"] = __arg_0;
 
-  static onwheel_Getter(mthis) native "Window_onwheel_Getter";
-  onwheel_Getter_(mthis) => onwheel_Getter(mthis);
+  onstorage_Getter_(mthis) => mthis["onstorage"];
 
-  static onwheel_Setter(mthis, __arg_0) native "Window_onwheel_Setter";
-  onwheel_Setter_(mthis, __arg_0) => onwheel_Setter(mthis, __arg_0);
+  onstorage_Setter_(mthis, __arg_0) => mthis["onstorage"] = __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);
+  onsubmit_Getter_(mthis) => mthis["onsubmit"];
 
-  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);
+  onsubmit_Setter_(mthis, __arg_0) => mthis["onsubmit"] = __arg_0;
 
-  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);
+  onsuspend_Getter_(mthis) => mthis["onsuspend"];
 
-  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);
+  onsuspend_Setter_(mthis, __arg_0) => mthis["onsuspend"] = __arg_0;
 
-  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);
+  ontimeupdate_Getter_(mthis) => mthis["ontimeupdate"];
 
-  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);
+  ontimeupdate_Setter_(mthis, __arg_0) => mthis["ontimeupdate"] = __arg_0;
 
-  static open_Callback_0(mthis) native "Window_open_Callback";
-  open_Callback_0_(mthis) => open_Callback_0(mthis);
+  ontoggle_Getter_(mthis) => mthis["ontoggle"];
 
-  static open_Callback_1(mthis, __arg_0) native "Window_open_Callback";
-  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+  ontoggle_Setter_(mthis, __arg_0) => mthis["ontoggle"] = __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);
+  ontouchcancel_Getter_(mthis) => mthis["ontouchcancel"];
 
-  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);
+  ontouchcancel_Setter_(mthis, __arg_0) => mthis["ontouchcancel"] = __arg_0;
 
-  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);
+  ontouchend_Getter_(mthis) => mthis["ontouchend"];
 
-  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);
+  ontouchend_Setter_(mthis, __arg_0) => mthis["ontouchend"] = __arg_0;
 
-  static opener_Getter(mthis) native "Window_opener_Getter";
-  opener_Getter_(mthis) => opener_Getter(mthis);
+  ontouchmove_Getter_(mthis) => mthis["ontouchmove"];
 
-  static opener_Setter(mthis, __arg_0) native "Window_opener_Setter";
-  opener_Setter_(mthis, __arg_0) => opener_Setter(mthis, __arg_0);
+  ontouchmove_Setter_(mthis, __arg_0) => mthis["ontouchmove"] = __arg_0;
 
-  static orientation_Getter(mthis) native "Window_orientation_Getter";
-  orientation_Getter_(mthis) => orientation_Getter(mthis);
+  ontouchstart_Getter_(mthis) => mthis["ontouchstart"];
 
-  static outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
-  outerHeight_Getter_(mthis) => outerHeight_Getter(mthis);
+  ontouchstart_Setter_(mthis, __arg_0) => mthis["ontouchstart"] = __arg_0;
 
-  static outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
-  outerWidth_Getter_(mthis) => outerWidth_Getter(mthis);
+  ontransitionend_Getter_(mthis) => mthis["ontransitionend"];
 
-  static pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
-  pageXOffset_Getter_(mthis) => pageXOffset_Getter(mthis);
+  ontransitionend_Setter_(mthis, __arg_0) => mthis["ontransitionend"] = __arg_0;
 
-  static pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
-  pageYOffset_Getter_(mthis) => pageYOffset_Getter(mthis);
+  onunload_Getter_(mthis) => mthis["onunload"];
 
-  static parent_Getter(mthis) native "Window_parent_Getter";
-  parent_Getter_(mthis) => parent_Getter(mthis);
+  onunload_Setter_(mthis, __arg_0) => mthis["onunload"] = __arg_0;
 
-  static performance_Getter(mthis) native "Window_performance_Getter";
-  performance_Getter_(mthis) => performance_Getter(mthis);
+  onvolumechange_Getter_(mthis) => mthis["onvolumechange"];
 
-  static personalbar_Getter(mthis) native "Window_personalbar_Getter";
-  personalbar_Getter_(mthis) => personalbar_Getter(mthis);
+  onvolumechange_Setter_(mthis, __arg_0) => mthis["onvolumechange"] = __arg_0;
 
-  static postMessage_Callback_0(mthis) native "Window_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  onwaiting_Getter_(mthis) => mthis["onwaiting"];
 
-  static postMessage_Callback_1(mthis, __arg_0) native "Window_postMessage_Callback";
-  postMessage_Callback_1_(mthis, __arg_0) => postMessage_Callback_1(mthis, __arg_0);
+  onwaiting_Setter_(mthis, __arg_0) => mthis["onwaiting"] = __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);
+  onwebkitanimationend_Getter_(mthis) => mthis["onwebkitanimationend"];
 
-  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);
+  onwebkitanimationend_Setter_(mthis, __arg_0) => mthis["onwebkitanimationend"] = __arg_0;
 
-  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);
+  onwebkitanimationiteration_Getter_(mthis) => mthis["onwebkitanimationiteration"];
 
-  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);
+  onwebkitanimationiteration_Setter_(mthis, __arg_0) => mthis["onwebkitanimationiteration"] = __arg_0;
 
-  static print_Callback_0(mthis) native "Window_print_Callback";
-  print_Callback_0_(mthis) => print_Callback_0(mthis);
+  onwebkitanimationstart_Getter_(mthis) => mthis["onwebkitanimationstart"];
 
-  static print_Callback_1(mthis, __arg_0) native "Window_print_Callback";
-  print_Callback_1_(mthis, __arg_0) => print_Callback_1(mthis, __arg_0);
+  onwebkitanimationstart_Setter_(mthis, __arg_0) => mthis["onwebkitanimationstart"] = __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);
+  onwebkittransitionend_Getter_(mthis) => mthis["onwebkittransitionend"];
 
-  static releaseEvents_Callback_0(mthis) native "Window_releaseEvents_Callback";
-  releaseEvents_Callback_0_(mthis) => releaseEvents_Callback_0(mthis);
+  onwebkittransitionend_Setter_(mthis, __arg_0) => mthis["onwebkittransitionend"] = __arg_0;
 
-  static releaseEvents_Callback_1(mthis, __arg_0) native "Window_releaseEvents_Callback";
-  releaseEvents_Callback_1_(mthis, __arg_0) => releaseEvents_Callback_1(mthis, __arg_0);
+  onwheel_Getter_(mthis) => mthis["onwheel"];
 
-  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);
+  onwheel_Setter_(mthis, __arg_0) => mthis["onwheel"] = __arg_0;
 
-  static requestAnimationFrame_Callback_0(mthis) native "Window_requestAnimationFrame_Callback";
-  requestAnimationFrame_Callback_0_(mthis) => requestAnimationFrame_Callback_0(mthis);
+  openDatabase_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("openDatabase", [__arg_0, __arg_1]);
 
-  static requestAnimationFrame_Callback_1(mthis, __arg_0) native "Window_requestAnimationFrame_Callback";
-  requestAnimationFrame_Callback_1_(mthis, __arg_0) => requestAnimationFrame_Callback_1(mthis, __arg_0);
+  openDatabase_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("openDatabase", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  openDatabase_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  openDatabase_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("openDatabase", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static resizeBy_Callback_0(mthis) native "Window_resizeBy_Callback";
-  resizeBy_Callback_0_(mthis) => resizeBy_Callback_0(mthis);
+  open_Callback_0_(mthis) => mthis.callMethod("open", []);
 
-  static resizeBy_Callback_1(mthis, __arg_0) native "Window_resizeBy_Callback";
-  resizeBy_Callback_1_(mthis, __arg_0) => resizeBy_Callback_1(mthis, __arg_0);
+  open_Callback_1_(mthis, __arg_0) => mthis.callMethod("open", [__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);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("open", [__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);
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("open", [__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);
+  opener_Getter_(mthis) => mthis["opener"];
 
-  static resizeTo_Callback_0(mthis) native "Window_resizeTo_Callback";
-  resizeTo_Callback_0_(mthis) => resizeTo_Callback_0(mthis);
+  opener_Setter_(mthis, __arg_0) => mthis["opener"] = __arg_0;
 
-  static resizeTo_Callback_1(mthis, __arg_0) native "Window_resizeTo_Callback";
-  resizeTo_Callback_1_(mthis, __arg_0) => resizeTo_Callback_1(mthis, __arg_0);
+  orientation_Getter_(mthis) => mthis["orientation"];
 
-  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);
+  outerHeight_Getter_(mthis) => mthis["outerHeight"];
 
-  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);
+  outerWidth_Getter_(mthis) => mthis["outerWidth"];
 
-  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);
+  pageXOffset_Getter_(mthis) => mthis["pageXOffset"];
 
-  static screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
-  screenLeft_Getter_(mthis) => screenLeft_Getter(mthis);
+  pageYOffset_Getter_(mthis) => mthis["pageYOffset"];
 
-  static screenTop_Getter(mthis) native "Window_screenTop_Getter";
-  screenTop_Getter_(mthis) => screenTop_Getter(mthis);
+  parent_Getter_(mthis) => mthis["parent"];
 
-  static screenX_Getter(mthis) native "Window_screenX_Getter";
-  screenX_Getter_(mthis) => screenX_Getter(mthis);
+  performance_Getter_(mthis) => mthis["performance"];
 
-  static screenY_Getter(mthis) native "Window_screenY_Getter";
-  screenY_Getter_(mthis) => screenY_Getter(mthis);
+  personalbar_Getter_(mthis) => mthis["personalbar"];
 
-  static screen_Getter(mthis) native "Window_screen_Getter";
-  screen_Getter_(mthis) => screen_Getter(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static scrollBy_Callback_0(mthis) native "Window_scrollBy_Callback";
-  scrollBy_Callback_0_(mthis) => scrollBy_Callback_0(mthis);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__arg_0]);
 
-  static scrollBy_Callback_1(mthis, __arg_0) native "Window_scrollBy_Callback";
-  scrollBy_Callback_1_(mthis, __arg_0) => scrollBy_Callback_1(mthis, __arg_0);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__arg_0, __arg_1]);
 
-  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);
+  postMessage_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("postMessage", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  print_Callback_0_(mthis) => mthis.callMethod("print", []);
 
-  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);
+  releaseEvents_Callback_0_(mthis) => mthis.callMethod("releaseEvents", []);
 
-  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);
+  requestAnimationFrame_Callback_0_(mthis) => mthis.callMethod("requestAnimationFrame", []);
 
-  static scrollTo_Callback_0(mthis) native "Window_scrollTo_Callback";
-  scrollTo_Callback_0_(mthis) => scrollTo_Callback_0(mthis);
+  requestAnimationFrame_Callback_1_(mthis, __arg_0) => mthis.callMethod("requestAnimationFrame", [__arg_0]);
 
-  static scrollTo_Callback_1(mthis, __arg_0) native "Window_scrollTo_Callback";
-  scrollTo_Callback_1_(mthis, __arg_0) => scrollTo_Callback_1(mthis, __arg_0);
+  resizeBy_Callback_0_(mthis) => mthis.callMethod("resizeBy", []);
 
-  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);
+  resizeBy_Callback_1_(mthis, __arg_0) => mthis.callMethod("resizeBy", [__arg_0]);
 
-  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);
+  resizeBy_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("resizeBy", [__arg_0, __arg_1]);
 
-  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);
+  resizeTo_Callback_0_(mthis) => mthis.callMethod("resizeTo", []);
 
-  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);
+  resizeTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("resizeTo", [__arg_0]);
 
-  static scrollX_Getter(mthis) native "Window_scrollX_Getter";
-  scrollX_Getter_(mthis) => scrollX_Getter(mthis);
+  resizeTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("resizeTo", [__arg_0, __arg_1]);
 
-  static scrollY_Getter(mthis) native "Window_scrollY_Getter";
-  scrollY_Getter_(mthis) => scrollY_Getter(mthis);
+  screenLeft_Getter_(mthis) => mthis["screenLeft"];
 
-  static scroll_Callback_0(mthis) native "Window_scroll_Callback";
-  scroll_Callback_0_(mthis) => scroll_Callback_0(mthis);
+  screenTop_Getter_(mthis) => mthis["screenTop"];
 
-  static scroll_Callback_1(mthis, __arg_0) native "Window_scroll_Callback";
-  scroll_Callback_1_(mthis, __arg_0) => scroll_Callback_1(mthis, __arg_0);
+  screenX_Getter_(mthis) => mthis["screenX"];
 
-  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);
+  screenY_Getter_(mthis) => mthis["screenY"];
 
-  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);
+  screen_Getter_(mthis) => mthis["screen"];
 
-  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);
+  scrollBy_Callback_0_(mthis) => mthis.callMethod("scrollBy", []);
 
-  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);
+  scrollBy_Callback_1_(mthis, __arg_0) => mthis.callMethod("scrollBy", [__arg_0]);
 
-  static scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
-  scrollbars_Getter_(mthis) => scrollbars_Getter(mthis);
+  scrollBy_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scrollBy", [__arg_0, __arg_1]);
 
-  static self_Getter(mthis) native "Window_self_Getter";
-  self_Getter_(mthis) => self_Getter(mthis);
+  scrollBy_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scrollBy", [__arg_0, __arg_1, __arg_2]);
 
-  static sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
-  sessionStorage_Getter_(mthis) => sessionStorage_Getter(mthis);
+  scrollTo_Callback_0_(mthis) => mthis.callMethod("scrollTo", []);
 
-  static setInterval_Callback_0(mthis) native "Window_setInterval_Callback";
-  setInterval_Callback_0_(mthis) => setInterval_Callback_0(mthis);
+  scrollTo_Callback_1_(mthis, __arg_0) => mthis.callMethod("scrollTo", [__arg_0]);
 
-  static setInterval_Callback_1(mthis, __arg_0) native "Window_setInterval_Callback";
-  setInterval_Callback_1_(mthis, __arg_0) => setInterval_Callback_1(mthis, __arg_0);
+  scrollTo_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scrollTo", [__arg_0, __arg_1]);
 
-  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);
+  scrollTo_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scrollTo", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  scrollX_Getter_(mthis) => mthis["scrollX"];
 
-  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);
+  scrollY_Getter_(mthis) => mthis["scrollY"];
 
-  static setTimeout_Callback_0(mthis) native "Window_setTimeout_Callback";
-  setTimeout_Callback_0_(mthis) => setTimeout_Callback_0(mthis);
+  scroll_Callback_0_(mthis) => mthis.callMethod("scroll", []);
 
-  static setTimeout_Callback_1(mthis, __arg_0) native "Window_setTimeout_Callback";
-  setTimeout_Callback_1_(mthis, __arg_0) => setTimeout_Callback_1(mthis, __arg_0);
+  scroll_Callback_1_(mthis, __arg_0) => mthis.callMethod("scroll", [__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);
+  scroll_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("scroll", [__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);
+  scroll_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("scroll", [__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);
+  scrollbars_Getter_(mthis) => mthis["scrollbars"];
 
-  static showModalDialog_Callback_0(mthis) native "Window_showModalDialog_Callback";
-  showModalDialog_Callback_0_(mthis) => showModalDialog_Callback_0(mthis);
+  self_Getter_(mthis) => mthis["self"];
 
-  static showModalDialog_Callback_1(mthis, __arg_0) native "Window_showModalDialog_Callback";
-  showModalDialog_Callback_1_(mthis, __arg_0) => showModalDialog_Callback_1(mthis, __arg_0);
+  sessionStorage_Getter_(mthis) => mthis["sessionStorage"];
 
-  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);
+  setInterval_Callback_0_(mthis) => mthis.callMethod("setInterval", []);
 
-  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);
+  setInterval_Callback_1_(mthis, __arg_0) => mthis.callMethod("setInterval", [__arg_0]);
 
-  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);
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setInterval", [__arg_0, __arg_1]);
 
-  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);
+  setTimeout_Callback_0_(mthis) => mthis.callMethod("setTimeout", []);
 
-  static speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
-  speechSynthesis_Getter_(mthis) => speechSynthesis_Getter(mthis);
+  setTimeout_Callback_1_(mthis, __arg_0) => mthis.callMethod("setTimeout", [__arg_0]);
 
-  static status_Getter(mthis) native "Window_status_Getter";
-  status_Getter_(mthis) => status_Getter(mthis);
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setTimeout", [__arg_0, __arg_1]);
 
-  static status_Setter(mthis, __arg_0) native "Window_status_Setter";
-  status_Setter_(mthis, __arg_0) => status_Setter(mthis, __arg_0);
+  showModalDialog_Callback_0_(mthis) => mthis.callMethod("showModalDialog", []);
 
-  static statusbar_Getter(mthis) native "Window_statusbar_Getter";
-  statusbar_Getter_(mthis) => statusbar_Getter(mthis);
+  showModalDialog_Callback_1_(mthis, __arg_0) => mthis.callMethod("showModalDialog", [__arg_0]);
 
-  static stop_Callback_0(mthis) native "Window_stop_Callback";
-  stop_Callback_0_(mthis) => stop_Callback_0(mthis);
+  showModalDialog_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("showModalDialog", [__arg_0, __arg_1]);
 
-  static stop_Callback_1(mthis, __arg_0) native "Window_stop_Callback";
-  stop_Callback_1_(mthis, __arg_0) => stop_Callback_1(mthis, __arg_0);
+  showModalDialog_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("showModalDialog", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  speechSynthesis_Getter_(mthis) => mthis["speechSynthesis"];
 
-  static styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
-  styleMedia_Getter_(mthis) => styleMedia_Getter(mthis);
+  status_Getter_(mthis) => mthis["status"];
 
-  static toolbar_Getter(mthis) native "Window_toolbar_Getter";
-  toolbar_Getter_(mthis) => toolbar_Getter(mthis);
+  status_Setter_(mthis, __arg_0) => mthis["status"] = __arg_0;
 
-  static top_Getter(mthis) native "Window_top_Getter";
-  top_Getter_(mthis) => top_Getter(mthis);
+  statusbar_Getter_(mthis) => mthis["statusbar"];
 
-  static webkitRequestFileSystem_Callback_1(mthis, __arg_0) native "Window_webkitRequestFileSystem_Callback";
-  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => webkitRequestFileSystem_Callback_1(mthis, __arg_0);
+  stop_Callback_0_(mthis) => mthis.callMethod("stop", []);
 
-  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);
+  styleMedia_Getter_(mthis) => mthis["styleMedia"];
 
-  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);
+  toolbar_Getter_(mthis) => mthis["toolbar"];
 
-  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);
+  top_Getter_(mthis) => mthis["top"];
 
-  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);
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitRequestFileSystem", [__arg_0]);
 
-  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);
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1]);
 
-  static webkitResolveLocalFileSystemURL_Callback_0(mthis) native "Window_webkitResolveLocalFileSystemURL_Callback";
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => webkitResolveLocalFileSystemURL_Callback_0(mthis);
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
 
-  static webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0) native "Window_webkitResolveLocalFileSystemURL_Callback";
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0);
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => mthis.callMethod("webkitResolveLocalFileSystemURL", []);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0]);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
 
-  static webkitStorageInfo_Getter(mthis) native "Window_webkitStorageInfo_Getter";
-  webkitStorageInfo_Getter_(mthis) => webkitStorageInfo_Getter(mthis);
+  webkitStorageInfo_Getter_(mthis) => mthis["webkitStorageInfo"];
 
-  static window_Getter(mthis) native "Window_window_Getter";
-  window_Getter_(mthis) => window_Getter(mthis);
+  window_Getter_(mthis) => mthis["window"];
 
 }
 
 class BlinkWorker extends BlinkEventTarget {
   static final instance = new BlinkWorker();
 
-  static constructorCallback_0() native "Worker_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["Worker"], []);
 
-  static constructorCallback_1(__arg_0) native "Worker_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["Worker"], [__arg_0]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "Worker_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  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);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onerror_Getter(mthis) native "Worker_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onmessage_Getter_(mthis) => mthis["onmessage"];
 
-  static onerror_Setter(mthis, __arg_0) native "Worker_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onmessage_Setter_(mthis, __arg_0) => mthis["onmessage"] = __arg_0;
 
-  static onmessage_Getter(mthis) native "Worker_onmessage_Getter";
-  onmessage_Getter_(mthis) => onmessage_Getter(mthis);
+  postMessage_Callback_0_(mthis) => mthis.callMethod("postMessage", []);
 
-  static onmessage_Setter(mthis, __arg_0) native "Worker_onmessage_Setter";
-  onmessage_Setter_(mthis, __arg_0) => onmessage_Setter(mthis, __arg_0);
+  postMessage_Callback_1_(mthis, __arg_0) => mthis.callMethod("postMessage", [__arg_0]);
 
-  static postMessage_Callback_0(mthis) native "Worker_postMessage_Callback";
-  postMessage_Callback_0_(mthis) => postMessage_Callback_0(mthis);
+  postMessage_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("postMessage", [__arg_0, __arg_1]);
 
-  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);
+  terminate_Callback_0_(mthis) => mthis.callMethod("terminate", []);
 
 }
 
@@ -30682,323 +16760,160 @@
 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);
+  atob_Callback_0_(mthis) => mthis.callMethod("atob", []);
 
-  static atob_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_atob_Callback";
-  atob_Callback_1_(mthis, __arg_0) => atob_Callback_1(mthis, __arg_0);
+  atob_Callback_1_(mthis, __arg_0) => mthis.callMethod("atob", [__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);
+  btoa_Callback_0_(mthis) => mthis.callMethod("btoa", []);
 
-  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);
+  btoa_Callback_1_(mthis, __arg_0) => mthis.callMethod("btoa", [__arg_0]);
 
-  static btoa_Callback_0(mthis) native "WorkerGlobalScope_btoa_Callback";
-  btoa_Callback_0_(mthis) => btoa_Callback_0(mthis);
+  clearInterval_Callback_0_(mthis) => mthis.callMethod("clearInterval", []);
 
-  static btoa_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_btoa_Callback";
-  btoa_Callback_1_(mthis, __arg_0) => btoa_Callback_1(mthis, __arg_0);
+  clearInterval_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearInterval", [__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);
+  clearTimeout_Callback_0_(mthis) => mthis.callMethod("clearTimeout", []);
 
-  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);
+  clearTimeout_Callback_1_(mthis, __arg_0) => mthis.callMethod("clearTimeout", [__arg_0]);
 
-  static clearInterval_Callback_0(mthis) native "WorkerGlobalScope_clearInterval_Callback";
-  clearInterval_Callback_0_(mthis) => clearInterval_Callback_0(mthis);
+  close_Callback_0_(mthis) => mthis.callMethod("close", []);
 
-  static clearInterval_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_clearInterval_Callback";
-  clearInterval_Callback_1_(mthis, __arg_0) => clearInterval_Callback_1(mthis, __arg_0);
+  console_Getter_(mthis) => mthis["console"];
 
-  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);
+  createImageBitmap_Callback_0_(mthis) => mthis.callMethod("createImageBitmap", []);
 
-  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);
+  createImageBitmap_Callback_1_(mthis, __arg_0) => mthis.callMethod("createImageBitmap", [__arg_0]);
 
-  static clearTimeout_Callback_0(mthis) native "WorkerGlobalScope_clearTimeout_Callback";
-  clearTimeout_Callback_0_(mthis) => clearTimeout_Callback_0(mthis);
+  createImageBitmap_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("createImageBitmap", [__arg_0, __arg_1, __arg_2]);
 
-  static clearTimeout_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_clearTimeout_Callback";
-  clearTimeout_Callback_1_(mthis, __arg_0) => clearTimeout_Callback_1(mthis, __arg_0);
+  createImageBitmap_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  createImageBitmap_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("createImageBitmap", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  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);
+  crypto_Getter_(mthis) => mthis["crypto"];
 
-  static close_Callback_0(mthis) native "WorkerGlobalScope_close_Callback";
-  close_Callback_0_(mthis) => close_Callback_0(mthis);
+  importScripts_Callback_0_(mthis) => mthis.callMethod("importScripts", []);
 
-  static close_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_close_Callback";
-  close_Callback_1_(mthis, __arg_0) => close_Callback_1(mthis, __arg_0);
+  importScripts_Callback_1_(mthis, __arg_0) => mthis.callMethod("importScripts", [__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);
+  indexedDB_Getter_(mthis) => mthis["indexedDB"];
 
-  static console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
-  console_Getter_(mthis) => console_Getter(mthis);
+  location_Getter_(mthis) => mthis["location"];
 
-  static createImageBitmap_Callback_0(mthis) native "WorkerGlobalScope_createImageBitmap_Callback";
-  createImageBitmap_Callback_0_(mthis) => createImageBitmap_Callback_0(mthis);
+  navigator_Getter_(mthis) => mthis["navigator"];
 
-  static createImageBitmap_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_createImageBitmap_Callback";
-  createImageBitmap_Callback_1_(mthis, __arg_0) => createImageBitmap_Callback_1(mthis, __arg_0);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  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);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  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);
+  performance_Getter_(mthis) => mthis["performance"];
 
-  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);
+  self_Getter_(mthis) => mthis["self"];
 
-  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);
+  setInterval_Callback_0_(mthis) => mthis.callMethod("setInterval", []);
 
-  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);
+  setInterval_Callback_1_(mthis, __arg_0) => mthis.callMethod("setInterval", [__arg_0]);
 
-  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);
+  setInterval_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setInterval", [__arg_0, __arg_1]);
 
-  static crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
-  crypto_Getter_(mthis) => crypto_Getter(mthis);
+  setTimeout_Callback_0_(mthis) => mthis.callMethod("setTimeout", []);
 
-  static importScripts_Callback_0(mthis) native "WorkerGlobalScope_importScripts_Callback";
-  importScripts_Callback_0_(mthis) => importScripts_Callback_0(mthis);
+  setTimeout_Callback_1_(mthis, __arg_0) => mthis.callMethod("setTimeout", [__arg_0]);
 
-  static importScripts_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_importScripts_Callback";
-  importScripts_Callback_1_(mthis, __arg_0) => importScripts_Callback_1(mthis, __arg_0);
+  setTimeout_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setTimeout", [__arg_0, __arg_1]);
 
-  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);
+  webkitRequestFileSystemSync_Callback_0_(mthis) => mthis.callMethod("webkitRequestFileSystemSync", []);
 
-  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);
+  webkitRequestFileSystemSync_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitRequestFileSystemSync", [__arg_0]);
 
-  static indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
-  indexedDB_Getter_(mthis) => indexedDB_Getter(mthis);
+  webkitRequestFileSystemSync_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitRequestFileSystemSync", [__arg_0, __arg_1]);
 
-  static location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
-  location_Getter_(mthis) => location_Getter(mthis);
+  webkitRequestFileSystem_Callback_0_(mthis) => mthis.callMethod("webkitRequestFileSystem", []);
 
-  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 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);
+  webkitRequestFileSystem_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitRequestFileSystem", [__arg_0]);
 
-  static webkitResolveLocalFileSystemSyncURL_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback";
-  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemSyncURL_Callback_1(mthis, __arg_0);
+  webkitRequestFileSystem_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1]);
 
-  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);
+  webkitRequestFileSystem_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  webkitRequestFileSystem_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("webkitRequestFileSystem", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  static webkitResolveLocalFileSystemURL_Callback_0(mthis) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
-  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => webkitResolveLocalFileSystemURL_Callback_0(mthis);
+  webkitResolveLocalFileSystemSyncURL_Callback_0_(mthis) => mthis.callMethod("webkitResolveLocalFileSystemSyncURL", []);
 
-  static webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback";
-  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => webkitResolveLocalFileSystemURL_Callback_1(mthis, __arg_0);
+  webkitResolveLocalFileSystemSyncURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitResolveLocalFileSystemSyncURL", [__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);
+  webkitResolveLocalFileSystemURL_Callback_0_(mthis) => mthis.callMethod("webkitResolveLocalFileSystemURL", []);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_1_(mthis, __arg_0) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0]);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0, __arg_1]);
 
-  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);
+  webkitResolveLocalFileSystemURL_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("webkitResolveLocalFileSystemURL", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkWorkerLocation {
   static final instance = new BlinkWorkerLocation();
 
-  static hash_Getter(mthis) native "WorkerLocation_hash_Getter";
-  hash_Getter_(mthis) => hash_Getter(mthis);
+  hash_Getter_(mthis) => mthis["hash"];
 
-  static host_Getter(mthis) native "WorkerLocation_host_Getter";
-  host_Getter_(mthis) => host_Getter(mthis);
+  host_Getter_(mthis) => mthis["host"];
 
-  static hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
-  hostname_Getter_(mthis) => hostname_Getter(mthis);
+  hostname_Getter_(mthis) => mthis["hostname"];
 
-  static href_Getter(mthis) native "WorkerLocation_href_Getter";
-  href_Getter_(mthis) => href_Getter(mthis);
+  href_Getter_(mthis) => mthis["href"];
 
-  static origin_Getter(mthis) native "WorkerLocation_origin_Getter";
-  origin_Getter_(mthis) => origin_Getter(mthis);
+  origin_Getter_(mthis) => mthis["origin"];
 
-  static pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
-  pathname_Getter_(mthis) => pathname_Getter(mthis);
+  pathname_Getter_(mthis) => mthis["pathname"];
 
-  static port_Getter(mthis) native "WorkerLocation_port_Getter";
-  port_Getter_(mthis) => port_Getter(mthis);
+  port_Getter_(mthis) => mthis["port"];
 
-  static protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
-  protocol_Getter_(mthis) => protocol_Getter(mthis);
+  protocol_Getter_(mthis) => mthis["protocol"];
 
-  static search_Getter(mthis) native "WorkerLocation_search_Getter";
-  search_Getter_(mthis) => search_Getter(mthis);
+  search_Getter_(mthis) => mthis["search"];
 
-  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);
+  toString_Callback_0_(mthis) => mthis.callMethod("toString", []);
 
 }
 
 class BlinkWorkerNavigator {
   static final instance = new BlinkWorkerNavigator();
 
-  static appCodeName_Getter(mthis) native "WorkerNavigator_appCodeName_Getter";
-  appCodeName_Getter_(mthis) => appCodeName_Getter(mthis);
+  appCodeName_Getter_(mthis) => mthis["appCodeName"];
 
-  static appName_Getter(mthis) native "WorkerNavigator_appName_Getter";
-  appName_Getter_(mthis) => appName_Getter(mthis);
+  appName_Getter_(mthis) => mthis["appName"];
 
-  static appVersion_Getter(mthis) native "WorkerNavigator_appVersion_Getter";
-  appVersion_Getter_(mthis) => appVersion_Getter(mthis);
+  appVersion_Getter_(mthis) => mthis["appVersion"];
 
-  static connection_Getter(mthis) native "WorkerNavigator_connection_Getter";
-  connection_Getter_(mthis) => connection_Getter(mthis);
+  connection_Getter_(mthis) => mthis["connection"];
 
-  static dartEnabled_Getter(mthis) native "WorkerNavigator_dartEnabled_Getter";
-  dartEnabled_Getter_(mthis) => dartEnabled_Getter(mthis);
+  dartEnabled_Getter_(mthis) => mthis["dartEnabled"];
 
-  static geofencing_Getter(mthis) native "WorkerNavigator_geofencing_Getter";
-  geofencing_Getter_(mthis) => geofencing_Getter(mthis);
+  geofencing_Getter_(mthis) => mthis["geofencing"];
 
-  static hardwareConcurrency_Getter(mthis) native "WorkerNavigator_hardwareConcurrency_Getter";
-  hardwareConcurrency_Getter_(mthis) => hardwareConcurrency_Getter(mthis);
+  hardwareConcurrency_Getter_(mthis) => mthis["hardwareConcurrency"];
 
-  static onLine_Getter(mthis) native "WorkerNavigator_onLine_Getter";
-  onLine_Getter_(mthis) => onLine_Getter(mthis);
+  onLine_Getter_(mthis) => mthis["onLine"];
 
-  static platform_Getter(mthis) native "WorkerNavigator_platform_Getter";
-  platform_Getter_(mthis) => platform_Getter(mthis);
+  platform_Getter_(mthis) => mthis["platform"];
 
-  static product_Getter(mthis) native "WorkerNavigator_product_Getter";
-  product_Getter_(mthis) => product_Getter(mthis);
+  product_Getter_(mthis) => mthis["product"];
 
-  static userAgent_Getter(mthis) native "WorkerNavigator_userAgent_Getter";
-  userAgent_Getter_(mthis) => userAgent_Getter(mthis);
+  userAgent_Getter_(mthis) => mthis["userAgent"];
 
-  static webkitPersistentStorage_Getter(mthis) native "WorkerNavigator_webkitPersistentStorage_Getter";
-  webkitPersistentStorage_Getter_(mthis) => webkitPersistentStorage_Getter(mthis);
+  webkitPersistentStorage_Getter_(mthis) => mthis["webkitPersistentStorage"];
 
-  static webkitTemporaryStorage_Getter(mthis) native "WorkerNavigator_webkitTemporaryStorage_Getter";
-  webkitTemporaryStorage_Getter_(mthis) => webkitTemporaryStorage_Getter(mthis);
+  webkitTemporaryStorage_Getter_(mthis) => mthis["webkitTemporaryStorage"];
 
 }
 
 class BlinkWorkerPerformance {
   static final instance = new BlinkWorkerPerformance();
 
-  static memory_Getter(mthis) native "WorkerPerformance_memory_Getter";
-  memory_Getter_(mthis) => memory_Getter(mthis);
+  memory_Getter_(mthis) => mthis["memory"];
 
-  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);
+  now_Callback_0_(mthis) => mthis.callMethod("now", []);
 
 }
 
@@ -31010,216 +16925,117 @@
 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);
+  abort_Callback_0_(mthis) => mthis.callMethod("abort", []);
 
-  static abort_Callback_1(mthis, __arg_0) native "XMLHttpRequest_abort_Callback";
-  abort_Callback_1_(mthis, __arg_0) => abort_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["XMLHttpRequest"], []);
 
-  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);
+  constructorCallback_1_(__arg_0) => new js.JsObject(js.context["XMLHttpRequest"], [__arg_0]);
 
-  static constructorCallback_0() native "XMLHttpRequest_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  getAllResponseHeaders_Callback_0_(mthis) => mthis.callMethod("getAllResponseHeaders", []);
 
-  static constructorCallback_1(__arg_0) native "XMLHttpRequest_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  getResponseHeader_Callback_0_(mthis) => mthis.callMethod("getResponseHeader", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "XMLHttpRequest_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  getResponseHeader_Callback_1_(mthis, __arg_0) => mthis.callMethod("getResponseHeader", [__arg_0]);
 
-  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);
+  onreadystatechange_Getter_(mthis) => mthis["onreadystatechange"];
 
-  static getAllResponseHeaders_Callback_0(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback";
-  getAllResponseHeaders_Callback_0_(mthis) => getAllResponseHeaders_Callback_0(mthis);
+  onreadystatechange_Setter_(mthis, __arg_0) => mthis["onreadystatechange"] = __arg_0;
 
-  static getAllResponseHeaders_Callback_1(mthis, __arg_0) native "XMLHttpRequest_getAllResponseHeaders_Callback";
-  getAllResponseHeaders_Callback_1_(mthis, __arg_0) => getAllResponseHeaders_Callback_1(mthis, __arg_0);
+  open_Callback_0_(mthis) => mthis.callMethod("open", []);
 
-  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);
+  open_Callback_1_(mthis, __arg_0) => mthis.callMethod("open", [__arg_0]);
 
-  static getResponseHeader_Callback_0(mthis) native "XMLHttpRequest_getResponseHeader_Callback";
-  getResponseHeader_Callback_0_(mthis) => getResponseHeader_Callback_0(mthis);
+  open_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("open", [__arg_0, __arg_1]);
 
-  static getResponseHeader_Callback_1(mthis, __arg_0) native "XMLHttpRequest_getResponseHeader_Callback";
-  getResponseHeader_Callback_1_(mthis, __arg_0) => getResponseHeader_Callback_1(mthis, __arg_0);
+  open_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("open", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  open_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("open", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  open_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("open", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
-  static onreadystatechange_Getter(mthis) native "XMLHttpRequest_onreadystatechange_Getter";
-  onreadystatechange_Getter_(mthis) => onreadystatechange_Getter(mthis);
+  overrideMimeType_Callback_0_(mthis) => mthis.callMethod("overrideMimeType", []);
 
-  static onreadystatechange_Setter(mthis, __arg_0) native "XMLHttpRequest_onreadystatechange_Setter";
-  onreadystatechange_Setter_(mthis, __arg_0) => onreadystatechange_Setter(mthis, __arg_0);
+  overrideMimeType_Callback_1_(mthis, __arg_0) => mthis.callMethod("overrideMimeType", [__arg_0]);
 
-  static open_Callback_0(mthis) native "XMLHttpRequest_open_Callback";
-  open_Callback_0_(mthis) => open_Callback_0(mthis);
+  readyState_Getter_(mthis) => mthis["readyState"];
 
-  static open_Callback_1(mthis, __arg_0) native "XMLHttpRequest_open_Callback";
-  open_Callback_1_(mthis, __arg_0) => open_Callback_1(mthis, __arg_0);
+  responseText_Getter_(mthis) => mthis["responseText"];
 
-  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);
+  responseType_Getter_(mthis) => mthis["responseType"];
 
-  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);
+  responseType_Setter_(mthis, __arg_0) => mthis["responseType"] = __arg_0;
 
-  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);
+  responseURL_Getter_(mthis) => mthis["responseURL"];
 
-  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);
+  responseXML_Getter_(mthis) => mthis["responseXML"];
 
-  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);
+  response_Getter_(mthis) => mthis["response"];
 
-  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);
+  send_Callback_0_(mthis) => mthis.callMethod("send", []);
 
-  static overrideMimeType_Callback_0(mthis) native "XMLHttpRequest_overrideMimeType_Callback";
-  overrideMimeType_Callback_0_(mthis) => overrideMimeType_Callback_0(mthis);
+  send_Callback_1_(mthis, __arg_0) => mthis.callMethod("send", [__arg_0]);
 
-  static overrideMimeType_Callback_1(mthis, __arg_0) native "XMLHttpRequest_overrideMimeType_Callback";
-  overrideMimeType_Callback_1_(mthis, __arg_0) => overrideMimeType_Callback_1(mthis, __arg_0);
+  setRequestHeader_Callback_0_(mthis) => mthis.callMethod("setRequestHeader", []);
 
-  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);
+  setRequestHeader_Callback_1_(mthis, __arg_0) => mthis.callMethod("setRequestHeader", [__arg_0]);
 
-  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);
+  setRequestHeader_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setRequestHeader", [__arg_0, __arg_1]);
 
-  static readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
-  readyState_Getter_(mthis) => readyState_Getter(mthis);
+  statusText_Getter_(mthis) => mthis["statusText"];
 
-  static responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
-  responseText_Getter_(mthis) => responseText_Getter(mthis);
+  status_Getter_(mthis) => mthis["status"];
 
-  static responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
-  responseType_Getter_(mthis) => responseType_Getter(mthis);
+  timeout_Getter_(mthis) => mthis["timeout"];
 
-  static responseType_Setter(mthis, __arg_0) native "XMLHttpRequest_responseType_Setter";
-  responseType_Setter_(mthis, __arg_0) => responseType_Setter(mthis, __arg_0);
+  timeout_Setter_(mthis, __arg_0) => mthis["timeout"] = __arg_0;
 
-  static responseURL_Getter(mthis) native "XMLHttpRequest_responseURL_Getter";
-  responseURL_Getter_(mthis) => responseURL_Getter(mthis);
+  upload_Getter_(mthis) => mthis["upload"];
 
-  static responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
-  responseXML_Getter_(mthis) => responseXML_Getter(mthis);
+  withCredentials_Getter_(mthis) => mthis["withCredentials"];
 
-  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, __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, __arg_0) native "XMLHttpRequest_withCredentials_Setter";
-  withCredentials_Setter_(mthis, __arg_0) => withCredentials_Setter(mthis, __arg_0);
+  withCredentials_Setter_(mthis, __arg_0) => mthis["withCredentials"] = __arg_0;
 
 }
 
 class BlinkXMLHttpRequestEventTarget extends BlinkEventTarget {
   static final instance = new BlinkXMLHttpRequestEventTarget();
 
-  static onabort_Getter(mthis) native "XMLHttpRequestEventTarget_onabort_Getter";
-  onabort_Getter_(mthis) => onabort_Getter(mthis);
+  onabort_Getter_(mthis) => mthis["onabort"];
 
-  static onabort_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onabort_Setter";
-  onabort_Setter_(mthis, __arg_0) => onabort_Setter(mthis, __arg_0);
+  onabort_Setter_(mthis, __arg_0) => mthis["onabort"] = __arg_0;
 
-  static onerror_Getter(mthis) native "XMLHttpRequestEventTarget_onerror_Getter";
-  onerror_Getter_(mthis) => onerror_Getter(mthis);
+  onerror_Getter_(mthis) => mthis["onerror"];
 
-  static onerror_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onerror_Setter";
-  onerror_Setter_(mthis, __arg_0) => onerror_Setter(mthis, __arg_0);
+  onerror_Setter_(mthis, __arg_0) => mthis["onerror"] = __arg_0;
 
-  static onload_Getter(mthis) native "XMLHttpRequestEventTarget_onload_Getter";
-  onload_Getter_(mthis) => onload_Getter(mthis);
+  onload_Getter_(mthis) => mthis["onload"];
 
-  static onload_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onload_Setter";
-  onload_Setter_(mthis, __arg_0) => onload_Setter(mthis, __arg_0);
+  onload_Setter_(mthis, __arg_0) => mthis["onload"] = __arg_0;
 
-  static onloadend_Getter(mthis) native "XMLHttpRequestEventTarget_onloadend_Getter";
-  onloadend_Getter_(mthis) => onloadend_Getter(mthis);
+  onloadend_Getter_(mthis) => mthis["onloadend"];
 
-  static onloadend_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onloadend_Setter";
-  onloadend_Setter_(mthis, __arg_0) => onloadend_Setter(mthis, __arg_0);
+  onloadend_Setter_(mthis, __arg_0) => mthis["onloadend"] = __arg_0;
 
-  static onloadstart_Getter(mthis) native "XMLHttpRequestEventTarget_onloadstart_Getter";
-  onloadstart_Getter_(mthis) => onloadstart_Getter(mthis);
+  onloadstart_Getter_(mthis) => mthis["onloadstart"];
 
-  static onloadstart_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onloadstart_Setter";
-  onloadstart_Setter_(mthis, __arg_0) => onloadstart_Setter(mthis, __arg_0);
+  onloadstart_Setter_(mthis, __arg_0) => mthis["onloadstart"] = __arg_0;
 
-  static onprogress_Getter(mthis) native "XMLHttpRequestEventTarget_onprogress_Getter";
-  onprogress_Getter_(mthis) => onprogress_Getter(mthis);
+  onprogress_Getter_(mthis) => mthis["onprogress"];
 
-  static onprogress_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_onprogress_Setter";
-  onprogress_Setter_(mthis, __arg_0) => onprogress_Setter(mthis, __arg_0);
+  onprogress_Setter_(mthis, __arg_0) => mthis["onprogress"] = __arg_0;
 
-  static ontimeout_Getter(mthis) native "XMLHttpRequestEventTarget_ontimeout_Getter";
-  ontimeout_Getter_(mthis) => ontimeout_Getter(mthis);
+  ontimeout_Getter_(mthis) => mthis["ontimeout"];
 
-  static ontimeout_Setter(mthis, __arg_0) native "XMLHttpRequestEventTarget_ontimeout_Setter";
-  ontimeout_Setter_(mthis, __arg_0) => ontimeout_Setter(mthis, __arg_0);
+  ontimeout_Setter_(mthis, __arg_0) => mthis["ontimeout"] = __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);
+  position_Getter_(mthis) => mthis["position"];
 
-  static totalSize_Getter(mthis) native "XMLHttpRequestProgressEvent_totalSize_Getter";
-  totalSize_Getter_(mthis) => totalSize_Getter(mthis);
+  totalSize_Getter_(mthis) => mthis["totalSize"];
 
 }
 
@@ -31231,294 +17047,130 @@
 class BlinkXMLSerializer {
   static final instance = new BlinkXMLSerializer();
 
-  static constructorCallback_0() native "XMLSerializer_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["XMLSerializer"], []);
 
-  static constructorCallback_1(__arg_0) native "XMLSerializer_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  serializeToString_Callback_0_(mthis) => mthis.callMethod("serializeToString", []);
 
-  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);
+  serializeToString_Callback_1_(mthis, __arg_0) => mthis.callMethod("serializeToString", [__arg_0]);
 
 }
 
 class BlinkXPathEvaluator {
   static final instance = new BlinkXPathEvaluator();
 
-  static constructorCallback_0() native "XPathEvaluator_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  constructorCallback_0_() => new js.JsObject(js.context["XPathEvaluator"], []);
 
-  static constructorCallback_1(__arg_0) native "XPathEvaluator_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  createExpression_Callback_0_(mthis) => mthis.callMethod("createExpression", []);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "XPathEvaluator_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  createExpression_Callback_1_(mthis, __arg_0) => mthis.callMethod("createExpression", [__arg_0]);
 
-  static createExpression_Callback_0(mthis) native "XPathEvaluator_createExpression_Callback";
-  createExpression_Callback_0_(mthis) => createExpression_Callback_0(mthis);
+  createExpression_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("createExpression", [__arg_0, __arg_1]);
 
-  static createExpression_Callback_1(mthis, __arg_0) native "XPathEvaluator_createExpression_Callback";
-  createExpression_Callback_1_(mthis, __arg_0) => createExpression_Callback_1(mthis, __arg_0);
+  createNSResolver_Callback_0_(mthis) => mthis.callMethod("createNSResolver", []);
 
-  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);
+  createNSResolver_Callback_1_(mthis, __arg_0) => mthis.callMethod("createNSResolver", [__arg_0]);
 
-  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);
+  evaluate_Callback_0_(mthis) => mthis.callMethod("evaluate", []);
 
-  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);
+  evaluate_Callback_1_(mthis, __arg_0) => mthis.callMethod("evaluate", [__arg_0]);
 
-  static createNSResolver_Callback_0(mthis) native "XPathEvaluator_createNSResolver_Callback";
-  createNSResolver_Callback_0_(mthis) => createNSResolver_Callback_0(mthis);
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("evaluate", [__arg_0, __arg_1]);
 
-  static createNSResolver_Callback_1(mthis, __arg_0) native "XPathEvaluator_createNSResolver_Callback";
-  createNSResolver_Callback_1_(mthis, __arg_0) => createNSResolver_Callback_1(mthis, __arg_0);
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("evaluate", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  evaluate_Callback_4_(mthis, __arg_0, __arg_1, __arg_2, __arg_3) => mthis.callMethod("evaluate", [__arg_0, __arg_1, __arg_2, __arg_3]);
 
-  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);
+  evaluate_Callback_5_(mthis, __arg_0, __arg_1, __arg_2, __arg_3, __arg_4) => mthis.callMethod("evaluate", [__arg_0, __arg_1, __arg_2, __arg_3, __arg_4]);
 
 }
 
 class BlinkXPathExpression {
   static final instance = new BlinkXPathExpression();
 
-  static evaluate_Callback_0(mthis) native "XPathExpression_evaluate_Callback";
-  evaluate_Callback_0_(mthis) => evaluate_Callback_0(mthis);
+  evaluate_Callback_0_(mthis) => mthis.callMethod("evaluate", []);
 
-  static evaluate_Callback_1(mthis, __arg_0) native "XPathExpression_evaluate_Callback";
-  evaluate_Callback_1_(mthis, __arg_0) => evaluate_Callback_1(mthis, __arg_0);
+  evaluate_Callback_1_(mthis, __arg_0) => mthis.callMethod("evaluate", [__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);
+  evaluate_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("evaluate", [__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);
+  evaluate_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("evaluate", [__arg_0, __arg_1, __arg_2]);
 
 }
 
 class BlinkXPathNSResolver {
   static final instance = new BlinkXPathNSResolver();
 
-  static lookupNamespaceURI_Callback_0(mthis) native "XPathNSResolver_lookupNamespaceURI_Callback";
-  lookupNamespaceURI_Callback_0_(mthis) => lookupNamespaceURI_Callback_0(mthis);
+  lookupNamespaceURI_Callback_0_(mthis) => mthis.callMethod("lookupNamespaceURI", []);
 
-  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);
+  lookupNamespaceURI_Callback_1_(mthis, __arg_0) => mthis.callMethod("lookupNamespaceURI", [__arg_0]);
 
 }
 
 class BlinkXPathResult {
   static final instance = new BlinkXPathResult();
 
-  static booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
-  booleanValue_Getter_(mthis) => booleanValue_Getter(mthis);
+  booleanValue_Getter_(mthis) => mthis["booleanValue"];
 
-  static invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
-  invalidIteratorState_Getter_(mthis) => invalidIteratorState_Getter(mthis);
+  invalidIteratorState_Getter_(mthis) => mthis["invalidIteratorState"];
 
-  static iterateNext_Callback_0(mthis) native "XPathResult_iterateNext_Callback";
-  iterateNext_Callback_0_(mthis) => iterateNext_Callback_0(mthis);
+  iterateNext_Callback_0_(mthis) => mthis.callMethod("iterateNext", []);
 
-  static iterateNext_Callback_1(mthis, __arg_0) native "XPathResult_iterateNext_Callback";
-  iterateNext_Callback_1_(mthis, __arg_0) => iterateNext_Callback_1(mthis, __arg_0);
+  numberValue_Getter_(mthis) => mthis["numberValue"];
 
-  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);
+  resultType_Getter_(mthis) => mthis["resultType"];
 
-  static numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
-  numberValue_Getter_(mthis) => numberValue_Getter(mthis);
+  singleNodeValue_Getter_(mthis) => mthis["singleNodeValue"];
 
-  static resultType_Getter(mthis) native "XPathResult_resultType_Getter";
-  resultType_Getter_(mthis) => resultType_Getter(mthis);
+  snapshotItem_Callback_0_(mthis) => mthis.callMethod("snapshotItem", []);
 
-  static singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
-  singleNodeValue_Getter_(mthis) => singleNodeValue_Getter(mthis);
+  snapshotItem_Callback_1_(mthis, __arg_0) => mthis.callMethod("snapshotItem", [__arg_0]);
 
-  static snapshotItem_Callback_0(mthis) native "XPathResult_snapshotItem_Callback";
-  snapshotItem_Callback_0_(mthis) => snapshotItem_Callback_0(mthis);
+  snapshotLength_Getter_(mthis) => mthis["snapshotLength"];
 
-  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);
+  stringValue_Getter_(mthis) => mthis["stringValue"];
 
 }
 
 class BlinkXSLTProcessor {
   static final instance = new BlinkXSLTProcessor();
 
-  static clearParameters_Callback_0(mthis) native "XSLTProcessor_clearParameters_Callback";
-  clearParameters_Callback_0_(mthis) => clearParameters_Callback_0(mthis);
+  clearParameters_Callback_0_(mthis) => mthis.callMethod("clearParameters", []);
 
-  static clearParameters_Callback_1(mthis, __arg_0) native "XSLTProcessor_clearParameters_Callback";
-  clearParameters_Callback_1_(mthis, __arg_0) => clearParameters_Callback_1(mthis, __arg_0);
+  constructorCallback_0_() => new js.JsObject(js.context["XSLTProcessor"], []);
 
-  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);
+  getParameter_Callback_0_(mthis) => mthis.callMethod("getParameter", []);
 
-  static constructorCallback_0() native "XSLTProcessor_constructorCallback";
-  constructorCallback_0_() => constructorCallback_0();
+  getParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("getParameter", [__arg_0]);
 
-  static constructorCallback_1(__arg_0) native "XSLTProcessor_constructorCallback";
-  constructorCallback_1_(__arg_0) => constructorCallback_1(__arg_0);
+  getParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("getParameter", [__arg_0, __arg_1]);
 
-  static constructorCallback_2(__arg_0, __arg_1) native "XSLTProcessor_constructorCallback";
-  constructorCallback_2_(__arg_0, __arg_1) => constructorCallback_2(__arg_0, __arg_1);
+  importStylesheet_Callback_0_(mthis) => mthis.callMethod("importStylesheet", []);
 
-  static getParameter_Callback_0(mthis) native "XSLTProcessor_getParameter_Callback";
-  getParameter_Callback_0_(mthis) => getParameter_Callback_0(mthis);
+  importStylesheet_Callback_1_(mthis, __arg_0) => mthis.callMethod("importStylesheet", [__arg_0]);
 
-  static getParameter_Callback_1(mthis, __arg_0) native "XSLTProcessor_getParameter_Callback";
-  getParameter_Callback_1_(mthis, __arg_0) => getParameter_Callback_1(mthis, __arg_0);
+  removeParameter_Callback_0_(mthis) => mthis.callMethod("removeParameter", []);
 
-  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);
+  removeParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("removeParameter", [__arg_0]);
 
-  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);
+  removeParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("removeParameter", [__arg_0, __arg_1]);
 
-  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);
+  reset_Callback_0_(mthis) => mthis.callMethod("reset", []);
 
-  static importStylesheet_Callback_0(mthis) native "XSLTProcessor_importStylesheet_Callback";
-  importStylesheet_Callback_0_(mthis) => importStylesheet_Callback_0(mthis);
+  setParameter_Callback_1_(mthis, __arg_0) => mthis.callMethod("setParameter", [__arg_0]);
 
-  static importStylesheet_Callback_1(mthis, __arg_0) native "XSLTProcessor_importStylesheet_Callback";
-  importStylesheet_Callback_1_(mthis, __arg_0) => importStylesheet_Callback_1(mthis, __arg_0);
+  setParameter_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("setParameter", [__arg_0, __arg_1]);
 
-  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);
+  setParameter_Callback_3_(mthis, __arg_0, __arg_1, __arg_2) => mthis.callMethod("setParameter", [__arg_0, __arg_1, __arg_2]);
 
-  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);
+  transformToDocument_Callback_0_(mthis) => mthis.callMethod("transformToDocument", []);
 
-  static removeParameter_Callback_0(mthis) native "XSLTProcessor_removeParameter_Callback";
-  removeParameter_Callback_0_(mthis) => removeParameter_Callback_0(mthis);
+  transformToDocument_Callback_1_(mthis, __arg_0) => mthis.callMethod("transformToDocument", [__arg_0]);
 
-  static removeParameter_Callback_1(mthis, __arg_0) native "XSLTProcessor_removeParameter_Callback";
-  removeParameter_Callback_1_(mthis, __arg_0) => removeParameter_Callback_1(mthis, __arg_0);
+  transformToFragment_Callback_0_(mthis) => mthis.callMethod("transformToFragment", []);
 
-  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);
+  transformToFragment_Callback_1_(mthis, __arg_0) => mthis.callMethod("transformToFragment", [__arg_0]);
 
-  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);
+  transformToFragment_Callback_2_(mthis, __arg_0, __arg_1) => mthis.callMethod("transformToFragment", [__arg_0, __arg_1]);
 
 }
 
@@ -31537,6 +17189,8 @@
 
   static createElement(document, tagName) native "Utils_createElement";
 
+  static constructElement(element_type, jsObject) native "Utils_constructor_create";
+
   static initializeCustomElement(element) native "Utils_initializeCustomElement";
 
   static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
diff --git a/sdk/lib/_internal/js_runtime/lib/interceptors.dart b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
index 0247af4..262213b 100644
--- a/sdk/lib/_internal/js_runtime/lib/interceptors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/interceptors.dart
@@ -12,7 +12,6 @@
 import 'dart:_internal' hide Symbol;
 import "dart:_internal" as _symbol_dev show Symbol;
 import 'dart:_js_helper' show allMatchesInStringUnchecked,
-                              Null,
                               JSSyntaxRegExp,
                               Primitives,
                               argumentErrorValue,
@@ -36,7 +35,6 @@
                               stringReplaceFirstMappedUnchecked,
                               stringReplaceRangeUnchecked,
                               lookupAndCacheInterceptor,
-                              lookupDispatchRecord,
                               StringMatch,
                               firstMatchAfter,
                               NoInline;
diff --git a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
index 6c39c4a..cb8820c 100644
--- a/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/internal_patch.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:_js_primitives' show printString;
-import 'dart:_js_helper' show JS, patch;
+import 'dart:_js_helper' show patch;
 import 'dart:_interceptors' show JSArray;
 
 @patch
diff --git a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
index 9e463ba..a74fb12 100644
--- a/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/isolate_helper.dart
@@ -21,7 +21,6 @@
 import 'dart:_js_helper' show
     Closure,
     InternalMap,
-    Null,
     Primitives,
     convertDartClosureToJS,
     createDartClosureFromNameOfStaticFunction,
diff --git a/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart b/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
index 70eda5b..85b30b1 100644
--- a/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/isolate_patch.dart
@@ -6,9 +6,7 @@
 
 import 'dart:_js_helper' show patch;
 import 'dart:_isolate_helper' show CapabilityImpl,
-                                   CloseToken,
                                    IsolateNatives,
-                                   JsIsolateSink,
                                    ReceivePortImpl,
                                    RawReceivePortImpl;
 
@@ -63,12 +61,14 @@
   static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message,
       {bool paused: false,
-       bool checked,
-       Uri packageRoot,
-       Map<String, Uri> packages,
-       bool errorsAreFatal,
        SendPort onExit,
-       SendPort onError}) {
+       SendPort onError,
+       bool errorsAreFatal,
+       bool checked,
+       Map<String, String> environment,
+       Uri packageRoot,
+       Map<String, Uri> packages}) {
+    if (environment != null) throw new UnimplementedError("environment");
     if (packageRoot != null) throw new UnimplementedError("packageRoot");
     if (packages != null) throw new UnimplementedError("packages");
     bool forcePause = (errorsAreFatal != null) ||
diff --git a/sdk/lib/_internal/js_runtime/lib/js_array.dart b/sdk/lib/_internal/js_runtime/lib/js_array.dart
index 5495a6c..ad369ab 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_array.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_array.dart
@@ -581,7 +581,7 @@
 
   int get length => JS('JSUInt32', r'#.length', this);
 
-  void set length(int newLength) {
+  set length(int newLength) {
     checkGrowable('set length');
     if (newLength is !int) {
       throw new ArgumentError.value(newLength, 'newLength');
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index b4ab91c..0007532 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -18,8 +18,7 @@
     JsGetName,
     LEAF_TAGS,
     NATIVE_SUPERCLASS_TAG_NAME,
-    STATIC_FUNCTION_NAME_PROPERTY_NAME,
-    TRACE_BUFFER;
+    STATIC_FUNCTION_NAME_PROPERTY_NAME;
 
 import 'dart:collection';
 
@@ -45,13 +44,12 @@
     JS_BUILTIN,
     JS_CALL_IN_ISOLATE,
     JS_CONST,
-    JS_GET_STATIC_STATEC,
     JS_CURRENT_ISOLATE_CONTEXT,
     JS_EFFECT,
     JS_EMBEDDED_GLOBAL,
     JS_GET_FLAG,
     JS_GET_NAME,
-    JS_HAS_EQUALS,
+    JS_INTERCEPTOR_CONSTANT,
     JS_STRING_CONCAT,
     RAW_DART_FUNCTION_REF;
 
@@ -848,24 +846,71 @@
   ///
   /// In minified mode, uses the unminified names if available.
   static String objectTypeName(Object object) {
-    String name = constructorNameFallback(getInterceptor(object));
-    if (name == 'Object') {
-      // Try to decompile the constructor by turning it into a string and get
-      // the name out of that. If the decompiled name is a string containing an
-      // identifier, we use that instead of the very generic 'Object'.
-      var decompiled =
-          JS('var', r'#.match(/^\s*function\s*([\w$]*)\s*\(/)[1]',
-              JS('var', r'String(#.constructor)', object));
-      if (decompiled is String)
-        if (JS('bool', r'/^\w+$/.test(#)', decompiled))
-          name = decompiled;
+    return formatType(_objectRawTypeName(object), getRuntimeTypeInfo(object));
+  }
+
+  static String _objectRawTypeName(Object object) {
+    var interceptor = getInterceptor(object);
+    // The interceptor is either an object (self-intercepting plain Dart class),
+    // the prototype of the constructor for an Interceptor class (like
+    // `JSString.prototype`, `JSNull.prototype`), or an Interceptor object
+    // instance (`const JSString()`, should use `JSString.prototype`).
+    //
+    // These all should have a `constructor` property with a `name` property.
+    String name;
+    var interceptorConstructor = JS('', '#.constructor', interceptor);
+    if (JS('bool', 'typeof # == "function"', interceptorConstructor)) {
+      var interceptorConstructorName = JS('', '#.name', interceptorConstructor);
+      if (interceptorConstructorName is String) {
+        name = interceptorConstructorName;
+      }
     }
+
+    if (name == null ||
+        identical(interceptor,
+            JS_INTERCEPTOR_CONSTANT(UnknownJavaScriptObject)) ||
+        identical(interceptor, JS_INTERCEPTOR_CONSTANT(Interceptor))) {
+      // Try to do better.  If we do not find something better, leave the name
+      // as 'UnknownJavaScriptObject' or 'Interceptor' (or the minified name).
+      //
+      // When we get here via the UnknownJavaScriptObject test (for JavaScript
+      // objects from outside the program), the object's constructor has a
+      // better name that 'UnknownJavaScriptObject'.
+      //
+      // When we get here the Interceptor test (for Native classes that are
+      // declared in the Dart program but have been 'folded' into Interceptor),
+      // the native class's constructor name is better than the generic
+      // 'Interceptor' (an abstract class).
+
+      // Try the [constructorNameFallback]. This gets the constructor name for
+      // any browser (used by [getNativeInterceptor]).
+      String dispatchName = constructorNameFallback(object);
+      if (name == null) name = dispatchName;
+      if (dispatchName == 'Object') {
+        // Try to decompile the constructor by turning it into a string and get
+        // the name out of that. If the decompiled name is a string containing
+        // an identifier, we use that instead of the very generic 'Object'.
+        var objectConstructor = JS('', '#.constructor', object);
+        if (JS('bool', 'typeof # == "function"', objectConstructor)) {
+          var decompiledName =
+              JS('var', r'#.match(/^\s*function\s*([\w$]*)\s*\(/)[1]',
+                  JS('var', r'String(#)', objectConstructor));
+          if (decompiledName is String &&
+              JS('bool', r'/^\w+$/.test(#)', decompiledName)) {
+            name = decompiledName;
+          }
+        }
+      } else {
+        name = dispatchName;
+      }
+    }
+
     // TODO(kasperl): If the namer gave us a fresh global name, we may
     // want to remove the numeric suffix that makes it unique too.
     if (name.length > 1 && identical(name.codeUnitAt(0), DOLLAR_CHAR_VALUE)) {
       name = name.substring(1);
     }
-    return formatType(name, getRuntimeTypeInfo(object));
+    return name;
   }
 
   /// In minified mode, uses the unminified names if available.
@@ -1566,7 +1611,7 @@
  */
 @NoInline()
 Error diagnoseIndexError(indexable, index) {
-  if (index is! int) return new ArgumentError.value(index, 'index');
+  if (index is !int) return new ArgumentError.value(index, 'index');
   int length = indexable.length;
   // The following returns the same error that would be thrown by calling
   // [RangeError.checkValidIndex] with no optional parameters provided.
@@ -3321,18 +3366,33 @@
 
 /**
  * Helper function for implementing asserts. The compiler treats this specially.
+ *
+ * Returns the negation of the condition. That is: `true` if the assert should
+ * fail.
  */
+bool assertTest(condition) {
+  // Do bool success check first, it is common and faster than 'is Function'.
+  if (true == condition) return false;
+  if (condition is Function) condition = condition();
+  if (condition is bool) return !condition;
+  throw new TypeErrorImplementation(condition, 'bool');
+}
+
+/**
+ * Helper function for implementing asserts with messages.
+ * The compiler treats this specially.
+ */
+void assertThrow(Object message) {
+  throw new _AssertionError(message);
+}
+
+/**
+ * Helper function for implementing asserts without messages.
+ * The compiler treats this specially.
+ */
+@NoInline()
 void assertHelper(condition) {
-  // Do a bool check first because it is common and faster than 'is Function'.
-  if (condition is !bool) {
-    if (condition is Function) condition = condition();
-    if (condition is !bool) {
-      throw new TypeErrorImplementation(condition, 'bool');
-    }
-  }
-  // Compare to true to avoid boolean conversion check in checked
-  // mode.
-  if (true != condition) throw new AssertionError();
+  if (assertTest(condition)) throw new AssertionError();
 }
 
 /**
@@ -3995,3 +4055,24 @@
 void mainHasTooManyParameters() {
   throw new MainError("'main' expects too many parameters.");
 }
+
+class _AssertionError extends AssertionError {
+  final _message;
+  _AssertionError(this._message);
+
+  String toString() => "Assertion failed: " + Error.safeToString(_message);
+}
+
+
+// [_UnreachableError] is a separate class because we always resolve
+// [assertUnreachable] and want to reduce the impact of resolving possibly
+// unneeded code.
+class _UnreachableError extends AssertionError {
+  _UnreachableError();
+  String toString() => "Assertion failed: Reached dead code";
+}
+
+@NoInline()
+void assertUnreachable() {
+  throw new _UnreachableError();
+}
diff --git a/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart b/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
index aa836ca..fc78e72 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
@@ -26,13 +26,7 @@
     JS_GET_STATIC_STATE,
     JS_CURRENT_ISOLATE_CONTEXT,
     JS_EMBEDDED_GLOBAL,
-    JS_GET_NAME,
-    JS_TYPEDEF_TAG,
-    JS_FUNCTION_TYPE_RETURN_TYPE_TAG,
-    JS_FUNCTION_TYPE_VOID_RETURN_TAG,
-    JS_FUNCTION_TYPE_REQUIRED_PARAMETERS_TAG,
-    JS_FUNCTION_TYPE_OPTIONAL_PARAMETERS_TAG,
-    JS_FUNCTION_TYPE_NAMED_PARAMETERS_TAG;
+    JS_GET_NAME;
 
 
 import 'dart:_internal' as _symbol_dev;
@@ -43,7 +37,6 @@
     Closure,
     JSInvocationMirror,
     JsCache,
-    Null,
     Primitives,
     ReflectionInfo,
     RuntimeError,
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index e5669e2..60af58d 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -41,7 +41,11 @@
 
 part of _js_helper;
 
-Type createRuntimeType(String name) => new TypeImpl(name);
+Type createRuntimeType(String name) {
+  // Use a 'JS' cast to String.  Since this is registered as used by the
+  // backend, type inference assumes the worst (name is dynamic).
+  return new TypeImpl(JS('String', '#', name));
+}
 
 class TypeImpl implements Type {
   final String _typeName;
@@ -85,10 +89,14 @@
  * representation of type 4 or 5, that is, either a JavaScript array or
  * `null`.
  */
+// Don't inline.  Let the JS engine inline this.  The call expression is much
+// more compact that the inlined expansion.
+// TODO(sra): For most objects it would be better to initialize the type info as
+// a field in the constructor: http://dartbug.com/22676 .
+@NoInline()
 Object setRuntimeTypeInfo(Object target, var rti) {
   assert(rti == null || isJsArray(rti));
-  // We have to check for null because factories may return null.
-  if (target != null) JS('var', r'#.$builtinTypeInfo = #', target, rti);
+  JS('var', r'#.$builtinTypeInfo = #', target, rti);
   return target;
 }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
index ec50a86..c256020 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_typed_data.dart
@@ -12,7 +12,7 @@
 import 'dart:_internal';
 import 'dart:_interceptors' show JSIndexable, JSUInt32, JSUInt31;
 import 'dart:_js_helper' show
-    Creates, JavaScriptIndexingBehavior, JSName, Native, Null, Returns,
+    Creates, JavaScriptIndexingBehavior, JSName, Native, Returns,
     diagnoseIndexError, diagnoseRangeError;
 import 'dart:_foreign_helper' show JS;
 import 'dart:math' as Math;
diff --git a/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart b/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart
index e9af062..6041760 100644
--- a/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/typed_data_patch.dart
@@ -9,7 +9,7 @@
 import 'dart:_internal';
 import 'dart:_interceptors' show JSIndexable, JSUInt32, JSUInt31;
 import 'dart:_js_helper'
-    show Creates, JavaScriptIndexingBehavior, JSName, Null, Returns, patch;
+    show Creates, JavaScriptIndexingBehavior, JSName, Returns, patch;
 import 'dart:_native_typed_data';
 
 @patch class ByteData {
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index b244191..ac205be 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -91,7 +91,7 @@
 library dart.async;
 
 import "dart:collection";
-import "dart:_internal" show deprecated, printToZone, printToConsole,
+import "dart:_internal" show printToZone, printToConsole,
                              IterableElementError;
 
 part 'async_error.dart';
diff --git a/sdk/lib/core/bool.dart b/sdk/lib/core/bool.dart
index 8150219..d1f31d7 100644
--- a/sdk/lib/core/bool.dart
+++ b/sdk/lib/core/bool.dart
@@ -21,11 +21,19 @@
    * In all other cases, including when there is no declaration for `name`,
    * the result is the [defaultValue].
    *
+   * The result is the same as would be returned by:
+   *
+   *     (const String.fromEnvironment(name) == "true")
+   *         ? true
+   *         : (const String.fromEnvironment(name) == "false")
+   *             ? false
+   *             : defaultValue
+   *
    * Example:
    *
    *     const loggingFlag = const bool.fromEnvironment("logging");
    *
-   * If you want to use a different truth-string, you can use the
+   * If you want to use a different truth-string than `"true"`, you can use the
    * [String.fromEnvironment] constructor directly:
    *
    *     const isLoggingOn = (const String.fromEnvironment("logging") == "on");
diff --git a/sdk/lib/core/errors.dart b/sdk/lib/core/errors.dart
index 3053807..0229732 100644
--- a/sdk/lib/core/errors.dart
+++ b/sdk/lib/core/errors.dart
@@ -96,6 +96,8 @@
  * Error thrown by the runtime system when an assert statement fails.
  */
 class AssertionError extends Error {
+  AssertionError();
+  String toString() => "Assertion failed";
 }
 
 /**
diff --git a/sdk/lib/core/list.dart b/sdk/lib/core/list.dart
index 8e837f8..50a5f58 100644
--- a/sdk/lib/core/list.dart
+++ b/sdk/lib/core/list.dart
@@ -159,7 +159,7 @@
    *
    * Throws an [UnsupportedError] if the list is fixed-length.
    */
-  void set length(int newLength);
+  set length(int newLength);
 
   /**
    * Adds [value] to the end of this list,
diff --git a/sdk/lib/developer/developer.dart b/sdk/lib/developer/developer.dart
index c51a680..d5620e4 100644
--- a/sdk/lib/developer/developer.dart
+++ b/sdk/lib/developer/developer.dart
@@ -37,13 +37,13 @@
 
 /// Emit a log event.
 /// [message] is the log message.
-/// [time] (optional) is the timestamp.
-/// [sequenceNumber] (optional) is a monotonically increasing sequence number.
-/// [level] (optional) is the severity level (value between 0 and 2000).
-/// [name] (optional) is the name of the source of the log message.
-/// [zone] (optional) the zone where the log was emitted
-/// [error] (optional) an error object associated with this log event.
-/// [stackTrace] (optional) a stack trace associated with this log event.
+/// [time]  (optional) is the timestamp.
+/// [sequenceNumber]  (optional) is a monotonically increasing sequence number.
+/// [level]  (optional) is the severity level (value between 0 and 2000).
+/// [name]  (optional) is the name of the source of the log message.
+/// [zone]  (optional) the zone where the log was emitted
+/// [error]  (optional) an error object associated with this log event.
+/// [stackTrace]  (optional) a stack trace associated with this log event.
 external void log(String message,
                   {DateTime time,
                    int sequenceNumber,
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index a63c557..ece22d3 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -26,7 +26,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:_internal' hide Symbol;
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
@@ -55,7 +55,7 @@
 // Not actually used, but imported since dart:html can generate these objects.
 import 'dart:_js_helper' show
     convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
-    JSName, Native, Null, Returns, Inline, ForceInline,
+    JSName, Native, Returns, ForceInline,
     findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
     makeLeafDispatchRecord;
 import 'dart:_interceptors' show
@@ -820,12 +820,10 @@
 @DomName('HTMLAudioElement')
 @Native("HTMLAudioElement")
 class AudioElement extends MediaElement {
-  // To suppress missing implicit constructor warnings.
-  factory AudioElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
-  factory AudioElement([String src]) {
+  factory AudioElement._([String src]) {
     if (src != null) {
       return AudioElement._create_1(src);
     }
@@ -839,6 +837,8 @@
    * This can only be called by subclasses from their created constructor.
    */
   AudioElement.created() : super.created();
+
+  factory AudioElement([String src]) => new AudioElement._(src);
 }
 // 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
@@ -1049,7 +1049,7 @@
   // Shadowing definition.
   String get returnValue => JS("String", "#.returnValue", this);
 
-  void set returnValue(String value) {
+  set returnValue(String value) {
     JS("void", "#.returnValue = #", this, value);
   }
 }
@@ -2372,7 +2372,7 @@
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
-  void set lineDashOffset(num value) {
+  set lineDashOffset(num value) {
     JS('void',
        'typeof #.lineDashOffset != "undefined" ? #.lineDashOffset = # : '
        '#.webkitLineDashOffset = #', this, this, value, this, value);
@@ -3458,7 +3458,7 @@
   String get background => this._background;
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     _background = value == null ? '' : value;
   }
   @Returns('String')
@@ -3469,7 +3469,7 @@
   String get backgroundAttachment => this._backgroundAttachment;
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     _backgroundAttachment = value == null ? '' : value;
   }
   @Returns('String')
@@ -3480,7 +3480,7 @@
   String get backgroundColor => this._backgroundColor;
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     _backgroundColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3491,7 +3491,7 @@
   String get backgroundImage => this._backgroundImage;
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     _backgroundImage = value == null ? '' : value;
   }
   @Returns('String')
@@ -3502,7 +3502,7 @@
   String get backgroundPosition => this._backgroundPosition;
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     _backgroundPosition = value == null ? '' : value;
   }
   @Returns('String')
@@ -3513,7 +3513,7 @@
   String get backgroundRepeat => this._backgroundRepeat;
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     _backgroundRepeat = value == null ? '' : value;
   }
   @Returns('String')
@@ -3524,7 +3524,7 @@
   String get border => this._border;
 
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     _border = value == null ? '' : value;
   }
   @Returns('String')
@@ -3535,7 +3535,7 @@
   String get borderBottom => this._borderBottom;
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     _borderBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -3546,7 +3546,7 @@
   String get borderBottomColor => this._borderBottomColor;
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     _borderBottomColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3557,7 +3557,7 @@
   String get borderBottomStyle => this._borderBottomStyle;
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     _borderBottomStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3568,7 +3568,7 @@
   String get borderBottomWidth => this._borderBottomWidth;
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     _borderBottomWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -3579,7 +3579,7 @@
   String get borderCollapse => this._borderCollapse;
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     _borderCollapse = value == null ? '' : value;
   }
   @Returns('String')
@@ -3590,7 +3590,7 @@
   String get borderColor => this._borderColor;
 
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     _borderColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3601,7 +3601,7 @@
   String get borderLeft => this._borderLeft;
 
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     _borderLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -3612,7 +3612,7 @@
   String get borderLeftColor => this._borderLeftColor;
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     _borderLeftColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3623,7 +3623,7 @@
   String get borderLeftStyle => this._borderLeftStyle;
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     _borderLeftStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3634,7 +3634,7 @@
   String get borderLeftWidth => this._borderLeftWidth;
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     _borderLeftWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -3645,7 +3645,7 @@
   String get borderRight => this._borderRight;
 
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     _borderRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -3656,7 +3656,7 @@
   String get borderRightColor => this._borderRightColor;
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     _borderRightColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3667,7 +3667,7 @@
   String get borderRightStyle => this._borderRightStyle;
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     _borderRightStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3678,7 +3678,7 @@
   String get borderRightWidth => this._borderRightWidth;
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     _borderRightWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -3689,7 +3689,7 @@
   String get borderSpacing => this._borderSpacing;
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     _borderSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -3700,7 +3700,7 @@
   String get borderStyle => this._borderStyle;
 
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     _borderStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3711,7 +3711,7 @@
   String get borderTop => this._borderTop;
 
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     _borderTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -3722,7 +3722,7 @@
   String get borderTopColor => this._borderTopColor;
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     _borderTopColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3733,7 +3733,7 @@
   String get borderTopStyle => this._borderTopStyle;
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     _borderTopStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3744,7 +3744,7 @@
   String get borderTopWidth => this._borderTopWidth;
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     _borderTopWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -3755,7 +3755,7 @@
   String get borderWidth => this._borderWidth;
 
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     _borderWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -3766,7 +3766,7 @@
   String get bottom => this._bottom;
 
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     _bottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -3777,7 +3777,7 @@
   String get captionSide => this._captionSide;
 
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     _captionSide = value == null ? '' : value;
   }
   @Returns('String')
@@ -3788,7 +3788,7 @@
   String get clear => this._clear;
 
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     _clear = value == null ? '' : value;
   }
   @Returns('String')
@@ -3799,7 +3799,7 @@
   String get clip => this._clip;
 
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     _clip = value == null ? '' : value;
   }
   @Returns('String')
@@ -3810,7 +3810,7 @@
   String get color => this._color;
 
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     _color = value == null ? '' : value;
   }
   @Returns('String')
@@ -3821,7 +3821,7 @@
   String get content => this._content;
 
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     _content = value == null ? '' : value;
   }
   @Returns('String')
@@ -3832,7 +3832,7 @@
   String get cursor => this._cursor;
 
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     _cursor = value == null ? '' : value;
   }
   @Returns('String')
@@ -3843,7 +3843,7 @@
   String get direction => this._direction;
 
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     _direction = value == null ? '' : value;
   }
   @Returns('String')
@@ -3854,7 +3854,7 @@
   String get display => this._display;
 
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     _display = value == null ? '' : value;
   }
   @Returns('String')
@@ -3865,7 +3865,7 @@
   String get emptyCells => this._emptyCells;
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     _emptyCells = value == null ? '' : value;
   }
   @Returns('String')
@@ -3876,7 +3876,7 @@
   String get font => this._font;
 
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     _font = value == null ? '' : value;
   }
   @Returns('String')
@@ -3887,7 +3887,7 @@
   String get fontFamily => this._fontFamily;
 
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     _fontFamily = value == null ? '' : value;
   }
   @Returns('String')
@@ -3898,7 +3898,7 @@
   String get fontSize => this._fontSize;
 
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     _fontSize = value == null ? '' : value;
   }
   @Returns('String')
@@ -3909,7 +3909,7 @@
   String get fontStyle => this._fontStyle;
 
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     _fontStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3920,7 +3920,7 @@
   String get fontVariant => this._fontVariant;
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     _fontVariant = value == null ? '' : value;
   }
   @Returns('String')
@@ -3931,7 +3931,7 @@
   String get fontWeight => this._fontWeight;
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     _fontWeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -3942,7 +3942,7 @@
   String get height => this._height;
 
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     _height = value == null ? '' : value;
   }
   @Returns('String')
@@ -3953,7 +3953,7 @@
   String get left => this._left;
 
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     _left = value == null ? '' : value;
   }
   @Returns('String')
@@ -3964,7 +3964,7 @@
   String get letterSpacing => this._letterSpacing;
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     _letterSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -3975,7 +3975,7 @@
   String get lineHeight => this._lineHeight;
 
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     _lineHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -3986,7 +3986,7 @@
   String get listStyle => this._listStyle;
 
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     _listStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -3997,7 +3997,7 @@
   String get listStyleImage => this._listStyleImage;
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     _listStyleImage = value == null ? '' : value;
   }
   @Returns('String')
@@ -4008,7 +4008,7 @@
   String get listStylePosition => this._listStylePosition;
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     _listStylePosition = value == null ? '' : value;
   }
   @Returns('String')
@@ -4019,7 +4019,7 @@
   String get listStyleType => this._listStyleType;
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     _listStyleType = value == null ? '' : value;
   }
   @Returns('String')
@@ -4030,7 +4030,7 @@
   String get margin => this._margin;
 
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     _margin = value == null ? '' : value;
   }
   @Returns('String')
@@ -4041,7 +4041,7 @@
   String get marginBottom => this._marginBottom;
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     _marginBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -4052,7 +4052,7 @@
   String get marginLeft => this._marginLeft;
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     _marginLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -4063,7 +4063,7 @@
   String get marginRight => this._marginRight;
 
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     _marginRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -4074,7 +4074,7 @@
   String get marginTop => this._marginTop;
 
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     _marginTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -4085,7 +4085,7 @@
   String get maxHeight => this._maxHeight;
 
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     _maxHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -4096,7 +4096,7 @@
   String get maxWidth => this._maxWidth;
 
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     _maxWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -4107,7 +4107,7 @@
   String get minHeight => this._minHeight;
 
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     _minHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -4118,7 +4118,7 @@
   String get minWidth => this._minWidth;
 
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     _minWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -4129,7 +4129,7 @@
   String get outline => this._outline;
 
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     _outline = value == null ? '' : value;
   }
   @Returns('String')
@@ -4140,7 +4140,7 @@
   String get outlineColor => this._outlineColor;
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     _outlineColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -4151,7 +4151,7 @@
   String get outlineStyle => this._outlineStyle;
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     _outlineStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -4162,7 +4162,7 @@
   String get outlineWidth => this._outlineWidth;
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     _outlineWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -4173,7 +4173,7 @@
   String get overflow => this._overflow;
 
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     _overflow = value == null ? '' : value;
   }
   @Returns('String')
@@ -4184,7 +4184,7 @@
   String get padding => this._padding;
 
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     _padding = value == null ? '' : value;
   }
   @Returns('String')
@@ -4195,7 +4195,7 @@
   String get paddingBottom => this._paddingBottom;
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     _paddingBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -4206,7 +4206,7 @@
   String get paddingLeft => this._paddingLeft;
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     _paddingLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -4217,7 +4217,7 @@
   String get paddingRight => this._paddingRight;
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     _paddingRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -4228,7 +4228,7 @@
   String get paddingTop => this._paddingTop;
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     _paddingTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -4239,7 +4239,7 @@
   String get pageBreakAfter => this._pageBreakAfter;
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     _pageBreakAfter = value == null ? '' : value;
   }
   @Returns('String')
@@ -4250,7 +4250,7 @@
   String get pageBreakBefore => this._pageBreakBefore;
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     _pageBreakBefore = value == null ? '' : value;
   }
   @Returns('String')
@@ -4261,7 +4261,7 @@
   String get pageBreakInside => this._pageBreakInside;
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     _pageBreakInside = value == null ? '' : value;
   }
   @Returns('String')
@@ -4272,7 +4272,7 @@
   String get position => this._position;
 
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     _position = value == null ? '' : value;
   }
   @Returns('String')
@@ -4283,7 +4283,7 @@
   String get quotes => this._quotes;
 
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     _quotes = value == null ? '' : value;
   }
   @Returns('String')
@@ -4294,7 +4294,7 @@
   String get right => this._right;
 
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     _right = value == null ? '' : value;
   }
   @Returns('String')
@@ -4305,7 +4305,7 @@
   String get tableLayout => this._tableLayout;
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     _tableLayout = value == null ? '' : value;
   }
   @Returns('String')
@@ -4316,7 +4316,7 @@
   String get textAlign => this._textAlign;
 
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     _textAlign = value == null ? '' : value;
   }
   @Returns('String')
@@ -4327,7 +4327,7 @@
   String get textDecoration => this._textDecoration;
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     _textDecoration = value == null ? '' : value;
   }
   @Returns('String')
@@ -4338,7 +4338,7 @@
   String get textIndent => this._textIndent;
 
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     _textIndent = value == null ? '' : value;
   }
   @Returns('String')
@@ -4349,7 +4349,7 @@
   String get textTransform => this._textTransform;
 
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     _textTransform = value == null ? '' : value;
   }
   @Returns('String')
@@ -4360,7 +4360,7 @@
   String get top => this._top;
 
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     _top = value == null ? '' : value;
   }
   @Returns('String')
@@ -4371,7 +4371,7 @@
   String get unicodeBidi => this._unicodeBidi;
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     _unicodeBidi = value == null ? '' : value;
   }
   @Returns('String')
@@ -4382,7 +4382,7 @@
   String get verticalAlign => this._verticalAlign;
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     _verticalAlign = value == null ? '' : value;
   }
   @Returns('String')
@@ -4393,7 +4393,7 @@
   String get visibility => this._visibility;
 
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     _visibility = value == null ? '' : value;
   }
   @Returns('String')
@@ -4404,7 +4404,7 @@
   String get whiteSpace => this._whiteSpace;
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     _whiteSpace = value == null ? '' : value;
   }
   @Returns('String')
@@ -4415,7 +4415,7 @@
   String get width => this._width;
 
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     _width = value == null ? '' : value;
   }
   @Returns('String')
@@ -4426,7 +4426,7 @@
   String get wordSpacing => this._wordSpacing;
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     _wordSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -4437,7 +4437,7 @@
   String get zIndex => this._zIndex;
 
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     _zIndex = value == null ? '' : value;
   }
   @Returns('String')
@@ -4473,452 +4473,452 @@
   }
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     _setAll('background', value);
   }
     
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     _setAll('backgroundAttachment', value);
   }
     
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     _setAll('backgroundColor', value);
   }
     
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     _setAll('backgroundImage', value);
   }
     
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     _setAll('backgroundPosition', value);
   }
     
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     _setAll('backgroundRepeat', value);
   }
     
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     _setAll('border', value);
   }
     
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     _setAll('borderBottom', value);
   }
     
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     _setAll('borderBottomColor', value);
   }
     
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     _setAll('borderBottomStyle', value);
   }
     
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     _setAll('borderBottomWidth', value);
   }
     
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     _setAll('borderCollapse', value);
   }
     
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     _setAll('borderColor', value);
   }
     
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     _setAll('borderLeft', value);
   }
     
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     _setAll('borderLeftColor', value);
   }
     
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     _setAll('borderLeftStyle', value);
   }
     
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     _setAll('borderLeftWidth', value);
   }
     
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     _setAll('borderRight', value);
   }
     
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     _setAll('borderRightColor', value);
   }
     
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     _setAll('borderRightStyle', value);
   }
     
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     _setAll('borderRightWidth', value);
   }
     
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     _setAll('borderSpacing', value);
   }
     
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     _setAll('borderStyle', value);
   }
     
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     _setAll('borderTop', value);
   }
     
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     _setAll('borderTopColor', value);
   }
     
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     _setAll('borderTopStyle', value);
   }
     
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     _setAll('borderTopWidth', value);
   }
     
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     _setAll('borderWidth', value);
   }
     
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     _setAll('bottom', value);
   }
     
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     _setAll('captionSide', value);
   }
     
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     _setAll('clear', value);
   }
     
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     _setAll('clip', value);
   }
     
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     _setAll('color', value);
   }
     
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     _setAll('content', value);
   }
     
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     _setAll('cursor', value);
   }
     
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     _setAll('direction', value);
   }
     
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     _setAll('display', value);
   }
     
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     _setAll('emptyCells', value);
   }
     
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     _setAll('font', value);
   }
     
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     _setAll('fontFamily', value);
   }
     
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     _setAll('fontSize', value);
   }
     
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     _setAll('fontStyle', value);
   }
     
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     _setAll('fontVariant', value);
   }
     
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     _setAll('fontWeight', value);
   }
     
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     _setAll('height', value);
   }
     
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     _setAll('left', value);
   }
     
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     _setAll('letterSpacing', value);
   }
     
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     _setAll('lineHeight', value);
   }
     
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     _setAll('listStyle', value);
   }
     
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     _setAll('listStyleImage', value);
   }
     
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     _setAll('listStylePosition', value);
   }
     
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     _setAll('listStyleType', value);
   }
     
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     _setAll('margin', value);
   }
     
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     _setAll('marginBottom', value);
   }
     
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     _setAll('marginLeft', value);
   }
     
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     _setAll('marginRight', value);
   }
     
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     _setAll('marginTop', value);
   }
     
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     _setAll('maxHeight', value);
   }
     
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     _setAll('maxWidth', value);
   }
     
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     _setAll('minHeight', value);
   }
     
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     _setAll('minWidth', value);
   }
     
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     _setAll('outline', value);
   }
     
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     _setAll('outlineColor', value);
   }
     
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     _setAll('outlineStyle', value);
   }
     
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     _setAll('outlineWidth', value);
   }
     
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     _setAll('overflow', value);
   }
     
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     _setAll('padding', value);
   }
     
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     _setAll('paddingBottom', value);
   }
     
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     _setAll('paddingLeft', value);
   }
     
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     _setAll('paddingRight', value);
   }
     
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     _setAll('paddingTop', value);
   }
     
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     _setAll('pageBreakAfter', value);
   }
     
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     _setAll('pageBreakBefore', value);
   }
     
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     _setAll('pageBreakInside', value);
   }
     
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     _setAll('position', value);
   }
     
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     _setAll('quotes', value);
   }
     
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     _setAll('right', value);
   }
     
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     _setAll('tableLayout', value);
   }
     
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     _setAll('textAlign', value);
   }
     
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     _setAll('textDecoration', value);
   }
     
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     _setAll('textIndent', value);
   }
     
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     _setAll('textTransform', value);
   }
     
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     _setAll('top', value);
   }
     
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     _setAll('unicodeBidi', value);
   }
     
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     _setAll('verticalAlign', value);
   }
     
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     _setAll('visibility', value);
   }
     
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     _setAll('whiteSpace', value);
   }
     
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     _setAll('width', value);
   }
     
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     _setAll('wordSpacing', value);
   }
     
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     _setAll('zIndex', value);
   }
     
@@ -4939,7 +4939,7 @@
     getPropertyValue('align-content');
 
   /** Sets the value of "align-content" */
-  void set alignContent(String value) {
+  set alignContent(String value) {
     setProperty('align-content', value, '');
   }
 
@@ -4948,7 +4948,7 @@
     getPropertyValue('align-items');
 
   /** Sets the value of "align-items" */
-  void set alignItems(String value) {
+  set alignItems(String value) {
     setProperty('align-items', value, '');
   }
 
@@ -4957,7 +4957,7 @@
     getPropertyValue('align-self');
 
   /** Sets the value of "align-self" */
-  void set alignSelf(String value) {
+  set alignSelf(String value) {
     setProperty('align-self', value, '');
   }
 
@@ -4966,7 +4966,7 @@
     getPropertyValue('animation');
 
   /** Sets the value of "animation" */
-  void set animation(String value) {
+  set animation(String value) {
     setProperty('animation', value, '');
   }
 
@@ -4975,7 +4975,7 @@
     getPropertyValue('animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(String value) {
+  set animationDelay(String value) {
     setProperty('animation-delay', value, '');
   }
 
@@ -4984,7 +4984,7 @@
     getPropertyValue('animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(String value) {
+  set animationDirection(String value) {
     setProperty('animation-direction', value, '');
   }
 
@@ -4993,7 +4993,7 @@
     getPropertyValue('animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(String value) {
+  set animationDuration(String value) {
     setProperty('animation-duration', value, '');
   }
 
@@ -5002,7 +5002,7 @@
     getPropertyValue('animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(String value) {
+  set animationFillMode(String value) {
     setProperty('animation-fill-mode', value, '');
   }
 
@@ -5011,7 +5011,7 @@
     getPropertyValue('animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(String value) {
+  set animationIterationCount(String value) {
     setProperty('animation-iteration-count', value, '');
   }
 
@@ -5020,7 +5020,7 @@
     getPropertyValue('animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(String value) {
+  set animationName(String value) {
     setProperty('animation-name', value, '');
   }
 
@@ -5029,7 +5029,7 @@
     getPropertyValue('animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(String value) {
+  set animationPlayState(String value) {
     setProperty('animation-play-state', value, '');
   }
 
@@ -5038,7 +5038,7 @@
     getPropertyValue('animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(String value) {
+  set animationTimingFunction(String value) {
     setProperty('animation-timing-function', value, '');
   }
 
@@ -5047,7 +5047,7 @@
     getPropertyValue('app-region');
 
   /** Sets the value of "app-region" */
-  void set appRegion(String value) {
+  set appRegion(String value) {
     setProperty('app-region', value, '');
   }
 
@@ -5056,7 +5056,7 @@
     getPropertyValue('appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(String value) {
+  set appearance(String value) {
     setProperty('appearance', value, '');
   }
 
@@ -5065,7 +5065,7 @@
     getPropertyValue('aspect-ratio');
 
   /** Sets the value of "aspect-ratio" */
-  void set aspectRatio(String value) {
+  set aspectRatio(String value) {
     setProperty('aspect-ratio', value, '');
   }
 
@@ -5074,7 +5074,7 @@
     getPropertyValue('backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(String value) {
+  set backfaceVisibility(String value) {
     setProperty('backface-visibility', value, '');
   }
 
@@ -5083,7 +5083,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -5092,7 +5092,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -5101,7 +5101,7 @@
     getPropertyValue('background-blend-mode');
 
   /** Sets the value of "background-blend-mode" */
-  void set backgroundBlendMode(String value) {
+  set backgroundBlendMode(String value) {
     setProperty('background-blend-mode', value, '');
   }
 
@@ -5110,7 +5110,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(String value) {
+  set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -5119,7 +5119,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -5128,7 +5128,7 @@
     getPropertyValue('background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(String value) {
+  set backgroundComposite(String value) {
     setProperty('background-composite', value, '');
   }
 
@@ -5137,7 +5137,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -5146,7 +5146,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(String value) {
+  set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -5155,7 +5155,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -5164,7 +5164,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(String value) {
+  set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -5173,7 +5173,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(String value) {
+  set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -5182,7 +5182,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -5191,7 +5191,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(String value) {
+  set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -5200,7 +5200,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(String value) {
+  set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -5209,7 +5209,7 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(String value) {
+  set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
@@ -5218,7 +5218,7 @@
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -5227,7 +5227,7 @@
     getPropertyValue('border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(String value) {
+  set borderAfter(String value) {
     setProperty('border-after', value, '');
   }
 
@@ -5236,7 +5236,7 @@
     getPropertyValue('border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(String value) {
+  set borderAfterColor(String value) {
     setProperty('border-after-color', value, '');
   }
 
@@ -5245,7 +5245,7 @@
     getPropertyValue('border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(String value) {
+  set borderAfterStyle(String value) {
     setProperty('border-after-style', value, '');
   }
 
@@ -5254,7 +5254,7 @@
     getPropertyValue('border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(String value) {
+  set borderAfterWidth(String value) {
     setProperty('border-after-width', value, '');
   }
 
@@ -5263,7 +5263,7 @@
     getPropertyValue('border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(String value) {
+  set borderBefore(String value) {
     setProperty('border-before', value, '');
   }
 
@@ -5272,7 +5272,7 @@
     getPropertyValue('border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(String value) {
+  set borderBeforeColor(String value) {
     setProperty('border-before-color', value, '');
   }
 
@@ -5281,7 +5281,7 @@
     getPropertyValue('border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(String value) {
+  set borderBeforeStyle(String value) {
     setProperty('border-before-style', value, '');
   }
 
@@ -5290,7 +5290,7 @@
     getPropertyValue('border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(String value) {
+  set borderBeforeWidth(String value) {
     setProperty('border-before-width', value, '');
   }
 
@@ -5299,7 +5299,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -5308,7 +5308,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -5317,7 +5317,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(String value) {
+  set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -5326,7 +5326,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(String value) {
+  set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -5335,7 +5335,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -5344,7 +5344,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -5353,7 +5353,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -5362,7 +5362,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -5371,7 +5371,7 @@
     getPropertyValue('border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(String value) {
+  set borderEnd(String value) {
     setProperty('border-end', value, '');
   }
 
@@ -5380,7 +5380,7 @@
     getPropertyValue('border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(String value) {
+  set borderEndColor(String value) {
     setProperty('border-end-color', value, '');
   }
 
@@ -5389,7 +5389,7 @@
     getPropertyValue('border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(String value) {
+  set borderEndStyle(String value) {
     setProperty('border-end-style', value, '');
   }
 
@@ -5398,7 +5398,7 @@
     getPropertyValue('border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(String value) {
+  set borderEndWidth(String value) {
     setProperty('border-end-width', value, '');
   }
 
@@ -5407,7 +5407,7 @@
     getPropertyValue('border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(String value) {
+  set borderFit(String value) {
     setProperty('border-fit', value, '');
   }
 
@@ -5416,7 +5416,7 @@
     getPropertyValue('border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(String value) {
+  set borderHorizontalSpacing(String value) {
     setProperty('border-horizontal-spacing', value, '');
   }
 
@@ -5425,7 +5425,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(String value) {
+  set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -5434,7 +5434,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(String value) {
+  set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -5443,7 +5443,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(String value) {
+  set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -5452,7 +5452,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(String value) {
+  set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -5461,7 +5461,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(String value) {
+  set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -5470,7 +5470,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(String value) {
+  set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -5479,7 +5479,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -5488,7 +5488,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -5497,7 +5497,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -5506,7 +5506,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -5515,7 +5515,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(String value) {
+  set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -5524,7 +5524,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -5533,7 +5533,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -5542,7 +5542,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -5551,7 +5551,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -5560,7 +5560,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -5569,7 +5569,7 @@
     getPropertyValue('border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(String value) {
+  set borderStart(String value) {
     setProperty('border-start', value, '');
   }
 
@@ -5578,7 +5578,7 @@
     getPropertyValue('border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(String value) {
+  set borderStartColor(String value) {
     setProperty('border-start-color', value, '');
   }
 
@@ -5587,7 +5587,7 @@
     getPropertyValue('border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(String value) {
+  set borderStartStyle(String value) {
     setProperty('border-start-style', value, '');
   }
 
@@ -5596,7 +5596,7 @@
     getPropertyValue('border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(String value) {
+  set borderStartWidth(String value) {
     setProperty('border-start-width', value, '');
   }
 
@@ -5605,7 +5605,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -5614,7 +5614,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -5623,7 +5623,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -5632,7 +5632,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(String value) {
+  set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -5641,7 +5641,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(String value) {
+  set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -5650,7 +5650,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -5659,7 +5659,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -5668,7 +5668,7 @@
     getPropertyValue('border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(String value) {
+  set borderVerticalSpacing(String value) {
     setProperty('border-vertical-spacing', value, '');
   }
 
@@ -5677,7 +5677,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -5686,7 +5686,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -5695,7 +5695,7 @@
     getPropertyValue('box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(String value) {
+  set boxAlign(String value) {
     setProperty('box-align', value, '');
   }
 
@@ -5704,7 +5704,7 @@
     getPropertyValue('box-decoration-break');
 
   /** Sets the value of "box-decoration-break" */
-  void set boxDecorationBreak(String value) {
+  set boxDecorationBreak(String value) {
     setProperty('box-decoration-break', value, '');
   }
 
@@ -5713,7 +5713,7 @@
     getPropertyValue('box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(String value) {
+  set boxDirection(String value) {
     setProperty('box-direction', value, '');
   }
 
@@ -5722,7 +5722,7 @@
     getPropertyValue('box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(String value) {
+  set boxFlex(String value) {
     setProperty('box-flex', value, '');
   }
 
@@ -5731,7 +5731,7 @@
     getPropertyValue('box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(String value) {
+  set boxFlexGroup(String value) {
     setProperty('box-flex-group', value, '');
   }
 
@@ -5740,7 +5740,7 @@
     getPropertyValue('box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(String value) {
+  set boxLines(String value) {
     setProperty('box-lines', value, '');
   }
 
@@ -5749,7 +5749,7 @@
     getPropertyValue('box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(String value) {
+  set boxOrdinalGroup(String value) {
     setProperty('box-ordinal-group', value, '');
   }
 
@@ -5758,7 +5758,7 @@
     getPropertyValue('box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(String value) {
+  set boxOrient(String value) {
     setProperty('box-orient', value, '');
   }
 
@@ -5767,7 +5767,7 @@
     getPropertyValue('box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(String value) {
+  set boxPack(String value) {
     setProperty('box-pack', value, '');
   }
 
@@ -5776,7 +5776,7 @@
     getPropertyValue('box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(String value) {
+  set boxReflect(String value) {
     setProperty('box-reflect', value, '');
   }
 
@@ -5785,7 +5785,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(String value) {
+  set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -5794,7 +5794,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(String value) {
+  set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -5803,7 +5803,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -5812,7 +5812,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -5821,7 +5821,7 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     setProperty('clip', value, '');
   }
 
@@ -5830,7 +5830,7 @@
     getPropertyValue('clip-path');
 
   /** Sets the value of "clip-path" */
-  void set clipPath(String value) {
+  set clipPath(String value) {
     setProperty('clip-path', value, '');
   }
 
@@ -5839,7 +5839,7 @@
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -5848,7 +5848,7 @@
     getPropertyValue('column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(String value) {
+  set columnBreakAfter(String value) {
     setProperty('column-break-after', value, '');
   }
 
@@ -5857,7 +5857,7 @@
     getPropertyValue('column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(String value) {
+  set columnBreakBefore(String value) {
     setProperty('column-break-before', value, '');
   }
 
@@ -5866,7 +5866,7 @@
     getPropertyValue('column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(String value) {
+  set columnBreakInside(String value) {
     setProperty('column-break-inside', value, '');
   }
 
@@ -5875,7 +5875,7 @@
     getPropertyValue('column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(String value) {
+  set columnCount(String value) {
     setProperty('column-count', value, '');
   }
 
@@ -5884,7 +5884,7 @@
     getPropertyValue('column-fill');
 
   /** Sets the value of "column-fill" */
-  void set columnFill(String value) {
+  set columnFill(String value) {
     setProperty('column-fill', value, '');
   }
 
@@ -5893,7 +5893,7 @@
     getPropertyValue('column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(String value) {
+  set columnGap(String value) {
     setProperty('column-gap', value, '');
   }
 
@@ -5902,7 +5902,7 @@
     getPropertyValue('column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(String value) {
+  set columnRule(String value) {
     setProperty('column-rule', value, '');
   }
 
@@ -5911,7 +5911,7 @@
     getPropertyValue('column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(String value) {
+  set columnRuleColor(String value) {
     setProperty('column-rule-color', value, '');
   }
 
@@ -5920,7 +5920,7 @@
     getPropertyValue('column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(String value) {
+  set columnRuleStyle(String value) {
     setProperty('column-rule-style', value, '');
   }
 
@@ -5929,7 +5929,7 @@
     getPropertyValue('column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(String value) {
+  set columnRuleWidth(String value) {
     setProperty('column-rule-width', value, '');
   }
 
@@ -5938,7 +5938,7 @@
     getPropertyValue('column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(String value) {
+  set columnSpan(String value) {
     setProperty('column-span', value, '');
   }
 
@@ -5947,7 +5947,7 @@
     getPropertyValue('column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(String value) {
+  set columnWidth(String value) {
     setProperty('column-width', value, '');
   }
 
@@ -5956,7 +5956,7 @@
     getPropertyValue('columns');
 
   /** Sets the value of "columns" */
-  void set columns(String value) {
+  set columns(String value) {
     setProperty('columns', value, '');
   }
 
@@ -5965,7 +5965,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -5974,7 +5974,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(String value) {
+  set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -5983,7 +5983,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(String value) {
+  set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -5992,7 +5992,7 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
@@ -6001,7 +6001,7 @@
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -6010,7 +6010,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -6019,7 +6019,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -6028,7 +6028,7 @@
     getPropertyValue('filter');
 
   /** Sets the value of "filter" */
-  void set filter(String value) {
+  set filter(String value) {
     setProperty('filter', value, '');
   }
 
@@ -6037,7 +6037,7 @@
     getPropertyValue('flex');
 
   /** Sets the value of "flex" */
-  void set flex(String value) {
+  set flex(String value) {
     setProperty('flex', value, '');
   }
 
@@ -6046,7 +6046,7 @@
     getPropertyValue('flex-basis');
 
   /** Sets the value of "flex-basis" */
-  void set flexBasis(String value) {
+  set flexBasis(String value) {
     setProperty('flex-basis', value, '');
   }
 
@@ -6055,7 +6055,7 @@
     getPropertyValue('flex-direction');
 
   /** Sets the value of "flex-direction" */
-  void set flexDirection(String value) {
+  set flexDirection(String value) {
     setProperty('flex-direction', value, '');
   }
 
@@ -6064,7 +6064,7 @@
     getPropertyValue('flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(String value) {
+  set flexFlow(String value) {
     setProperty('flex-flow', value, '');
   }
 
@@ -6073,7 +6073,7 @@
     getPropertyValue('flex-grow');
 
   /** Sets the value of "flex-grow" */
-  void set flexGrow(String value) {
+  set flexGrow(String value) {
     setProperty('flex-grow', value, '');
   }
 
@@ -6082,7 +6082,7 @@
     getPropertyValue('flex-shrink');
 
   /** Sets the value of "flex-shrink" */
-  void set flexShrink(String value) {
+  set flexShrink(String value) {
     setProperty('flex-shrink', value, '');
   }
 
@@ -6091,7 +6091,7 @@
     getPropertyValue('flex-wrap');
 
   /** Sets the value of "flex-wrap" */
-  void set flexWrap(String value) {
+  set flexWrap(String value) {
     setProperty('flex-wrap', value, '');
   }
 
@@ -6100,7 +6100,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(String value) {
+  set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -6109,7 +6109,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -6118,7 +6118,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -6127,7 +6127,7 @@
     getPropertyValue('font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(String value) {
+  set fontFeatureSettings(String value) {
     setProperty('font-feature-settings', value, '');
   }
 
@@ -6136,7 +6136,7 @@
     getPropertyValue('font-kerning');
 
   /** Sets the value of "font-kerning" */
-  void set fontKerning(String value) {
+  set fontKerning(String value) {
     setProperty('font-kerning', value, '');
   }
 
@@ -6145,7 +6145,7 @@
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -6154,7 +6154,7 @@
     getPropertyValue('font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(String value) {
+  set fontSizeDelta(String value) {
     setProperty('font-size-delta', value, '');
   }
 
@@ -6163,7 +6163,7 @@
     getPropertyValue('font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(String value) {
+  set fontSmoothing(String value) {
     setProperty('font-smoothing', value, '');
   }
 
@@ -6172,7 +6172,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(String value) {
+  set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -6181,7 +6181,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -6190,7 +6190,7 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
@@ -6199,7 +6199,7 @@
     getPropertyValue('font-variant-ligatures');
 
   /** Sets the value of "font-variant-ligatures" */
-  void set fontVariantLigatures(String value) {
+  set fontVariantLigatures(String value) {
     setProperty('font-variant-ligatures', value, '');
   }
 
@@ -6208,7 +6208,7 @@
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
@@ -6217,7 +6217,7 @@
     getPropertyValue('grid');
 
   /** Sets the value of "grid" */
-  void set grid(String value) {
+  set grid(String value) {
     setProperty('grid', value, '');
   }
 
@@ -6226,7 +6226,7 @@
     getPropertyValue('grid-area');
 
   /** Sets the value of "grid-area" */
-  void set gridArea(String value) {
+  set gridArea(String value) {
     setProperty('grid-area', value, '');
   }
 
@@ -6235,7 +6235,7 @@
     getPropertyValue('grid-auto-columns');
 
   /** Sets the value of "grid-auto-columns" */
-  void set gridAutoColumns(String value) {
+  set gridAutoColumns(String value) {
     setProperty('grid-auto-columns', value, '');
   }
 
@@ -6244,7 +6244,7 @@
     getPropertyValue('grid-auto-flow');
 
   /** Sets the value of "grid-auto-flow" */
-  void set gridAutoFlow(String value) {
+  set gridAutoFlow(String value) {
     setProperty('grid-auto-flow', value, '');
   }
 
@@ -6253,7 +6253,7 @@
     getPropertyValue('grid-auto-rows');
 
   /** Sets the value of "grid-auto-rows" */
-  void set gridAutoRows(String value) {
+  set gridAutoRows(String value) {
     setProperty('grid-auto-rows', value, '');
   }
 
@@ -6262,7 +6262,7 @@
     getPropertyValue('grid-column');
 
   /** Sets the value of "grid-column" */
-  void set gridColumn(String value) {
+  set gridColumn(String value) {
     setProperty('grid-column', value, '');
   }
 
@@ -6271,7 +6271,7 @@
     getPropertyValue('grid-column-end');
 
   /** Sets the value of "grid-column-end" */
-  void set gridColumnEnd(String value) {
+  set gridColumnEnd(String value) {
     setProperty('grid-column-end', value, '');
   }
 
@@ -6280,7 +6280,7 @@
     getPropertyValue('grid-column-start');
 
   /** Sets the value of "grid-column-start" */
-  void set gridColumnStart(String value) {
+  set gridColumnStart(String value) {
     setProperty('grid-column-start', value, '');
   }
 
@@ -6289,7 +6289,7 @@
     getPropertyValue('grid-row');
 
   /** Sets the value of "grid-row" */
-  void set gridRow(String value) {
+  set gridRow(String value) {
     setProperty('grid-row', value, '');
   }
 
@@ -6298,7 +6298,7 @@
     getPropertyValue('grid-row-end');
 
   /** Sets the value of "grid-row-end" */
-  void set gridRowEnd(String value) {
+  set gridRowEnd(String value) {
     setProperty('grid-row-end', value, '');
   }
 
@@ -6307,7 +6307,7 @@
     getPropertyValue('grid-row-start');
 
   /** Sets the value of "grid-row-start" */
-  void set gridRowStart(String value) {
+  set gridRowStart(String value) {
     setProperty('grid-row-start', value, '');
   }
 
@@ -6316,7 +6316,7 @@
     getPropertyValue('grid-template');
 
   /** Sets the value of "grid-template" */
-  void set gridTemplate(String value) {
+  set gridTemplate(String value) {
     setProperty('grid-template', value, '');
   }
 
@@ -6325,7 +6325,7 @@
     getPropertyValue('grid-template-areas');
 
   /** Sets the value of "grid-template-areas" */
-  void set gridTemplateAreas(String value) {
+  set gridTemplateAreas(String value) {
     setProperty('grid-template-areas', value, '');
   }
 
@@ -6334,7 +6334,7 @@
     getPropertyValue('grid-template-columns');
 
   /** Sets the value of "grid-template-columns" */
-  void set gridTemplateColumns(String value) {
+  set gridTemplateColumns(String value) {
     setProperty('grid-template-columns', value, '');
   }
 
@@ -6343,7 +6343,7 @@
     getPropertyValue('grid-template-rows');
 
   /** Sets the value of "grid-template-rows" */
-  void set gridTemplateRows(String value) {
+  set gridTemplateRows(String value) {
     setProperty('grid-template-rows', value, '');
   }
 
@@ -6352,7 +6352,7 @@
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -6361,7 +6361,7 @@
     getPropertyValue('highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(String value) {
+  set highlight(String value) {
     setProperty('highlight', value, '');
   }
 
@@ -6370,7 +6370,7 @@
     getPropertyValue('hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(String value) {
+  set hyphenateCharacter(String value) {
     setProperty('hyphenate-character', value, '');
   }
 
@@ -6379,7 +6379,7 @@
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(String value) {
+  set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
@@ -6388,7 +6388,7 @@
     getPropertyValue('isolation');
 
   /** Sets the value of "isolation" */
-  void set isolation(String value) {
+  set isolation(String value) {
     setProperty('isolation', value, '');
   }
 
@@ -6397,7 +6397,7 @@
     getPropertyValue('justify-content');
 
   /** Sets the value of "justify-content" */
-  void set justifyContent(String value) {
+  set justifyContent(String value) {
     setProperty('justify-content', value, '');
   }
 
@@ -6406,7 +6406,7 @@
     getPropertyValue('justify-self');
 
   /** Sets the value of "justify-self" */
-  void set justifySelf(String value) {
+  set justifySelf(String value) {
     setProperty('justify-self', value, '');
   }
 
@@ -6415,7 +6415,7 @@
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -6424,7 +6424,7 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
@@ -6433,7 +6433,7 @@
     getPropertyValue('line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(String value) {
+  set lineBoxContain(String value) {
     setProperty('line-box-contain', value, '');
   }
 
@@ -6442,7 +6442,7 @@
     getPropertyValue('line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(String value) {
+  set lineBreak(String value) {
     setProperty('line-break', value, '');
   }
 
@@ -6451,7 +6451,7 @@
     getPropertyValue('line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(String value) {
+  set lineClamp(String value) {
     setProperty('line-clamp', value, '');
   }
 
@@ -6460,7 +6460,7 @@
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
@@ -6469,7 +6469,7 @@
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -6478,7 +6478,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -6487,7 +6487,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -6496,7 +6496,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -6505,7 +6505,7 @@
     getPropertyValue('locale');
 
   /** Sets the value of "locale" */
-  void set locale(String value) {
+  set locale(String value) {
     setProperty('locale', value, '');
   }
 
@@ -6514,7 +6514,7 @@
     getPropertyValue('logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(String value) {
+  set logicalHeight(String value) {
     setProperty('logical-height', value, '');
   }
 
@@ -6523,7 +6523,7 @@
     getPropertyValue('logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(String value) {
+  set logicalWidth(String value) {
     setProperty('logical-width', value, '');
   }
 
@@ -6532,7 +6532,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -6541,7 +6541,7 @@
     getPropertyValue('margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(String value) {
+  set marginAfter(String value) {
     setProperty('margin-after', value, '');
   }
 
@@ -6550,7 +6550,7 @@
     getPropertyValue('margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(String value) {
+  set marginAfterCollapse(String value) {
     setProperty('margin-after-collapse', value, '');
   }
 
@@ -6559,7 +6559,7 @@
     getPropertyValue('margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(String value) {
+  set marginBefore(String value) {
     setProperty('margin-before', value, '');
   }
 
@@ -6568,7 +6568,7 @@
     getPropertyValue('margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(String value) {
+  set marginBeforeCollapse(String value) {
     setProperty('margin-before-collapse', value, '');
   }
 
@@ -6577,7 +6577,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -6586,7 +6586,7 @@
     getPropertyValue('margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(String value) {
+  set marginBottomCollapse(String value) {
     setProperty('margin-bottom-collapse', value, '');
   }
 
@@ -6595,7 +6595,7 @@
     getPropertyValue('margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(String value) {
+  set marginCollapse(String value) {
     setProperty('margin-collapse', value, '');
   }
 
@@ -6604,7 +6604,7 @@
     getPropertyValue('margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(String value) {
+  set marginEnd(String value) {
     setProperty('margin-end', value, '');
   }
 
@@ -6613,7 +6613,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -6622,7 +6622,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -6631,7 +6631,7 @@
     getPropertyValue('margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(String value) {
+  set marginStart(String value) {
     setProperty('margin-start', value, '');
   }
 
@@ -6640,7 +6640,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -6649,7 +6649,7 @@
     getPropertyValue('margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(String value) {
+  set marginTopCollapse(String value) {
     setProperty('margin-top-collapse', value, '');
   }
 
@@ -6658,7 +6658,7 @@
     getPropertyValue('mask');
 
   /** Sets the value of "mask" */
-  void set mask(String value) {
+  set mask(String value) {
     setProperty('mask', value, '');
   }
 
@@ -6667,7 +6667,7 @@
     getPropertyValue('mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(String value) {
+  set maskBoxImage(String value) {
     setProperty('mask-box-image', value, '');
   }
 
@@ -6676,7 +6676,7 @@
     getPropertyValue('mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(String value) {
+  set maskBoxImageOutset(String value) {
     setProperty('mask-box-image-outset', value, '');
   }
 
@@ -6685,7 +6685,7 @@
     getPropertyValue('mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(String value) {
+  set maskBoxImageRepeat(String value) {
     setProperty('mask-box-image-repeat', value, '');
   }
 
@@ -6694,7 +6694,7 @@
     getPropertyValue('mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(String value) {
+  set maskBoxImageSlice(String value) {
     setProperty('mask-box-image-slice', value, '');
   }
 
@@ -6703,7 +6703,7 @@
     getPropertyValue('mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(String value) {
+  set maskBoxImageSource(String value) {
     setProperty('mask-box-image-source', value, '');
   }
 
@@ -6712,7 +6712,7 @@
     getPropertyValue('mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(String value) {
+  set maskBoxImageWidth(String value) {
     setProperty('mask-box-image-width', value, '');
   }
 
@@ -6721,7 +6721,7 @@
     getPropertyValue('mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(String value) {
+  set maskClip(String value) {
     setProperty('mask-clip', value, '');
   }
 
@@ -6730,7 +6730,7 @@
     getPropertyValue('mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(String value) {
+  set maskComposite(String value) {
     setProperty('mask-composite', value, '');
   }
 
@@ -6739,7 +6739,7 @@
     getPropertyValue('mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(String value) {
+  set maskImage(String value) {
     setProperty('mask-image', value, '');
   }
 
@@ -6748,7 +6748,7 @@
     getPropertyValue('mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(String value) {
+  set maskOrigin(String value) {
     setProperty('mask-origin', value, '');
   }
 
@@ -6757,7 +6757,7 @@
     getPropertyValue('mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(String value) {
+  set maskPosition(String value) {
     setProperty('mask-position', value, '');
   }
 
@@ -6766,7 +6766,7 @@
     getPropertyValue('mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(String value) {
+  set maskPositionX(String value) {
     setProperty('mask-position-x', value, '');
   }
 
@@ -6775,7 +6775,7 @@
     getPropertyValue('mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(String value) {
+  set maskPositionY(String value) {
     setProperty('mask-position-y', value, '');
   }
 
@@ -6784,7 +6784,7 @@
     getPropertyValue('mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(String value) {
+  set maskRepeat(String value) {
     setProperty('mask-repeat', value, '');
   }
 
@@ -6793,7 +6793,7 @@
     getPropertyValue('mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(String value) {
+  set maskRepeatX(String value) {
     setProperty('mask-repeat-x', value, '');
   }
 
@@ -6802,7 +6802,7 @@
     getPropertyValue('mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(String value) {
+  set maskRepeatY(String value) {
     setProperty('mask-repeat-y', value, '');
   }
 
@@ -6811,7 +6811,7 @@
     getPropertyValue('mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(String value) {
+  set maskSize(String value) {
     setProperty('mask-size', value, '');
   }
 
@@ -6820,7 +6820,7 @@
     getPropertyValue('mask-source-type');
 
   /** Sets the value of "mask-source-type" */
-  void set maskSourceType(String value) {
+  set maskSourceType(String value) {
     setProperty('mask-source-type', value, '');
   }
 
@@ -6829,7 +6829,7 @@
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -6838,7 +6838,7 @@
     getPropertyValue('max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(String value) {
+  set maxLogicalHeight(String value) {
     setProperty('max-logical-height', value, '');
   }
 
@@ -6847,7 +6847,7 @@
     getPropertyValue('max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(String value) {
+  set maxLogicalWidth(String value) {
     setProperty('max-logical-width', value, '');
   }
 
@@ -6856,7 +6856,7 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
@@ -6865,7 +6865,7 @@
     getPropertyValue('max-zoom');
 
   /** Sets the value of "max-zoom" */
-  void set maxZoom(String value) {
+  set maxZoom(String value) {
     setProperty('max-zoom', value, '');
   }
 
@@ -6874,7 +6874,7 @@
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -6883,7 +6883,7 @@
     getPropertyValue('min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(String value) {
+  set minLogicalHeight(String value) {
     setProperty('min-logical-height', value, '');
   }
 
@@ -6892,7 +6892,7 @@
     getPropertyValue('min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(String value) {
+  set minLogicalWidth(String value) {
     setProperty('min-logical-width', value, '');
   }
 
@@ -6901,7 +6901,7 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
@@ -6910,7 +6910,7 @@
     getPropertyValue('min-zoom');
 
   /** Sets the value of "min-zoom" */
-  void set minZoom(String value) {
+  set minZoom(String value) {
     setProperty('min-zoom', value, '');
   }
 
@@ -6919,7 +6919,7 @@
     getPropertyValue('mix-blend-mode');
 
   /** Sets the value of "mix-blend-mode" */
-  void set mixBlendMode(String value) {
+  set mixBlendMode(String value) {
     setProperty('mix-blend-mode', value, '');
   }
 
@@ -6928,7 +6928,7 @@
     getPropertyValue('object-fit');
 
   /** Sets the value of "object-fit" */
-  void set objectFit(String value) {
+  set objectFit(String value) {
     setProperty('object-fit', value, '');
   }
 
@@ -6937,7 +6937,7 @@
     getPropertyValue('object-position');
 
   /** Sets the value of "object-position" */
-  void set objectPosition(String value) {
+  set objectPosition(String value) {
     setProperty('object-position', value, '');
   }
 
@@ -6946,7 +6946,7 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(String value) {
+  set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
@@ -6955,7 +6955,7 @@
     getPropertyValue('order');
 
   /** Sets the value of "order" */
-  void set order(String value) {
+  set order(String value) {
     setProperty('order', value, '');
   }
 
@@ -6964,7 +6964,7 @@
     getPropertyValue('orientation');
 
   /** Sets the value of "orientation" */
-  void set orientation(String value) {
+  set orientation(String value) {
     setProperty('orientation', value, '');
   }
 
@@ -6973,7 +6973,7 @@
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(String value) {
+  set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -6982,7 +6982,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -6991,7 +6991,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -7000,7 +7000,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(String value) {
+  set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -7009,7 +7009,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -7018,7 +7018,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -7027,7 +7027,7 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
@@ -7036,7 +7036,7 @@
     getPropertyValue('overflow-wrap');
 
   /** Sets the value of "overflow-wrap" */
-  void set overflowWrap(String value) {
+  set overflowWrap(String value) {
     setProperty('overflow-wrap', value, '');
   }
 
@@ -7045,7 +7045,7 @@
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(String value) {
+  set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -7054,7 +7054,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(String value) {
+  set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -7063,7 +7063,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -7072,7 +7072,7 @@
     getPropertyValue('padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(String value) {
+  set paddingAfter(String value) {
     setProperty('padding-after', value, '');
   }
 
@@ -7081,7 +7081,7 @@
     getPropertyValue('padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(String value) {
+  set paddingBefore(String value) {
     setProperty('padding-before', value, '');
   }
 
@@ -7090,7 +7090,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -7099,7 +7099,7 @@
     getPropertyValue('padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(String value) {
+  set paddingEnd(String value) {
     setProperty('padding-end', value, '');
   }
 
@@ -7108,7 +7108,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -7117,7 +7117,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -7126,7 +7126,7 @@
     getPropertyValue('padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(String value) {
+  set paddingStart(String value) {
     setProperty('padding-start', value, '');
   }
 
@@ -7135,7 +7135,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -7144,7 +7144,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(String value) {
+  set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -7153,7 +7153,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -7162,7 +7162,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -7171,7 +7171,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -7180,7 +7180,7 @@
     getPropertyValue('perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(String value) {
+  set perspective(String value) {
     setProperty('perspective', value, '');
   }
 
@@ -7189,7 +7189,7 @@
     getPropertyValue('perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(String value) {
+  set perspectiveOrigin(String value) {
     setProperty('perspective-origin', value, '');
   }
 
@@ -7198,7 +7198,7 @@
     getPropertyValue('perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(String value) {
+  set perspectiveOriginX(String value) {
     setProperty('perspective-origin-x', value, '');
   }
 
@@ -7207,7 +7207,7 @@
     getPropertyValue('perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(String value) {
+  set perspectiveOriginY(String value) {
     setProperty('perspective-origin-y', value, '');
   }
 
@@ -7216,7 +7216,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(String value) {
+  set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -7225,7 +7225,7 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     setProperty('position', value, '');
   }
 
@@ -7234,7 +7234,7 @@
     getPropertyValue('print-color-adjust');
 
   /** Sets the value of "print-color-adjust" */
-  void set printColorAdjust(String value) {
+  set printColorAdjust(String value) {
     setProperty('print-color-adjust', value, '');
   }
 
@@ -7243,7 +7243,7 @@
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -7252,7 +7252,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(String value) {
+  set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -7261,7 +7261,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -7270,7 +7270,7 @@
     getPropertyValue('rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(String value) {
+  set rtlOrdering(String value) {
     setProperty('rtl-ordering', value, '');
   }
 
@@ -7279,7 +7279,7 @@
     getPropertyValue('ruby-position');
 
   /** Sets the value of "ruby-position" */
-  void set rubyPosition(String value) {
+  set rubyPosition(String value) {
     setProperty('ruby-position', value, '');
   }
 
@@ -7288,7 +7288,7 @@
     getPropertyValue('scroll-behavior');
 
   /** Sets the value of "scroll-behavior" */
-  void set scrollBehavior(String value) {
+  set scrollBehavior(String value) {
     setProperty('scroll-behavior', value, '');
   }
 
@@ -7297,7 +7297,7 @@
     getPropertyValue('shape-image-threshold');
 
   /** Sets the value of "shape-image-threshold" */
-  void set shapeImageThreshold(String value) {
+  set shapeImageThreshold(String value) {
     setProperty('shape-image-threshold', value, '');
   }
 
@@ -7306,7 +7306,7 @@
     getPropertyValue('shape-margin');
 
   /** Sets the value of "shape-margin" */
-  void set shapeMargin(String value) {
+  set shapeMargin(String value) {
     setProperty('shape-margin', value, '');
   }
 
@@ -7315,7 +7315,7 @@
     getPropertyValue('shape-outside');
 
   /** Sets the value of "shape-outside" */
-  void set shapeOutside(String value) {
+  set shapeOutside(String value) {
     setProperty('shape-outside', value, '');
   }
 
@@ -7324,7 +7324,7 @@
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(String value) {
+  set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -7333,7 +7333,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(String value) {
+  set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -7342,7 +7342,7 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(String value) {
+  set src(String value) {
     setProperty('src', value, '');
   }
 
@@ -7351,7 +7351,7 @@
     getPropertyValue('tab-size');
 
   /** Sets the value of "tab-size" */
-  void set tabSize(String value) {
+  set tabSize(String value) {
     setProperty('tab-size', value, '');
   }
 
@@ -7360,7 +7360,7 @@
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -7369,7 +7369,7 @@
     getPropertyValue('tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(String value) {
+  set tapHighlightColor(String value) {
     setProperty('tap-highlight-color', value, '');
   }
 
@@ -7378,7 +7378,7 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
@@ -7387,7 +7387,7 @@
     getPropertyValue('text-align-last');
 
   /** Sets the value of "text-align-last" */
-  void set textAlignLast(String value) {
+  set textAlignLast(String value) {
     setProperty('text-align-last', value, '');
   }
 
@@ -7396,7 +7396,7 @@
     getPropertyValue('text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(String value) {
+  set textCombine(String value) {
     setProperty('text-combine', value, '');
   }
 
@@ -7405,7 +7405,7 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
@@ -7414,7 +7414,7 @@
     getPropertyValue('text-decoration-color');
 
   /** Sets the value of "text-decoration-color" */
-  void set textDecorationColor(String value) {
+  set textDecorationColor(String value) {
     setProperty('text-decoration-color', value, '');
   }
 
@@ -7423,7 +7423,7 @@
     getPropertyValue('text-decoration-line');
 
   /** Sets the value of "text-decoration-line" */
-  void set textDecorationLine(String value) {
+  set textDecorationLine(String value) {
     setProperty('text-decoration-line', value, '');
   }
 
@@ -7432,7 +7432,7 @@
     getPropertyValue('text-decoration-style');
 
   /** Sets the value of "text-decoration-style" */
-  void set textDecorationStyle(String value) {
+  set textDecorationStyle(String value) {
     setProperty('text-decoration-style', value, '');
   }
 
@@ -7441,7 +7441,7 @@
     getPropertyValue('text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(String value) {
+  set textDecorationsInEffect(String value) {
     setProperty('text-decorations-in-effect', value, '');
   }
 
@@ -7450,7 +7450,7 @@
     getPropertyValue('text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(String value) {
+  set textEmphasis(String value) {
     setProperty('text-emphasis', value, '');
   }
 
@@ -7459,7 +7459,7 @@
     getPropertyValue('text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(String value) {
+  set textEmphasisColor(String value) {
     setProperty('text-emphasis-color', value, '');
   }
 
@@ -7468,7 +7468,7 @@
     getPropertyValue('text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(String value) {
+  set textEmphasisPosition(String value) {
     setProperty('text-emphasis-position', value, '');
   }
 
@@ -7477,7 +7477,7 @@
     getPropertyValue('text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(String value) {
+  set textEmphasisStyle(String value) {
     setProperty('text-emphasis-style', value, '');
   }
 
@@ -7486,7 +7486,7 @@
     getPropertyValue('text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(String value) {
+  set textFillColor(String value) {
     setProperty('text-fill-color', value, '');
   }
 
@@ -7495,7 +7495,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -7504,7 +7504,7 @@
     getPropertyValue('text-justify');
 
   /** Sets the value of "text-justify" */
-  void set textJustify(String value) {
+  set textJustify(String value) {
     setProperty('text-justify', value, '');
   }
 
@@ -7513,7 +7513,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(String value) {
+  set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -7522,7 +7522,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(String value) {
+  set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -7531,7 +7531,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(String value) {
+  set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -7540,7 +7540,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(String value) {
+  set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -7549,7 +7549,7 @@
     getPropertyValue('text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(String value) {
+  set textOrientation(String value) {
     setProperty('text-orientation', value, '');
   }
 
@@ -7558,7 +7558,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(String value) {
+  set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -7567,7 +7567,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(String value) {
+  set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -7576,7 +7576,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(String value) {
+  set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -7585,7 +7585,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(String value) {
+  set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -7594,7 +7594,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(String value) {
+  set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -7603,7 +7603,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(String value) {
+  set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -7612,7 +7612,7 @@
     getPropertyValue('text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(String value) {
+  set textSecurity(String value) {
     setProperty('text-security', value, '');
   }
 
@@ -7621,7 +7621,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(String value) {
+  set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -7630,7 +7630,7 @@
     getPropertyValue('text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(String value) {
+  set textStroke(String value) {
     setProperty('text-stroke', value, '');
   }
 
@@ -7639,7 +7639,7 @@
     getPropertyValue('text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(String value) {
+  set textStrokeColor(String value) {
     setProperty('text-stroke-color', value, '');
   }
 
@@ -7648,7 +7648,7 @@
     getPropertyValue('text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(String value) {
+  set textStrokeWidth(String value) {
     setProperty('text-stroke-width', value, '');
   }
 
@@ -7657,7 +7657,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -7666,7 +7666,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(String value) {
+  set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -7675,7 +7675,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(String value) {
+  set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -7684,7 +7684,7 @@
     getPropertyValue('text-underline-position');
 
   /** Sets the value of "text-underline-position" */
-  void set textUnderlinePosition(String value) {
+  set textUnderlinePosition(String value) {
     setProperty('text-underline-position', value, '');
   }
 
@@ -7693,7 +7693,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(String value) {
+  set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -7702,7 +7702,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(String value) {
+  set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -7711,7 +7711,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -7720,7 +7720,7 @@
     getPropertyValue('touch-action');
 
   /** Sets the value of "touch-action" */
-  void set touchAction(String value) {
+  set touchAction(String value) {
     setProperty('touch-action', value, '');
   }
 
@@ -7729,7 +7729,7 @@
     getPropertyValue('touch-action-delay');
 
   /** Sets the value of "touch-action-delay" */
-  void set touchActionDelay(String value) {
+  set touchActionDelay(String value) {
     setProperty('touch-action-delay', value, '');
   }
 
@@ -7738,7 +7738,7 @@
     getPropertyValue('transform');
 
   /** Sets the value of "transform" */
-  void set transform(String value) {
+  set transform(String value) {
     setProperty('transform', value, '');
   }
 
@@ -7747,7 +7747,7 @@
     getPropertyValue('transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(String value) {
+  set transformOrigin(String value) {
     setProperty('transform-origin', value, '');
   }
 
@@ -7756,7 +7756,7 @@
     getPropertyValue('transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(String value) {
+  set transformOriginX(String value) {
     setProperty('transform-origin-x', value, '');
   }
 
@@ -7765,7 +7765,7 @@
     getPropertyValue('transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(String value) {
+  set transformOriginY(String value) {
     setProperty('transform-origin-y', value, '');
   }
 
@@ -7774,7 +7774,7 @@
     getPropertyValue('transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(String value) {
+  set transformOriginZ(String value) {
     setProperty('transform-origin-z', value, '');
   }
 
@@ -7783,7 +7783,7 @@
     getPropertyValue('transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(String value) {
+  set transformStyle(String value) {
     setProperty('transform-style', value, '');
   }
 
@@ -7798,7 +7798,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void set transition(String value) {
+  set transition(String value) {
     setProperty('transition', value, '');
   }
 
@@ -7807,7 +7807,7 @@
     getPropertyValue('transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(String value) {
+  set transitionDelay(String value) {
     setProperty('transition-delay', value, '');
   }
 
@@ -7816,7 +7816,7 @@
     getPropertyValue('transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(String value) {
+  set transitionDuration(String value) {
     setProperty('transition-duration', value, '');
   }
 
@@ -7825,7 +7825,7 @@
     getPropertyValue('transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(String value) {
+  set transitionProperty(String value) {
     setProperty('transition-property', value, '');
   }
 
@@ -7834,7 +7834,7 @@
     getPropertyValue('transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(String value) {
+  set transitionTimingFunction(String value) {
     setProperty('transition-timing-function', value, '');
   }
 
@@ -7843,7 +7843,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -7852,7 +7852,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(String value) {
+  set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -7861,7 +7861,7 @@
     getPropertyValue('user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(String value) {
+  set userDrag(String value) {
     setProperty('user-drag', value, '');
   }
 
@@ -7870,7 +7870,7 @@
     getPropertyValue('user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(String value) {
+  set userModify(String value) {
     setProperty('user-modify', value, '');
   }
 
@@ -7879,7 +7879,7 @@
     getPropertyValue('user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(String value) {
+  set userSelect(String value) {
     setProperty('user-select', value, '');
   }
 
@@ -7888,7 +7888,7 @@
     getPropertyValue('user-zoom');
 
   /** Sets the value of "user-zoom" */
-  void set userZoom(String value) {
+  set userZoom(String value) {
     setProperty('user-zoom', value, '');
   }
 
@@ -7897,7 +7897,7 @@
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -7906,7 +7906,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -7915,7 +7915,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -7924,7 +7924,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(String value) {
+  set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -7933,7 +7933,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -7942,7 +7942,7 @@
     getPropertyValue('will-change');
 
   /** Sets the value of "will-change" */
-  void set willChange(String value) {
+  set willChange(String value) {
     setProperty('will-change', value, '');
   }
 
@@ -7951,7 +7951,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(String value) {
+  set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -7960,7 +7960,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -7969,7 +7969,7 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(String value) {
+  set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
@@ -7978,7 +7978,7 @@
     getPropertyValue('wrap-flow');
 
   /** Sets the value of "wrap-flow" */
-  void set wrapFlow(String value) {
+  set wrapFlow(String value) {
     setProperty('wrap-flow', value, '');
   }
 
@@ -7987,7 +7987,7 @@
     getPropertyValue('wrap-through');
 
   /** Sets the value of "wrap-through" */
-  void set wrapThrough(String value) {
+  set wrapThrough(String value) {
     setProperty('wrap-through', value, '');
   }
 
@@ -7996,7 +7996,7 @@
     getPropertyValue('writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(String value) {
+  set writingMode(String value) {
     setProperty('writing-mode', value, '');
   }
 
@@ -8005,7 +8005,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -8014,7 +8014,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(String value) {
+  set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
@@ -9232,9 +9232,10 @@
   @DocsEditable()
   Element _createElement(String localName_OR_tagName, [String typeExtension]) native;
 
+  @JSName('createElementNS')
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) native;
+  Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) native;
 
   @JSName('createEvent')
   @DomName('Document.createEvent')
@@ -9833,7 +9834,32 @@
 
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
-    return _createElement(tagName, typeExtension);
+    if (typeExtension == null) {
+      return _createElement_2(tagName);
+    } else {
+      return _createElement(tagName, typeExtension);
+    }
+  }
+
+  // The two-argument version of this is automatically generated, but we need to
+  // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
+  @DomName('Document.createElement')
+  _createElement_2(String tagName) => JS('', '#.createElement(#)', this, tagName);
+
+  // The three-argument version of this is automatically generated, but we need to
+  // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
+  @DomName('Document.createElementNS')
+  _createElementNS_2(String namespaceURI, String qualifiedName) =>
+      JS('', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
+
+  @DomName('Document.createElementNS')
+  @DocsEditable()
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+    if (typeExtension == null) {
+      return _createElementNS_2(namespaceURI, qualifiedName);
+    } else {
+      return _createElementNS(namespaceURI, qualifiedName, typeExtension);
+    }
   }
 
   @DomName('Document.createNodeIterator')
@@ -9887,7 +9913,7 @@
     return _docChildren;
   }
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -9909,14 +9935,13 @@
   ElementList<Element> querySelectorAll(String selectors) =>
     new _FrozenElementList._wrap(_querySelectorAll(selectors));
 
-
   String get innerHtml {
     final e = new Element.tag("div");
     e.append(this.clone(true));
     return e.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
@@ -10179,154 +10204,154 @@
   // Shadowing definition.
   num get a => JS("num", "#.a", this);
 
-  void set a(num value) {
+  set a(num value) {
     JS("void", "#.a = #", this, value);
   }
 
   // Shadowing definition.
   num get b => JS("num", "#.b", this);
 
-  void set b(num value) {
+  set b(num value) {
     JS("void", "#.b = #", this, value);
   }
 
   // Shadowing definition.
   num get c => JS("num", "#.c", this);
 
-  void set c(num value) {
+  set c(num value) {
     JS("void", "#.c = #", this, value);
   }
 
   // Shadowing definition.
   num get d => JS("num", "#.d", this);
 
-  void set d(num value) {
+  set d(num value) {
     JS("void", "#.d = #", this, value);
   }
 
   // Shadowing definition.
   num get e => JS("num", "#.e", this);
 
-  void set e(num value) {
+  set e(num value) {
     JS("void", "#.e = #", this, value);
   }
 
   // Shadowing definition.
   num get f => JS("num", "#.f", this);
 
-  void set f(num value) {
+  set f(num value) {
     JS("void", "#.f = #", this, value);
   }
 
   // Shadowing definition.
   num get m11 => JS("num", "#.m11", this);
 
-  void set m11(num value) {
+  set m11(num value) {
     JS("void", "#.m11 = #", this, value);
   }
 
   // Shadowing definition.
   num get m12 => JS("num", "#.m12", this);
 
-  void set m12(num value) {
+  set m12(num value) {
     JS("void", "#.m12 = #", this, value);
   }
 
   // Shadowing definition.
   num get m13 => JS("num", "#.m13", this);
 
-  void set m13(num value) {
+  set m13(num value) {
     JS("void", "#.m13 = #", this, value);
   }
 
   // Shadowing definition.
   num get m14 => JS("num", "#.m14", this);
 
-  void set m14(num value) {
+  set m14(num value) {
     JS("void", "#.m14 = #", this, value);
   }
 
   // Shadowing definition.
   num get m21 => JS("num", "#.m21", this);
 
-  void set m21(num value) {
+  set m21(num value) {
     JS("void", "#.m21 = #", this, value);
   }
 
   // Shadowing definition.
   num get m22 => JS("num", "#.m22", this);
 
-  void set m22(num value) {
+  set m22(num value) {
     JS("void", "#.m22 = #", this, value);
   }
 
   // Shadowing definition.
   num get m23 => JS("num", "#.m23", this);
 
-  void set m23(num value) {
+  set m23(num value) {
     JS("void", "#.m23 = #", this, value);
   }
 
   // Shadowing definition.
   num get m24 => JS("num", "#.m24", this);
 
-  void set m24(num value) {
+  set m24(num value) {
     JS("void", "#.m24 = #", this, value);
   }
 
   // Shadowing definition.
   num get m31 => JS("num", "#.m31", this);
 
-  void set m31(num value) {
+  set m31(num value) {
     JS("void", "#.m31 = #", this, value);
   }
 
   // Shadowing definition.
   num get m32 => JS("num", "#.m32", this);
 
-  void set m32(num value) {
+  set m32(num value) {
     JS("void", "#.m32 = #", this, value);
   }
 
   // Shadowing definition.
   num get m33 => JS("num", "#.m33", this);
 
-  void set m33(num value) {
+  set m33(num value) {
     JS("void", "#.m33 = #", this, value);
   }
 
   // Shadowing definition.
   num get m34 => JS("num", "#.m34", this);
 
-  void set m34(num value) {
+  set m34(num value) {
     JS("void", "#.m34 = #", this, value);
   }
 
   // Shadowing definition.
   num get m41 => JS("num", "#.m41", this);
 
-  void set m41(num value) {
+  set m41(num value) {
     JS("void", "#.m41 = #", this, value);
   }
 
   // Shadowing definition.
   num get m42 => JS("num", "#.m42", this);
 
-  void set m42(num value) {
+  set m42(num value) {
     JS("void", "#.m42 = #", this, value);
   }
 
   // Shadowing definition.
   num get m43 => JS("num", "#.m43", this);
 
-  void set m43(num value) {
+  set m43(num value) {
     JS("void", "#.m43 = #", this, value);
   }
 
   // Shadowing definition.
   num get m44 => JS("num", "#.m44", this);
 
-  void set m44(num value) {
+  set m44(num value) {
     JS("void", "#.m44 = #", this, value);
   }
 
@@ -10597,28 +10622,28 @@
   // Shadowing definition.
   num get w => JS("num", "#.w", this);
 
-  void set w(num value) {
+  set w(num value) {
     JS("void", "#.w = #", this, value);
   }
 
   // Shadowing definition.
   num get x => JS("num", "#.x", this);
 
-  void set x(num value) {
+  set x(num value) {
     JS("void", "#.x = #", this, value);
   }
 
   // Shadowing definition.
   num get y => JS("num", "#.y", this);
 
-  void set y(num value) {
+  set y(num value) {
     JS("void", "#.y = #", this, value);
   }
 
   // Shadowing definition.
   num get z => JS("num", "#.z", this);
 
-  void set z(num value) {
+  set z(num value) {
     JS("void", "#.z = #", this, value);
   }
 }
@@ -10862,7 +10887,7 @@
   // String is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -10990,7 +11015,7 @@
     _element._replaceChild(value, _childElements[index]);
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     // TODO(jacobr): remove children when length is reduced.
     throw new UnsupportedError('Cannot resize element lists');
   }
@@ -11696,7 +11721,7 @@
     throw new UnsupportedError('Cannot modify list');
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     throw new UnsupportedError('Cannot modify list');
   }
 
@@ -11719,7 +11744,7 @@
   CssStyleDeclarationBase get style =>
       new _CssStyleDeclarationSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): This might be faster for Sets:
     //
     //     new _MultiElementCssClassSet(this).writeClasses(value)
@@ -12214,7 +12239,7 @@
  */
 @DomName('Element')
 @Native("Element")
-abstract class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
+class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
 
   /**
    * Creates an HTML element from a valid fragment of HTML.
@@ -12261,11 +12286,7 @@
    *     }
    *     document.registerElement('x-custom', CustomElement);
    */
-  Element.created() : super._created() {
-    // Validate that this is a custom element & perform any additional
-    // initialization.
-    _initializeCustomElement(this);
-  }
+  Element.created() : super._created();
 
   /**
    * Creates the HTML element specified by the tag name.
@@ -12446,7 +12467,7 @@
    */
   Map<String, String> get attributes => new _ElementAttributeMap(this);
 
-  void set attributes(Map<String, String> value) {
+  set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
     attributes.clear();
     for (String key in value.keys) {
@@ -12468,7 +12489,7 @@
    */
   List<Element> get children => new _ChildrenElementList._wrap(this);
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -12522,7 +12543,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): Do this without reading the classes in clear() and addAll(),
     // or writing the classes in clear().
     CssClassSet classSet = classes;
@@ -12556,7 +12577,7 @@
   Map<String, String> get dataset =>
     new _DataAttributeMap(attributes);
 
-  void set dataset(Map<String, String> value) {
+  set dataset(Map<String, String> value) {
     final data = this.dataset;
     data.clear();
     for (String key in value.keys) {
@@ -12689,18 +12710,15 @@
    *     var animation = elem.animate([
    *       {"transform": "translate(100px, -100%)"},
    *       {"transform" : "translate(400px, 500px)"}
-   *     ], 1500);  
+   *     ], 1500);
    *
    * The [frames] parameter is an Iterable<Map>, where the
    * map entries specify CSS animation effects. The
    * [timing] paramter can be a double, representing the number of milliseconds
    * for the transition, or a Map with fields corresponding to those
    * of the [Timing] object.
-   *
-   * This is not yet supported in Dartium.
   **/
-// TODO(alanknight): Correct above comment once it works in Dartium.
-  @Experimental
+  @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
   AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
@@ -12750,7 +12768,7 @@
   // members of the component are used. The actual type is a subtype of Element.
   get xtag => _xtag != null ? _xtag : this;
 
-  void set xtag(Element value) {
+  set xtag(Element value) {
     _xtag = value;
   }
 
@@ -12869,7 +12887,7 @@
 
   @JSName('insertAdjacentText')
   void _insertAdjacentText(String where, String text) native;
-  
+
 
   /**
    * Parses text as an HTML fragment and inserts it into the DOM at the
@@ -13122,8 +13140,9 @@
     // offsetParent, "tops out" at BODY. But people could conceivably pass in
     // the document.documentElement and I want it to return an absolute offset,
     // so we have the special case checking for HTML.
-    bool foundAsParent = identical(current, parent) || parent.tagName == 'HTML';
-    if (current == null || identical(current, parent)) {
+    bool sameAsParent = identical(current, parent);
+    bool foundAsParent = sameAsParent || parent.tagName == 'HTML';
+    if (current == null || sameAsParent) {
       if (foundAsParent) return new Point(0, 0);
       throw new ArgumentError("Specified element is not a transitive offset "
           "parent of this element.");
@@ -13181,11 +13200,11 @@
     if (_parseDocument == null) {
       _parseDocument = document.implementation.createHtmlDocument('');
       _parseRange = _parseDocument.createRange();
-	
+
       // Workaround for Safari bug. Was also previously Chrome bug 229142
-      // - URIs are not resolved in new doc.	
-      var base = _parseDocument.createElement('base');	
-      base.href = document.baseUri;	
+      // - URIs are not resolved in new doc.
+      var base = _parseDocument.createElement('base');
+      base.href = document.baseUri;
       _parseDocument.head.append(base);
     }
     var contextElement;
@@ -13243,7 +13262,7 @@
    * This uses the default sanitization behavior to sanitize the HTML fragment,
    * use [setInnerHtml] to override the default behavior.
    */
-  void set innerHtml(String html) {
+  set innerHtml(String html) {
     this.setInnerHtml(html);
   }
 
@@ -13285,7 +13304,7 @@
    * used when an explicit accessor is not available.
    */
   ElementEvents get on => new ElementEvents(this);
-  
+
   /**
    * Verify if any of the attributes that we use in the sanitizer look unexpected,
    * possibly indicating DOM clobbering attacks.
@@ -13313,6 +13332,16 @@
           })(#)''', element);
   }
 
+  String get _safeTagName {
+    String result = 'element tag unavailable';
+    try {
+      if (tagName is String) {
+        result = tagName;
+      }
+    } catch (e) {}
+    return result;
+  }
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
   int get offsetHeight => JS('num', '#.offsetHeight', this).round();
@@ -13355,7 +13384,7 @@
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) {
+  set scrollLeft(int value) {
     JS("void", "#.scrollLeft = #", this, value.round());
   }
 
@@ -13365,7 +13394,7 @@
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) {
+  set scrollTop(int value) {
     JS("void", "#.scrollTop = #", this, value.round());
   }
 
@@ -15978,7 +16007,7 @@
   // File is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -17840,7 +17869,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -17960,7 +17989,7 @@
 
   @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => _selectedStylesheetSet;
-  void set selectedStylesheetSet(String value) {
+  set selectedStylesheetSet(String value) {
     _selectedStylesheetSet = value;
   }
 
@@ -17971,7 +18000,7 @@
   String get title => _title;
 
   @DomName('Document.title')
-  void set title(String value) {
+  set title(String value) {
     _title = value;
   }
 
@@ -18577,6 +18606,25 @@
     return headers;
   }
 
+  /**
+   * Specify the desired `url`, and `method` to use in making the request.
+   *
+   * By default the request is done asyncronously, with no user or password
+   * authentication information. If `async` is false, the request will be send
+   * synchronously.
+   *
+   * Calling `open` again on a currently active request is equivalent to
+   * calling `abort`.
+   *
+   * Note: Most simple HTTP requests can be accomplished using the [getString],
+   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+   * `open` method is intended only for more complext HTTP requests where
+   * finer-grained control is needed.
+   */
+  @DomName('XMLHttpRequest.open')
+  @DocsEditable()
+  void open(String method, String url, {bool async, String user, String password}) native;
+
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -18833,25 +18881,6 @@
   String getResponseHeader(String header) native;
 
   /**
-   * Specify the desired `url`, and `method` to use in making the request.
-   *
-   * By default the request is done asyncronously, with no user or password
-   * authentication information. If `async` is false, the request will be send
-   * synchronously.
-   *
-   * Calling `open` again on a currently active request is equivalent to
-   * calling `abort`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `open` method is intended only for more complext HTTP requests where
-   * finer-grained control is needed.
-   */
-  @DomName('XMLHttpRequest.open')
-  @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) native;
-
-  /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
    * response.
    *
@@ -19543,10 +19572,10 @@
   @Creates('Null')
   final dynamic _get_valueAsDate;
 
-  void set valueAsDate(DateTime value) {
+  set valueAsDate(DateTime value) {
     this._set_valueAsDate = convertDartToNative_DateTime(value);
   }
-  void set _set_valueAsDate(/*dynamic*/ value) {
+  set _set_valueAsDate(/*dynamic*/ value) {
     JS("void", "#.valueAsDate = #", this, value);
   }
 
@@ -22661,7 +22690,7 @@
   // MimeType is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -23287,11 +23316,6 @@
   @Experimental()
   void getStorageUpdates() native;
 
-  @DomName('Navigator.isProtocolHandlerRegistered')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) native;
-
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
@@ -23302,11 +23326,6 @@
   @Experimental() // untriaged
   bool sendBeacon(String url, data) native;
 
-  @DomName('Navigator.unregisterProtocolHandler')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) native;
-
   // From NavigatorCPU
 
   @DomName('Navigator.hardwareConcurrency')
@@ -23658,7 +23677,7 @@
   // a local copy of childNodes is more efficient.
   int get length => _this.childNodes.length;
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
@@ -23683,7 +23702,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Iterable<Node> value) {
+  set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -24222,7 +24241,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -25404,7 +25423,7 @@
   // Plugin is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -27668,7 +27687,7 @@
   }
 
   @deprecated
-  void set resetStyleInheritance(bool value) {
+  set resetStyleInheritance(bool value) {
     _shadowRootDeprecationReport();
   }
 
@@ -27680,7 +27699,7 @@
   }
 
   @deprecated
-  void set applyAuthorStyles(bool value) {
+  set applyAuthorStyles(bool value) {
     _shadowRootDeprecationReport();
   }
 }
@@ -27861,7 +27880,7 @@
   // SourceBuffer is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -28067,7 +28086,7 @@
   // SpeechGrammar is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -29932,7 +29951,7 @@
   // TextTrackCue is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -30017,7 +30036,7 @@
   // TextTrack is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -30418,7 +30437,7 @@
   // Touch is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -31632,7 +31651,7 @@
     if (view == null) {
       view = window;
     }
-    
+
     return JS('WheelEvent', 'new WheelEvent(#, #)',
         type, convertDartToNative_Dictionary(options));
 
@@ -31876,13 +31895,13 @@
    * Sets the window's location, which causes the browser to navigate to the new
    * location. [value] may be a Location object or a String.
    */
-  void set location(value) {
+  set location(value) {
     _location = value;
   }
 
   // Native getter and setter to access raw Location object.
   dynamic get _location => JS('Location|Null', '#.location', this);
-  void set _location(value) {
+  set _location(value) {
     JS('void', '#.location = #', this, value);
   }
 
@@ -32403,7 +32422,7 @@
   @Returns('Window|=Object')
   final dynamic _get_opener;
 
-  void set opener(Window value) {
+  set opener(Window value) {
     JS("void", "#.opener = #", this, value);
   }
 
@@ -33750,7 +33769,7 @@
 
   String get returnValue => _returnValue;
 
-  void set returnValue(String value) {
+  set returnValue(String value) {
     _returnValue = value;
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
@@ -34455,7 +34474,7 @@
   // Shadowing definition.
   String get text => JS("String", "#.textContent", this);
 
-  void set text(String value) {
+  set text(String value) {
     JS("void", "#.textContent = #", this, value);
   }
 
@@ -34722,7 +34741,7 @@
   // Rectangle is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -34800,7 +34819,7 @@
   // CssRule is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -34866,7 +34885,7 @@
   // _CSSValue is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -34959,7 +34978,9 @@
   factory _DocumentType._() { throw new UnsupportedError("Not supported"); }
 
   // From ChildNode
+
 }
+
 // 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.
@@ -34999,28 +35020,28 @@
   // Shadowing definition.
   num get height => JS("num", "#.height", this);
 
-  void set height(num value) {
+  set height(num value) {
     JS("void", "#.height = #", this, value);
   }
 
   // Shadowing definition.
   num get width => JS("num", "#.width", this);
 
-  void set width(num value) {
+  set width(num value) {
     JS("void", "#.width = #", this, value);
   }
 
   // Shadowing definition.
   num get x => JS("num", "#.x", this);
 
-  void set x(num value) {
+  set x(num value) {
     JS("void", "#.x = #", this, value);
   }
 
   // Shadowing definition.
   num get y => JS("num", "#.y", this);
 
-  void set y(num value) {
+  set y(num value) {
     JS("void", "#.y = #", this, value);
   }
 }
@@ -35118,7 +35139,7 @@
   // Gamepad is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35271,7 +35292,9 @@
    * This can only be called by subclasses from their created constructor.
    */
   _HTMLFrameSetElement.created() : super.created();
+
 }
+
 // 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.
@@ -35346,7 +35369,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35593,7 +35616,9 @@
 abstract class _ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
   factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
+
 }
+
 // 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.
@@ -35625,7 +35650,7 @@
   // SpeechRecognitionResult is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35689,7 +35714,7 @@
   // StyleSheet is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35832,7 +35857,9 @@
   factory _WorkerLocation._() { throw new UnsupportedError("Not supported"); }
 
   // From URLUtilsReadOnly
+
 }
+
 // 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.
@@ -35852,7 +35879,9 @@
   // From NavigatorID
 
   // From NavigatorOnLine
+
 }
+
 // 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.
@@ -36467,7 +36496,7 @@
    * `height` function in jQuery and the calculated `height` CSS value,
    * converted to a num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     if (newHeight is Dimension) {
       if (newHeight.value < 0) newHeight = new Dimension.px(0);
       _element.style.height = newHeight.toString();
@@ -36485,7 +36514,7 @@
    * and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     if (newWidth is Dimension) {
       if (newWidth.value < 0) newWidth = new Dimension.px(0);
       _element.style.width = newWidth.toString();
@@ -36520,7 +36549,7 @@
    * function in jQuery and the calculated `height` CSS value, converted to a
    * num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     _elementList.forEach((e) => e.contentEdge.height = newHeight);
   }
 
@@ -36530,7 +36559,7 @@
    * This is equivalent to the `width` function in jQuery and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     _elementList.forEach((e) => e.contentEdge.width = newWidth);
   }
 }
@@ -36637,7 +36666,7 @@
    *
    * Note that only the content height can actually be set via this method.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     throw new UnsupportedError("Can only set height for content rect.");
   }
 
@@ -36651,7 +36680,7 @@
    *
    * Note that only the content width can be set via this method.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     throw new UnsupportedError("Can only set width for content rect.");
   }
 
@@ -37902,11 +37931,11 @@
   }
 
   bool allowsElement(Element element) {
-    return _allowedElements.contains(element.tagName);
+    return _allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     var validator = _attributeValidators['$tagName::$attributeName'];
     if (validator == null) {
       validator = _attributeValidators['*::$attributeName'];
@@ -39568,11 +39597,11 @@
   }
 
   bool allowsElement(Element element) {
-    return allowedElements.contains(element.tagName);
+    return allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     if (allowedUriAttributes.contains('$tagName::$attributeName')) {
       return uriPolicy.allowsUri(value);
     } else if (allowedUriAttributes.contains('*::$attributeName')) {
@@ -39613,10 +39642,10 @@
       var isAttr = element.attributes['is'];
       if (isAttr != null) {
         return allowedElements.contains(isAttr.toUpperCase()) &&
-          allowedElements.contains(element.tagName);
+          allowedElements.contains(element._safeTagName);
       }
     }
-    return allowCustomTag && allowedElements.contains(element.tagName);
+    return allowCustomTag && allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
@@ -39672,7 +39701,7 @@
     // foreignobject tag as SvgElement. We don't want foreignobject contents
     // anyway, so just remove the whole tree outright. And we can't rely
     // on IE recognizing the SvgForeignObject type, so go by tagName. Bug 23144
-    if (element is svg.SvgElement && element.tagName == 'foreignObject') {
+    if (element is svg.SvgElement && element._safeTagName == 'foreignObject') {
       return false;
     }
     if (element is svg.SvgElement) {
@@ -39748,7 +39777,7 @@
 
   void operator []=(int index, E value) { _list[index] = value; }
 
-  void set length(int newLength) { _list.length = newLength; }
+  set length(int newLength) { _list.length = newLength; }
 
   void sort([int compare(E a, E b)]) { _list.sort(compare); }
 
@@ -40194,7 +40223,7 @@
   // properly.  Its fields and methods can only be accessed via JavaScript.
   var _location;
 
-  void set href(String val) => _setHref(_location, val);
+  set href(String val) => _setHref(_location, val);
   static void _setHref(location, val) {
     JS('void', '#.href = #', location, val);
   }
@@ -40730,7 +40759,7 @@
   /**
    * A sanitizer for trees that we trust. It does no validation and allows
    * any elements. It is also more efficient, since it can pass the text
-   * directly through to the underlying APIs without creating a document 
+   * directly through to the underlying APIs without creating a document
    * fragment to be sanitized.
    */
   static const trusted = const _TrustedHtmlTreeSanitizer();
@@ -40745,7 +40774,7 @@
 
   sanitizeTree(Node node) {}
 }
-  
+
 /**
  * Defines the policy for what types of uris are allowed for particular
  * attribute values.
@@ -40799,14 +40828,14 @@
 
   bool allowsElement(Element element) {
     if (!validator.allowsElement(element)) {
-      throw new ArgumentError(element.tagName);
+      throw new ArgumentError(element._safeTagName);
     }
     return true;
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
     if (!validator.allowsAttribute(element, attributeName, value)) {
-      throw new ArgumentError('${element.tagName}[$attributeName="$value"]');
+      throw new ArgumentError('${element._safeTagName}[$attributeName="$value"]');
     }
   }
 }
@@ -40871,10 +40900,7 @@
     try {
       elementText = element.toString();
     } catch(e) {}
-    var elementTagName = 'element tag unavailable';
-    try {
-      elementTagName = element.tagName;
-    } catch(e) {}
+    var elementTagName = element._safeTagName;
     _sanitizeElement(element, parent, corrupted, elementText, elementTagName,
         attrs, isAttr);
   }
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index 06cecb0..9925893 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -26,7 +26,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:_internal' hide Symbol;
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:indexed_db' show indexed_dbBlinkMap;
@@ -89,7 +89,7 @@
   if (_window != null) {
     return _window;
   }
-  _window = _Utils.window();
+  _window = wrap_jso(js.context['window']);
   return _window;
 }
 
@@ -619,11 +619,680 @@
   return null;
 }
 
+// FIXME: Can we make this private?
+final htmlBlinkFunctionMap = {
+  'Animation': () => Animation.internalCreateAnimation,
+  'AnimationEffect': () => AnimationEffect.internalCreateAnimationEffect,
+  'AnimationNode': () => AnimationNode.internalCreateAnimationNode,
+  'AnimationPlayer': () => AnimationPlayer.internalCreateAnimationPlayer,
+  'AnimationPlayerEvent': () => AnimationPlayerEvent.internalCreateAnimationPlayerEvent,
+  'AnimationTimeline': () => AnimationTimeline.internalCreateAnimationTimeline,
+  'ApplicationCache': () => ApplicationCache.internalCreateApplicationCache,
+  'ApplicationCacheErrorEvent': () => ApplicationCacheErrorEvent.internalCreateApplicationCacheErrorEvent,
+  'Attr': () => _Attr.internalCreate_Attr,
+  'AudioTrack': () => AudioTrack.internalCreateAudioTrack,
+  'AudioTrackList': () => AudioTrackList.internalCreateAudioTrackList,
+  'AutocompleteErrorEvent': () => AutocompleteErrorEvent.internalCreateAutocompleteErrorEvent,
+  'BarProp': () => BarProp.internalCreateBarProp,
+  'BatteryManager': () => BatteryManager.internalCreateBatteryManager,
+  'BeforeUnloadEvent': () => BeforeUnloadEvent.internalCreateBeforeUnloadEvent,
+  'Blob': () => Blob.internalCreateBlob,
+  'Body': () => Body.internalCreateBody,
+  'CDATASection': () => CDataSection.internalCreateCDataSection,
+  'CSS': () => Css.internalCreateCss,
+  'CSSCharsetRule': () => CssCharsetRule.internalCreateCssCharsetRule,
+  'CSSFontFaceRule': () => CssFontFaceRule.internalCreateCssFontFaceRule,
+  'CSSImportRule': () => CssImportRule.internalCreateCssImportRule,
+  'CSSKeyframeRule': () => CssKeyframeRule.internalCreateCssKeyframeRule,
+  'CSSKeyframesRule': () => CssKeyframesRule.internalCreateCssKeyframesRule,
+  'CSSMediaRule': () => CssMediaRule.internalCreateCssMediaRule,
+  'CSSPageRule': () => CssPageRule.internalCreateCssPageRule,
+  'CSSPrimitiveValue': () => _CSSPrimitiveValue.internalCreate_CSSPrimitiveValue,
+  'CSSRule': () => CssRule.internalCreateCssRule,
+  'CSSRuleList': () => _CssRuleList.internalCreate_CssRuleList,
+  'CSSStyleDeclaration': () => CssStyleDeclaration.internalCreateCssStyleDeclaration,
+  'CSSStyleRule': () => CssStyleRule.internalCreateCssStyleRule,
+  'CSSStyleSheet': () => CssStyleSheet.internalCreateCssStyleSheet,
+  'CSSSupportsRule': () => CssSupportsRule.internalCreateCssSupportsRule,
+  'CSSUnknownRule': () => _CSSUnknownRule.internalCreate_CSSUnknownRule,
+  'CSSValue': () => _CSSValue.internalCreate_CSSValue,
+  'CSSValueList': () => _CssValueList.internalCreate_CssValueList,
+  'CSSViewportRule': () => CssViewportRule.internalCreateCssViewportRule,
+  'Cache': () => _Cache.internalCreate_Cache,
+  'CacheStorage': () => CacheStorage.internalCreateCacheStorage,
+  'Canvas2DContextAttributes': () => Canvas2DContextAttributes.internalCreateCanvas2DContextAttributes,
+  'CanvasGradient': () => CanvasGradient.internalCreateCanvasGradient,
+  'CanvasPattern': () => CanvasPattern.internalCreateCanvasPattern,
+  'CanvasRenderingContext2D': () => CanvasRenderingContext2D.internalCreateCanvasRenderingContext2D,
+  'CharacterData': () => CharacterData.internalCreateCharacterData,
+  'CircularGeofencingRegion': () => CircularGeofencingRegion.internalCreateCircularGeofencingRegion,
+  'ClientRect': () => _ClientRect.internalCreate_ClientRect,
+  'ClientRectList': () => _ClientRectList.internalCreate_ClientRectList,
+  'CloseEvent': () => CloseEvent.internalCreateCloseEvent,
+  'Comment': () => Comment.internalCreateComment,
+  'CompositionEvent': () => CompositionEvent.internalCreateCompositionEvent,
+  'Console': () => Console.internalCreateConsole,
+  'ConsoleBase': () => ConsoleBase.internalCreateConsoleBase,
+  'Coordinates': () => Coordinates.internalCreateCoordinates,
+  'Counter': () => _Counter.internalCreate_Counter,
+  'Credential': () => Credential.internalCreateCredential,
+  'CredentialsContainer': () => CredentialsContainer.internalCreateCredentialsContainer,
+  'Crypto': () => Crypto.internalCreateCrypto,
+  'CryptoKey': () => CryptoKey.internalCreateCryptoKey,
+  'CustomEvent': () => CustomEvent.internalCreateCustomEvent,
+  'DOMError': () => DomError.internalCreateDomError,
+  'DOMException': () => DomException.internalCreateDomException,
+  'DOMFileSystem': () => FileSystem.internalCreateFileSystem,
+  'DOMFileSystemSync': () => _DOMFileSystemSync.internalCreate_DOMFileSystemSync,
+  'DOMImplementation': () => DomImplementation.internalCreateDomImplementation,
+  'DOMMatrix': () => DomMatrix.internalCreateDomMatrix,
+  'DOMMatrixReadOnly': () => DomMatrixReadOnly.internalCreateDomMatrixReadOnly,
+  'DOMParser': () => DomParser.internalCreateDomParser,
+  'DOMPoint': () => DomPoint.internalCreateDomPoint,
+  'DOMPointReadOnly': () => DomPointReadOnly.internalCreateDomPointReadOnly,
+  'DOMRect': () => _DomRect.internalCreate_DomRect,
+  'DOMRectReadOnly': () => DomRectReadOnly.internalCreateDomRectReadOnly,
+  'DOMSettableTokenList': () => DomSettableTokenList.internalCreateDomSettableTokenList,
+  'DOMStringList': () => DomStringList.internalCreateDomStringList,
+  'DOMTokenList': () => DomTokenList.internalCreateDomTokenList,
+  'DataTransfer': () => DataTransfer.internalCreateDataTransfer,
+  'DataTransferItem': () => DataTransferItem.internalCreateDataTransferItem,
+  'DataTransferItemList': () => DataTransferItemList.internalCreateDataTransferItemList,
+  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope.internalCreateDedicatedWorkerGlobalScope,
+  'DeprecatedStorageInfo': () => DeprecatedStorageInfo.internalCreateDeprecatedStorageInfo,
+  'DeprecatedStorageQuota': () => DeprecatedStorageQuota.internalCreateDeprecatedStorageQuota,
+  'DeviceAcceleration': () => DeviceAcceleration.internalCreateDeviceAcceleration,
+  'DeviceLightEvent': () => DeviceLightEvent.internalCreateDeviceLightEvent,
+  'DeviceMotionEvent': () => DeviceMotionEvent.internalCreateDeviceMotionEvent,
+  'DeviceOrientationEvent': () => DeviceOrientationEvent.internalCreateDeviceOrientationEvent,
+  'DeviceRotationRate': () => DeviceRotationRate.internalCreateDeviceRotationRate,
+  'DirectoryEntry': () => DirectoryEntry.internalCreateDirectoryEntry,
+  'DirectoryEntrySync': () => _DirectoryEntrySync.internalCreate_DirectoryEntrySync,
+  'DirectoryReader': () => DirectoryReader.internalCreateDirectoryReader,
+  'DirectoryReaderSync': () => _DirectoryReaderSync.internalCreate_DirectoryReaderSync,
+  'Document': () => Document.internalCreateDocument,
+  'DocumentFragment': () => DocumentFragment.internalCreateDocumentFragment,
+  'DocumentType': () => _DocumentType.internalCreate_DocumentType,
+  'Element': () => Element.internalCreateElement,
+  'Entry': () => Entry.internalCreateEntry,
+  'EntrySync': () => _EntrySync.internalCreate_EntrySync,
+  'ErrorEvent': () => ErrorEvent.internalCreateErrorEvent,
+  'Event': () => Event.internalCreateEvent,
+  'EventSource': () => EventSource.internalCreateEventSource,
+  'EventTarget': () => EventTarget.internalCreateEventTarget,
+  'ExtendableEvent': () => ExtendableEvent.internalCreateExtendableEvent,
+  'FederatedCredential': () => FederatedCredential.internalCreateFederatedCredential,
+  'FetchEvent': () => FetchEvent.internalCreateFetchEvent,
+  'File': () => File.internalCreateFile,
+  'FileEntry': () => FileEntry.internalCreateFileEntry,
+  'FileEntrySync': () => _FileEntrySync.internalCreate_FileEntrySync,
+  'FileError': () => FileError.internalCreateFileError,
+  'FileList': () => FileList.internalCreateFileList,
+  'FileReader': () => FileReader.internalCreateFileReader,
+  'FileReaderSync': () => _FileReaderSync.internalCreate_FileReaderSync,
+  'FileWriter': () => FileWriter.internalCreateFileWriter,
+  'FileWriterSync': () => _FileWriterSync.internalCreate_FileWriterSync,
+  'FocusEvent': () => FocusEvent.internalCreateFocusEvent,
+  'FontFace': () => FontFace.internalCreateFontFace,
+  'FontFaceSet': () => FontFaceSet.internalCreateFontFaceSet,
+  'FontFaceSetLoadEvent': () => FontFaceSetLoadEvent.internalCreateFontFaceSetLoadEvent,
+  'FormData': () => FormData.internalCreateFormData,
+  'Gamepad': () => Gamepad.internalCreateGamepad,
+  'GamepadButton': () => GamepadButton.internalCreateGamepadButton,
+  'GamepadEvent': () => GamepadEvent.internalCreateGamepadEvent,
+  'GamepadList': () => _GamepadList.internalCreate_GamepadList,
+  'Geofencing': () => Geofencing.internalCreateGeofencing,
+  'GeofencingRegion': () => GeofencingRegion.internalCreateGeofencingRegion,
+  'Geolocation': () => Geolocation.internalCreateGeolocation,
+  'Geoposition': () => Geoposition.internalCreateGeoposition,
+  'HTMLAllCollection': () => _HTMLAllCollection.internalCreate_HTMLAllCollection,
+  'HTMLAnchorElement': () => AnchorElement.internalCreateAnchorElement,
+  'HTMLAppletElement': () => _HTMLAppletElement.internalCreate_HTMLAppletElement,
+  'HTMLAreaElement': () => AreaElement.internalCreateAreaElement,
+  'HTMLAudioElement': () => AudioElement.internalCreateAudioElement,
+  'HTMLBRElement': () => BRElement.internalCreateBRElement,
+  'HTMLBaseElement': () => BaseElement.internalCreateBaseElement,
+  'HTMLBodyElement': () => BodyElement.internalCreateBodyElement,
+  'HTMLButtonElement': () => ButtonElement.internalCreateButtonElement,
+  'HTMLCanvasElement': () => CanvasElement.internalCreateCanvasElement,
+  'HTMLCollection': () => HtmlCollection.internalCreateHtmlCollection,
+  'HTMLContentElement': () => ContentElement.internalCreateContentElement,
+  'HTMLDListElement': () => DListElement.internalCreateDListElement,
+  'HTMLDataListElement': () => DataListElement.internalCreateDataListElement,
+  'HTMLDetailsElement': () => DetailsElement.internalCreateDetailsElement,
+  'HTMLDialogElement': () => DialogElement.internalCreateDialogElement,
+  'HTMLDirectoryElement': () => _HTMLDirectoryElement.internalCreate_HTMLDirectoryElement,
+  'HTMLDivElement': () => DivElement.internalCreateDivElement,
+  'HTMLDocument': () => HtmlDocument.internalCreateHtmlDocument,
+  'HTMLElement': () => HtmlElement.internalCreateHtmlElement,
+  'HTMLEmbedElement': () => EmbedElement.internalCreateEmbedElement,
+  'HTMLFieldSetElement': () => FieldSetElement.internalCreateFieldSetElement,
+  'HTMLFontElement': () => _HTMLFontElement.internalCreate_HTMLFontElement,
+  'HTMLFormControlsCollection': () => HtmlFormControlsCollection.internalCreateHtmlFormControlsCollection,
+  'HTMLFormElement': () => FormElement.internalCreateFormElement,
+  'HTMLFrameElement': () => _HTMLFrameElement.internalCreate_HTMLFrameElement,
+  'HTMLFrameSetElement': () => _HTMLFrameSetElement.internalCreate_HTMLFrameSetElement,
+  'HTMLHRElement': () => HRElement.internalCreateHRElement,
+  'HTMLHeadElement': () => HeadElement.internalCreateHeadElement,
+  'HTMLHeadingElement': () => HeadingElement.internalCreateHeadingElement,
+  'HTMLHtmlElement': () => HtmlHtmlElement.internalCreateHtmlHtmlElement,
+  'HTMLIFrameElement': () => IFrameElement.internalCreateIFrameElement,
+  'HTMLImageElement': () => ImageElement.internalCreateImageElement,
+  'HTMLInputElement': () => InputElement.internalCreateInputElement,
+  'HTMLKeygenElement': () => KeygenElement.internalCreateKeygenElement,
+  'HTMLLIElement': () => LIElement.internalCreateLIElement,
+  'HTMLLabelElement': () => LabelElement.internalCreateLabelElement,
+  'HTMLLegendElement': () => LegendElement.internalCreateLegendElement,
+  'HTMLLinkElement': () => LinkElement.internalCreateLinkElement,
+  'HTMLMapElement': () => MapElement.internalCreateMapElement,
+  'HTMLMarqueeElement': () => _HTMLMarqueeElement.internalCreate_HTMLMarqueeElement,
+  'HTMLMediaElement': () => MediaElement.internalCreateMediaElement,
+  'HTMLMenuElement': () => MenuElement.internalCreateMenuElement,
+  'HTMLMenuItemElement': () => MenuItemElement.internalCreateMenuItemElement,
+  'HTMLMetaElement': () => MetaElement.internalCreateMetaElement,
+  'HTMLMeterElement': () => MeterElement.internalCreateMeterElement,
+  'HTMLModElement': () => ModElement.internalCreateModElement,
+  'HTMLOListElement': () => OListElement.internalCreateOListElement,
+  'HTMLObjectElement': () => ObjectElement.internalCreateObjectElement,
+  'HTMLOptGroupElement': () => OptGroupElement.internalCreateOptGroupElement,
+  'HTMLOptionElement': () => OptionElement.internalCreateOptionElement,
+  'HTMLOptionsCollection': () => HtmlOptionsCollection.internalCreateHtmlOptionsCollection,
+  'HTMLOutputElement': () => OutputElement.internalCreateOutputElement,
+  'HTMLParagraphElement': () => ParagraphElement.internalCreateParagraphElement,
+  'HTMLParamElement': () => ParamElement.internalCreateParamElement,
+  'HTMLPictureElement': () => PictureElement.internalCreatePictureElement,
+  'HTMLPreElement': () => PreElement.internalCreatePreElement,
+  'HTMLProgressElement': () => ProgressElement.internalCreateProgressElement,
+  'HTMLQuoteElement': () => QuoteElement.internalCreateQuoteElement,
+  'HTMLScriptElement': () => ScriptElement.internalCreateScriptElement,
+  'HTMLSelectElement': () => SelectElement.internalCreateSelectElement,
+  'HTMLShadowElement': () => ShadowElement.internalCreateShadowElement,
+  'HTMLSourceElement': () => SourceElement.internalCreateSourceElement,
+  'HTMLSpanElement': () => SpanElement.internalCreateSpanElement,
+  'HTMLStyleElement': () => StyleElement.internalCreateStyleElement,
+  'HTMLTableCaptionElement': () => TableCaptionElement.internalCreateTableCaptionElement,
+  'HTMLTableCellElement': () => TableCellElement.internalCreateTableCellElement,
+  'HTMLTableColElement': () => TableColElement.internalCreateTableColElement,
+  'HTMLTableElement': () => TableElement.internalCreateTableElement,
+  'HTMLTableRowElement': () => TableRowElement.internalCreateTableRowElement,
+  'HTMLTableSectionElement': () => TableSectionElement.internalCreateTableSectionElement,
+  'HTMLTemplateElement': () => TemplateElement.internalCreateTemplateElement,
+  'HTMLTextAreaElement': () => TextAreaElement.internalCreateTextAreaElement,
+  'HTMLTitleElement': () => TitleElement.internalCreateTitleElement,
+  'HTMLTrackElement': () => TrackElement.internalCreateTrackElement,
+  'HTMLUListElement': () => UListElement.internalCreateUListElement,
+  'HTMLUnknownElement': () => UnknownElement.internalCreateUnknownElement,
+  'HTMLVideoElement': () => VideoElement.internalCreateVideoElement,
+  'HashChangeEvent': () => HashChangeEvent.internalCreateHashChangeEvent,
+  'Headers': () => Headers.internalCreateHeaders,
+  'History': () => History.internalCreateHistory,
+  'ImageBitmap': () => ImageBitmap.internalCreateImageBitmap,
+  'ImageData': () => ImageData.internalCreateImageData,
+  'InjectedScriptHost': () => InjectedScriptHost.internalCreateInjectedScriptHost,
+  'InputMethodContext': () => InputMethodContext.internalCreateInputMethodContext,
+  'InstallEvent': () => InstallEvent.internalCreateInstallEvent,
+  'Iterator': () => DomIterator.internalCreateDomIterator,
+  'KeyboardEvent': () => KeyboardEvent.internalCreateKeyboardEvent,
+  'LocalCredential': () => LocalCredential.internalCreateLocalCredential,
+  'Location': () => Location.internalCreateLocation,
+  'MIDIAccess': () => MidiAccess.internalCreateMidiAccess,
+  'MIDIConnectionEvent': () => MidiConnectionEvent.internalCreateMidiConnectionEvent,
+  'MIDIInput': () => MidiInput.internalCreateMidiInput,
+  'MIDIInputMap': () => MidiInputMap.internalCreateMidiInputMap,
+  'MIDIMessageEvent': () => MidiMessageEvent.internalCreateMidiMessageEvent,
+  'MIDIOutput': () => MidiOutput.internalCreateMidiOutput,
+  'MIDIOutputMap': () => MidiOutputMap.internalCreateMidiOutputMap,
+  'MIDIPort': () => MidiPort.internalCreateMidiPort,
+  'MediaController': () => MediaController.internalCreateMediaController,
+  'MediaDeviceInfo': () => MediaDeviceInfo.internalCreateMediaDeviceInfo,
+  'MediaError': () => MediaError.internalCreateMediaError,
+  'MediaKeyError': () => MediaKeyError.internalCreateMediaKeyError,
+  'MediaKeyEvent': () => MediaKeyEvent.internalCreateMediaKeyEvent,
+  'MediaKeyMessageEvent': () => MediaKeyMessageEvent.internalCreateMediaKeyMessageEvent,
+  'MediaKeyNeededEvent': () => MediaKeyNeededEvent.internalCreateMediaKeyNeededEvent,
+  'MediaKeySession': () => MediaKeySession.internalCreateMediaKeySession,
+  'MediaKeys': () => MediaKeys.internalCreateMediaKeys,
+  'MediaList': () => MediaList.internalCreateMediaList,
+  'MediaQueryList': () => MediaQueryList.internalCreateMediaQueryList,
+  'MediaQueryListEvent': () => MediaQueryListEvent.internalCreateMediaQueryListEvent,
+  'MediaSource': () => MediaSource.internalCreateMediaSource,
+  'MediaStream': () => MediaStream.internalCreateMediaStream,
+  'MediaStreamEvent': () => MediaStreamEvent.internalCreateMediaStreamEvent,
+  'MediaStreamTrack': () => MediaStreamTrack.internalCreateMediaStreamTrack,
+  'MediaStreamTrackEvent': () => MediaStreamTrackEvent.internalCreateMediaStreamTrackEvent,
+  'MemoryInfo': () => MemoryInfo.internalCreateMemoryInfo,
+  'MessageChannel': () => MessageChannel.internalCreateMessageChannel,
+  'MessageEvent': () => MessageEvent.internalCreateMessageEvent,
+  'MessagePort': () => MessagePort.internalCreateMessagePort,
+  'Metadata': () => Metadata.internalCreateMetadata,
+  'MimeType': () => MimeType.internalCreateMimeType,
+  'MimeTypeArray': () => MimeTypeArray.internalCreateMimeTypeArray,
+  'MouseEvent': () => MouseEvent.internalCreateMouseEvent,
+  'MutationEvent': () => _MutationEvent.internalCreate_MutationEvent,
+  'MutationObserver': () => MutationObserver.internalCreateMutationObserver,
+  'MutationRecord': () => MutationRecord.internalCreateMutationRecord,
+  'NamedNodeMap': () => _NamedNodeMap.internalCreate_NamedNodeMap,
+  'Navigator': () => Navigator.internalCreateNavigator,
+  'NavigatorUserMediaError': () => NavigatorUserMediaError.internalCreateNavigatorUserMediaError,
+  'NetworkInformation': () => NetworkInformation.internalCreateNetworkInformation,
+  'Node': () => Node.internalCreateNode,
+  'NodeFilter': () => NodeFilter.internalCreateNodeFilter,
+  'NodeIterator': () => NodeIterator.internalCreateNodeIterator,
+  'NodeList': () => NodeList.internalCreateNodeList,
+  'Notification': () => Notification.internalCreateNotification,
+  'OverflowEvent': () => OverflowEvent.internalCreateOverflowEvent,
+  'PagePopupController': () => _PagePopupController.internalCreate_PagePopupController,
+  'PageTransitionEvent': () => PageTransitionEvent.internalCreatePageTransitionEvent,
+  'Path2D': () => Path2D.internalCreatePath2D,
+  'Performance': () => Performance.internalCreatePerformance,
+  'PerformanceEntry': () => PerformanceEntry.internalCreatePerformanceEntry,
+  'PerformanceMark': () => PerformanceMark.internalCreatePerformanceMark,
+  'PerformanceMeasure': () => PerformanceMeasure.internalCreatePerformanceMeasure,
+  'PerformanceNavigation': () => PerformanceNavigation.internalCreatePerformanceNavigation,
+  'PerformanceResourceTiming': () => PerformanceResourceTiming.internalCreatePerformanceResourceTiming,
+  'PerformanceTiming': () => PerformanceTiming.internalCreatePerformanceTiming,
+  'Plugin': () => Plugin.internalCreatePlugin,
+  'PluginArray': () => PluginArray.internalCreatePluginArray,
+  'PluginPlaceholderElement': () => PluginPlaceholderElement.internalCreatePluginPlaceholderElement,
+  'PopStateEvent': () => PopStateEvent.internalCreatePopStateEvent,
+  'PositionError': () => PositionError.internalCreatePositionError,
+  'Presentation': () => Presentation.internalCreatePresentation,
+  'ProcessingInstruction': () => ProcessingInstruction.internalCreateProcessingInstruction,
+  'ProgressEvent': () => ProgressEvent.internalCreateProgressEvent,
+  'PushEvent': () => PushEvent.internalCreatePushEvent,
+  'PushManager': () => PushManager.internalCreatePushManager,
+  'PushRegistration': () => PushRegistration.internalCreatePushRegistration,
+  'RGBColor': () => _RGBColor.internalCreate_RGBColor,
+  'RTCDTMFSender': () => RtcDtmfSender.internalCreateRtcDtmfSender,
+  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent.internalCreateRtcDtmfToneChangeEvent,
+  'RTCDataChannel': () => RtcDataChannel.internalCreateRtcDataChannel,
+  'RTCDataChannelEvent': () => RtcDataChannelEvent.internalCreateRtcDataChannelEvent,
+  'RTCIceCandidate': () => RtcIceCandidate.internalCreateRtcIceCandidate,
+  'RTCIceCandidateEvent': () => RtcIceCandidateEvent.internalCreateRtcIceCandidateEvent,
+  'RTCPeerConnection': () => RtcPeerConnection.internalCreateRtcPeerConnection,
+  'RTCSessionDescription': () => RtcSessionDescription.internalCreateRtcSessionDescription,
+  'RTCStatsReport': () => RtcStatsReport.internalCreateRtcStatsReport,
+  'RTCStatsResponse': () => RtcStatsResponse.internalCreateRtcStatsResponse,
+  'RadioNodeList': () => _RadioNodeList.internalCreate_RadioNodeList,
+  'Range': () => Range.internalCreateRange,
+  'ReadableStream': () => ReadableStream.internalCreateReadableStream,
+  'Rect': () => _Rect.internalCreate_Rect,
+  'RelatedEvent': () => RelatedEvent.internalCreateRelatedEvent,
+  'Request': () => _Request.internalCreate_Request,
+  'ResourceProgressEvent': () => ResourceProgressEvent.internalCreateResourceProgressEvent,
+  'Response': () => _Response.internalCreate_Response,
+  'Screen': () => Screen.internalCreateScreen,
+  'ScreenOrientation': () => ScreenOrientation.internalCreateScreenOrientation,
+  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent.internalCreateSecurityPolicyViolationEvent,
+  'Selection': () => Selection.internalCreateSelection,
+  'ServiceWorker': () => _ServiceWorker.internalCreate_ServiceWorker,
+  'ServiceWorkerClient': () => ServiceWorkerClient.internalCreateServiceWorkerClient,
+  'ServiceWorkerClients': () => ServiceWorkerClients.internalCreateServiceWorkerClients,
+  'ServiceWorkerContainer': () => ServiceWorkerContainer.internalCreateServiceWorkerContainer,
+  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope.internalCreateServiceWorkerGlobalScope,
+  'ServiceWorkerRegistration': () => ServiceWorkerRegistration.internalCreateServiceWorkerRegistration,
+  'ShadowRoot': () => ShadowRoot.internalCreateShadowRoot,
+  'SharedWorker': () => SharedWorker.internalCreateSharedWorker,
+  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope.internalCreateSharedWorkerGlobalScope,
+  'SourceBuffer': () => SourceBuffer.internalCreateSourceBuffer,
+  'SourceBufferList': () => SourceBufferList.internalCreateSourceBufferList,
+  'SourceInfo': () => SourceInfo.internalCreateSourceInfo,
+  'SpeechGrammar': () => SpeechGrammar.internalCreateSpeechGrammar,
+  'SpeechGrammarList': () => SpeechGrammarList.internalCreateSpeechGrammarList,
+  'SpeechRecognition': () => SpeechRecognition.internalCreateSpeechRecognition,
+  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative.internalCreateSpeechRecognitionAlternative,
+  'SpeechRecognitionError': () => SpeechRecognitionError.internalCreateSpeechRecognitionError,
+  'SpeechRecognitionEvent': () => SpeechRecognitionEvent.internalCreateSpeechRecognitionEvent,
+  'SpeechRecognitionResult': () => SpeechRecognitionResult.internalCreateSpeechRecognitionResult,
+  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList.internalCreate_SpeechRecognitionResultList,
+  'SpeechSynthesis': () => SpeechSynthesis.internalCreateSpeechSynthesis,
+  'SpeechSynthesisEvent': () => SpeechSynthesisEvent.internalCreateSpeechSynthesisEvent,
+  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance.internalCreateSpeechSynthesisUtterance,
+  'SpeechSynthesisVoice': () => SpeechSynthesisVoice.internalCreateSpeechSynthesisVoice,
+  'Storage': () => Storage.internalCreateStorage,
+  'StorageEvent': () => StorageEvent.internalCreateStorageEvent,
+  'StorageInfo': () => StorageInfo.internalCreateStorageInfo,
+  'StorageQuota': () => StorageQuota.internalCreateStorageQuota,
+  'Stream': () => FileStream.internalCreateFileStream,
+  'StyleMedia': () => StyleMedia.internalCreateStyleMedia,
+  'StyleSheet': () => StyleSheet.internalCreateStyleSheet,
+  'StyleSheetList': () => _StyleSheetList.internalCreate_StyleSheetList,
+  'SubtleCrypto': () => _SubtleCrypto.internalCreate_SubtleCrypto,
+  'Text': () => Text.internalCreateText,
+  'TextEvent': () => TextEvent.internalCreateTextEvent,
+  'TextMetrics': () => TextMetrics.internalCreateTextMetrics,
+  'TextTrack': () => TextTrack.internalCreateTextTrack,
+  'TextTrackCue': () => TextTrackCue.internalCreateTextTrackCue,
+  'TextTrackCueList': () => TextTrackCueList.internalCreateTextTrackCueList,
+  'TextTrackList': () => TextTrackList.internalCreateTextTrackList,
+  'TimeRanges': () => TimeRanges.internalCreateTimeRanges,
+  'Timing': () => Timing.internalCreateTiming,
+  'Touch': () => Touch.internalCreateTouch,
+  'TouchEvent': () => TouchEvent.internalCreateTouchEvent,
+  'TouchList': () => TouchList.internalCreateTouchList,
+  'TrackEvent': () => TrackEvent.internalCreateTrackEvent,
+  'TransitionEvent': () => TransitionEvent.internalCreateTransitionEvent,
+  'TreeWalker': () => TreeWalker.internalCreateTreeWalker,
+  'UIEvent': () => UIEvent.internalCreateUIEvent,
+  'URL': () => Url.internalCreateUrl,
+  'VTTCue': () => VttCue.internalCreateVttCue,
+  'VTTRegion': () => VttRegion.internalCreateVttRegion,
+  'VTTRegionList': () => VttRegionList.internalCreateVttRegionList,
+  'ValidityState': () => ValidityState.internalCreateValidityState,
+  'VideoPlaybackQuality': () => VideoPlaybackQuality.internalCreateVideoPlaybackQuality,
+  'VideoTrack': () => VideoTrack.internalCreateVideoTrack,
+  'VideoTrackList': () => VideoTrackList.internalCreateVideoTrackList,
+  'WebKitAnimationEvent': () => AnimationEvent.internalCreateAnimationEvent,
+  'WebKitCSSFilterRule': () => CssFilterRule.internalCreateCssFilterRule,
+  'WebKitCSSFilterValue': () => _WebKitCSSFilterValue.internalCreate_WebKitCSSFilterValue,
+  'WebKitCSSMatrix': () => _WebKitCSSMatrix.internalCreate_WebKitCSSMatrix,
+  'WebKitCSSTransformValue': () => _WebKitCSSTransformValue.internalCreate_WebKitCSSTransformValue,
+  'WebSocket': () => WebSocket.internalCreateWebSocket,
+  'WheelEvent': () => WheelEvent.internalCreateWheelEvent,
+  'Window': () => Window.internalCreateWindow,
+  'Worker': () => Worker.internalCreateWorker,
+  'WorkerConsole': () => WorkerConsole.internalCreateWorkerConsole,
+  'WorkerGlobalScope': () => WorkerGlobalScope.internalCreateWorkerGlobalScope,
+  'WorkerLocation': () => _WorkerLocation.internalCreate_WorkerLocation,
+  'WorkerNavigator': () => _WorkerNavigator.internalCreate_WorkerNavigator,
+  'WorkerPerformance': () => WorkerPerformance.internalCreateWorkerPerformance,
+  'XMLDocument': () => XmlDocument.internalCreateXmlDocument,
+  'XMLHttpRequest': () => HttpRequest.internalCreateHttpRequest,
+  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget.internalCreateHttpRequestEventTarget,
+  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent.internalCreate_XMLHttpRequestProgressEvent,
+  'XMLHttpRequestUpload': () => HttpRequestUpload.internalCreateHttpRequestUpload,
+  'XMLSerializer': () => XmlSerializer.internalCreateXmlSerializer,
+  'XPathEvaluator': () => XPathEvaluator.internalCreateXPathEvaluator,
+  'XPathExpression': () => XPathExpression.internalCreateXPathExpression,
+  'XPathNSResolver': () => XPathNSResolver.internalCreateXPathNSResolver,
+  'XPathResult': () => XPathResult.internalCreateXPathResult,
+  'XSLTProcessor': () => XsltProcessor.internalCreateXsltProcessor,
+  'polymer-element': () => HtmlElement.internalCreateHtmlElement,
 
-unwrap_jso(dartClass_instance) => dartClass_instance;
-wrap_jso(jsObject) => jsObject;
-wrap_jso_list(jso_nodes) => jso_nodes;
-make_dart_rectangle(r) => r;
+};
+
+// TODO(terry): We may want to move this elsewhere if html becomes
+// a package to avoid dartium depending on pkg:html.
+getHtmlCreateFunction(String key) {
+  var result;
+
+  // TODO(vsm): Add Cross Frame and JS types here as well.
+
+  // Check the html library.
+  result = _getHtmlFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web gl library.
+  result = _getWebGlFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the indexed db library.
+  result = _getIndexDbFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web audio library.
+  result = _getWebAudioFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web sql library.
+  result = _getWebSqlFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the svg library.
+  result = _getSvgFunction(key);
+  if (result != null) {
+    return result;
+  }
+
+  return null;
+}
+
+Function _getHtmlFunction(String key) {
+  if (htmlBlinkFunctionMap.containsKey(key)) {
+    return htmlBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+Function _getWebGlFunction(String key) {
+  if (web_glBlinkFunctionMap.containsKey(key)) {
+    return web_glBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+Function _getIndexDbFunction(String key) {
+  if (indexed_dbBlinkFunctionMap.containsKey(key)) {
+    return indexed_dbBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+Function _getWebAudioFunction(String key) {
+  if (web_audioBlinkFunctionMap.containsKey(key)) {
+    return web_audioBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+Function _getWebSqlFunction(String key) {
+  if (web_sqlBlinkFunctionMap.containsKey(key)) {
+    return web_sqlBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+Function _getSvgFunction(String key) {
+  if (svgBlinkFunctionMap.containsKey(key)) {
+    return svgBlinkFunctionMap[key]();
+  }
+  return null;
+}
+
+
+/******************************************************************************
+ **********                                                          **********
+ **********                    JS Interop Support                    **********
+ **********                                                          **********
+ ******************************************************************************/
+
+Rectangle make_dart_rectangle(r) =>
+    r == null ? null : new Rectangle(r['left'], r['top'], r['width'], r['height']);
+
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
+// Flag to disable JS interop asserts.  Setting to false will speed up the
+// wrap_jso calls.
+bool __interop_checks = true;
+
+/** Expando for JsObject, used by every Dart class associated with a Javascript
+ *  class (e.g., DOM, WebAudio, etc.).
+ */
+
+/**
+ * Return the JsObject associated with a Dart class [dartClass_instance].
+ */
+unwrap_jso(dartClass_instance) {
+  try {
+    if (dartClass_instance != null)
+      return dartClass_instance is NativeFieldWrapperClass2 ?
+          dartClass_instance.blink_jsObject : dartClass_instance;
+    else
+      return null;
+  } catch(NoSuchMethodException) {
+    // No blink_jsObject then return the dartClass_instance is probably an
+    // array that was already converted to a Dart class e.g., Uint8ClampedList.
+    return dartClass_instance;
+  }
+}
+
+/**
+ * Create Dart class that maps to the JS Type, add the JsObject as an expando
+ * on the Dart class and return the created Dart class.
+ */
+wrap_jso(jsObject) {
+  try {
+    if (jsObject is! js.JsObject) {
+      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
+      return jsObject;
+    }
+    // Try the most general type conversions on it.
+    // TODO(alanknight): We may be able to do better. This maintains identity,
+    // which is useful, but expensive. And if we nest something that only
+    // this conversion handles, how does that work? e.g. a list of maps of elements.
+    var converted = convertNativeToDart_SerializedScriptValue(jsObject);
+    if (!identical(converted, jsObject)) {
+      return converted;
+    }
+    var constructor = jsObject['constructor'];
+    if (__interop_checks) {
+      debug_or_assert("constructor != null", constructor != null);
+    }
+    var jsTypeName = constructor['name'];
+    if (__interop_checks) {
+      debug_or_assert("constructor != null && jsTypeName.length > 0", constructor != null && jsTypeName.length > 0);
+    }
+
+    var dartClass_instance;
+    if (jsObject.hasProperty('dart_class')) {
+      // Got a dart_class (it's a custom element) use it it's already set up.
+      dartClass_instance = jsObject['dart_class'];
+    } else {
+      var func = getHtmlCreateFunction(jsTypeName);
+      if (func != null) {
+        dartClass_instance = func();
+        dartClass_instance.blink_jsObject = jsObject;
+      }
+    }
+    return dartClass_instance;
+  } catch(e, stacktrace){
+    if (__interop_checks) {
+      if (e is DebugAssertException)
+        window.console.log("${e.message}\n ${stacktrace}");
+      else
+        window.console.log("${stacktrace}");
+    }
+  }
+
+  return null;
+}
+
+/**
+ * Create Dart class that maps to the JS Type that is the JS type being
+ * extended using JS interop createCallback (we need the base type of the
+ * custom element) not the Dart created constructor.
+ */
+wrap_jso_custom_element(jsObject) {
+  try {
+    if (jsObject is! js.JsObject) {
+      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
+      return jsObject;
+    }
+
+    // Find out what object we're extending.
+    var objectName = jsObject.toString();
+    // Expect to see something like '[object HTMLElement]'.
+    if (!objectName.startsWith('[object ')) {
+      return jsObject;
+    }
+
+    var extendsClass = objectName.substring(8, objectName.length - 1);
+    var func = getHtmlCreateFunction(extendsClass);
+    if (__interop_checks)
+      debug_or_assert("func != null name = ${extendsClass}", func != null);
+    var dartClass_instance = func();
+    dartClass_instance.blink_jsObject = jsObject;
+    return dartClass_instance;
+  } catch(e, stacktrace){
+    if (__interop_checks) {
+      if (e is DebugAssertException)
+        window.console.log("${e.message}\n ${stacktrace}");
+      else
+        window.console.log("${stacktrace}");
+    }
+
+    // Problem?
+    return null;
+  }
+}
+
+class DebugAssertException implements Exception {
+  String message;
+  DebugAssertException(this.message);
+}
+
+debug_or_assert(message, expression) {
+  if (!expression) {
+    throw new DebugAssertException("$message");
+  }
+}
+
+// TODO(terry): Manage JS interop JsFunctions for each listener used for add/
+//              removeEventListener.  These JsFunctions will leak look at
+//              fixing with weak-refs in C++.  The key are the hashcodes of the
+//              user's this (this is needed for futures) and listener function.
+Map<int, Map<int, js.JsFunction>> _knownListeners = {};
+
+js.JsFunction wrap_event_listener(theObject, Function listener) {
+  var thisHashCode = theObject.hashCode;
+  var listenerHashCode = identityHashCode(listener);
+
+  _knownListeners.putIfAbsent(thisHashCode, () => new Map<int, js.JsFunction>());
+  _knownListeners[thisHashCode].putIfAbsent(listenerHashCode, () =>
+    new js.JsFunction.withThis((theObject, event) => listener(wrap_jso(event))));
+
+  return _knownListeners[thisHashCode][listenerHashCode];
+}
+
+Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
+  var result = new Map();
+  var keys = js.context['Object'].callMethod('keys', [jsObject]);
+  for (var key in keys) {
+    result[key] = wrap_jso(jsObject[key]);
+  }
+  return result;
+}
+
+// Converts a flat Dart map into a JavaScript object with properties this is
+// is the Dartium only version it uses dart:js.
+// TODO(alanknight): This could probably be unified with the dart2js conversions
+// code in html_common and be more general.
+convertDartToNative_Dictionary(Map dict) {
+  if (dict == null) return null;
+  var jsObject = new js.JsObject(js.context['Object']);
+  dict.forEach((String key, value) {
+    if (value is List) {
+      var jsArray = new js.JsArray();
+      value.forEach((elem) {
+        jsArray.add(elem is Map ? convertDartToNative_Dictionary(elem): elem);
+      });
+      jsObject[key] = jsArray;
+    } else {
+      jsObject[key] = value;
+    }
+  });
+  return jsObject;
+}
+
+// Converts a Dart list into a JsArray. For the Dartium version only.
+convertDartToNative_List(List input) => new js.JsArray()..addAll(input);
+
+// Conversion function place holder (currently not used in dart2js or dartium).
+List convertDartToNative_StringArray(List<String> input) => input;
+
 // 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.
@@ -670,6 +1339,18 @@
     if (href != null) e.href = href;
     return e;
   }
+
+
+  static AnchorElement internalCreateAnchorElement() {
+    return new AnchorElement._internalWrap();
+  }
+
+  factory AnchorElement._internalWrap() {
+    return new AnchorElement.internal_();
+  }
+
+  AnchorElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -683,7 +1364,7 @@
   
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  void set download(String value) => _blink.BlinkHTMLAnchorElement.instance.download_Setter_(unwrap_jso(this), value);
+  set download(String value) => _blink.BlinkHTMLAnchorElement.instance.download_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
@@ -691,7 +1372,7 @@
   
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(unwrap_jso(this), value);
+  set hreflang(String value) => _blink.BlinkHTMLAnchorElement.instance.hreflang_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.integrity')
   @DocsEditable()
@@ -701,7 +1382,7 @@
   @DomName('HTMLAnchorElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLAnchorElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLAnchorElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
@@ -709,7 +1390,7 @@
   
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.BlinkHTMLAnchorElement.instance.rel_Setter_(unwrap_jso(this), value);
+  set rel(String value) => _blink.BlinkHTMLAnchorElement.instance.rel_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
@@ -717,7 +1398,7 @@
   
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLAnchorElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLAnchorElement.instance.target_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
@@ -725,7 +1406,7 @@
   
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLAnchorElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLAnchorElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
@@ -733,7 +1414,7 @@
   
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkHTMLAnchorElement.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkHTMLAnchorElement.instance.hash_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
@@ -741,7 +1422,7 @@
   
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkHTMLAnchorElement.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkHTMLAnchorElement.instance.host_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
@@ -749,7 +1430,7 @@
   
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkHTMLAnchorElement.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkHTMLAnchorElement.instance.hostname_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
@@ -757,7 +1438,7 @@
   
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLAnchorElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLAnchorElement.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
@@ -773,7 +1454,7 @@
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkHTMLAnchorElement.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkHTMLAnchorElement.instance.password_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
@@ -781,7 +1462,7 @@
   
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkHTMLAnchorElement.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkHTMLAnchorElement.instance.pathname_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
@@ -789,7 +1470,7 @@
   
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkHTMLAnchorElement.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkHTMLAnchorElement.instance.port_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
@@ -797,7 +1478,7 @@
   
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkHTMLAnchorElement.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkHTMLAnchorElement.instance.protocol_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
@@ -805,7 +1486,7 @@
   
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkHTMLAnchorElement.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkHTMLAnchorElement.instance.search_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
@@ -815,7 +1496,7 @@
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkHTMLAnchorElement.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkHTMLAnchorElement.instance.username_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
@@ -840,17 +1521,30 @@
   @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.instance.constructorCallback_2_(target, keyframes);
+      return wrap_jso(_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.instance.constructorCallback_3_(target, keyframes, timingInput);
+      return wrap_jso(_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.instance.constructorCallback_3_(target, keyframes, timingInput);
+      var timingInput_1 = convertDartToNative_Dictionary(timingInput);
+      return wrap_jso(_blink.BlinkAnimation.instance.constructorCallback_3_(target, keyframes, timingInput_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static Animation internalCreateAnimation() {
+    return new Animation._internalWrap();
+  }
+
+  factory Animation._internalWrap() {
+    return new Animation.internal_();
+  }
+
+  Animation.internal_() : super.internal_();
+
+
 }
 // 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
@@ -866,6 +1560,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationEffect._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimationEffect internalCreateAnimationEffect() {
+    return new AnimationEffect._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimationEffect._internalWrap() {
+    return new AnimationEffect.internal_();
+  }
+
+  AnimationEffect.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -883,13 +1592,25 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AnimationEvent internalCreateAnimationEvent() {
+    return new AnimationEvent._internalWrap();
+  }
+
+  factory AnimationEvent._internalWrap() {
+    return new AnimationEvent.internal_();
+  }
+
+  AnimationEvent.internal_() : super.internal_();
+
+
   @DomName('WebKitAnimationEvent.animationName')
   @DocsEditable()
   String get animationName => _blink.BlinkWebKitAnimationEvent.instance.animationName_Getter_(unwrap_jso(this));
   
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkWebKitAnimationEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkWebKitAnimationEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -906,10 +1627,25 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationNode._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimationNode internalCreateAnimationNode() {
+    return new AnimationNode._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimationNode._internalWrap() {
+    return new AnimationNode.internal_();
+  }
+
+  AnimationNode.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AnimationNode.activeDuration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get activeDuration => _blink.BlinkAnimationNode.instance.activeDuration_Getter_(unwrap_jso(this));
+  num get activeDuration => _blink.BlinkAnimationNode.instance.activeDuration_Getter_(unwrap_jso(this));
   
   @DomName('AnimationNode.currentIteration')
   @DocsEditable()
@@ -919,17 +1655,17 @@
   @DomName('AnimationNode.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get duration => _blink.BlinkAnimationNode.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkAnimationNode.instance.duration_Getter_(unwrap_jso(this));
   
   @DomName('AnimationNode.endTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get endTime => _blink.BlinkAnimationNode.instance.endTime_Getter_(unwrap_jso(this));
+  num get endTime => _blink.BlinkAnimationNode.instance.endTime_Getter_(unwrap_jso(this));
   
   @DomName('AnimationNode.localTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get localTime => _blink.BlinkAnimationNode.instance.localTime_Getter_(unwrap_jso(this));
+  num get localTime => _blink.BlinkAnimationNode.instance.localTime_Getter_(unwrap_jso(this));
   
   @DomName('AnimationNode.player')
   @DocsEditable()
@@ -939,7 +1675,7 @@
   @DomName('AnimationNode.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get startTime => _blink.BlinkAnimationNode.instance.startTime_Getter_(unwrap_jso(this));
+  num get startTime => _blink.BlinkAnimationNode.instance.startTime_Getter_(unwrap_jso(this));
   
   @DomName('AnimationNode.timing')
   @DocsEditable()
@@ -961,6 +1697,18 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationPlayer._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AnimationPlayer internalCreateAnimationPlayer() {
+    return new AnimationPlayer._internalWrap();
+  }
+
+  factory AnimationPlayer._internalWrap() {
+    return new AnimationPlayer.internal_();
+  }
+
+  AnimationPlayer.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -972,7 +1720,7 @@
   @DomName('AnimationPlayer.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTime(num value) => _blink.BlinkAnimationPlayer.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkAnimationPlayer.instance.currentTime_Setter_(unwrap_jso(this), value);
   
   @DomName('AnimationPlayer.playState')
   @DocsEditable()
@@ -987,7 +1735,7 @@
   @DomName('AnimationPlayer.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.BlinkAnimationPlayer.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkAnimationPlayer.instance.playbackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('AnimationPlayer.source')
   @DocsEditable()
@@ -997,7 +1745,7 @@
   @DomName('AnimationPlayer.source')
   @DocsEditable()
   @Experimental() // untriaged
-  void set source(AnimationNode value) => _blink.BlinkAnimationPlayer.instance.source_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set source(AnimationNode value) => _blink.BlinkAnimationPlayer.instance.source_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('AnimationPlayer.startTime')
   @DocsEditable()
@@ -1007,7 +1755,7 @@
   @DomName('AnimationPlayer.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set startTime(num value) => _blink.BlinkAnimationPlayer.instance.startTime_Setter_(unwrap_jso(this), value);
+  set startTime(num value) => _blink.BlinkAnimationPlayer.instance.startTime_Setter_(unwrap_jso(this), value);
   
   @DomName('AnimationPlayer.cancel')
   @DocsEditable()
@@ -1049,15 +1797,27 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationPlayerEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AnimationPlayerEvent internalCreateAnimationPlayerEvent() {
+    return new AnimationPlayerEvent._internalWrap();
+  }
+
+  factory AnimationPlayerEvent._internalWrap() {
+    return new AnimationPlayerEvent.internal_();
+  }
+
+  AnimationPlayerEvent.internal_() : super.internal_();
+
+
   @DomName('AnimationPlayerEvent.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get currentTime => _blink.BlinkAnimationPlayerEvent.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAnimationPlayerEvent.instance.currentTime_Getter_(unwrap_jso(this));
   
   @DomName('AnimationPlayerEvent.timelineTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get timelineTime => _blink.BlinkAnimationPlayerEvent.instance.timelineTime_Getter_(unwrap_jso(this));
+  num get timelineTime => _blink.BlinkAnimationPlayerEvent.instance.timelineTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1074,15 +1834,30 @@
   // To suppress missing implicit constructor warnings.
   factory AnimationTimeline._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimationTimeline internalCreateAnimationTimeline() {
+    return new AnimationTimeline._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimationTimeline._internalWrap() {
+    return new AnimationTimeline.internal_();
+  }
+
+  AnimationTimeline.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AnimationTimeline.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAnimationTimeline.instance.currentTime_Getter_(unwrap_jso(this));
   
   @DomName('AnimationTimeline.getAnimationPlayers')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkAnimationTimeline.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this));
+  List<AnimationPlayer> getAnimationPlayers() => wrap_jso(_blink.BlinkAnimationTimeline.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this)));
   
   @DomName('AnimationTimeline.play')
   @DocsEditable()
@@ -1192,6 +1967,18 @@
   @DocsEditable()
   static const EventStreamProvider<Event> updateReadyEvent = const EventStreamProvider<Event>('updateready');
 
+
+  static ApplicationCache internalCreateApplicationCache() {
+    return new ApplicationCache._internalWrap();
+  }
+
+  factory ApplicationCache._internalWrap() {
+    return new ApplicationCache.internal_();
+  }
+
+  ApplicationCache.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -1290,6 +2077,18 @@
   // To suppress missing implicit constructor warnings.
   factory ApplicationCacheErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ApplicationCacheErrorEvent internalCreateApplicationCacheErrorEvent() {
+    return new ApplicationCacheErrorEvent._internalWrap();
+  }
+
+  factory ApplicationCacheErrorEvent._internalWrap() {
+    return new ApplicationCacheErrorEvent.internal_();
+  }
+
+  ApplicationCacheErrorEvent.internal_() : super.internal_();
+
+
   @DomName('ApplicationCacheErrorEvent.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1337,6 +2136,18 @@
   @DomName('HTMLAreaElement.HTMLAreaElement')
   @DocsEditable()
   factory AreaElement() => document.createElement("area");
+
+
+  static AreaElement internalCreateAreaElement() {
+    return new AreaElement._internalWrap();
+  }
+
+  factory AreaElement._internalWrap() {
+    return new AreaElement.internal_();
+  }
+
+  AreaElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1350,7 +2161,7 @@
   
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLAreaElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLAreaElement.instance.alt_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
@@ -1358,7 +2169,7 @@
   
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  void set coords(String value) => _blink.BlinkHTMLAreaElement.instance.coords_Setter_(unwrap_jso(this), value);
+  set coords(String value) => _blink.BlinkHTMLAreaElement.instance.coords_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
@@ -1366,7 +2177,7 @@
   
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  void set shape(String value) => _blink.BlinkHTMLAreaElement.instance.shape_Setter_(unwrap_jso(this), value);
+  set shape(String value) => _blink.BlinkHTMLAreaElement.instance.shape_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
@@ -1374,7 +2185,7 @@
   
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLAreaElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLAreaElement.instance.target_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
@@ -1382,7 +2193,7 @@
   
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkHTMLAreaElement.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkHTMLAreaElement.instance.hash_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
@@ -1390,7 +2201,7 @@
   
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkHTMLAreaElement.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkHTMLAreaElement.instance.host_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
@@ -1398,7 +2209,7 @@
   
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkHTMLAreaElement.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkHTMLAreaElement.instance.hostname_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
@@ -1406,7 +2217,7 @@
   
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLAreaElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLAreaElement.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
@@ -1421,7 +2232,7 @@
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkHTMLAreaElement.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkHTMLAreaElement.instance.password_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
@@ -1429,7 +2240,7 @@
   
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkHTMLAreaElement.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkHTMLAreaElement.instance.pathname_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
@@ -1437,7 +2248,7 @@
   
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkHTMLAreaElement.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkHTMLAreaElement.instance.port_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
@@ -1445,7 +2256,7 @@
   
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkHTMLAreaElement.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkHTMLAreaElement.instance.protocol_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
@@ -1453,7 +2264,7 @@
   
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkHTMLAreaElement.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkHTMLAreaElement.instance.search_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
@@ -1463,7 +2274,7 @@
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkHTMLAreaElement.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkHTMLAreaElement.instance.username_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
@@ -1475,20 +2286,28 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('HTMLAudioElement')
 class AudioElement extends MediaElement {
-  // To suppress missing implicit constructor warnings.
-  factory AudioElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
-  factory AudioElement([String src]) {
-    return _blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src);
+  factory AudioElement._([String src]) {
+    return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
   }
+
+
+  static AudioElement internalCreateAudioElement() {
+    return new AudioElement._internalWrap();
+  }
+
+  factory AudioElement._internalWrap() {
+    return new AudioElement.internal_();
+  }
+
+  AudioElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1496,6 +2315,12 @@
    */
   AudioElement.created() : super.created();
 
+  factory AudioElement([String src]) {
+    if (src == null)
+      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_0_());
+    else
+      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
+  }
 }
 // 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
@@ -1511,6 +2336,21 @@
   // To suppress missing implicit constructor warnings.
   factory AudioTrack._() { throw new UnsupportedError("Not supported"); }
 
+  static AudioTrack internalCreateAudioTrack() {
+    return new AudioTrack._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AudioTrack._internalWrap() {
+    return new AudioTrack.internal_();
+  }
+
+  AudioTrack.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1519,7 +2359,7 @@
   @DomName('AudioTrack.enabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set enabled(bool value) => _blink.BlinkAudioTrack.instance.enabled_Setter_(unwrap_jso(this), value);
+  set enabled(bool value) => _blink.BlinkAudioTrack.instance.enabled_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioTrack.id')
   @DocsEditable()
@@ -1561,6 +2401,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+
+  static AudioTrackList internalCreateAudioTrackList() {
+    return new AudioTrackList._internalWrap();
+  }
+
+  factory AudioTrackList._internalWrap() {
+    return new AudioTrackList.internal_();
+  }
+
+  AudioTrackList.internal_() : super.internal_();
+
+
   @DomName('AudioTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1597,6 +2449,18 @@
   // To suppress missing implicit constructor warnings.
   factory AutocompleteErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AutocompleteErrorEvent internalCreateAutocompleteErrorEvent() {
+    return new AutocompleteErrorEvent._internalWrap();
+  }
+
+  factory AutocompleteErrorEvent._internalWrap() {
+    return new AutocompleteErrorEvent.internal_();
+  }
+
+  AutocompleteErrorEvent.internal_() : super.internal_();
+
+
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
   String get reason => _blink.BlinkAutocompleteErrorEvent.instance.reason_Getter_(unwrap_jso(this));
@@ -1618,6 +2482,18 @@
   @DomName('HTMLBRElement.HTMLBRElement')
   @DocsEditable()
   factory BRElement() => document.createElement("br");
+
+
+  static BRElement internalCreateBRElement() {
+    return new BRElement._internalWrap();
+  }
+
+  factory BRElement._internalWrap() {
+    return new BRElement.internal_();
+  }
+
+  BRElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1641,6 +2517,21 @@
   // To suppress missing implicit constructor warnings.
   factory BarProp._() { throw new UnsupportedError("Not supported"); }
 
+  static BarProp internalCreateBarProp() {
+    return new BarProp._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory BarProp._internalWrap() {
+    return new BarProp.internal_();
+  }
+
+  BarProp.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('BarProp.visible')
   @DocsEditable()
   bool get visible => _blink.BlinkBarProp.instance.visible_Getter_(unwrap_jso(this));
@@ -1662,6 +2553,18 @@
   @DomName('HTMLBaseElement.HTMLBaseElement')
   @DocsEditable()
   factory BaseElement() => document.createElement("base");
+
+
+  static BaseElement internalCreateBaseElement() {
+    return new BaseElement._internalWrap();
+  }
+
+  factory BaseElement._internalWrap() {
+    return new BaseElement.internal_();
+  }
+
+  BaseElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1675,7 +2578,7 @@
   
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLBaseElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLBaseElement.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
@@ -1683,7 +2586,7 @@
   
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLBaseElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLBaseElement.instance.target_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1701,21 +2604,33 @@
   // To suppress missing implicit constructor warnings.
   factory BatteryManager._() { throw new UnsupportedError("Not supported"); }
 
+
+  static BatteryManager internalCreateBatteryManager() {
+    return new BatteryManager._internalWrap();
+  }
+
+  factory BatteryManager._internalWrap() {
+    return new BatteryManager.internal_();
+  }
+
+  BatteryManager.internal_() : super.internal_();
+
+
   @DomName('BatteryManager.charging')
   @DocsEditable()
   bool get charging => _blink.BlinkBatteryManager.instance.charging_Getter_(unwrap_jso(this));
   
   @DomName('BatteryManager.chargingTime')
   @DocsEditable()
-  double get chargingTime => _blink.BlinkBatteryManager.instance.chargingTime_Getter_(unwrap_jso(this));
+  num get chargingTime => _blink.BlinkBatteryManager.instance.chargingTime_Getter_(unwrap_jso(this));
   
   @DomName('BatteryManager.dischargingTime')
   @DocsEditable()
-  double get dischargingTime => _blink.BlinkBatteryManager.instance.dischargingTime_Getter_(unwrap_jso(this));
+  num get dischargingTime => _blink.BlinkBatteryManager.instance.dischargingTime_Getter_(unwrap_jso(this));
   
   @DomName('BatteryManager.level')
   @DocsEditable()
-  double get level => _blink.BlinkBatteryManager.instance.level_Getter_(unwrap_jso(this));
+  num get level => _blink.BlinkBatteryManager.instance.level_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1731,13 +2646,25 @@
   // To suppress missing implicit constructor warnings.
   factory BeforeUnloadEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static BeforeUnloadEvent internalCreateBeforeUnloadEvent() {
+    return new BeforeUnloadEvent._internalWrap();
+  }
+
+  factory BeforeUnloadEvent._internalWrap() {
+    return new BeforeUnloadEvent.internal_();
+  }
+
+  BeforeUnloadEvent.internal_() : super.internal_();
+
+
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
   String get returnValue => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Getter_(unwrap_jso(this));
   
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  void set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Setter_(unwrap_jso(this), value);
+  set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.instance.returnValue_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1750,12 +2677,20 @@
   // To suppress missing implicit constructor warnings.
   factory Blob._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('Blob.Blob')
-  @DocsEditable()
-  factory Blob(List blobParts, [String type, String endings]) => wrap_jso(_create(blobParts, type, endings));
+  static Blob internalCreateBlob() {
+    return new Blob._internalWrap();
+  }
 
-  @DocsEditable()
-  static Blob _create(blobParts, type, endings) => _blink.BlinkBlob.instance.constructorCallback_3_(blobParts, type, endings);
+  js.JsObject blink_jsObject;
+
+  factory Blob._internalWrap() {
+    return new Blob.internal_();
+  }
+
+  Blob.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
 
   @DomName('Blob.size')
   @DocsEditable()
@@ -1783,6 +2718,20 @@
     return wrap_jso(_blink.BlinkBlob.instance.slice_Callback_0_(unwrap_jso(this)));
   }
 
+  factory Blob(List blobParts, [String type, String endings]) {
+    // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
+    // array to ArrayBuffer if it is a total view.
+
+    var parts = convertDartToNative_List(blobParts.map(unwrap_jso).toList());
+    if (type == null && endings == null) {
+      return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_1_(parts));
+    }
+    var bag = {};
+    if (type != null) bag['type'] = type;
+    if (endings != null) bag['endings'] = endings;
+    return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_2_(parts,
+        convertDartToNative_Dictionary(bag)));
+  }
 }
 // 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
@@ -1798,6 +2747,21 @@
   // To suppress missing implicit constructor warnings.
   factory Body._() { throw new UnsupportedError("Not supported"); }
 
+  static Body internalCreateBody() {
+    return new Body._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Body._internalWrap() {
+    return new Body.internal_();
+  }
+
+  Body.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Body.bodyUsed')
   @DocsEditable()
   @Experimental() // untriaged
@@ -1806,22 +2770,22 @@
   @DomName('Body.arrayBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  Future arrayBuffer() => _blink.BlinkBody.instance.arrayBuffer_Callback_0_(unwrap_jso(this));
+  Future arrayBuffer() => wrap_jso(_blink.BlinkBody.instance.arrayBuffer_Callback_0_(unwrap_jso(this)));
   
   @DomName('Body.blob')
   @DocsEditable()
   @Experimental() // untriaged
-  Future blob() => _blink.BlinkBody.instance.blob_Callback_0_(unwrap_jso(this));
+  Future blob() => wrap_jso(_blink.BlinkBody.instance.blob_Callback_0_(unwrap_jso(this)));
   
   @DomName('Body.json')
   @DocsEditable()
   @Experimental() // untriaged
-  Future json() => _blink.BlinkBody.instance.json_Callback_0_(unwrap_jso(this));
+  Future json() => wrap_jso(_blink.BlinkBody.instance.json_Callback_0_(unwrap_jso(this)));
   
   @DomName('Body.text')
   @DocsEditable()
   @Experimental() // untriaged
-  Future text() => _blink.BlinkBody.instance.text_Callback_0_(unwrap_jso(this));
+  Future text() => wrap_jso(_blink.BlinkBody.instance.text_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1965,6 +2929,18 @@
   @DomName('HTMLBodyElement.HTMLBodyElement')
   @DocsEditable()
   factory BodyElement() => document.createElement("body");
+
+
+  static BodyElement internalCreateBodyElement() {
+    return new BodyElement._internalWrap();
+  }
+
+  factory BodyElement._internalWrap() {
+    return new BodyElement.internal_();
+  }
+
+  BodyElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2054,6 +3030,18 @@
   @DomName('HTMLButtonElement.HTMLButtonElement')
   @DocsEditable()
   factory ButtonElement() => document.createElement("button");
+
+
+  static ButtonElement internalCreateButtonElement() {
+    return new ButtonElement._internalWrap();
+  }
+
+  factory ButtonElement._internalWrap() {
+    return new ButtonElement.internal_();
+  }
+
+  ButtonElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2067,7 +3055,7 @@
   
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLButtonElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLButtonElement.instance.autofocus_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
@@ -2075,7 +3063,7 @@
   
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLButtonElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLButtonElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
@@ -2087,7 +3075,7 @@
   
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.BlinkHTMLButtonElement.instance.formAction_Setter_(unwrap_jso(this), value);
+  set formAction(String value) => _blink.BlinkHTMLButtonElement.instance.formAction_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
@@ -2095,7 +3083,7 @@
   
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.BlinkHTMLButtonElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
+  set formEnctype(String value) => _blink.BlinkHTMLButtonElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
@@ -2103,7 +3091,7 @@
   
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.BlinkHTMLButtonElement.instance.formMethod_Setter_(unwrap_jso(this), value);
+  set formMethod(String value) => _blink.BlinkHTMLButtonElement.instance.formMethod_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
@@ -2111,7 +3099,7 @@
   
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
+  set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
@@ -2119,12 +3107,12 @@
   
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.BlinkHTMLButtonElement.instance.formTarget_Setter_(unwrap_jso(this), value);
+  set formTarget(String value) => _blink.BlinkHTMLButtonElement.instance.formTarget_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLButtonElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLButtonElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
@@ -2132,7 +3120,7 @@
   
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLButtonElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLButtonElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
@@ -2140,7 +3128,7 @@
   
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLButtonElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLButtonElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
@@ -2156,7 +3144,7 @@
   
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLButtonElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLButtonElement.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
@@ -2186,6 +3174,18 @@
   // To suppress missing implicit constructor warnings.
   factory CDataSection._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CDataSection internalCreateCDataSection() {
+    return new CDataSection._internalWrap();
+  }
+
+  factory CDataSection._internalWrap() {
+    return new CDataSection.internal_();
+  }
+
+  CDataSection.internal_() : super.internal_();
+
+
 }
 // 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
@@ -2201,30 +3201,45 @@
   // To suppress missing implicit constructor warnings.
   factory CacheStorage._() { throw new UnsupportedError("Not supported"); }
 
+  static CacheStorage internalCreateCacheStorage() {
+    return new CacheStorage._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CacheStorage._internalWrap() {
+    return new CacheStorage.internal_();
+  }
+
+  CacheStorage.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CacheStorage.create')
   @DocsEditable()
   @Experimental() // untriaged
-  Future create(String cacheName) => _blink.BlinkCacheStorage.instance.create_Callback_1_(unwrap_jso(this), cacheName);
+  Future create(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.create_Callback_1_(unwrap_jso(this), cacheName));
   
   @DomName('CacheStorage.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  Future delete(String cacheName) => _blink.BlinkCacheStorage.instance.delete_Callback_1_(unwrap_jso(this), cacheName);
+  Future delete(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.delete_Callback_1_(unwrap_jso(this), cacheName));
   
   @DomName('CacheStorage.get')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get(String cacheName) => _blink.BlinkCacheStorage.instance.get_Callback_1_(unwrap_jso(this), cacheName);
+  Future get(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.get_Callback_1_(unwrap_jso(this), cacheName));
   
   @DomName('CacheStorage.has')
   @DocsEditable()
   @Experimental() // untriaged
-  Future has(String cacheName) => _blink.BlinkCacheStorage.instance.has_Callback_1_(unwrap_jso(this), cacheName);
+  Future has(String cacheName) => wrap_jso(_blink.BlinkCacheStorage.instance.has_Callback_1_(unwrap_jso(this), cacheName));
   
   @DomName('CacheStorage.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future keys() => _blink.BlinkCacheStorage.instance.keys_Callback_0_(unwrap_jso(this));
+  Future keys() => wrap_jso(_blink.BlinkCacheStorage.instance.keys_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2242,13 +3257,28 @@
   // To suppress missing implicit constructor warnings.
   factory Canvas2DContextAttributes._() { throw new UnsupportedError("Not supported"); }
 
+  static Canvas2DContextAttributes internalCreateCanvas2DContextAttributes() {
+    return new Canvas2DContextAttributes._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Canvas2DContextAttributes._internalWrap() {
+    return new Canvas2DContextAttributes.internal_();
+  }
+
+  Canvas2DContextAttributes.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
   bool get alpha => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Getter_(unwrap_jso(this));
   
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
+  set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
   
   @DomName('Canvas2DContextAttributes.storage')
   @DocsEditable()
@@ -2258,7 +3288,7 @@
   @DomName('Canvas2DContextAttributes.storage')
   @DocsEditable()
   @Experimental() // untriaged
-  void set storage(String value) => _blink.BlinkCanvas2DContextAttributes.instance.storage_Setter_(unwrap_jso(this), value);
+  set storage(String value) => _blink.BlinkCanvas2DContextAttributes.instance.storage_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2299,6 +3329,18 @@
     if (height != null) e.height = height;
     return e;
   }
+
+
+  static CanvasElement internalCreateCanvasElement() {
+    return new CanvasElement._internalWrap();
+  }
+
+  factory CanvasElement._internalWrap() {
+    return new CanvasElement.internal_();
+  }
+
+  CanvasElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2314,7 +3356,7 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLCanvasElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLCanvasElement.instance.height_Setter_(unwrap_jso(this), value);
   
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
@@ -2324,11 +3366,11 @@
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLCanvasElement.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  Object getContext(String contextId, [Map attrs]) => wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(unwrap_jso(this), contextId, attrs));
+  Object getContext(String contextId, [Map attrs]) => wrap_jso(_blink.BlinkHTMLCanvasElement.instance.getContext_Callback_2_(unwrap_jso(this), contextId, convertDartToNative_Dictionary(attrs)));
   
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
@@ -2464,6 +3506,21 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasGradient._() { throw new UnsupportedError("Not supported"); }
 
+  static CanvasGradient internalCreateCanvasGradient() {
+    return new CanvasGradient._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CanvasGradient._internalWrap() {
+    return new CanvasGradient.internal_();
+  }
+
+  CanvasGradient.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /**
    * Adds a color stop to this gradient at the offset.
    *
@@ -2518,6 +3575,21 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasPattern._() { throw new UnsupportedError("Not supported"); }
 
+  static CanvasPattern internalCreateCanvasPattern() {
+    return new CanvasPattern._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CanvasPattern._internalWrap() {
+    return new CanvasPattern.internal_();
+  }
+
+  CanvasPattern.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CanvasPattern.setTransform')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2538,6 +3610,21 @@
   // To suppress missing implicit constructor warnings.
   factory CanvasRenderingContext2D._() { throw new UnsupportedError("Not supported"); }
 
+  static CanvasRenderingContext2D internalCreateCanvasRenderingContext2D() {
+    return new CanvasRenderingContext2D._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CanvasRenderingContext2D._internalWrap() {
+    return new CanvasRenderingContext2D.internal_();
+  }
+
+  CanvasRenderingContext2D.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CanvasRenderingContext2D.canvas')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2551,7 +3638,7 @@
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.instance.currentTransform_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('CanvasRenderingContext2D.direction')
   @DocsEditable()
@@ -2561,15 +3648,15 @@
   @DomName('CanvasRenderingContext2D.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) => _blink.BlinkCanvasRenderingContext2D.instance.direction_Setter_(unwrap_jso(this), value);
+  set direction(String value) => _blink.BlinkCanvasRenderingContext2D.instance.direction_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Getter_(unwrap_jso(this));
+  Object get fillStyle => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Getter_(unwrap_jso(this)));
   
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  void set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.fillStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
@@ -2577,7 +3664,7 @@
   
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  void set font(String value) => _blink.BlinkCanvasRenderingContext2D.instance.font_Setter_(unwrap_jso(this), value);
+  set font(String value) => _blink.BlinkCanvasRenderingContext2D.instance.font_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
@@ -2585,7 +3672,7 @@
   
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  void set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Setter_(unwrap_jso(this), value);
+  set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.instance.globalAlpha_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
@@ -2593,7 +3680,7 @@
   
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  void set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Setter_(unwrap_jso(this), value);
+  set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.instance.globalCompositeOperation_Setter_(unwrap_jso(this), value);
   
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2623,7 +3710,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Setter_(unwrap_jso(this), value);
+  set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.instance.imageSmoothingEnabled_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
@@ -2631,7 +3718,7 @@
   
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  void set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Setter_(unwrap_jso(this), value);
+  set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineCap_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
@@ -2639,7 +3726,7 @@
   
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  void set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Setter_(unwrap_jso(this), value);
+  set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineDashOffset_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
@@ -2647,7 +3734,7 @@
   
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  void set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Setter_(unwrap_jso(this), value);
+  set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.instance.lineJoin_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
@@ -2655,7 +3742,7 @@
   
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  void set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Setter_(unwrap_jso(this), value);
+  set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.instance.lineWidth_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
@@ -2663,7 +3750,7 @@
   
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  void set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Setter_(unwrap_jso(this), value);
+  set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.instance.miterLimit_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
@@ -2671,7 +3758,7 @@
   
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  void set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Setter_(unwrap_jso(this), value);
+  set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowBlur_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
@@ -2679,7 +3766,7 @@
   
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  void set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Setter_(unwrap_jso(this), value);
+  set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowColor_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
@@ -2687,7 +3774,7 @@
   
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  void set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Setter_(unwrap_jso(this), value);
+  set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetX_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
@@ -2695,15 +3782,15 @@
   
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  void set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Setter_(unwrap_jso(this), value);
+  set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.instance.shadowOffsetY_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Getter_(unwrap_jso(this));
+  Object get strokeStyle => wrap_jso(_blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Getter_(unwrap_jso(this)));
   
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  void set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.instance.strokeStyle_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
@@ -2711,7 +3798,7 @@
   
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  void set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Setter_(unwrap_jso(this), value);
+  set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textAlign_Setter_(unwrap_jso(this), value);
   
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
@@ -2719,11 +3806,11 @@
   
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Setter_(unwrap_jso(this), value);
+  set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.instance.textBaseline_Setter_(unwrap_jso(this), value);
   
   void addHitRegion([Map options]) {
     if (options != null) {
-      _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_1_(unwrap_jso(this), options);
+      _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options));
       return;
     }
     _blink.BlinkCanvasRenderingContext2D.instance.addHitRegion_Callback_0_(unwrap_jso(this));
@@ -3312,13 +4399,25 @@
   // To suppress missing implicit constructor warnings.
   factory CharacterData._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CharacterData internalCreateCharacterData() {
+    return new CharacterData._internalWrap();
+  }
+
+  factory CharacterData._internalWrap() {
+    return new CharacterData.internal_();
+  }
+
+  CharacterData.internal_() : super.internal_();
+
+
   @DomName('CharacterData.data')
   @DocsEditable()
   String get data => _blink.BlinkCharacterData.instance.data_Getter_(unwrap_jso(this));
   
   @DomName('CharacterData.data')
   @DocsEditable()
-  void set data(String value) => _blink.BlinkCharacterData.instance.data_Setter_(unwrap_jso(this), value);
+  set data(String value) => _blink.BlinkCharacterData.instance.data_Setter_(unwrap_jso(this), value);
   
   @DomName('CharacterData.length')
   @DocsEditable()
@@ -3400,9 +4499,22 @@
   @DomName('CircularGeofencingRegion.CircularGeofencingRegion')
   @DocsEditable()
   factory CircularGeofencingRegion(Map init) {
-    return _blink.BlinkCircularGeofencingRegion.instance.constructorCallback_1_(init);
+    var init_1 = convertDartToNative_Dictionary(init);
+    return wrap_jso(_blink.BlinkCircularGeofencingRegion.instance.constructorCallback_1_(init_1));
   }
 
+
+  static CircularGeofencingRegion internalCreateCircularGeofencingRegion() {
+    return new CircularGeofencingRegion._internalWrap();
+  }
+
+  factory CircularGeofencingRegion._internalWrap() {
+    return new CircularGeofencingRegion.internal_();
+  }
+
+  CircularGeofencingRegion.internal_() : super.internal_();
+
+
   @DomName('CircularGeofencingRegion.MAX_RADIUS')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3416,17 +4528,17 @@
   @DomName('CircularGeofencingRegion.latitude')
   @DocsEditable()
   @Experimental() // untriaged
-  double get latitude => _blink.BlinkCircularGeofencingRegion.instance.latitude_Getter_(unwrap_jso(this));
+  num get latitude => _blink.BlinkCircularGeofencingRegion.instance.latitude_Getter_(unwrap_jso(this));
   
   @DomName('CircularGeofencingRegion.longitude')
   @DocsEditable()
   @Experimental() // untriaged
-  double get longitude => _blink.BlinkCircularGeofencingRegion.instance.longitude_Getter_(unwrap_jso(this));
+  num get longitude => _blink.BlinkCircularGeofencingRegion.instance.longitude_Getter_(unwrap_jso(this));
   
   @DomName('CircularGeofencingRegion.radius')
   @DocsEditable()
   @Experimental() // untriaged
-  double get radius => _blink.BlinkCircularGeofencingRegion.instance.radius_Getter_(unwrap_jso(this));
+  num get radius => _blink.BlinkCircularGeofencingRegion.instance.radius_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3442,6 +4554,18 @@
   // To suppress missing implicit constructor warnings.
   factory CloseEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CloseEvent internalCreateCloseEvent() {
+    return new CloseEvent._internalWrap();
+  }
+
+  factory CloseEvent._internalWrap() {
+    return new CloseEvent.internal_();
+  }
+
+  CloseEvent.internal_() : super.internal_();
+
+
   @DomName('CloseEvent.code')
   @DocsEditable()
   int get code => _blink.BlinkCloseEvent.instance.code_Getter_(unwrap_jso(this));
@@ -3470,10 +4594,22 @@
   @DocsEditable()
   factory Comment([String data]) {
     if (data != null) {
-      return _blink.BlinkComment.instance.constructorCallback_1_(data);
+      return wrap_jso(_blink.BlinkComment.instance.constructorCallback_1_(data));
     }
-    return _blink.BlinkComment.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkComment.instance.constructorCallback_0_());
   }
+
+
+  static Comment internalCreateComment() {
+    return new Comment._internalWrap();
+  }
+
+  factory Comment._internalWrap() {
+    return new Comment.internal_();
+  }
+
+  Comment.internal_() : super.internal_();
+
 }
 // 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
@@ -3500,6 +4636,18 @@
   // To suppress missing implicit constructor warnings.
   factory CompositionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CompositionEvent internalCreateCompositionEvent() {
+    return new CompositionEvent._internalWrap();
+  }
+
+  factory CompositionEvent._internalWrap() {
+    return new CompositionEvent.internal_();
+  }
+
+  CompositionEvent.internal_() : super.internal_();
+
+
   @DomName('CompositionEvent.activeSegmentEnd')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3537,6 +4685,18 @@
   // To suppress missing implicit constructor warnings.
   factory Console._() { throw new UnsupportedError("Not supported"); }
 
+
+  static Console internalCreateConsole() {
+    return new Console._internalWrap();
+  }
+
+  factory Console._internalWrap() {
+    return new Console.internal_();
+  }
+
+  Console.internal_() : super.internal_();
+
+
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
@@ -3557,6 +4717,21 @@
   // To suppress missing implicit constructor warnings.
   factory ConsoleBase._() { throw new UnsupportedError("Not supported"); }
 
+  static ConsoleBase internalCreateConsoleBase() {
+    return new ConsoleBase._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ConsoleBase._internalWrap() {
+    return new ConsoleBase.internal_();
+  }
+
+  ConsoleBase.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3692,6 +4867,18 @@
   @DomName('HTMLContentElement.HTMLContentElement')
   @DocsEditable()
   factory ContentElement() => document.createElement("content");
+
+
+  static ContentElement internalCreateContentElement() {
+    return new ContentElement._internalWrap();
+  }
+
+  factory ContentElement._internalWrap() {
+    return new ContentElement.internal_();
+  }
+
+  ContentElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3708,11 +4895,11 @@
   
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  void set select(String value) => _blink.BlinkHTMLContentElement.instance.select_Setter_(unwrap_jso(this), value);
+  set select(String value) => _blink.BlinkHTMLContentElement.instance.select_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() => wrap_jso_list(_blink.BlinkHTMLContentElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
+  List<Node> getDistributedNodes() => wrap_jso(_blink.BlinkHTMLContentElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3728,33 +4915,48 @@
   // To suppress missing implicit constructor warnings.
   factory Coordinates._() { throw new UnsupportedError("Not supported"); }
 
+  static Coordinates internalCreateCoordinates() {
+    return new Coordinates._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Coordinates._internalWrap() {
+    return new Coordinates.internal_();
+  }
+
+  Coordinates.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  double get accuracy => _blink.BlinkCoordinates.instance.accuracy_Getter_(unwrap_jso(this));
+  num get accuracy => _blink.BlinkCoordinates.instance.accuracy_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  double get altitude => _blink.BlinkCoordinates.instance.altitude_Getter_(unwrap_jso(this));
+  num get altitude => _blink.BlinkCoordinates.instance.altitude_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  double get altitudeAccuracy => _blink.BlinkCoordinates.instance.altitudeAccuracy_Getter_(unwrap_jso(this));
+  num get altitudeAccuracy => _blink.BlinkCoordinates.instance.altitudeAccuracy_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.heading')
   @DocsEditable()
-  double get heading => _blink.BlinkCoordinates.instance.heading_Getter_(unwrap_jso(this));
+  num get heading => _blink.BlinkCoordinates.instance.heading_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  double get latitude => _blink.BlinkCoordinates.instance.latitude_Getter_(unwrap_jso(this));
+  num get latitude => _blink.BlinkCoordinates.instance.latitude_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  double get longitude => _blink.BlinkCoordinates.instance.longitude_Getter_(unwrap_jso(this));
+  num get longitude => _blink.BlinkCoordinates.instance.longitude_Getter_(unwrap_jso(this));
   
   @DomName('Coordinates.speed')
   @DocsEditable()
-  double get speed => _blink.BlinkCoordinates.instance.speed_Getter_(unwrap_jso(this));
+  num get speed => _blink.BlinkCoordinates.instance.speed_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3771,6 +4973,21 @@
   // To suppress missing implicit constructor warnings.
   factory Credential._() { throw new UnsupportedError("Not supported"); }
 
+  static Credential internalCreateCredential() {
+    return new Credential._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Credential._internalWrap() {
+    return new Credential.internal_();
+  }
+
+  Credential.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Credential.avatarURL')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3801,26 +5018,41 @@
   // To suppress missing implicit constructor warnings.
   factory CredentialsContainer._() { throw new UnsupportedError("Not supported"); }
 
+  static CredentialsContainer internalCreateCredentialsContainer() {
+    return new CredentialsContainer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CredentialsContainer._internalWrap() {
+    return new CredentialsContainer.internal_();
+  }
+
+  CredentialsContainer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CredentialsContainer.notifyFailedSignIn')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifyFailedSignIn(Credential credential) => _blink.BlinkCredentialsContainer.instance.notifyFailedSignIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential));
+  Future notifyFailedSignIn(Credential credential) => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifyFailedSignIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential)));
   
   @DomName('CredentialsContainer.notifySignedIn')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifySignedIn(Credential credential) => _blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential));
+  Future notifySignedIn(Credential credential) => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifySignedIn_Callback_1_(unwrap_jso(this), unwrap_jso(credential)));
   
   @DomName('CredentialsContainer.notifySignedOut')
   @DocsEditable()
   @Experimental() // untriaged
-  Future notifySignedOut() => _blink.BlinkCredentialsContainer.instance.notifySignedOut_Callback_0_(unwrap_jso(this));
+  Future notifySignedOut() => wrap_jso(_blink.BlinkCredentialsContainer.instance.notifySignedOut_Callback_0_(unwrap_jso(this)));
   
   Future request([Map options]) {
     if (options != null) {
-      return _blink.BlinkCredentialsContainer.instance.request_Callback_1_(unwrap_jso(this), options);
+      return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
     }
-    return _blink.BlinkCredentialsContainer.instance.request_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkCredentialsContainer.instance.request_Callback_0_(unwrap_jso(this)));
   }
 
 }
@@ -3841,6 +5073,21 @@
   // To suppress missing implicit constructor warnings.
   factory Crypto._() { throw new UnsupportedError("Not supported"); }
 
+  static Crypto internalCreateCrypto() {
+    return new Crypto._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Crypto._internalWrap() {
+    return new Crypto.internal_();
+  }
+
+  Crypto.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -3851,7 +5098,7 @@
   
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData getRandomValues(TypedData array) => _blink.BlinkCrypto.instance.getRandomValues_Callback_1_(unwrap_jso(this), unwrap_jso(array));
+  TypedData getRandomValues(TypedData array) => wrap_jso(_blink.BlinkCrypto.instance.getRandomValues_Callback_1_(unwrap_jso(this), unwrap_jso(array)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3868,10 +5115,25 @@
   // To suppress missing implicit constructor warnings.
   factory CryptoKey._() { throw new UnsupportedError("Not supported"); }
 
+  static CryptoKey internalCreateCryptoKey() {
+    return new CryptoKey._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CryptoKey._internalWrap() {
+    return new CryptoKey.internal_();
+  }
+
+  CryptoKey.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CryptoKey.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get algorithm => _blink.BlinkCryptoKey.instance.algorithm_Getter_(unwrap_jso(this));
+  Object get algorithm => wrap_jso(_blink.BlinkCryptoKey.instance.algorithm_Getter_(unwrap_jso(this)));
   
   @DomName('CryptoKey.extractable')
   @DocsEditable()
@@ -3904,6 +5166,21 @@
   // To suppress missing implicit constructor warnings.
   factory Css._() { throw new UnsupportedError("Not supported"); }
 
+  static Css internalCreateCss() {
+    return new Css._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Css._internalWrap() {
+    return new Css.internal_();
+  }
+
+  Css.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CSS.supports')
   @DocsEditable()
   bool supports(String property, String value) => _blink.BlinkCSS.instance.supports_Callback_2_(unwrap_jso(this), property, value);
@@ -3928,13 +5205,25 @@
   // To suppress missing implicit constructor warnings.
   factory CssCharsetRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssCharsetRule internalCreateCssCharsetRule() {
+    return new CssCharsetRule._internalWrap();
+  }
+
+  factory CssCharsetRule._internalWrap() {
+    return new CssCharsetRule.internal_();
+  }
+
+  CssCharsetRule.internal_() : super.internal_();
+
+
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
   String get encoding => _blink.BlinkCSSCharsetRule.instance.encoding_Getter_(unwrap_jso(this));
   
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.BlinkCSSCharsetRule.instance.encoding_Setter_(unwrap_jso(this), value);
+  set encoding(String value) => _blink.BlinkCSSCharsetRule.instance.encoding_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3954,6 +5243,18 @@
   // To suppress missing implicit constructor warnings.
   factory CssFilterRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssFilterRule internalCreateCssFilterRule() {
+    return new CssFilterRule._internalWrap();
+  }
+
+  factory CssFilterRule._internalWrap() {
+    return new CssFilterRule.internal_();
+  }
+
+  CssFilterRule.internal_() : super.internal_();
+
+
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable()
   CssStyleDeclaration get style => wrap_jso(_blink.BlinkWebKitCSSFilterRule.instance.style_Getter_(unwrap_jso(this)));
@@ -3972,6 +5273,18 @@
   // To suppress missing implicit constructor warnings.
   factory CssFontFaceRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssFontFaceRule internalCreateCssFontFaceRule() {
+    return new CssFontFaceRule._internalWrap();
+  }
+
+  factory CssFontFaceRule._internalWrap() {
+    return new CssFontFaceRule.internal_();
+  }
+
+  CssFontFaceRule.internal_() : super.internal_();
+
+
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
   CssStyleDeclaration get style => wrap_jso(_blink.BlinkCSSFontFaceRule.instance.style_Getter_(unwrap_jso(this)));
@@ -3990,6 +5303,18 @@
   // To suppress missing implicit constructor warnings.
   factory CssImportRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssImportRule internalCreateCssImportRule() {
+    return new CssImportRule._internalWrap();
+  }
+
+  factory CssImportRule._internalWrap() {
+    return new CssImportRule.internal_();
+  }
+
+  CssImportRule.internal_() : super.internal_();
+
+
   @DomName('CSSImportRule.href')
   @DocsEditable()
   String get href => _blink.BlinkCSSImportRule.instance.href_Getter_(unwrap_jso(this));
@@ -4017,6 +5342,18 @@
   // To suppress missing implicit constructor warnings.
   factory CssKeyframeRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssKeyframeRule internalCreateCssKeyframeRule() {
+    return new CssKeyframeRule._internalWrap();
+  }
+
+  factory CssKeyframeRule._internalWrap() {
+    return new CssKeyframeRule.internal_();
+  }
+
+  CssKeyframeRule.internal_() : super.internal_();
+
+
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
@@ -4025,7 +5362,7 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  void set keyText(String value) => _blink.BlinkCSSKeyframeRule.instance.keyText_Setter_(unwrap_jso(this), value);
+  set keyText(String value) => _blink.BlinkCSSKeyframeRule.instance.keyText_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
@@ -4047,10 +5384,22 @@
   // To suppress missing implicit constructor warnings.
   factory CssKeyframesRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssKeyframesRule internalCreateCssKeyframesRule() {
+    return new CssKeyframesRule._internalWrap();
+  }
+
+  factory CssKeyframesRule._internalWrap() {
+    return new CssKeyframesRule.internal_();
+  }
+
+  CssKeyframesRule.internal_() : super.internal_();
+
+
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => wrap_jso_list(_blink.BlinkCSSKeyframesRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.cssRules_Getter_(unwrap_jso(this)));
   
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
@@ -4060,12 +5409,12 @@
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void set name(String value) => _blink.BlinkCSSKeyframesRule.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkCSSKeyframesRule.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(unwrap_jso(this), index);
+  CssKeyframeRule __getter__(int index) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.$__getter___Callback_1_(unwrap_jso(this), index));
   
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
@@ -4075,7 +5424,7 @@
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) => _blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(unwrap_jso(this), key);
+  CssKeyframeRule findRule(String key) => wrap_jso(_blink.BlinkCSSKeyframesRule.instance.findRule_Callback_1_(unwrap_jso(this), key));
   
   @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
@@ -4096,9 +5445,21 @@
   // To suppress missing implicit constructor warnings.
   factory CssMediaRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssMediaRule internalCreateCssMediaRule() {
+    return new CssMediaRule._internalWrap();
+  }
+
+  factory CssMediaRule._internalWrap() {
+    return new CssMediaRule.internal_();
+  }
+
+  CssMediaRule.internal_() : super.internal_();
+
+
   @DomName('CSSMediaRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso_list(_blink.BlinkCSSMediaRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSMediaRule.instance.cssRules_Getter_(unwrap_jso(this)));
   
   @DomName('CSSMediaRule.media')
   @DocsEditable()
@@ -4126,13 +5487,25 @@
   // To suppress missing implicit constructor warnings.
   factory CssPageRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssPageRule internalCreateCssPageRule() {
+    return new CssPageRule._internalWrap();
+  }
+
+  factory CssPageRule._internalWrap() {
+    return new CssPageRule.internal_();
+  }
+
+  CssPageRule.internal_() : super.internal_();
+
+
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
   String get selectorText => _blink.BlinkCSSPageRule.instance.selectorText_Getter_(unwrap_jso(this));
   
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.BlinkCSSPageRule.instance.selectorText_Setter_(unwrap_jso(this), value);
+  set selectorText(String value) => _blink.BlinkCSSPageRule.instance.selectorText_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSPageRule.style')
   @DocsEditable()
@@ -4152,6 +5525,21 @@
   // To suppress missing implicit constructor warnings.
   factory CssRule._() { throw new UnsupportedError("Not supported"); }
 
+  static CssRule internalCreateCssRule() {
+    return new CssRule._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CssRule._internalWrap() {
+    return new CssRule.internal_();
+  }
+
+  CssRule.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CSSRule.CHARSET_RULE')
   @DocsEditable()
   static const int CHARSET_RULE = 2;
@@ -4219,7 +5607,7 @@
   
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.BlinkCSSRule.instance.cssText_Setter_(unwrap_jso(this), value);
+  set cssText(String value) => _blink.BlinkCSSRule.instance.cssText_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSRule.parentRule')
   @DocsEditable()
@@ -4247,7 +5635,7 @@
 
 
 @DomName('CSSStyleDeclaration')
-class CssStyleDeclaration  extends NativeFieldWrapperClass2 with
+class CssStyleDeclaration  extends JsoNativeFieldWrapper with
     CssStyleDeclarationBase  {
   factory CssStyleDeclaration() => new CssStyleDeclaration.css('');
 
@@ -4293,7 +5681,7 @@
   }
 
   bool _hasProperty(String propertyName) =>
-      _blink.BlinkCSSStyleDeclaration.$__propertyQuery___Callback_1(this, propertyName);
+      _blink.BlinkCSSStyleDeclaration.instance.$__propertyQuery___Callback_1_(unwrap_jso(this), propertyName) != null;
 
   @DomName('CSSStyleDeclaration.setProperty')
   void setProperty(String propertyName, String value, [String priority]) {
@@ -4337,13 +5725,28 @@
   // To suppress missing implicit constructor warnings.
   factory CssStyleDeclaration._() { throw new UnsupportedError("Not supported"); }
 
+  static CssStyleDeclaration internalCreateCssStyleDeclaration() {
+    return new CssStyleDeclaration._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CssStyleDeclaration._internalWrap() {
+    return new CssStyleDeclaration.internal_();
+  }
+
+  CssStyleDeclaration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
   String get cssText => _blink.BlinkCSSStyleDeclaration.instance.cssText_Getter_(unwrap_jso(this));
   
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.BlinkCSSStyleDeclaration.instance.cssText_Setter_(unwrap_jso(this), value);
+  set cssText(String value) => _blink.BlinkCSSStyleDeclaration.instance.cssText_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
@@ -4416,16 +5819,18 @@
   // items in the MEMBERS set if you want that functionality.
 }
 
-abstract class CssStyleDeclarationBase {
-  String getPropertyValue(String propertyName);
-  void setProperty(String propertyName, String value, [String priority]);
+class CssStyleDeclarationBase {
+  String getPropertyValue(String propertyName) =>
+    throw new StateError('getProperty not overridden in dart:html');
+  void setProperty(String propertyName, String value, [String priority]) =>
+    throw new StateError('setProperty not overridden in dart:html');
 
   /** Gets the value of "align-content" */
   String get alignContent =>
     getPropertyValue('align-content');
 
   /** Sets the value of "align-content" */
-  void set alignContent(String value) {
+  set alignContent(String value) {
     setProperty('align-content', value, '');
   }
 
@@ -4434,7 +5839,7 @@
     getPropertyValue('align-items');
 
   /** Sets the value of "align-items" */
-  void set alignItems(String value) {
+  set alignItems(String value) {
     setProperty('align-items', value, '');
   }
 
@@ -4443,7 +5848,7 @@
     getPropertyValue('align-self');
 
   /** Sets the value of "align-self" */
-  void set alignSelf(String value) {
+  set alignSelf(String value) {
     setProperty('align-self', value, '');
   }
 
@@ -4452,7 +5857,7 @@
     getPropertyValue('animation');
 
   /** Sets the value of "animation" */
-  void set animation(String value) {
+  set animation(String value) {
     setProperty('animation', value, '');
   }
 
@@ -4461,7 +5866,7 @@
     getPropertyValue('animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(String value) {
+  set animationDelay(String value) {
     setProperty('animation-delay', value, '');
   }
 
@@ -4470,7 +5875,7 @@
     getPropertyValue('animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(String value) {
+  set animationDirection(String value) {
     setProperty('animation-direction', value, '');
   }
 
@@ -4479,7 +5884,7 @@
     getPropertyValue('animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(String value) {
+  set animationDuration(String value) {
     setProperty('animation-duration', value, '');
   }
 
@@ -4488,7 +5893,7 @@
     getPropertyValue('animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(String value) {
+  set animationFillMode(String value) {
     setProperty('animation-fill-mode', value, '');
   }
 
@@ -4497,7 +5902,7 @@
     getPropertyValue('animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(String value) {
+  set animationIterationCount(String value) {
     setProperty('animation-iteration-count', value, '');
   }
 
@@ -4506,7 +5911,7 @@
     getPropertyValue('animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(String value) {
+  set animationName(String value) {
     setProperty('animation-name', value, '');
   }
 
@@ -4515,7 +5920,7 @@
     getPropertyValue('animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(String value) {
+  set animationPlayState(String value) {
     setProperty('animation-play-state', value, '');
   }
 
@@ -4524,7 +5929,7 @@
     getPropertyValue('animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(String value) {
+  set animationTimingFunction(String value) {
     setProperty('animation-timing-function', value, '');
   }
 
@@ -4533,7 +5938,7 @@
     getPropertyValue('app-region');
 
   /** Sets the value of "app-region" */
-  void set appRegion(String value) {
+  set appRegion(String value) {
     setProperty('app-region', value, '');
   }
 
@@ -4542,7 +5947,7 @@
     getPropertyValue('appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(String value) {
+  set appearance(String value) {
     setProperty('appearance', value, '');
   }
 
@@ -4551,7 +5956,7 @@
     getPropertyValue('aspect-ratio');
 
   /** Sets the value of "aspect-ratio" */
-  void set aspectRatio(String value) {
+  set aspectRatio(String value) {
     setProperty('aspect-ratio', value, '');
   }
 
@@ -4560,7 +5965,7 @@
     getPropertyValue('backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(String value) {
+  set backfaceVisibility(String value) {
     setProperty('backface-visibility', value, '');
   }
 
@@ -4569,7 +5974,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -4578,7 +5983,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -4587,7 +5992,7 @@
     getPropertyValue('background-blend-mode');
 
   /** Sets the value of "background-blend-mode" */
-  void set backgroundBlendMode(String value) {
+  set backgroundBlendMode(String value) {
     setProperty('background-blend-mode', value, '');
   }
 
@@ -4596,7 +6001,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(String value) {
+  set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -4605,7 +6010,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -4614,7 +6019,7 @@
     getPropertyValue('background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(String value) {
+  set backgroundComposite(String value) {
     setProperty('background-composite', value, '');
   }
 
@@ -4623,7 +6028,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -4632,7 +6037,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(String value) {
+  set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -4641,7 +6046,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -4650,7 +6055,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(String value) {
+  set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -4659,7 +6064,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(String value) {
+  set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -4668,7 +6073,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -4677,7 +6082,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(String value) {
+  set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -4686,7 +6091,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(String value) {
+  set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -4695,7 +6100,7 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(String value) {
+  set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
@@ -4704,7 +6109,7 @@
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -4713,7 +6118,7 @@
     getPropertyValue('border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(String value) {
+  set borderAfter(String value) {
     setProperty('border-after', value, '');
   }
 
@@ -4722,7 +6127,7 @@
     getPropertyValue('border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(String value) {
+  set borderAfterColor(String value) {
     setProperty('border-after-color', value, '');
   }
 
@@ -4731,7 +6136,7 @@
     getPropertyValue('border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(String value) {
+  set borderAfterStyle(String value) {
     setProperty('border-after-style', value, '');
   }
 
@@ -4740,7 +6145,7 @@
     getPropertyValue('border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(String value) {
+  set borderAfterWidth(String value) {
     setProperty('border-after-width', value, '');
   }
 
@@ -4749,7 +6154,7 @@
     getPropertyValue('border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(String value) {
+  set borderBefore(String value) {
     setProperty('border-before', value, '');
   }
 
@@ -4758,7 +6163,7 @@
     getPropertyValue('border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(String value) {
+  set borderBeforeColor(String value) {
     setProperty('border-before-color', value, '');
   }
 
@@ -4767,7 +6172,7 @@
     getPropertyValue('border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(String value) {
+  set borderBeforeStyle(String value) {
     setProperty('border-before-style', value, '');
   }
 
@@ -4776,7 +6181,7 @@
     getPropertyValue('border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(String value) {
+  set borderBeforeWidth(String value) {
     setProperty('border-before-width', value, '');
   }
 
@@ -4785,7 +6190,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -4794,7 +6199,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -4803,7 +6208,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(String value) {
+  set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -4812,7 +6217,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(String value) {
+  set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -4821,7 +6226,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -4830,7 +6235,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -4839,7 +6244,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -4848,7 +6253,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -4857,7 +6262,7 @@
     getPropertyValue('border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(String value) {
+  set borderEnd(String value) {
     setProperty('border-end', value, '');
   }
 
@@ -4866,7 +6271,7 @@
     getPropertyValue('border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(String value) {
+  set borderEndColor(String value) {
     setProperty('border-end-color', value, '');
   }
 
@@ -4875,7 +6280,7 @@
     getPropertyValue('border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(String value) {
+  set borderEndStyle(String value) {
     setProperty('border-end-style', value, '');
   }
 
@@ -4884,7 +6289,7 @@
     getPropertyValue('border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(String value) {
+  set borderEndWidth(String value) {
     setProperty('border-end-width', value, '');
   }
 
@@ -4893,7 +6298,7 @@
     getPropertyValue('border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(String value) {
+  set borderFit(String value) {
     setProperty('border-fit', value, '');
   }
 
@@ -4902,7 +6307,7 @@
     getPropertyValue('border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(String value) {
+  set borderHorizontalSpacing(String value) {
     setProperty('border-horizontal-spacing', value, '');
   }
 
@@ -4911,7 +6316,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(String value) {
+  set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -4920,7 +6325,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(String value) {
+  set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -4929,7 +6334,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(String value) {
+  set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -4938,7 +6343,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(String value) {
+  set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -4947,7 +6352,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(String value) {
+  set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -4956,7 +6361,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(String value) {
+  set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -4965,7 +6370,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -4974,7 +6379,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -4983,7 +6388,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -4992,7 +6397,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -5001,7 +6406,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(String value) {
+  set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -5010,7 +6415,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -5019,7 +6424,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -5028,7 +6433,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -5037,7 +6442,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -5046,7 +6451,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -5055,7 +6460,7 @@
     getPropertyValue('border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(String value) {
+  set borderStart(String value) {
     setProperty('border-start', value, '');
   }
 
@@ -5064,7 +6469,7 @@
     getPropertyValue('border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(String value) {
+  set borderStartColor(String value) {
     setProperty('border-start-color', value, '');
   }
 
@@ -5073,7 +6478,7 @@
     getPropertyValue('border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(String value) {
+  set borderStartStyle(String value) {
     setProperty('border-start-style', value, '');
   }
 
@@ -5082,7 +6487,7 @@
     getPropertyValue('border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(String value) {
+  set borderStartWidth(String value) {
     setProperty('border-start-width', value, '');
   }
 
@@ -5091,7 +6496,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -5100,7 +6505,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -5109,7 +6514,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -5118,7 +6523,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(String value) {
+  set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -5127,7 +6532,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(String value) {
+  set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -5136,7 +6541,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -5145,7 +6550,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -5154,7 +6559,7 @@
     getPropertyValue('border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(String value) {
+  set borderVerticalSpacing(String value) {
     setProperty('border-vertical-spacing', value, '');
   }
 
@@ -5163,7 +6568,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -5172,7 +6577,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -5181,7 +6586,7 @@
     getPropertyValue('box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(String value) {
+  set boxAlign(String value) {
     setProperty('box-align', value, '');
   }
 
@@ -5190,7 +6595,7 @@
     getPropertyValue('box-decoration-break');
 
   /** Sets the value of "box-decoration-break" */
-  void set boxDecorationBreak(String value) {
+  set boxDecorationBreak(String value) {
     setProperty('box-decoration-break', value, '');
   }
 
@@ -5199,7 +6604,7 @@
     getPropertyValue('box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(String value) {
+  set boxDirection(String value) {
     setProperty('box-direction', value, '');
   }
 
@@ -5208,7 +6613,7 @@
     getPropertyValue('box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(String value) {
+  set boxFlex(String value) {
     setProperty('box-flex', value, '');
   }
 
@@ -5217,7 +6622,7 @@
     getPropertyValue('box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(String value) {
+  set boxFlexGroup(String value) {
     setProperty('box-flex-group', value, '');
   }
 
@@ -5226,7 +6631,7 @@
     getPropertyValue('box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(String value) {
+  set boxLines(String value) {
     setProperty('box-lines', value, '');
   }
 
@@ -5235,7 +6640,7 @@
     getPropertyValue('box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(String value) {
+  set boxOrdinalGroup(String value) {
     setProperty('box-ordinal-group', value, '');
   }
 
@@ -5244,7 +6649,7 @@
     getPropertyValue('box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(String value) {
+  set boxOrient(String value) {
     setProperty('box-orient', value, '');
   }
 
@@ -5253,7 +6658,7 @@
     getPropertyValue('box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(String value) {
+  set boxPack(String value) {
     setProperty('box-pack', value, '');
   }
 
@@ -5262,7 +6667,7 @@
     getPropertyValue('box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(String value) {
+  set boxReflect(String value) {
     setProperty('box-reflect', value, '');
   }
 
@@ -5271,7 +6676,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(String value) {
+  set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -5280,7 +6685,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(String value) {
+  set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -5289,7 +6694,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -5298,7 +6703,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -5307,7 +6712,7 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     setProperty('clip', value, '');
   }
 
@@ -5316,7 +6721,7 @@
     getPropertyValue('clip-path');
 
   /** Sets the value of "clip-path" */
-  void set clipPath(String value) {
+  set clipPath(String value) {
     setProperty('clip-path', value, '');
   }
 
@@ -5325,7 +6730,7 @@
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -5334,7 +6739,7 @@
     getPropertyValue('column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(String value) {
+  set columnBreakAfter(String value) {
     setProperty('column-break-after', value, '');
   }
 
@@ -5343,7 +6748,7 @@
     getPropertyValue('column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(String value) {
+  set columnBreakBefore(String value) {
     setProperty('column-break-before', value, '');
   }
 
@@ -5352,7 +6757,7 @@
     getPropertyValue('column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(String value) {
+  set columnBreakInside(String value) {
     setProperty('column-break-inside', value, '');
   }
 
@@ -5361,7 +6766,7 @@
     getPropertyValue('column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(String value) {
+  set columnCount(String value) {
     setProperty('column-count', value, '');
   }
 
@@ -5370,7 +6775,7 @@
     getPropertyValue('column-fill');
 
   /** Sets the value of "column-fill" */
-  void set columnFill(String value) {
+  set columnFill(String value) {
     setProperty('column-fill', value, '');
   }
 
@@ -5379,7 +6784,7 @@
     getPropertyValue('column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(String value) {
+  set columnGap(String value) {
     setProperty('column-gap', value, '');
   }
 
@@ -5388,7 +6793,7 @@
     getPropertyValue('column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(String value) {
+  set columnRule(String value) {
     setProperty('column-rule', value, '');
   }
 
@@ -5397,7 +6802,7 @@
     getPropertyValue('column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(String value) {
+  set columnRuleColor(String value) {
     setProperty('column-rule-color', value, '');
   }
 
@@ -5406,7 +6811,7 @@
     getPropertyValue('column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(String value) {
+  set columnRuleStyle(String value) {
     setProperty('column-rule-style', value, '');
   }
 
@@ -5415,7 +6820,7 @@
     getPropertyValue('column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(String value) {
+  set columnRuleWidth(String value) {
     setProperty('column-rule-width', value, '');
   }
 
@@ -5424,7 +6829,7 @@
     getPropertyValue('column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(String value) {
+  set columnSpan(String value) {
     setProperty('column-span', value, '');
   }
 
@@ -5433,7 +6838,7 @@
     getPropertyValue('column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(String value) {
+  set columnWidth(String value) {
     setProperty('column-width', value, '');
   }
 
@@ -5442,7 +6847,7 @@
     getPropertyValue('columns');
 
   /** Sets the value of "columns" */
-  void set columns(String value) {
+  set columns(String value) {
     setProperty('columns', value, '');
   }
 
@@ -5451,7 +6856,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -5460,7 +6865,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(String value) {
+  set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -5469,7 +6874,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(String value) {
+  set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -5478,7 +6883,7 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
@@ -5487,7 +6892,7 @@
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -5496,7 +6901,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -5505,7 +6910,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -5514,7 +6919,7 @@
     getPropertyValue('filter');
 
   /** Sets the value of "filter" */
-  void set filter(String value) {
+  set filter(String value) {
     setProperty('filter', value, '');
   }
 
@@ -5523,7 +6928,7 @@
     getPropertyValue('flex');
 
   /** Sets the value of "flex" */
-  void set flex(String value) {
+  set flex(String value) {
     setProperty('flex', value, '');
   }
 
@@ -5532,7 +6937,7 @@
     getPropertyValue('flex-basis');
 
   /** Sets the value of "flex-basis" */
-  void set flexBasis(String value) {
+  set flexBasis(String value) {
     setProperty('flex-basis', value, '');
   }
 
@@ -5541,7 +6946,7 @@
     getPropertyValue('flex-direction');
 
   /** Sets the value of "flex-direction" */
-  void set flexDirection(String value) {
+  set flexDirection(String value) {
     setProperty('flex-direction', value, '');
   }
 
@@ -5550,7 +6955,7 @@
     getPropertyValue('flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(String value) {
+  set flexFlow(String value) {
     setProperty('flex-flow', value, '');
   }
 
@@ -5559,7 +6964,7 @@
     getPropertyValue('flex-grow');
 
   /** Sets the value of "flex-grow" */
-  void set flexGrow(String value) {
+  set flexGrow(String value) {
     setProperty('flex-grow', value, '');
   }
 
@@ -5568,7 +6973,7 @@
     getPropertyValue('flex-shrink');
 
   /** Sets the value of "flex-shrink" */
-  void set flexShrink(String value) {
+  set flexShrink(String value) {
     setProperty('flex-shrink', value, '');
   }
 
@@ -5577,7 +6982,7 @@
     getPropertyValue('flex-wrap');
 
   /** Sets the value of "flex-wrap" */
-  void set flexWrap(String value) {
+  set flexWrap(String value) {
     setProperty('flex-wrap', value, '');
   }
 
@@ -5586,7 +6991,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(String value) {
+  set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -5595,7 +7000,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -5604,7 +7009,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -5613,7 +7018,7 @@
     getPropertyValue('font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(String value) {
+  set fontFeatureSettings(String value) {
     setProperty('font-feature-settings', value, '');
   }
 
@@ -5622,7 +7027,7 @@
     getPropertyValue('font-kerning');
 
   /** Sets the value of "font-kerning" */
-  void set fontKerning(String value) {
+  set fontKerning(String value) {
     setProperty('font-kerning', value, '');
   }
 
@@ -5631,7 +7036,7 @@
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -5640,7 +7045,7 @@
     getPropertyValue('font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(String value) {
+  set fontSizeDelta(String value) {
     setProperty('font-size-delta', value, '');
   }
 
@@ -5649,7 +7054,7 @@
     getPropertyValue('font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(String value) {
+  set fontSmoothing(String value) {
     setProperty('font-smoothing', value, '');
   }
 
@@ -5658,7 +7063,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(String value) {
+  set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -5667,7 +7072,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -5676,7 +7081,7 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
@@ -5685,7 +7090,7 @@
     getPropertyValue('font-variant-ligatures');
 
   /** Sets the value of "font-variant-ligatures" */
-  void set fontVariantLigatures(String value) {
+  set fontVariantLigatures(String value) {
     setProperty('font-variant-ligatures', value, '');
   }
 
@@ -5694,7 +7099,7 @@
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
@@ -5703,7 +7108,7 @@
     getPropertyValue('grid');
 
   /** Sets the value of "grid" */
-  void set grid(String value) {
+  set grid(String value) {
     setProperty('grid', value, '');
   }
 
@@ -5712,7 +7117,7 @@
     getPropertyValue('grid-area');
 
   /** Sets the value of "grid-area" */
-  void set gridArea(String value) {
+  set gridArea(String value) {
     setProperty('grid-area', value, '');
   }
 
@@ -5721,7 +7126,7 @@
     getPropertyValue('grid-auto-columns');
 
   /** Sets the value of "grid-auto-columns" */
-  void set gridAutoColumns(String value) {
+  set gridAutoColumns(String value) {
     setProperty('grid-auto-columns', value, '');
   }
 
@@ -5730,7 +7135,7 @@
     getPropertyValue('grid-auto-flow');
 
   /** Sets the value of "grid-auto-flow" */
-  void set gridAutoFlow(String value) {
+  set gridAutoFlow(String value) {
     setProperty('grid-auto-flow', value, '');
   }
 
@@ -5739,7 +7144,7 @@
     getPropertyValue('grid-auto-rows');
 
   /** Sets the value of "grid-auto-rows" */
-  void set gridAutoRows(String value) {
+  set gridAutoRows(String value) {
     setProperty('grid-auto-rows', value, '');
   }
 
@@ -5748,7 +7153,7 @@
     getPropertyValue('grid-column');
 
   /** Sets the value of "grid-column" */
-  void set gridColumn(String value) {
+  set gridColumn(String value) {
     setProperty('grid-column', value, '');
   }
 
@@ -5757,7 +7162,7 @@
     getPropertyValue('grid-column-end');
 
   /** Sets the value of "grid-column-end" */
-  void set gridColumnEnd(String value) {
+  set gridColumnEnd(String value) {
     setProperty('grid-column-end', value, '');
   }
 
@@ -5766,7 +7171,7 @@
     getPropertyValue('grid-column-start');
 
   /** Sets the value of "grid-column-start" */
-  void set gridColumnStart(String value) {
+  set gridColumnStart(String value) {
     setProperty('grid-column-start', value, '');
   }
 
@@ -5775,7 +7180,7 @@
     getPropertyValue('grid-row');
 
   /** Sets the value of "grid-row" */
-  void set gridRow(String value) {
+  set gridRow(String value) {
     setProperty('grid-row', value, '');
   }
 
@@ -5784,7 +7189,7 @@
     getPropertyValue('grid-row-end');
 
   /** Sets the value of "grid-row-end" */
-  void set gridRowEnd(String value) {
+  set gridRowEnd(String value) {
     setProperty('grid-row-end', value, '');
   }
 
@@ -5793,7 +7198,7 @@
     getPropertyValue('grid-row-start');
 
   /** Sets the value of "grid-row-start" */
-  void set gridRowStart(String value) {
+  set gridRowStart(String value) {
     setProperty('grid-row-start', value, '');
   }
 
@@ -5802,7 +7207,7 @@
     getPropertyValue('grid-template');
 
   /** Sets the value of "grid-template" */
-  void set gridTemplate(String value) {
+  set gridTemplate(String value) {
     setProperty('grid-template', value, '');
   }
 
@@ -5811,7 +7216,7 @@
     getPropertyValue('grid-template-areas');
 
   /** Sets the value of "grid-template-areas" */
-  void set gridTemplateAreas(String value) {
+  set gridTemplateAreas(String value) {
     setProperty('grid-template-areas', value, '');
   }
 
@@ -5820,7 +7225,7 @@
     getPropertyValue('grid-template-columns');
 
   /** Sets the value of "grid-template-columns" */
-  void set gridTemplateColumns(String value) {
+  set gridTemplateColumns(String value) {
     setProperty('grid-template-columns', value, '');
   }
 
@@ -5829,7 +7234,7 @@
     getPropertyValue('grid-template-rows');
 
   /** Sets the value of "grid-template-rows" */
-  void set gridTemplateRows(String value) {
+  set gridTemplateRows(String value) {
     setProperty('grid-template-rows', value, '');
   }
 
@@ -5838,7 +7243,7 @@
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -5847,7 +7252,7 @@
     getPropertyValue('highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(String value) {
+  set highlight(String value) {
     setProperty('highlight', value, '');
   }
 
@@ -5856,7 +7261,7 @@
     getPropertyValue('hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(String value) {
+  set hyphenateCharacter(String value) {
     setProperty('hyphenate-character', value, '');
   }
 
@@ -5865,7 +7270,7 @@
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(String value) {
+  set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
@@ -5874,7 +7279,7 @@
     getPropertyValue('isolation');
 
   /** Sets the value of "isolation" */
-  void set isolation(String value) {
+  set isolation(String value) {
     setProperty('isolation', value, '');
   }
 
@@ -5883,7 +7288,7 @@
     getPropertyValue('justify-content');
 
   /** Sets the value of "justify-content" */
-  void set justifyContent(String value) {
+  set justifyContent(String value) {
     setProperty('justify-content', value, '');
   }
 
@@ -5892,7 +7297,7 @@
     getPropertyValue('justify-self');
 
   /** Sets the value of "justify-self" */
-  void set justifySelf(String value) {
+  set justifySelf(String value) {
     setProperty('justify-self', value, '');
   }
 
@@ -5901,7 +7306,7 @@
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -5910,7 +7315,7 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
@@ -5919,7 +7324,7 @@
     getPropertyValue('line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(String value) {
+  set lineBoxContain(String value) {
     setProperty('line-box-contain', value, '');
   }
 
@@ -5928,7 +7333,7 @@
     getPropertyValue('line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(String value) {
+  set lineBreak(String value) {
     setProperty('line-break', value, '');
   }
 
@@ -5937,7 +7342,7 @@
     getPropertyValue('line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(String value) {
+  set lineClamp(String value) {
     setProperty('line-clamp', value, '');
   }
 
@@ -5946,7 +7351,7 @@
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
@@ -5955,7 +7360,7 @@
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -5964,7 +7369,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -5973,7 +7378,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -5982,7 +7387,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -5991,7 +7396,7 @@
     getPropertyValue('locale');
 
   /** Sets the value of "locale" */
-  void set locale(String value) {
+  set locale(String value) {
     setProperty('locale', value, '');
   }
 
@@ -6000,7 +7405,7 @@
     getPropertyValue('logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(String value) {
+  set logicalHeight(String value) {
     setProperty('logical-height', value, '');
   }
 
@@ -6009,7 +7414,7 @@
     getPropertyValue('logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(String value) {
+  set logicalWidth(String value) {
     setProperty('logical-width', value, '');
   }
 
@@ -6018,7 +7423,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -6027,7 +7432,7 @@
     getPropertyValue('margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(String value) {
+  set marginAfter(String value) {
     setProperty('margin-after', value, '');
   }
 
@@ -6036,7 +7441,7 @@
     getPropertyValue('margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(String value) {
+  set marginAfterCollapse(String value) {
     setProperty('margin-after-collapse', value, '');
   }
 
@@ -6045,7 +7450,7 @@
     getPropertyValue('margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(String value) {
+  set marginBefore(String value) {
     setProperty('margin-before', value, '');
   }
 
@@ -6054,7 +7459,7 @@
     getPropertyValue('margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(String value) {
+  set marginBeforeCollapse(String value) {
     setProperty('margin-before-collapse', value, '');
   }
 
@@ -6063,7 +7468,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -6072,7 +7477,7 @@
     getPropertyValue('margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(String value) {
+  set marginBottomCollapse(String value) {
     setProperty('margin-bottom-collapse', value, '');
   }
 
@@ -6081,7 +7486,7 @@
     getPropertyValue('margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(String value) {
+  set marginCollapse(String value) {
     setProperty('margin-collapse', value, '');
   }
 
@@ -6090,7 +7495,7 @@
     getPropertyValue('margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(String value) {
+  set marginEnd(String value) {
     setProperty('margin-end', value, '');
   }
 
@@ -6099,7 +7504,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -6108,7 +7513,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -6117,7 +7522,7 @@
     getPropertyValue('margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(String value) {
+  set marginStart(String value) {
     setProperty('margin-start', value, '');
   }
 
@@ -6126,7 +7531,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -6135,7 +7540,7 @@
     getPropertyValue('margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(String value) {
+  set marginTopCollapse(String value) {
     setProperty('margin-top-collapse', value, '');
   }
 
@@ -6144,7 +7549,7 @@
     getPropertyValue('mask');
 
   /** Sets the value of "mask" */
-  void set mask(String value) {
+  set mask(String value) {
     setProperty('mask', value, '');
   }
 
@@ -6153,7 +7558,7 @@
     getPropertyValue('mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(String value) {
+  set maskBoxImage(String value) {
     setProperty('mask-box-image', value, '');
   }
 
@@ -6162,7 +7567,7 @@
     getPropertyValue('mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(String value) {
+  set maskBoxImageOutset(String value) {
     setProperty('mask-box-image-outset', value, '');
   }
 
@@ -6171,7 +7576,7 @@
     getPropertyValue('mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(String value) {
+  set maskBoxImageRepeat(String value) {
     setProperty('mask-box-image-repeat', value, '');
   }
 
@@ -6180,7 +7585,7 @@
     getPropertyValue('mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(String value) {
+  set maskBoxImageSlice(String value) {
     setProperty('mask-box-image-slice', value, '');
   }
 
@@ -6189,7 +7594,7 @@
     getPropertyValue('mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(String value) {
+  set maskBoxImageSource(String value) {
     setProperty('mask-box-image-source', value, '');
   }
 
@@ -6198,7 +7603,7 @@
     getPropertyValue('mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(String value) {
+  set maskBoxImageWidth(String value) {
     setProperty('mask-box-image-width', value, '');
   }
 
@@ -6207,7 +7612,7 @@
     getPropertyValue('mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(String value) {
+  set maskClip(String value) {
     setProperty('mask-clip', value, '');
   }
 
@@ -6216,7 +7621,7 @@
     getPropertyValue('mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(String value) {
+  set maskComposite(String value) {
     setProperty('mask-composite', value, '');
   }
 
@@ -6225,7 +7630,7 @@
     getPropertyValue('mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(String value) {
+  set maskImage(String value) {
     setProperty('mask-image', value, '');
   }
 
@@ -6234,7 +7639,7 @@
     getPropertyValue('mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(String value) {
+  set maskOrigin(String value) {
     setProperty('mask-origin', value, '');
   }
 
@@ -6243,7 +7648,7 @@
     getPropertyValue('mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(String value) {
+  set maskPosition(String value) {
     setProperty('mask-position', value, '');
   }
 
@@ -6252,7 +7657,7 @@
     getPropertyValue('mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(String value) {
+  set maskPositionX(String value) {
     setProperty('mask-position-x', value, '');
   }
 
@@ -6261,7 +7666,7 @@
     getPropertyValue('mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(String value) {
+  set maskPositionY(String value) {
     setProperty('mask-position-y', value, '');
   }
 
@@ -6270,7 +7675,7 @@
     getPropertyValue('mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(String value) {
+  set maskRepeat(String value) {
     setProperty('mask-repeat', value, '');
   }
 
@@ -6279,7 +7684,7 @@
     getPropertyValue('mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(String value) {
+  set maskRepeatX(String value) {
     setProperty('mask-repeat-x', value, '');
   }
 
@@ -6288,7 +7693,7 @@
     getPropertyValue('mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(String value) {
+  set maskRepeatY(String value) {
     setProperty('mask-repeat-y', value, '');
   }
 
@@ -6297,7 +7702,7 @@
     getPropertyValue('mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(String value) {
+  set maskSize(String value) {
     setProperty('mask-size', value, '');
   }
 
@@ -6306,7 +7711,7 @@
     getPropertyValue('mask-source-type');
 
   /** Sets the value of "mask-source-type" */
-  void set maskSourceType(String value) {
+  set maskSourceType(String value) {
     setProperty('mask-source-type', value, '');
   }
 
@@ -6315,7 +7720,7 @@
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -6324,7 +7729,7 @@
     getPropertyValue('max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(String value) {
+  set maxLogicalHeight(String value) {
     setProperty('max-logical-height', value, '');
   }
 
@@ -6333,7 +7738,7 @@
     getPropertyValue('max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(String value) {
+  set maxLogicalWidth(String value) {
     setProperty('max-logical-width', value, '');
   }
 
@@ -6342,7 +7747,7 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
@@ -6351,7 +7756,7 @@
     getPropertyValue('max-zoom');
 
   /** Sets the value of "max-zoom" */
-  void set maxZoom(String value) {
+  set maxZoom(String value) {
     setProperty('max-zoom', value, '');
   }
 
@@ -6360,7 +7765,7 @@
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -6369,7 +7774,7 @@
     getPropertyValue('min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(String value) {
+  set minLogicalHeight(String value) {
     setProperty('min-logical-height', value, '');
   }
 
@@ -6378,7 +7783,7 @@
     getPropertyValue('min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(String value) {
+  set minLogicalWidth(String value) {
     setProperty('min-logical-width', value, '');
   }
 
@@ -6387,7 +7792,7 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
@@ -6396,7 +7801,7 @@
     getPropertyValue('min-zoom');
 
   /** Sets the value of "min-zoom" */
-  void set minZoom(String value) {
+  set minZoom(String value) {
     setProperty('min-zoom', value, '');
   }
 
@@ -6405,7 +7810,7 @@
     getPropertyValue('mix-blend-mode');
 
   /** Sets the value of "mix-blend-mode" */
-  void set mixBlendMode(String value) {
+  set mixBlendMode(String value) {
     setProperty('mix-blend-mode', value, '');
   }
 
@@ -6414,7 +7819,7 @@
     getPropertyValue('object-fit');
 
   /** Sets the value of "object-fit" */
-  void set objectFit(String value) {
+  set objectFit(String value) {
     setProperty('object-fit', value, '');
   }
 
@@ -6423,7 +7828,7 @@
     getPropertyValue('object-position');
 
   /** Sets the value of "object-position" */
-  void set objectPosition(String value) {
+  set objectPosition(String value) {
     setProperty('object-position', value, '');
   }
 
@@ -6432,7 +7837,7 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(String value) {
+  set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
@@ -6441,7 +7846,7 @@
     getPropertyValue('order');
 
   /** Sets the value of "order" */
-  void set order(String value) {
+  set order(String value) {
     setProperty('order', value, '');
   }
 
@@ -6450,7 +7855,7 @@
     getPropertyValue('orientation');
 
   /** Sets the value of "orientation" */
-  void set orientation(String value) {
+  set orientation(String value) {
     setProperty('orientation', value, '');
   }
 
@@ -6459,7 +7864,7 @@
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(String value) {
+  set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -6468,7 +7873,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -6477,7 +7882,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -6486,7 +7891,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(String value) {
+  set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -6495,7 +7900,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -6504,7 +7909,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -6513,7 +7918,7 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
@@ -6522,7 +7927,7 @@
     getPropertyValue('overflow-wrap');
 
   /** Sets the value of "overflow-wrap" */
-  void set overflowWrap(String value) {
+  set overflowWrap(String value) {
     setProperty('overflow-wrap', value, '');
   }
 
@@ -6531,7 +7936,7 @@
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(String value) {
+  set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -6540,7 +7945,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(String value) {
+  set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -6549,7 +7954,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -6558,7 +7963,7 @@
     getPropertyValue('padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(String value) {
+  set paddingAfter(String value) {
     setProperty('padding-after', value, '');
   }
 
@@ -6567,7 +7972,7 @@
     getPropertyValue('padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(String value) {
+  set paddingBefore(String value) {
     setProperty('padding-before', value, '');
   }
 
@@ -6576,7 +7981,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -6585,7 +7990,7 @@
     getPropertyValue('padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(String value) {
+  set paddingEnd(String value) {
     setProperty('padding-end', value, '');
   }
 
@@ -6594,7 +7999,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -6603,7 +8008,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -6612,7 +8017,7 @@
     getPropertyValue('padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(String value) {
+  set paddingStart(String value) {
     setProperty('padding-start', value, '');
   }
 
@@ -6621,7 +8026,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -6630,7 +8035,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(String value) {
+  set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -6639,7 +8044,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -6648,7 +8053,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -6657,7 +8062,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -6666,7 +8071,7 @@
     getPropertyValue('perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(String value) {
+  set perspective(String value) {
     setProperty('perspective', value, '');
   }
 
@@ -6675,7 +8080,7 @@
     getPropertyValue('perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(String value) {
+  set perspectiveOrigin(String value) {
     setProperty('perspective-origin', value, '');
   }
 
@@ -6684,7 +8089,7 @@
     getPropertyValue('perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(String value) {
+  set perspectiveOriginX(String value) {
     setProperty('perspective-origin-x', value, '');
   }
 
@@ -6693,7 +8098,7 @@
     getPropertyValue('perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(String value) {
+  set perspectiveOriginY(String value) {
     setProperty('perspective-origin-y', value, '');
   }
 
@@ -6702,7 +8107,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(String value) {
+  set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -6711,7 +8116,7 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     setProperty('position', value, '');
   }
 
@@ -6720,7 +8125,7 @@
     getPropertyValue('print-color-adjust');
 
   /** Sets the value of "print-color-adjust" */
-  void set printColorAdjust(String value) {
+  set printColorAdjust(String value) {
     setProperty('print-color-adjust', value, '');
   }
 
@@ -6729,7 +8134,7 @@
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -6738,7 +8143,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(String value) {
+  set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -6747,7 +8152,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -6756,7 +8161,7 @@
     getPropertyValue('rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(String value) {
+  set rtlOrdering(String value) {
     setProperty('rtl-ordering', value, '');
   }
 
@@ -6765,7 +8170,7 @@
     getPropertyValue('ruby-position');
 
   /** Sets the value of "ruby-position" */
-  void set rubyPosition(String value) {
+  set rubyPosition(String value) {
     setProperty('ruby-position', value, '');
   }
 
@@ -6774,7 +8179,7 @@
     getPropertyValue('scroll-behavior');
 
   /** Sets the value of "scroll-behavior" */
-  void set scrollBehavior(String value) {
+  set scrollBehavior(String value) {
     setProperty('scroll-behavior', value, '');
   }
 
@@ -6783,7 +8188,7 @@
     getPropertyValue('shape-image-threshold');
 
   /** Sets the value of "shape-image-threshold" */
-  void set shapeImageThreshold(String value) {
+  set shapeImageThreshold(String value) {
     setProperty('shape-image-threshold', value, '');
   }
 
@@ -6792,7 +8197,7 @@
     getPropertyValue('shape-margin');
 
   /** Sets the value of "shape-margin" */
-  void set shapeMargin(String value) {
+  set shapeMargin(String value) {
     setProperty('shape-margin', value, '');
   }
 
@@ -6801,7 +8206,7 @@
     getPropertyValue('shape-outside');
 
   /** Sets the value of "shape-outside" */
-  void set shapeOutside(String value) {
+  set shapeOutside(String value) {
     setProperty('shape-outside', value, '');
   }
 
@@ -6810,7 +8215,7 @@
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(String value) {
+  set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -6819,7 +8224,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(String value) {
+  set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -6828,7 +8233,7 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(String value) {
+  set src(String value) {
     setProperty('src', value, '');
   }
 
@@ -6837,7 +8242,7 @@
     getPropertyValue('tab-size');
 
   /** Sets the value of "tab-size" */
-  void set tabSize(String value) {
+  set tabSize(String value) {
     setProperty('tab-size', value, '');
   }
 
@@ -6846,7 +8251,7 @@
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -6855,7 +8260,7 @@
     getPropertyValue('tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(String value) {
+  set tapHighlightColor(String value) {
     setProperty('tap-highlight-color', value, '');
   }
 
@@ -6864,7 +8269,7 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
@@ -6873,7 +8278,7 @@
     getPropertyValue('text-align-last');
 
   /** Sets the value of "text-align-last" */
-  void set textAlignLast(String value) {
+  set textAlignLast(String value) {
     setProperty('text-align-last', value, '');
   }
 
@@ -6882,7 +8287,7 @@
     getPropertyValue('text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(String value) {
+  set textCombine(String value) {
     setProperty('text-combine', value, '');
   }
 
@@ -6891,7 +8296,7 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
@@ -6900,7 +8305,7 @@
     getPropertyValue('text-decoration-color');
 
   /** Sets the value of "text-decoration-color" */
-  void set textDecorationColor(String value) {
+  set textDecorationColor(String value) {
     setProperty('text-decoration-color', value, '');
   }
 
@@ -6909,7 +8314,7 @@
     getPropertyValue('text-decoration-line');
 
   /** Sets the value of "text-decoration-line" */
-  void set textDecorationLine(String value) {
+  set textDecorationLine(String value) {
     setProperty('text-decoration-line', value, '');
   }
 
@@ -6918,7 +8323,7 @@
     getPropertyValue('text-decoration-style');
 
   /** Sets the value of "text-decoration-style" */
-  void set textDecorationStyle(String value) {
+  set textDecorationStyle(String value) {
     setProperty('text-decoration-style', value, '');
   }
 
@@ -6927,7 +8332,7 @@
     getPropertyValue('text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(String value) {
+  set textDecorationsInEffect(String value) {
     setProperty('text-decorations-in-effect', value, '');
   }
 
@@ -6936,7 +8341,7 @@
     getPropertyValue('text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(String value) {
+  set textEmphasis(String value) {
     setProperty('text-emphasis', value, '');
   }
 
@@ -6945,7 +8350,7 @@
     getPropertyValue('text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(String value) {
+  set textEmphasisColor(String value) {
     setProperty('text-emphasis-color', value, '');
   }
 
@@ -6954,7 +8359,7 @@
     getPropertyValue('text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(String value) {
+  set textEmphasisPosition(String value) {
     setProperty('text-emphasis-position', value, '');
   }
 
@@ -6963,7 +8368,7 @@
     getPropertyValue('text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(String value) {
+  set textEmphasisStyle(String value) {
     setProperty('text-emphasis-style', value, '');
   }
 
@@ -6972,7 +8377,7 @@
     getPropertyValue('text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(String value) {
+  set textFillColor(String value) {
     setProperty('text-fill-color', value, '');
   }
 
@@ -6981,7 +8386,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -6990,7 +8395,7 @@
     getPropertyValue('text-justify');
 
   /** Sets the value of "text-justify" */
-  void set textJustify(String value) {
+  set textJustify(String value) {
     setProperty('text-justify', value, '');
   }
 
@@ -6999,7 +8404,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(String value) {
+  set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -7008,7 +8413,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(String value) {
+  set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -7017,7 +8422,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(String value) {
+  set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -7026,7 +8431,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(String value) {
+  set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -7035,7 +8440,7 @@
     getPropertyValue('text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(String value) {
+  set textOrientation(String value) {
     setProperty('text-orientation', value, '');
   }
 
@@ -7044,7 +8449,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(String value) {
+  set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -7053,7 +8458,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(String value) {
+  set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -7062,7 +8467,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(String value) {
+  set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -7071,7 +8476,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(String value) {
+  set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -7080,7 +8485,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(String value) {
+  set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -7089,7 +8494,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(String value) {
+  set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -7098,7 +8503,7 @@
     getPropertyValue('text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(String value) {
+  set textSecurity(String value) {
     setProperty('text-security', value, '');
   }
 
@@ -7107,7 +8512,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(String value) {
+  set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -7116,7 +8521,7 @@
     getPropertyValue('text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(String value) {
+  set textStroke(String value) {
     setProperty('text-stroke', value, '');
   }
 
@@ -7125,7 +8530,7 @@
     getPropertyValue('text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(String value) {
+  set textStrokeColor(String value) {
     setProperty('text-stroke-color', value, '');
   }
 
@@ -7134,7 +8539,7 @@
     getPropertyValue('text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(String value) {
+  set textStrokeWidth(String value) {
     setProperty('text-stroke-width', value, '');
   }
 
@@ -7143,7 +8548,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -7152,7 +8557,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(String value) {
+  set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -7161,7 +8566,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(String value) {
+  set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -7170,7 +8575,7 @@
     getPropertyValue('text-underline-position');
 
   /** Sets the value of "text-underline-position" */
-  void set textUnderlinePosition(String value) {
+  set textUnderlinePosition(String value) {
     setProperty('text-underline-position', value, '');
   }
 
@@ -7179,7 +8584,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(String value) {
+  set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -7188,7 +8593,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(String value) {
+  set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -7197,7 +8602,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -7206,7 +8611,7 @@
     getPropertyValue('touch-action');
 
   /** Sets the value of "touch-action" */
-  void set touchAction(String value) {
+  set touchAction(String value) {
     setProperty('touch-action', value, '');
   }
 
@@ -7215,7 +8620,7 @@
     getPropertyValue('touch-action-delay');
 
   /** Sets the value of "touch-action-delay" */
-  void set touchActionDelay(String value) {
+  set touchActionDelay(String value) {
     setProperty('touch-action-delay', value, '');
   }
 
@@ -7224,7 +8629,7 @@
     getPropertyValue('transform');
 
   /** Sets the value of "transform" */
-  void set transform(String value) {
+  set transform(String value) {
     setProperty('transform', value, '');
   }
 
@@ -7233,7 +8638,7 @@
     getPropertyValue('transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(String value) {
+  set transformOrigin(String value) {
     setProperty('transform-origin', value, '');
   }
 
@@ -7242,7 +8647,7 @@
     getPropertyValue('transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(String value) {
+  set transformOriginX(String value) {
     setProperty('transform-origin-x', value, '');
   }
 
@@ -7251,7 +8656,7 @@
     getPropertyValue('transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(String value) {
+  set transformOriginY(String value) {
     setProperty('transform-origin-y', value, '');
   }
 
@@ -7260,7 +8665,7 @@
     getPropertyValue('transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(String value) {
+  set transformOriginZ(String value) {
     setProperty('transform-origin-z', value, '');
   }
 
@@ -7269,7 +8674,7 @@
     getPropertyValue('transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(String value) {
+  set transformStyle(String value) {
     setProperty('transform-style', value, '');
   }
 
@@ -7284,7 +8689,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void set transition(String value) {
+  set transition(String value) {
     setProperty('transition', value, '');
   }
 
@@ -7293,7 +8698,7 @@
     getPropertyValue('transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(String value) {
+  set transitionDelay(String value) {
     setProperty('transition-delay', value, '');
   }
 
@@ -7302,7 +8707,7 @@
     getPropertyValue('transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(String value) {
+  set transitionDuration(String value) {
     setProperty('transition-duration', value, '');
   }
 
@@ -7311,7 +8716,7 @@
     getPropertyValue('transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(String value) {
+  set transitionProperty(String value) {
     setProperty('transition-property', value, '');
   }
 
@@ -7320,7 +8725,7 @@
     getPropertyValue('transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(String value) {
+  set transitionTimingFunction(String value) {
     setProperty('transition-timing-function', value, '');
   }
 
@@ -7329,7 +8734,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -7338,7 +8743,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(String value) {
+  set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -7347,7 +8752,7 @@
     getPropertyValue('user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(String value) {
+  set userDrag(String value) {
     setProperty('user-drag', value, '');
   }
 
@@ -7356,7 +8761,7 @@
     getPropertyValue('user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(String value) {
+  set userModify(String value) {
     setProperty('user-modify', value, '');
   }
 
@@ -7365,7 +8770,7 @@
     getPropertyValue('user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(String value) {
+  set userSelect(String value) {
     setProperty('user-select', value, '');
   }
 
@@ -7374,7 +8779,7 @@
     getPropertyValue('user-zoom');
 
   /** Sets the value of "user-zoom" */
-  void set userZoom(String value) {
+  set userZoom(String value) {
     setProperty('user-zoom', value, '');
   }
 
@@ -7383,7 +8788,7 @@
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -7392,7 +8797,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -7401,7 +8806,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -7410,7 +8815,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(String value) {
+  set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -7419,7 +8824,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -7428,7 +8833,7 @@
     getPropertyValue('will-change');
 
   /** Sets the value of "will-change" */
-  void set willChange(String value) {
+  set willChange(String value) {
     setProperty('will-change', value, '');
   }
 
@@ -7437,7 +8842,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(String value) {
+  set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -7446,7 +8851,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -7455,7 +8860,7 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(String value) {
+  set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
@@ -7464,7 +8869,7 @@
     getPropertyValue('wrap-flow');
 
   /** Sets the value of "wrap-flow" */
-  void set wrapFlow(String value) {
+  set wrapFlow(String value) {
     setProperty('wrap-flow', value, '');
   }
 
@@ -7473,7 +8878,7 @@
     getPropertyValue('wrap-through');
 
   /** Sets the value of "wrap-through" */
-  void set wrapThrough(String value) {
+  set wrapThrough(String value) {
     setProperty('wrap-through', value, '');
   }
 
@@ -7482,7 +8887,7 @@
     getPropertyValue('writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(String value) {
+  set writingMode(String value) {
     setProperty('writing-mode', value, '');
   }
 
@@ -7491,7 +8896,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -7500,7 +8905,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(String value) {
+  set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
@@ -7517,13 +8922,25 @@
   // To suppress missing implicit constructor warnings.
   factory CssStyleRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssStyleRule internalCreateCssStyleRule() {
+    return new CssStyleRule._internalWrap();
+  }
+
+  factory CssStyleRule._internalWrap() {
+    return new CssStyleRule.internal_();
+  }
+
+  CssStyleRule.internal_() : super.internal_();
+
+
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
   String get selectorText => _blink.BlinkCSSStyleRule.instance.selectorText_Getter_(unwrap_jso(this));
   
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.BlinkCSSStyleRule.instance.selectorText_Setter_(unwrap_jso(this), value);
+  set selectorText(String value) => _blink.BlinkCSSStyleRule.instance.selectorText_Setter_(unwrap_jso(this), value);
   
   @DomName('CSSStyleRule.style')
   @DocsEditable()
@@ -7543,9 +8960,21 @@
   // To suppress missing implicit constructor warnings.
   factory CssStyleSheet._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssStyleSheet internalCreateCssStyleSheet() {
+    return new CssStyleSheet._internalWrap();
+  }
+
+  factory CssStyleSheet._internalWrap() {
+    return new CssStyleSheet.internal_();
+  }
+
+  CssStyleSheet.internal_() : super.internal_();
+
+
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso_list(_blink.BlinkCSSStyleSheet.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSStyleSheet.instance.cssRules_Getter_(unwrap_jso(this)));
   
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
@@ -7554,7 +8983,7 @@
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules => wrap_jso_list(_blink.BlinkCSSStyleSheet.instance.rules_Getter_(unwrap_jso(this)));
+  List<CssRule> get rules => wrap_jso(_blink.BlinkCSSStyleSheet.instance.rules_Getter_(unwrap_jso(this)));
   
   int addRule(String selector, String style, [int index]) {
     if (index != null) {
@@ -7593,13 +9022,25 @@
   // To suppress missing implicit constructor warnings.
   factory CssSupportsRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssSupportsRule internalCreateCssSupportsRule() {
+    return new CssSupportsRule._internalWrap();
+  }
+
+  factory CssSupportsRule._internalWrap() {
+    return new CssSupportsRule.internal_();
+  }
+
+  CssSupportsRule.internal_() : super.internal_();
+
+
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
   String get conditionText => _blink.BlinkCSSSupportsRule.instance.conditionText_Getter_(unwrap_jso(this));
   
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => wrap_jso_list(_blink.BlinkCSSSupportsRule.instance.cssRules_Getter_(unwrap_jso(this)));
+  List<CssRule> get cssRules => wrap_jso(_blink.BlinkCSSSupportsRule.instance.cssRules_Getter_(unwrap_jso(this)));
   
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
@@ -7624,6 +9065,18 @@
   // To suppress missing implicit constructor warnings.
   factory CssViewportRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CssViewportRule internalCreateCssViewportRule() {
+    return new CssViewportRule._internalWrap();
+  }
+
+  factory CssViewportRule._internalWrap() {
+    return new CssViewportRule.internal_();
+  }
+
+  CssViewportRule.internal_() : super.internal_();
+
+
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7673,9 +9126,21 @@
   // To suppress missing implicit constructor warnings.
   factory CustomEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CustomEvent internalCreateCustomEvent() {
+    return new CustomEvent._internalWrap();
+  }
+
+  factory CustomEvent._internalWrap() {
+    return new CustomEvent.internal_();
+  }
+
+  CustomEvent.internal_() : super.internal_();
+
+
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail => _blink.BlinkCustomEvent.instance.detail_Getter_(unwrap_jso(this));
+  Object get _detail => wrap_jso(_blink.BlinkCustomEvent.instance.detail_Getter_(unwrap_jso(this)));
   
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
@@ -7698,6 +9163,18 @@
   @DomName('HTMLDListElement.HTMLDListElement')
   @DocsEditable()
   factory DListElement() => document.createElement("dl");
+
+
+  static DListElement internalCreateDListElement() {
+    return new DListElement._internalWrap();
+  }
+
+  factory DListElement._internalWrap() {
+    return new DListElement.internal_();
+  }
+
+  DListElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7726,6 +9203,18 @@
   @DomName('HTMLDataListElement.HTMLDataListElement')
   @DocsEditable()
   factory DataListElement() => document.createElement("datalist");
+
+
+  static DataListElement internalCreateDataListElement() {
+    return new DataListElement._internalWrap();
+  }
+
+  factory DataListElement._internalWrap() {
+    return new DataListElement.internal_();
+  }
+
+  DataListElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7738,7 +9227,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options => wrap_jso_list(_blink.BlinkHTMLDataListElement.instance.options_Getter_(unwrap_jso(this)));
+  List<Node> get options => wrap_jso(_blink.BlinkHTMLDataListElement.instance.options_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7755,6 +9244,21 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransfer._() { throw new UnsupportedError("Not supported"); }
 
+  static DataTransfer internalCreateDataTransfer() {
+    return new DataTransfer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DataTransfer._internalWrap() {
+    return new DataTransfer.internal_();
+  }
+
+  DataTransfer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7763,7 +9267,7 @@
   @DomName('DataTransfer.dropEffect')
   @DocsEditable()
   @Experimental() // untriaged
-  void set dropEffect(String value) => _blink.BlinkDataTransfer.instance.dropEffect_Setter_(unwrap_jso(this), value);
+  set dropEffect(String value) => _blink.BlinkDataTransfer.instance.dropEffect_Setter_(unwrap_jso(this), value);
   
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
@@ -7773,12 +9277,12 @@
   @DomName('DataTransfer.effectAllowed')
   @DocsEditable()
   @Experimental() // untriaged
-  void set effectAllowed(String value) => _blink.BlinkDataTransfer.instance.effectAllowed_Setter_(unwrap_jso(this), value);
+  set effectAllowed(String value) => _blink.BlinkDataTransfer.instance.effectAllowed_Setter_(unwrap_jso(this), value);
   
   @DomName('DataTransfer.files')
   @DocsEditable()
   @Experimental() // untriaged
-  List<File> get files => wrap_jso_list(_blink.BlinkDataTransfer.instance.files_Getter_(unwrap_jso(this)));
+  List<File> get files => wrap_jso(_blink.BlinkDataTransfer.instance.files_Getter_(unwrap_jso(this)));
   
   @DomName('DataTransfer.items')
   @DocsEditable()
@@ -7830,6 +9334,21 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItem._() { throw new UnsupportedError("Not supported"); }
 
+  static DataTransferItem internalCreateDataTransferItem() {
+    return new DataTransferItem._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DataTransferItem._internalWrap() {
+    return new DataTransferItem.internal_();
+  }
+
+  DataTransferItem.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DataTransferItem.kind')
   @DocsEditable()
   String get kind => _blink.BlinkDataTransferItem.instance.kind_Getter_(unwrap_jso(this));
@@ -7844,7 +9363,7 @@
   
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.instance.getAsString_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.instance.getAsString_Callback_1_(unwrap_jso(this), unwrap_jso((data) => callback(data)));
   
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -7874,6 +9393,21 @@
   // To suppress missing implicit constructor warnings.
   factory DataTransferItemList._() { throw new UnsupportedError("Not supported"); }
 
+  static DataTransferItemList internalCreateDataTransferItemList() {
+    return new DataTransferItemList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DataTransferItemList._internalWrap() {
+    return new DataTransferItemList.internal_();
+  }
+
+  DataTransferItemList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DataTransferItemList.length')
   @DocsEditable()
   int get length => _blink.BlinkDataTransferItemList.instance.length_Getter_(unwrap_jso(this));
@@ -7952,6 +9486,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+
+  static DedicatedWorkerGlobalScope internalCreateDedicatedWorkerGlobalScope() {
+    return new DedicatedWorkerGlobalScope._internalWrap();
+  }
+
+  factory DedicatedWorkerGlobalScope._internalWrap() {
+    return new DedicatedWorkerGlobalScope.internal_();
+  }
+
+  DedicatedWorkerGlobalScope.internal_() : super.internal_();
+
+
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7978,6 +9524,21 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static DeprecatedStorageInfo internalCreateDeprecatedStorageInfo() {
+    return new DeprecatedStorageInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DeprecatedStorageInfo._internalWrap() {
+    return new DeprecatedStorageInfo.internal_();
+  }
+
+  DeprecatedStorageInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DeprecatedStorageInfo.PERSISTENT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7990,11 +9551,11 @@
 
   void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_3_(unwrap_jso(this), storageType, unwrap_jso(usageCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_3_(unwrap_jso(this), storageType, unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (usageCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), storageType, unwrap_jso(usageCallback));
+      _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), storageType, unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)));
       return;
     }
     _blink.BlinkDeprecatedStorageInfo.instance.queryUsageAndQuota_Callback_1_(unwrap_jso(this), storageType);
@@ -8003,11 +9564,11 @@
 
   void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_4_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso(quotaCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_4_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_3_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso(quotaCallback));
+      _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_3_(unwrap_jso(this), storageType, newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)));
       return;
     }
     _blink.BlinkDeprecatedStorageInfo.instance.requestQuota_Callback_2_(unwrap_jso(this), storageType, newQuotaInBytes);
@@ -8029,22 +9590,37 @@
   // To suppress missing implicit constructor warnings.
   factory DeprecatedStorageQuota._() { throw new UnsupportedError("Not supported"); }
 
+  static DeprecatedStorageQuota internalCreateDeprecatedStorageQuota() {
+    return new DeprecatedStorageQuota._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DeprecatedStorageQuota._internalWrap() {
+    return new DeprecatedStorageQuota.internal_();
+  }
+
+  DeprecatedStorageQuota.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), unwrap_jso(usageCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_2_(unwrap_jso(this), unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_1_(unwrap_jso(this), unwrap_jso(usageCallback));
+    _blink.BlinkDeprecatedStorageQuota.instance.queryUsageAndQuota_Callback_1_(unwrap_jso(this), unwrap_jso((currentUsageInBytes, currentQuotaInBytes) => usageCallback(currentUsageInBytes, currentQuotaInBytes)));
     return;
   }
 
   void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_3_(unwrap_jso(this), newQuotaInBytes, unwrap_jso(quotaCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_3_(unwrap_jso(this), newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (quotaCallback != null) {
-      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_2_(unwrap_jso(this), newQuotaInBytes, unwrap_jso(quotaCallback));
+      _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_2_(unwrap_jso(this), newQuotaInBytes, unwrap_jso((grantedQuotaInBytes) => quotaCallback(grantedQuotaInBytes)));
       return;
     }
     _blink.BlinkDeprecatedStorageQuota.instance.requestQuota_Callback_1_(unwrap_jso(this), newQuotaInBytes);
@@ -8071,6 +9647,18 @@
   @DomName('HTMLDetailsElement.HTMLDetailsElement')
   @DocsEditable()
   factory DetailsElement() => document.createElement("details");
+
+
+  static DetailsElement internalCreateDetailsElement() {
+    return new DetailsElement._internalWrap();
+  }
+
+  factory DetailsElement._internalWrap() {
+    return new DetailsElement.internal_();
+  }
+
+  DetailsElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -8087,7 +9675,7 @@
   
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.BlinkHTMLDetailsElement.instance.open_Setter_(unwrap_jso(this), value);
+  set open(bool value) => _blink.BlinkHTMLDetailsElement.instance.open_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8105,17 +9693,32 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceAcceleration._() { throw new UnsupportedError("Not supported"); }
 
+  static DeviceAcceleration internalCreateDeviceAcceleration() {
+    return new DeviceAcceleration._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DeviceAcceleration._internalWrap() {
+    return new DeviceAcceleration.internal_();
+  }
+
+  DeviceAcceleration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  double get x => _blink.BlinkDeviceAcceleration.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDeviceAcceleration.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  double get y => _blink.BlinkDeviceAcceleration.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDeviceAcceleration.instance.y_Getter_(unwrap_jso(this));
   
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  double get z => _blink.BlinkDeviceAcceleration.instance.z_Getter_(unwrap_jso(this));
+  num get z => _blink.BlinkDeviceAcceleration.instance.z_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8132,10 +9735,22 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceLightEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DeviceLightEvent internalCreateDeviceLightEvent() {
+    return new DeviceLightEvent._internalWrap();
+  }
+
+  factory DeviceLightEvent._internalWrap() {
+    return new DeviceLightEvent.internal_();
+  }
+
+  DeviceLightEvent.internal_() : super.internal_();
+
+
   @DomName('DeviceLightEvent.value')
   @DocsEditable()
   @Experimental() // untriaged
-  double get value => _blink.BlinkDeviceLightEvent.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkDeviceLightEvent.instance.value_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8153,6 +9768,18 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceMotionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DeviceMotionEvent internalCreateDeviceMotionEvent() {
+    return new DeviceMotionEvent._internalWrap();
+  }
+
+  factory DeviceMotionEvent._internalWrap() {
+    return new DeviceMotionEvent.internal_();
+  }
+
+  DeviceMotionEvent.internal_() : super.internal_();
+
+
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
   DeviceAcceleration get acceleration => wrap_jso(_blink.BlinkDeviceMotionEvent.instance.acceleration_Getter_(unwrap_jso(this)));
@@ -8163,7 +9790,7 @@
   
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  double get interval => _blink.BlinkDeviceMotionEvent.instance.interval_Getter_(unwrap_jso(this));
+  num get interval => _blink.BlinkDeviceMotionEvent.instance.interval_Getter_(unwrap_jso(this));
   
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
@@ -8196,21 +9823,33 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceOrientationEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DeviceOrientationEvent internalCreateDeviceOrientationEvent() {
+    return new DeviceOrientationEvent._internalWrap();
+  }
+
+  factory DeviceOrientationEvent._internalWrap() {
+    return new DeviceOrientationEvent.internal_();
+  }
+
+  DeviceOrientationEvent.internal_() : super.internal_();
+
+
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
   bool get absolute => _blink.BlinkDeviceOrientationEvent.instance.absolute_Getter_(unwrap_jso(this));
   
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  double get alpha => _blink.BlinkDeviceOrientationEvent.instance.alpha_Getter_(unwrap_jso(this));
+  num get alpha => _blink.BlinkDeviceOrientationEvent.instance.alpha_Getter_(unwrap_jso(this));
   
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  double get beta => _blink.BlinkDeviceOrientationEvent.instance.beta_Getter_(unwrap_jso(this));
+  num get beta => _blink.BlinkDeviceOrientationEvent.instance.beta_Getter_(unwrap_jso(this));
   
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  double get gamma => _blink.BlinkDeviceOrientationEvent.instance.gamma_Getter_(unwrap_jso(this));
+  num get gamma => _blink.BlinkDeviceOrientationEvent.instance.gamma_Getter_(unwrap_jso(this));
   
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
@@ -8232,17 +9871,32 @@
   // To suppress missing implicit constructor warnings.
   factory DeviceRotationRate._() { throw new UnsupportedError("Not supported"); }
 
+  static DeviceRotationRate internalCreateDeviceRotationRate() {
+    return new DeviceRotationRate._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DeviceRotationRate._internalWrap() {
+    return new DeviceRotationRate.internal_();
+  }
+
+  DeviceRotationRate.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  double get alpha => _blink.BlinkDeviceRotationRate.instance.alpha_Getter_(unwrap_jso(this));
+  num get alpha => _blink.BlinkDeviceRotationRate.instance.alpha_Getter_(unwrap_jso(this));
   
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  double get beta => _blink.BlinkDeviceRotationRate.instance.beta_Getter_(unwrap_jso(this));
+  num get beta => _blink.BlinkDeviceRotationRate.instance.beta_Getter_(unwrap_jso(this));
   
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  double get gamma => _blink.BlinkDeviceRotationRate.instance.gamma_Getter_(unwrap_jso(this));
+  num get gamma => _blink.BlinkDeviceRotationRate.instance.gamma_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8258,6 +9912,18 @@
 class DialogElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory DialogElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static DialogElement internalCreateDialogElement() {
+    return new DialogElement._internalWrap();
+  }
+
+  factory DialogElement._internalWrap() {
+    return new DialogElement.internal_();
+  }
+
+  DialogElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -8271,7 +9937,7 @@
   
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.BlinkHTMLDialogElement.instance.open_Setter_(unwrap_jso(this), value);
+  set open(bool value) => _blink.BlinkHTMLDialogElement.instance.open_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
@@ -8281,7 +9947,7 @@
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  void set returnValue(String value) => _blink.BlinkHTMLDialogElement.instance.returnValue_Setter_(unwrap_jso(this), value);
+  set returnValue(String value) => _blink.BlinkHTMLDialogElement.instance.returnValue_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
@@ -8345,21 +10011,33 @@
   // To suppress missing implicit constructor warnings.
   factory DirectoryEntry._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DirectoryEntry internalCreateDirectoryEntry() {
+    return new DirectoryEntry._internalWrap();
+  }
+
+  factory DirectoryEntry._internalWrap() {
+    return new DirectoryEntry.internal_();
+  }
+
+  DirectoryEntry.internal_() : super.internal_();
+
+
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
   DirectoryReader createReader() => wrap_jso(_blink.BlinkDirectoryEntry.instance.createReader_Callback_0_(unwrap_jso(this)));
   
   void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_4_(unwrap_jso(this), path, options, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_4_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_3_(unwrap_jso(this), path, options, unwrap_jso(successCallback));
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_3_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_2_(unwrap_jso(this), path, options);
+      _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_2_(unwrap_jso(this), path, convertDartToNative_Dictionary(options));
       return;
     }
     _blink.BlinkDirectoryEntry.instance.getDirectory_Callback_1_(unwrap_jso(this), path);
@@ -8376,15 +10054,15 @@
 
   void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_4_(unwrap_jso(this), path, options, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_4_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_3_(unwrap_jso(this), path, options, unwrap_jso(successCallback));
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_3_(unwrap_jso(this), path, convertDartToNative_Dictionary(options), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
       return;
     }
     if (options != null) {
-      _blink.BlinkDirectoryEntry.instance.getFile_Callback_2_(unwrap_jso(this), path, options);
+      _blink.BlinkDirectoryEntry.instance.getFile_Callback_2_(unwrap_jso(this), path, convertDartToNative_Dictionary(options));
       return;
     }
     _blink.BlinkDirectoryEntry.instance.getFile_Callback_1_(unwrap_jso(this), path);
@@ -8401,10 +10079,10 @@
 
   void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_2_(unwrap_jso(this), unwrap_jso(() => successCallback()), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkDirectoryEntry.instance.removeRecursively_Callback_1_(unwrap_jso(this), unwrap_jso(() => successCallback()));
     return;
   }
 
@@ -8432,12 +10110,27 @@
   // To suppress missing implicit constructor warnings.
   factory DirectoryReader._() { throw new UnsupportedError("Not supported"); }
 
+  static DirectoryReader internalCreateDirectoryReader() {
+    return new DirectoryReader._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DirectoryReader._internalWrap() {
+    return new DirectoryReader.internal_();
+  }
+
+  DirectoryReader.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkDirectoryReader.instance.readEntries_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkDirectoryReader.instance.readEntries_Callback_2_(unwrap_jso(this), unwrap_jso((entries) => successCallback(entries)), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkDirectoryReader.instance.readEntries_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkDirectoryReader.instance.readEntries_Callback_1_(unwrap_jso(this), unwrap_jso((entries) => successCallback(entries)));
     return;
   }
 
@@ -8488,6 +10181,18 @@
   @DomName('HTMLDivElement.HTMLDivElement')
   @DocsEditable()
   factory DivElement() => document.createElement("div");
+
+
+  static DivElement internalCreateDivElement() {
+    return new DivElement._internalWrap();
+  }
+
+  factory DivElement._internalWrap() {
+    return new DivElement.internal_();
+  }
+
+  DivElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -8560,6 +10265,18 @@
   @DocsEditable()
   static const EventStreamProvider<Event> selectionChangeEvent = const EventStreamProvider<Event>('selectionchange');
 
+
+  static Document internalCreateDocument() {
+    return new Document._internalWrap();
+  }
+
+  factory Document._internalWrap() {
+    return new Document.internal_();
+  }
+
+  Document.internal_() : super.internal_();
+
+
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
@@ -8571,7 +10288,7 @@
   
   @DomName('Document.body')
   @DocsEditable()
-  void set _body(HtmlElement value) => _blink.BlinkDocument.instance.body_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set _body(HtmlElement value) => _blink.BlinkDocument.instance.body_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('Document.contentType')
   @DocsEditable()
@@ -8584,7 +10301,7 @@
   
   @DomName('Document.cookie')
   @DocsEditable()
-  void set cookie(String value) => _blink.BlinkDocument.instance.cookie_Setter_(unwrap_jso(this), value);
+  set cookie(String value) => _blink.BlinkDocument.instance.cookie_Setter_(unwrap_jso(this), value);
   
   @DomName('Document.currentScript')
   @DocsEditable()
@@ -8663,11 +10380,11 @@
   
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  void set _selectedStylesheetSet(String value) => _blink.BlinkDocument.instance.selectedStylesheetSet_Setter_(unwrap_jso(this), value);
+  set _selectedStylesheetSet(String value) => _blink.BlinkDocument.instance.selectedStylesheetSet_Setter_(unwrap_jso(this), value);
   
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets => wrap_jso_list(_blink.BlinkDocument.instance.styleSheets_Getter_(unwrap_jso(this)));
+  List<StyleSheet> get _styleSheets => wrap_jso(_blink.BlinkDocument.instance.styleSheets_Getter_(unwrap_jso(this)));
   
   @DomName('Document.timeline')
   @DocsEditable()
@@ -8680,7 +10397,7 @@
   
   @DomName('Document.title')
   @DocsEditable()
-  void set _title(String value) => _blink.BlinkDocument.instance.title_Setter_(unwrap_jso(this), value);
+  set _title(String value) => _blink.BlinkDocument.instance.title_Setter_(unwrap_jso(this), value);
   
   @DomName('Document.visibilityState')
   @DocsEditable()
@@ -8739,7 +10456,7 @@
   
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => wrap_jso(_blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension));
+  Element _createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => wrap_jso(_blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension));
   
   @DomName('Document.createEvent')
   @DocsEditable()
@@ -8809,15 +10526,15 @@
   
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => wrap_jso_list(_blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
+  List<Node> getElementsByClassName(String classNames) => wrap_jso(_blink.BlinkDocument.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
   
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) => wrap_jso_list(_blink.BlinkDocument.instance.getElementsByName_Callback_1_(unwrap_jso(this), elementName));
+  List<Node> getElementsByName(String elementName) => wrap_jso(_blink.BlinkDocument.instance.getElementsByName_Callback_1_(unwrap_jso(this), elementName));
   
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) => wrap_jso_list(_blink.BlinkDocument.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), localName));
+  List<Node> getElementsByTagName(String localName) => wrap_jso(_blink.BlinkDocument.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), localName));
   
   Node importNode(Node node, [bool deep]) {
     if (deep != null) {
@@ -8865,7 +10582,7 @@
   
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children => wrap_jso_list(_blink.BlinkDocument.instance.children_Getter_(unwrap_jso(this)));
+  List<Node> get _children => wrap_jso(_blink.BlinkDocument.instance.children_Getter_(unwrap_jso(this)));
   
   @DomName('Document.firstElementChild')
   @DocsEditable()
@@ -8898,7 +10615,7 @@
   
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso_list(_blink.BlinkDocument.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkDocument.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
   
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -9323,12 +11040,45 @@
 
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
-    if (typeExtension != null) {  
-      return _createElement(tagName, typeExtension);  
-    } else {  
-      // Fast-path for Dartium when typeExtension is not needed.  
-      return _Utils.createElement(this, tagName); 
-    } 
+    var newElement = (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElement_Callback_1_(unwrap_jso(this), tagName) :
+      _blink.BlinkDocument.instance.createElement_Callback_2_(unwrap_jso(this), tagName, typeExtension);
+
+    var wrapped;
+
+    if (newElement['dart_class'] != null) {
+      wrapped = newElement['dart_class'];         // Here's our Dart class.
+      wrapped.blink_jsObject = newElement;
+    } else {
+      wrapped = wrap_jso(newElement);
+      if (wrapped == null) {
+        wrapped = wrap_jso_custom_element(newElement);
+      }
+    }
+
+    return wrapped;
+  }
+
+  @DomName('Document.createElementNS')
+  @DocsEditable()
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+    var newElement = (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElementNS_Callback_2_(unwrap_jso(this), namespaceURI, qualifiedName) :
+      _blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension);
+
+    var wrapped;
+
+    if (newElement['dart_class'] != null) {
+      wrapped = newElement['dart_class'];         // Here's our Dart class.
+      wrapped.blink_jsObject = newElement;
+    } else {
+      wrapped = wrap_jso(newElement);
+      if (wrapped == null) {
+        wrapped = wrap_jso_custom_element(newElement);
+      }
+    }
+
+    return wrapped;
   }
 
 }
@@ -9367,7 +11117,7 @@
     return _docChildren;
   }
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -9389,14 +11139,13 @@
   ElementList<Element> querySelectorAll(String selectors) =>
     new _FrozenElementList._wrap(_querySelectorAll(selectors));
 
-
   String get innerHtml {
     final e = new Element.tag("div");
     e.append(this.clone(true));
     return e.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
@@ -9451,6 +11200,18 @@
   // To suppress missing implicit constructor warnings.
   factory DocumentFragment._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DocumentFragment internalCreateDocumentFragment() {
+    return new DocumentFragment._internalWrap();
+  }
+
+  factory DocumentFragment._internalWrap() {
+    return new DocumentFragment.internal_();
+  }
+
+  DocumentFragment.internal_() : super.internal_();
+
+
   @DomName('DocumentFragment.getElementById')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9486,7 +11247,7 @@
   
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso_list(_blink.BlinkDocumentFragment.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkDocumentFragment.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -9505,9 +11266,24 @@
   @DomName('DOMError.DOMError')
   @DocsEditable()
   factory DomError(String name, [String message]) {
-    return _blink.BlinkDOMError.instance.constructorCallback_2_(name, message);
+    return wrap_jso(_blink.BlinkDOMError.instance.constructorCallback_2_(name, message));
   }
 
+  static DomError internalCreateDomError() {
+    return new DomError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomError._internalWrap() {
+    return new DomError.internal_();
+  }
+
+  DomError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9549,21 +11325,47 @@
   static const String INVALID_NODE_TYPE = 'InvalidNodeTypeError';
   static const String DATA_CLONE = 'DataCloneError';
 
+  String _name;
+  String _message;
+
   // To suppress missing implicit constructor warnings.
   factory DomException._() { throw new UnsupportedError("Not supported"); }
 
+  static DomException internalCreateDomException() {
+    return new DomException._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomException._internalWrap() {
+    return new DomException.internal_();
+  }
+
+  DomException.internal_() { }
+
+  DomException.jsInterop(String m) {
+    var name_index = m.indexOf(': ');
+    if (name_index < 0) {
+      _name = "";
+      _message = m;
+    } else {
+      _name = m.substring(0, name_index);
+      _message = m.substring(name_index + 1).trim();
+    }
+  }
+
   @DomName('DOMException.message')
   @DocsEditable()
-  String get message => _blink.BlinkDOMException.instance.message_Getter_(unwrap_jso(this));
-  
+  String get message => _message;
+
   @DomName('DOMException.name')
   @DocsEditable()
-  String get name => _blink.BlinkDOMException.instance.name_Getter_(unwrap_jso(this));
-  
+  String get name => _name;
+
   @DomName('DOMException.toString')
   @DocsEditable()
-  String toString() => _blink.BlinkDOMException.instance.toString_Callback_0_(unwrap_jso(this));
-  
+  String toString() => "${_name}: $_message";
+
 }
 // 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
@@ -9578,13 +11380,28 @@
   // To suppress missing implicit constructor warnings.
   factory DomImplementation._() { throw new UnsupportedError("Not supported"); }
 
+  static DomImplementation internalCreateDomImplementation() {
+    return new DomImplementation._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomImplementation._internalWrap() {
+    return new DomImplementation.internal_();
+  }
+
+  DomImplementation.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.instance.createDocument_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, unwrap_jso(doctype));
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => wrap_jso(_blink.BlinkDOMImplementation.instance.createDocument_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, unwrap_jso(doctype)));
   
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.instance.createDocumentType_Callback_3_(unwrap_jso(this), qualifiedName, publicId, systemId);
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => wrap_jso(_blink.BlinkDOMImplementation.instance.createDocumentType_Callback_3_(unwrap_jso(this), qualifiedName, publicId, systemId));
   
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
@@ -9609,11 +11426,26 @@
   // To suppress missing implicit constructor warnings.
   factory DomIterator._() { throw new UnsupportedError("Not supported"); }
 
+  static DomIterator internalCreateDomIterator() {
+    return new DomIterator._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomIterator._internalWrap() {
+    return new DomIterator.internal_();
+  }
+
+  DomIterator.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   Object next([Object value]) {
     if (value != null) {
-      return _blink.BlinkIterator.instance.next_Callback_1_(unwrap_jso(this), value);
+      return wrap_jso(_blink.BlinkIterator.instance.next_Callback_1_(unwrap_jso(this), value));
     }
-    return _blink.BlinkIterator.instance.next_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkIterator.instance.next_Callback_0_(unwrap_jso(this)));
   }
 
 }
@@ -9635,14 +11467,26 @@
   @DocsEditable()
   factory DomMatrix([DomMatrixReadOnly other]) {
     if (other == null) {
-      return _blink.BlinkDOMMatrix.instance.constructorCallback_0_();
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.constructorCallback_0_());
     }
     if ((other is DomMatrixReadOnly || other == null)) {
-      return _blink.BlinkDOMMatrix.instance.constructorCallback_1_(other);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.constructorCallback_1_(other));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static DomMatrix internalCreateDomMatrix() {
+    return new DomMatrix._internalWrap();
+  }
+
+  factory DomMatrix._internalWrap() {
+    return new DomMatrix.internal_();
+  }
+
+  DomMatrix.internal_() : super.internal_();
+
+
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
@@ -9651,7 +11495,7 @@
   @DomName('DOMMatrix.a')
   @DocsEditable()
   @Experimental() // untriaged
-  void set a(num value) => _blink.BlinkDOMMatrix.instance.a_Setter_(unwrap_jso(this), value);
+  set a(num value) => _blink.BlinkDOMMatrix.instance.a_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.b')
   @DocsEditable()
@@ -9661,7 +11505,7 @@
   @DomName('DOMMatrix.b')
   @DocsEditable()
   @Experimental() // untriaged
-  void set b(num value) => _blink.BlinkDOMMatrix.instance.b_Setter_(unwrap_jso(this), value);
+  set b(num value) => _blink.BlinkDOMMatrix.instance.b_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.c')
   @DocsEditable()
@@ -9671,7 +11515,7 @@
   @DomName('DOMMatrix.c')
   @DocsEditable()
   @Experimental() // untriaged
-  void set c(num value) => _blink.BlinkDOMMatrix.instance.c_Setter_(unwrap_jso(this), value);
+  set c(num value) => _blink.BlinkDOMMatrix.instance.c_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.d')
   @DocsEditable()
@@ -9681,7 +11525,7 @@
   @DomName('DOMMatrix.d')
   @DocsEditable()
   @Experimental() // untriaged
-  void set d(num value) => _blink.BlinkDOMMatrix.instance.d_Setter_(unwrap_jso(this), value);
+  set d(num value) => _blink.BlinkDOMMatrix.instance.d_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.e')
   @DocsEditable()
@@ -9691,7 +11535,7 @@
   @DomName('DOMMatrix.e')
   @DocsEditable()
   @Experimental() // untriaged
-  void set e(num value) => _blink.BlinkDOMMatrix.instance.e_Setter_(unwrap_jso(this), value);
+  set e(num value) => _blink.BlinkDOMMatrix.instance.e_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.f')
   @DocsEditable()
@@ -9701,7 +11545,7 @@
   @DomName('DOMMatrix.f')
   @DocsEditable()
   @Experimental() // untriaged
-  void set f(num value) => _blink.BlinkDOMMatrix.instance.f_Setter_(unwrap_jso(this), value);
+  set f(num value) => _blink.BlinkDOMMatrix.instance.f_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m11')
   @DocsEditable()
@@ -9711,7 +11555,7 @@
   @DomName('DOMMatrix.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m11(num value) => _blink.BlinkDOMMatrix.instance.m11_Setter_(unwrap_jso(this), value);
+  set m11(num value) => _blink.BlinkDOMMatrix.instance.m11_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m12')
   @DocsEditable()
@@ -9721,7 +11565,7 @@
   @DomName('DOMMatrix.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m12(num value) => _blink.BlinkDOMMatrix.instance.m12_Setter_(unwrap_jso(this), value);
+  set m12(num value) => _blink.BlinkDOMMatrix.instance.m12_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m13')
   @DocsEditable()
@@ -9731,7 +11575,7 @@
   @DomName('DOMMatrix.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m13(num value) => _blink.BlinkDOMMatrix.instance.m13_Setter_(unwrap_jso(this), value);
+  set m13(num value) => _blink.BlinkDOMMatrix.instance.m13_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m14')
   @DocsEditable()
@@ -9741,7 +11585,7 @@
   @DomName('DOMMatrix.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m14(num value) => _blink.BlinkDOMMatrix.instance.m14_Setter_(unwrap_jso(this), value);
+  set m14(num value) => _blink.BlinkDOMMatrix.instance.m14_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m21')
   @DocsEditable()
@@ -9751,7 +11595,7 @@
   @DomName('DOMMatrix.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m21(num value) => _blink.BlinkDOMMatrix.instance.m21_Setter_(unwrap_jso(this), value);
+  set m21(num value) => _blink.BlinkDOMMatrix.instance.m21_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m22')
   @DocsEditable()
@@ -9761,7 +11605,7 @@
   @DomName('DOMMatrix.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m22(num value) => _blink.BlinkDOMMatrix.instance.m22_Setter_(unwrap_jso(this), value);
+  set m22(num value) => _blink.BlinkDOMMatrix.instance.m22_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m23')
   @DocsEditable()
@@ -9771,7 +11615,7 @@
   @DomName('DOMMatrix.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m23(num value) => _blink.BlinkDOMMatrix.instance.m23_Setter_(unwrap_jso(this), value);
+  set m23(num value) => _blink.BlinkDOMMatrix.instance.m23_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m24')
   @DocsEditable()
@@ -9781,7 +11625,7 @@
   @DomName('DOMMatrix.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m24(num value) => _blink.BlinkDOMMatrix.instance.m24_Setter_(unwrap_jso(this), value);
+  set m24(num value) => _blink.BlinkDOMMatrix.instance.m24_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m31')
   @DocsEditable()
@@ -9791,7 +11635,7 @@
   @DomName('DOMMatrix.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m31(num value) => _blink.BlinkDOMMatrix.instance.m31_Setter_(unwrap_jso(this), value);
+  set m31(num value) => _blink.BlinkDOMMatrix.instance.m31_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m32')
   @DocsEditable()
@@ -9801,7 +11645,7 @@
   @DomName('DOMMatrix.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m32(num value) => _blink.BlinkDOMMatrix.instance.m32_Setter_(unwrap_jso(this), value);
+  set m32(num value) => _blink.BlinkDOMMatrix.instance.m32_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m33')
   @DocsEditable()
@@ -9811,7 +11655,7 @@
   @DomName('DOMMatrix.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m33(num value) => _blink.BlinkDOMMatrix.instance.m33_Setter_(unwrap_jso(this), value);
+  set m33(num value) => _blink.BlinkDOMMatrix.instance.m33_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m34')
   @DocsEditable()
@@ -9821,7 +11665,7 @@
   @DomName('DOMMatrix.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m34(num value) => _blink.BlinkDOMMatrix.instance.m34_Setter_(unwrap_jso(this), value);
+  set m34(num value) => _blink.BlinkDOMMatrix.instance.m34_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m41')
   @DocsEditable()
@@ -9831,7 +11675,7 @@
   @DomName('DOMMatrix.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m41(num value) => _blink.BlinkDOMMatrix.instance.m41_Setter_(unwrap_jso(this), value);
+  set m41(num value) => _blink.BlinkDOMMatrix.instance.m41_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m42')
   @DocsEditable()
@@ -9841,7 +11685,7 @@
   @DomName('DOMMatrix.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m42(num value) => _blink.BlinkDOMMatrix.instance.m42_Setter_(unwrap_jso(this), value);
+  set m42(num value) => _blink.BlinkDOMMatrix.instance.m42_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m43')
   @DocsEditable()
@@ -9851,7 +11695,7 @@
   @DomName('DOMMatrix.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m43(num value) => _blink.BlinkDOMMatrix.instance.m43_Setter_(unwrap_jso(this), value);
+  set m43(num value) => _blink.BlinkDOMMatrix.instance.m43_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.m44')
   @DocsEditable()
@@ -9861,65 +11705,65 @@
   @DomName('DOMMatrix.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  void set m44(num value) => _blink.BlinkDOMMatrix.instance.m44_Setter_(unwrap_jso(this), value);
+  set m44(num value) => _blink.BlinkDOMMatrix.instance.m44_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMMatrix.multiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiplySelf(DomMatrix other) => _blink.BlinkDOMMatrix.instance.multiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other));
+  DomMatrix multiplySelf(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrix.instance.multiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
   
   @DomName('DOMMatrix.preMultiplySelf')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix preMultiplySelf(DomMatrix other) => _blink.BlinkDOMMatrix.instance.preMultiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other));
+  DomMatrix preMultiplySelf(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrix.instance.preMultiplySelf_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
   
   DomMatrix scale3dSelf(num scale, [num ox, num oy, num oz]) {
     if (oz != null) {
-      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(unwrap_jso(this), scale, ox, oy, oz);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_4_(unwrap_jso(this), scale, ox, oy, oz));
     }
     if (oy != null) {
-      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(unwrap_jso(this), scale, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_3_(unwrap_jso(this), scale, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(unwrap_jso(this), scale, ox);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_2_(unwrap_jso(this), scale, ox));
     }
-    return _blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_1_(unwrap_jso(this), scale);
+    return wrap_jso(_blink.BlinkDOMMatrix.instance.scale3dSelf_Callback_1_(unwrap_jso(this), scale));
   }
 
   DomMatrix scaleNonUniformSelf(num sx, [num sy, num sz, num ox, num oy, num oz]) {
     if (oz != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz));
     }
     if (oy != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(unwrap_jso(this), sx, sy, sz, ox);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_4_(unwrap_jso(this), sx, sy, sz, ox));
     }
     if (sz != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(unwrap_jso(this), sx, sy, sz);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_3_(unwrap_jso(this), sx, sy, sz));
     }
     if (sy != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(unwrap_jso(this), sx, sy);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_2_(unwrap_jso(this), sx, sy));
     }
-    return _blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(unwrap_jso(this), sx);
+    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleNonUniformSelf_Callback_1_(unwrap_jso(this), sx));
   }
 
   DomMatrix scaleSelf(num scale, [num ox, num oy]) {
     if (oy != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(unwrap_jso(this), scale, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_3_(unwrap_jso(this), scale, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(unwrap_jso(this), scale, ox);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_2_(unwrap_jso(this), scale, ox));
     }
-    return _blink.BlinkDOMMatrix.instance.scaleSelf_Callback_1_(unwrap_jso(this), scale);
+    return wrap_jso(_blink.BlinkDOMMatrix.instance.scaleSelf_Callback_1_(unwrap_jso(this), scale));
   }
 
   DomMatrix translateSelf(num tx, num ty, [num tz]) {
     if (tz != null) {
-      return _blink.BlinkDOMMatrix.instance.translateSelf_Callback_3_(unwrap_jso(this), tx, ty, tz);
+      return wrap_jso(_blink.BlinkDOMMatrix.instance.translateSelf_Callback_3_(unwrap_jso(this), tx, ty, tz));
     }
-    return _blink.BlinkDOMMatrix.instance.translateSelf_Callback_2_(unwrap_jso(this), tx, ty);
+    return wrap_jso(_blink.BlinkDOMMatrix.instance.translateSelf_Callback_2_(unwrap_jso(this), tx, ty));
   }
 
 }
@@ -9937,35 +11781,50 @@
   // To suppress missing implicit constructor warnings.
   factory DomMatrixReadOnly._() { throw new UnsupportedError("Not supported"); }
 
+  static DomMatrixReadOnly internalCreateDomMatrixReadOnly() {
+    return new DomMatrixReadOnly._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomMatrixReadOnly._internalWrap() {
+    return new DomMatrixReadOnly.internal_();
+  }
+
+  DomMatrixReadOnly.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMMatrixReadOnly.a')
   @DocsEditable()
   @Experimental() // untriaged
-  double get a => _blink.BlinkDOMMatrixReadOnly.instance.a_Getter_(unwrap_jso(this));
+  num get a => _blink.BlinkDOMMatrixReadOnly.instance.a_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.b')
   @DocsEditable()
   @Experimental() // untriaged
-  double get b => _blink.BlinkDOMMatrixReadOnly.instance.b_Getter_(unwrap_jso(this));
+  num get b => _blink.BlinkDOMMatrixReadOnly.instance.b_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.c')
   @DocsEditable()
   @Experimental() // untriaged
-  double get c => _blink.BlinkDOMMatrixReadOnly.instance.c_Getter_(unwrap_jso(this));
+  num get c => _blink.BlinkDOMMatrixReadOnly.instance.c_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.d')
   @DocsEditable()
   @Experimental() // untriaged
-  double get d => _blink.BlinkDOMMatrixReadOnly.instance.d_Getter_(unwrap_jso(this));
+  num get d => _blink.BlinkDOMMatrixReadOnly.instance.d_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.e')
   @DocsEditable()
   @Experimental() // untriaged
-  double get e => _blink.BlinkDOMMatrixReadOnly.instance.e_Getter_(unwrap_jso(this));
+  num get e => _blink.BlinkDOMMatrixReadOnly.instance.e_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.f')
   @DocsEditable()
   @Experimental() // untriaged
-  double get f => _blink.BlinkDOMMatrixReadOnly.instance.f_Getter_(unwrap_jso(this));
+  num get f => _blink.BlinkDOMMatrixReadOnly.instance.f_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.is2D')
   @DocsEditable()
@@ -9980,128 +11839,128 @@
   @DomName('DOMMatrixReadOnly.m11')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m11 => _blink.BlinkDOMMatrixReadOnly.instance.m11_Getter_(unwrap_jso(this));
+  num get m11 => _blink.BlinkDOMMatrixReadOnly.instance.m11_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m12')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m12 => _blink.BlinkDOMMatrixReadOnly.instance.m12_Getter_(unwrap_jso(this));
+  num get m12 => _blink.BlinkDOMMatrixReadOnly.instance.m12_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m13')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m13 => _blink.BlinkDOMMatrixReadOnly.instance.m13_Getter_(unwrap_jso(this));
+  num get m13 => _blink.BlinkDOMMatrixReadOnly.instance.m13_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m14')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m14 => _blink.BlinkDOMMatrixReadOnly.instance.m14_Getter_(unwrap_jso(this));
+  num get m14 => _blink.BlinkDOMMatrixReadOnly.instance.m14_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m21')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m21 => _blink.BlinkDOMMatrixReadOnly.instance.m21_Getter_(unwrap_jso(this));
+  num get m21 => _blink.BlinkDOMMatrixReadOnly.instance.m21_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m22')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m22 => _blink.BlinkDOMMatrixReadOnly.instance.m22_Getter_(unwrap_jso(this));
+  num get m22 => _blink.BlinkDOMMatrixReadOnly.instance.m22_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m23')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m23 => _blink.BlinkDOMMatrixReadOnly.instance.m23_Getter_(unwrap_jso(this));
+  num get m23 => _blink.BlinkDOMMatrixReadOnly.instance.m23_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m24')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m24 => _blink.BlinkDOMMatrixReadOnly.instance.m24_Getter_(unwrap_jso(this));
+  num get m24 => _blink.BlinkDOMMatrixReadOnly.instance.m24_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m31')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m31 => _blink.BlinkDOMMatrixReadOnly.instance.m31_Getter_(unwrap_jso(this));
+  num get m31 => _blink.BlinkDOMMatrixReadOnly.instance.m31_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m32')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m32 => _blink.BlinkDOMMatrixReadOnly.instance.m32_Getter_(unwrap_jso(this));
+  num get m32 => _blink.BlinkDOMMatrixReadOnly.instance.m32_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m33')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m33 => _blink.BlinkDOMMatrixReadOnly.instance.m33_Getter_(unwrap_jso(this));
+  num get m33 => _blink.BlinkDOMMatrixReadOnly.instance.m33_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m34')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m34 => _blink.BlinkDOMMatrixReadOnly.instance.m34_Getter_(unwrap_jso(this));
+  num get m34 => _blink.BlinkDOMMatrixReadOnly.instance.m34_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m41')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m41 => _blink.BlinkDOMMatrixReadOnly.instance.m41_Getter_(unwrap_jso(this));
+  num get m41 => _blink.BlinkDOMMatrixReadOnly.instance.m41_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m42')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m42 => _blink.BlinkDOMMatrixReadOnly.instance.m42_Getter_(unwrap_jso(this));
+  num get m42 => _blink.BlinkDOMMatrixReadOnly.instance.m42_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m43')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m43 => _blink.BlinkDOMMatrixReadOnly.instance.m43_Getter_(unwrap_jso(this));
+  num get m43 => _blink.BlinkDOMMatrixReadOnly.instance.m43_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.m44')
   @DocsEditable()
   @Experimental() // untriaged
-  double get m44 => _blink.BlinkDOMMatrixReadOnly.instance.m44_Getter_(unwrap_jso(this));
+  num get m44 => _blink.BlinkDOMMatrixReadOnly.instance.m44_Getter_(unwrap_jso(this));
   
   @DomName('DOMMatrixReadOnly.multiply')
   @DocsEditable()
   @Experimental() // untriaged
-  DomMatrix multiply(DomMatrix other) => _blink.BlinkDOMMatrixReadOnly.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(other));
+  DomMatrix multiply(DomMatrix other) => wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(other)));
   
   DomMatrix scale(num scale, [num ox, num oy]) {
     if (oy != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(unwrap_jso(this), scale, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_3_(unwrap_jso(this), scale, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(unwrap_jso(this), scale, ox);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_2_(unwrap_jso(this), scale, ox));
     }
-    return _blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_1_(unwrap_jso(this), scale);
+    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale_Callback_1_(unwrap_jso(this), scale));
   }
 
   DomMatrix scale3d(num scale, [num ox, num oy, num oz]) {
     if (oz != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(unwrap_jso(this), scale, ox, oy, oz);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_4_(unwrap_jso(this), scale, ox, oy, oz));
     }
     if (oy != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(unwrap_jso(this), scale, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_3_(unwrap_jso(this), scale, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(unwrap_jso(this), scale, ox);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_2_(unwrap_jso(this), scale, ox));
     }
-    return _blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_1_(unwrap_jso(this), scale);
+    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scale3d_Callback_1_(unwrap_jso(this), scale));
   }
 
   DomMatrix scaleNonUniform(num sx, [num sy, num sz, num ox, num oy, num oz]) {
     if (oz != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_6_(unwrap_jso(this), sx, sy, sz, ox, oy, oz));
     }
     if (oy != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_5_(unwrap_jso(this), sx, sy, sz, ox, oy));
     }
     if (ox != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(unwrap_jso(this), sx, sy, sz, ox);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_4_(unwrap_jso(this), sx, sy, sz, ox));
     }
     if (sz != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(unwrap_jso(this), sx, sy, sz);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_3_(unwrap_jso(this), sx, sy, sz));
     }
     if (sy != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), sx, sy);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), sx, sy));
     }
-    return _blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(unwrap_jso(this), sx);
+    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.scaleNonUniform_Callback_1_(unwrap_jso(this), sx));
   }
 
   @DomName('DOMMatrixReadOnly.toFloat32Array')
@@ -10116,9 +11975,9 @@
   
   DomMatrix translate(num tx, num ty, [num tz]) {
     if (tz != null) {
-      return _blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_3_(unwrap_jso(this), tx, ty, tz);
+      return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_3_(unwrap_jso(this), tx, ty, tz));
     }
-    return _blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_2_(unwrap_jso(this), tx, ty);
+    return wrap_jso(_blink.BlinkDOMMatrixReadOnly.instance.translate_Callback_2_(unwrap_jso(this), tx, ty));
   }
 
 }
@@ -10138,9 +11997,24 @@
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
   factory DomParser() {
-    return _blink.BlinkDOMParser.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkDOMParser.instance.constructorCallback_0_());
   }
 
+  static DomParser internalCreateDomParser() {
+    return new DomParser._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomParser._internalWrap() {
+    return new DomParser.internal_();
+  }
+
+  DomParser.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
   Document parseFromString(String str, String contentType) => wrap_jso(_blink.BlinkDOMParser.instance.parseFromString_Callback_2_(unwrap_jso(this), str, contentType));
@@ -10164,23 +12038,36 @@
   @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.instance.constructorCallback_0_();
+      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_0_());
     }
     if ((point_OR_x is Map || point_OR_x == null) && y == null && z == null && w == null) {
-      return _blink.BlinkDOMPoint.instance.constructorCallback_1_(point_OR_x);
+      var point_1 = convertDartToNative_Dictionary(point_OR_x);
+      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_1_(point_1));
     }
     if ((y is num || y == null) && (point_OR_x is num || point_OR_x == null) && z == null && w == null) {
-      return _blink.BlinkDOMPoint.instance.constructorCallback_2_(point_OR_x, y);
+      return wrap_jso(_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.instance.constructorCallback_3_(point_OR_x, y, z);
+      return wrap_jso(_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.instance.constructorCallback_4_(point_OR_x, y, z, w);
+      return wrap_jso(_blink.BlinkDOMPoint.instance.constructorCallback_4_(point_OR_x, y, z, w));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static DomPoint internalCreateDomPoint() {
+    return new DomPoint._internalWrap();
+  }
+
+  factory DomPoint._internalWrap() {
+    return new DomPoint.internal_();
+  }
+
+  DomPoint.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -10192,7 +12079,7 @@
   @DomName('DOMPoint.w')
   @DocsEditable()
   @Experimental() // untriaged
-  void set w(num value) => _blink.BlinkDOMPoint.instance.w_Setter_(unwrap_jso(this), value);
+  set w(num value) => _blink.BlinkDOMPoint.instance.w_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMPoint.x')
   @DocsEditable()
@@ -10202,7 +12089,7 @@
   @DomName('DOMPoint.x')
   @DocsEditable()
   @Experimental() // untriaged
-  void set x(num value) => _blink.BlinkDOMPoint.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkDOMPoint.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMPoint.y')
   @DocsEditable()
@@ -10212,7 +12099,7 @@
   @DomName('DOMPoint.y')
   @DocsEditable()
   @Experimental() // untriaged
-  void set y(num value) => _blink.BlinkDOMPoint.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkDOMPoint.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMPoint.z')
   @DocsEditable()
@@ -10222,7 +12109,7 @@
   @DomName('DOMPoint.z')
   @DocsEditable()
   @Experimental() // untriaged
-  void set z(num value) => _blink.BlinkDOMPoint.instance.z_Setter_(unwrap_jso(this), value);
+  set z(num value) => _blink.BlinkDOMPoint.instance.z_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10242,28 +12129,43 @@
   @DomName('DOMPointReadOnly.DOMPointReadOnly')
   @DocsEditable()
   factory DomPointReadOnly(num x, num y, num z, num w) {
-    return _blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w);
+    return wrap_jso(_blink.BlinkDOMPointReadOnly.instance.constructorCallback_4_(x, y, z, w));
   }
 
+  static DomPointReadOnly internalCreateDomPointReadOnly() {
+    return new DomPointReadOnly._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomPointReadOnly._internalWrap() {
+    return new DomPointReadOnly.internal_();
+  }
+
+  DomPointReadOnly.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMPointReadOnly.w')
   @DocsEditable()
   @Experimental() // untriaged
-  double get w => _blink.BlinkDOMPointReadOnly.instance.w_Getter_(unwrap_jso(this));
+  num get w => _blink.BlinkDOMPointReadOnly.instance.w_Getter_(unwrap_jso(this));
   
   @DomName('DOMPointReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  double get x => _blink.BlinkDOMPointReadOnly.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMPointReadOnly.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('DOMPointReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  double get y => _blink.BlinkDOMPointReadOnly.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMPointReadOnly.instance.y_Getter_(unwrap_jso(this));
   
   @DomName('DOMPointReadOnly.z')
   @DocsEditable()
   @Experimental() // untriaged
-  double get z => _blink.BlinkDOMPointReadOnly.instance.z_Getter_(unwrap_jso(this));
+  num get z => _blink.BlinkDOMPointReadOnly.instance.z_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -10371,48 +12273,61 @@
   @DomName('DOMRectReadOnly.DOMRectReadOnly')
   @DocsEditable()
   factory DomRectReadOnly(num x, num y, num width, num height) {
-    return _blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height);
+    return wrap_jso(_blink.BlinkDOMRectReadOnly.instance.constructorCallback_4_(x, y, width, height));
   }
 
+  static DomRectReadOnly internalCreateDomRectReadOnly() {
+    return new DomRectReadOnly._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomRectReadOnly._internalWrap() {
+    return new DomRectReadOnly.internal_();
+  }
+
+  DomRectReadOnly.internal_() { }
+
+
   @DomName('DOMRectReadOnly.bottom')
   @DocsEditable()
   @Experimental() // untriaged
-  double get bottom => _blink.BlinkDOMRectReadOnly.instance.bottom_Getter_(unwrap_jso(this));
+  num get bottom => _blink.BlinkDOMRectReadOnly.instance.bottom_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.height')
   @DocsEditable()
   @Experimental() // untriaged
-  double get height => _blink.BlinkDOMRectReadOnly.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkDOMRectReadOnly.instance.height_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.left')
   @DocsEditable()
   @Experimental() // untriaged
-  double get left => _blink.BlinkDOMRectReadOnly.instance.left_Getter_(unwrap_jso(this));
+  num get left => _blink.BlinkDOMRectReadOnly.instance.left_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.right')
   @DocsEditable()
   @Experimental() // untriaged
-  double get right => _blink.BlinkDOMRectReadOnly.instance.right_Getter_(unwrap_jso(this));
+  num get right => _blink.BlinkDOMRectReadOnly.instance.right_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.top')
   @DocsEditable()
   @Experimental() // untriaged
-  double get top => _blink.BlinkDOMRectReadOnly.instance.top_Getter_(unwrap_jso(this));
+  num get top => _blink.BlinkDOMRectReadOnly.instance.top_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.width')
   @DocsEditable()
   @Experimental() // untriaged
-  double get width => _blink.BlinkDOMRectReadOnly.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkDOMRectReadOnly.instance.width_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.x')
   @DocsEditable()
   @Experimental() // untriaged
-  double get x => _blink.BlinkDOMRectReadOnly.instance.x_Getter_(unwrap_jso(this));
+  num get x => _blink.BlinkDOMRectReadOnly.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('DOMRectReadOnly.y')
   @DocsEditable()
   @Experimental() // untriaged
-  double get y => _blink.BlinkDOMRectReadOnly.instance.y_Getter_(unwrap_jso(this));
+  num get y => _blink.BlinkDOMRectReadOnly.instance.y_Getter_(unwrap_jso(this));
   }
 
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10428,13 +12343,25 @@
   // To suppress missing implicit constructor warnings.
   factory DomSettableTokenList._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DomSettableTokenList internalCreateDomSettableTokenList() {
+    return new DomSettableTokenList._internalWrap();
+  }
+
+  factory DomSettableTokenList._internalWrap() {
+    return new DomSettableTokenList.internal_();
+  }
+
+  DomSettableTokenList.internal_() : super.internal_();
+
+
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
   String get value => _blink.BlinkDOMSettableTokenList.instance.value_Getter_(unwrap_jso(this));
   
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkDOMSettableTokenList.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable()
@@ -10450,10 +12377,25 @@
 
 @DocsEditable()
 @DomName('DOMStringList')
-class DomStringList extends NativeFieldWrapperClass2 with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
+class DomStringList extends JsoNativeFieldWrapper with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
   // To suppress missing implicit constructor warnings.
   factory DomStringList._() { throw new UnsupportedError("Not supported"); }
 
+  static DomStringList internalCreateDomStringList() {
+    return new DomStringList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomStringList._internalWrap() {
+    return new DomStringList.internal_();
+  }
+
+  DomStringList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMStringList.length')
   @DocsEditable()
   int get length => _blink.BlinkDOMStringList.instance.length_Getter_(unwrap_jso(this));
@@ -10465,7 +12407,7 @@
   }
 
   String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.instance.item_Callback_1_(unwrap_jso(this), index);
- 
+
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -10473,7 +12415,7 @@
   // String is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -10522,7 +12464,7 @@
 
 @DocsEditable()
 @DomName('DOMStringMap')
-abstract class DomStringMap extends NativeFieldWrapperClass2 {
+class DomStringMap extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
@@ -10572,6 +12514,21 @@
   // To suppress missing implicit constructor warnings.
   factory DomTokenList._() { throw new UnsupportedError("Not supported"); }
 
+  static DomTokenList internalCreateDomTokenList() {
+    return new DomTokenList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomTokenList._internalWrap() {
+    return new DomTokenList.internal_();
+  }
+
+  DomTokenList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('DOMTokenList.length')
   @DocsEditable()
   int get length => _blink.BlinkDOMTokenList.instance.length_Getter_(unwrap_jso(this));
@@ -10636,7 +12593,7 @@
     _element._replaceChild(value, _childElements[index]);
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     // TODO(jacobr): remove children when length is reduced.
     throw new UnsupportedError('Cannot resize element lists');
   }
@@ -10700,7 +12657,8 @@
   bool remove(Object object) {
     if (object is Element) {
       Element element = object;
-      if (identical(element.parentNode, _element)) {
+      // We aren't preserving identity of nodes in JSINTEROP mode
+      if (element.parentNode == _element) {
         _element._removeChild(element);
         return true;
       }
@@ -11332,7 +13290,11 @@
     implements ElementList, NodeListWrapper {
   final List<Node> _nodeList;
 
-  _FrozenElementList._wrap(this._nodeList);
+  var dartClass_instance;
+
+  _FrozenElementList._wrap(this._nodeList) {
+      this.dartClass_instance = this._nodeList;
+  }
 
   int get length => _nodeList.length;
 
@@ -11342,7 +13304,7 @@
     throw new UnsupportedError('Cannot modify list');
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     throw new UnsupportedError('Cannot modify list');
   }
 
@@ -11365,7 +13327,7 @@
   CssStyleDeclarationBase get style =>
       new _CssStyleDeclarationSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): This might be faster for Sets:
     //
     //     new _MultiElementCssClassSet(this).writeClasses(value)
@@ -11859,7 +13821,7 @@
  * An abstract class, which all HTML elements extend.
  */
 @DomName('Element')
-abstract class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
+class Element extends Node implements GlobalEventHandlers, ParentNode, ChildNode {
 
   /**
    * Creates an HTML element from a valid fragment of HTML.
@@ -11906,11 +13868,7 @@
    *     }
    *     document.registerElement('x-custom', CustomElement);
    */
-  Element.created() : super._created() {
-    // Validate that this is a custom element & perform any additional
-    // initialization.
-    _initializeCustomElement(this);
-  }
+  Element.created() : super._created();
 
   /**
    * Creates the HTML element specified by the tag name.
@@ -12091,7 +14049,7 @@
    */
   Map<String, String> get attributes => new _ElementAttributeMap(this);
 
-  void set attributes(Map<String, String> value) {
+  set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
     attributes.clear();
     for (String key in value.keys) {
@@ -12113,7 +14071,7 @@
    */
   List<Element> get children => new _ChildrenElementList._wrap(this);
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -12167,7 +14125,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): Do this without reading the classes in clear() and addAll(),
     // or writing the classes in clear().
     CssClassSet classSet = classes;
@@ -12201,7 +14159,7 @@
   Map<String, String> get dataset =>
     new _DataAttributeMap(attributes);
 
-  void set dataset(Map<String, String> value) {
+  set dataset(Map<String, String> value) {
     final data = this.dataset;
     data.clear();
     for (String key in value.keys) {
@@ -12321,6 +14279,49 @@
   void leftView() {}
 
   /**
+   * Creates a new AnimationEffect object whose target element is the object
+   * on which the method is called, and calls the play() method of the
+   * AnimationTimeline object of the document timeline of the node document
+   * of the element, passing the newly created AnimationEffect as the argument
+   * to the method. Returns an AnimationPlayer for the effect.
+   *
+   * Examples
+   *
+   *     var animation = elem.animate([{"opacity": 75}, {"opacity": 0}], 200);
+   *
+   *     var animation = elem.animate([
+   *       {"transform": "translate(100px, -100%)"},
+   *       {"transform" : "translate(400px, 500px)"}
+   *     ], 1500);
+   *
+   * The [frames] parameter is an Iterable<Map>, where the
+   * map entries specify CSS animation effects. The
+   * [timing] paramter can be a double, representing the number of milliseconds
+   * for the transition, or a Map with fields corresponding to those
+   * of the [Timing] object.
+  **/
+  @Experimental()
+  @SupportedBrowser(SupportedBrowser.CHROME, '36')
+  AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
+    if (frames is! Iterable || !(frames.every((x) => x is Map))) {
+      throw new ArgumentError("The frames parameter should be a List of Maps "
+          "with frame information");
+    }
+    var convertedFrames = frames;
+    if (convertedFrames is Iterable) {
+      convertedFrames = convertDartToNative_List(
+          frames.map(convertDartToNative_Dictionary).toList());
+    }
+    var convertedTiming = timing;
+    if (convertedTiming is Map) {
+      convertedTiming = convertDartToNative_Dictionary(convertedTiming);
+    }
+    return convertedTiming == null
+      ? _animate(convertedFrames)
+      : _animate(convertedFrames, convertedTiming);
+  }
+
+  /**
    * Called by the DOM whenever an attribute on this has been changed.
    */
   void attributeChanged(String name, String oldValue, String newValue) {}
@@ -12345,7 +14346,7 @@
   // members of the component are used. The actual type is a subtype of Element.
   get xtag => _xtag != null ? _xtag : this;
 
-  void set xtag(Element value) {
+  set xtag(Element value) {
     _xtag = value;
   }
 
@@ -12579,8 +14580,9 @@
     // offsetParent, "tops out" at BODY. But people could conceivably pass in
     // the document.documentElement and I want it to return an absolute offset,
     // so we have the special case checking for HTML.
-    bool foundAsParent = identical(current, parent) || parent.tagName == 'HTML';
-    if (current == null || identical(current, parent)) {
+    bool sameAsParent = current == parent;
+    bool foundAsParent = sameAsParent || parent.tagName == 'HTML';
+    if (current == null || sameAsParent) {
       if (foundAsParent) return new Point(0, 0);
       throw new ArgumentError("Specified element is not a transitive offset "
           "parent of this element.");
@@ -12638,11 +14640,11 @@
     if (_parseDocument == null) {
       _parseDocument = document.implementation.createHtmlDocument('');
       _parseRange = _parseDocument.createRange();
-	
+
       // Workaround for Safari bug. Was also previously Chrome bug 229142
-      // - URIs are not resolved in new doc.	
-      var base = _parseDocument.createElement('base');	
-      base.href = document.baseUri;	
+      // - URIs are not resolved in new doc.
+      var base = _parseDocument.createElement('base');
+      base.href = document.baseUri;
       _parseDocument.head.append(base);
     }
     var contextElement;
@@ -12700,7 +14702,7 @@
    * This uses the default sanitization behavior to sanitize the HTML fragment,
    * use [setInnerHtml] to override the default behavior.
    */
-  void set innerHtml(String html) {
+  set innerHtml(String html) {
     this.setInnerHtml(html);
   }
 
@@ -12742,71 +14744,109 @@
    * used when an explicit accessor is not available.
    */
   ElementEvents get on => new ElementEvents(this);
-  
+
   /**
    * Verify if any of the attributes that we use in the sanitizer look unexpected,
    * possibly indicating DOM clobbering attacks.
    *
    * Those attributes are: attributes, lastChild, children, previousNode and tagName.
    */
-  // Dartium isn't affected by these attacks, because it goes directly to the C++ API.
-  static bool _hasCorruptedAttributes(Element element) => false;
+
+  static var _namedNodeMap = js.context["NamedNodeMap"];
+  static var _htmlCollection = js.context["HTMLCollection"];
+  static var _nodeList = js.context["NodeList"];
+
+  static bool _hasCorruptedAttributes(Element element) {
+    var attributes = unwrap_jso(element)["attributes"];
+    if (!attributes.instanceof(_namedNodeMap)) {
+      return true;
+    }
+    var childNodes = unwrap_jso(element.childNodes);
+    var length = childNodes["length"];
+    var lastChild = unwrap_jso(element.lastChild);
+    if (null != lastChild &&
+        lastChild != childNodes[length - 1]) {
+      return true;
+    }
+    var children = unwrap_jso(element._children);
+    if (null != children) { // On Safari, children can apparently be null.
+      if (!children.instanceof(_htmlCollection) ||
+          children.instanceof(_nodeList)) {
+	return true;
+      }
+    }
+    return false;
+  }
+
+  String get _safeTagName {
+    String result = 'element tag unavailable';
+    try {
+      if (tagName is String) {
+        result = tagName;
+      }
+    } catch (e) {}
+    return result;
+  }
+
+  // Need to explicitly delegate because Element is no longer abstract for Dartium.
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.BlinkElement.offsetHeight_Getter(this).round();
+  int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.BlinkElement.offsetLeft_Getter(this).round();
+  int get offsetLeft => _blink.BlinkElement.instance.offsetLeft_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.BlinkElement.offsetTop_Getter(this).round();
+  int get offsetTop => _blink.BlinkElement.instance.offsetTop_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.BlinkElement.offsetWidth_Getter(this).round();
+  int get offsetWidth => _blink.BlinkElement.instance.offsetWidth_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.BlinkElement.clientHeight_Getter(this).round();
+  int get clientHeight => _blink.BlinkElement.instance.clientHeight_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.BlinkElement.clientLeft_Getter(this).round();
+  int get clientLeft => _blink.BlinkElement.instance.clientLeft_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.BlinkElement.clientTop_Getter(this).round();
+  int get clientTop => _blink.BlinkElement.instance.clientTop_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.BlinkElement.clientWidth_Getter(this).round();
+  int get clientWidth => _blink.BlinkElement.instance.clientWidth_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.BlinkElement.scrollHeight_Getter(this).round();
+  int get scrollHeight => _blink.BlinkElement.instance.scrollHeight_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.BlinkElement.scrollLeft_Getter(this).round();
+  int get scrollLeft => _blink.BlinkElement.instance.scrollLeft_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round());
+  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.BlinkElement.scrollTop_Getter(this).round();
+  int get scrollTop => _blink.BlinkElement.instance.scrollTop_Getter_(unwrap_jso(this)).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round());
+  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.BlinkElement.scrollWidth_Getter(this).round();
+  int get scrollWidth => _blink.BlinkElement.instance.scrollWidth_Getter_(unwrap_jso(this)).round();
 
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
@@ -13479,6 +15519,18 @@
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
   static const EventStreamProvider<Event> fullscreenErrorEvent = const EventStreamProvider<Event>('webkitfullscreenerror');
 
+
+  static Element internalCreateElement() {
+    return new Element._internalWrap();
+  }
+
+  factory Element._internalWrap() {
+    return new Element.internal_();
+  }
+
+  Element.internal_() : super.internal_();
+
+
   String contentEditable;
 
   MenuElement contextMenu;
@@ -13489,8 +15541,6 @@
 
   bool hidden;
 
-  bool get isContentEditable;
-
   String lang;
 
   bool spellcheck;
@@ -13503,8 +15553,6 @@
 
   String dropzone;
 
-  void click();
-
   @DomName('Element.attributes')
   @DocsEditable()
   _NamedNodeMap get _attributes => wrap_jso(_blink.BlinkElement.instance.attributes_Getter_(unwrap_jso(this)));
@@ -13515,7 +15563,7 @@
   
   @DomName('Element.className')
   @DocsEditable()
-  void set className(String value) => _blink.BlinkElement.instance.className_Setter_(unwrap_jso(this), value);
+  set className(String value) => _blink.BlinkElement.instance.className_Setter_(unwrap_jso(this), value);
   
   @DomName('Element.clientHeight')
   @DocsEditable()
@@ -13539,7 +15587,7 @@
   
   @DomName('Element.id')
   @DocsEditable()
-  void set id(String value) => _blink.BlinkElement.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkElement.instance.id_Setter_(unwrap_jso(this), value);
   
   @DomName('Element.innerHTML')
   @DocsEditable()
@@ -13547,7 +15595,7 @@
   
   @DomName('Element.innerHTML')
   @DocsEditable()
-  void set _innerHtml(String value) => _blink.BlinkElement.instance.innerHTML_Setter_(unwrap_jso(this), value);
+  set _innerHtml(String value) => _blink.BlinkElement.instance.innerHTML_Setter_(unwrap_jso(this), value);
   
   @DomName('Element.localName')
   @DocsEditable()
@@ -13593,7 +15641,7 @@
   
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set _scrollLeft(num value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value);
+  set _scrollLeft(num value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value);
   
   @DomName('Element.scrollTop')
   @DocsEditable()
@@ -13601,7 +15649,7 @@
   
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set _scrollTop(num value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value);
+  set _scrollTop(num value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value);
   
   @DomName('Element.scrollWidth')
   @DocsEditable()
@@ -13624,7 +15672,7 @@
   @DomName('Element.animate')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimationPlayer animate(Object effect, [Object timing]) => wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, timing));
+  AnimationPlayer _animate(Object effect, [Object timing]) => wrap_jso(_blink.BlinkElement.instance.animate_Callback_2_(unwrap_jso(this), effect, timing));
   
   @DomName('Element.blur')
   @DocsEditable()
@@ -13644,7 +15692,7 @@
   @DomName('Element.getAnimationPlayers')
   @DocsEditable()
   @Experimental() // untriaged
-  List<AnimationPlayer> getAnimationPlayers() => _blink.BlinkElement.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this));
+  List<AnimationPlayer> getAnimationPlayers() => wrap_jso(_blink.BlinkElement.instance.getAnimationPlayers_Callback_0_(unwrap_jso(this)));
   
   @DomName('Element.getAttribute')
   @DocsEditable()
@@ -13688,7 +15736,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.BlinkElement.instance.getClientRects_Callback_0_(unwrap_jso(this));
+  List<Rectangle> getClientRects() => wrap_jso(_blink.BlinkElement.instance.getClientRects_Callback_0_(unwrap_jso(this)));
   
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -13703,7 +15751,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => wrap_jso_list(_blink.BlinkElement.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
+  List<Node> getDestinationInsertionPoints() => wrap_jso(_blink.BlinkElement.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
   
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -13718,11 +15766,11 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => wrap_jso_list(_blink.BlinkElement.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
+  List<Node> getElementsByClassName(String classNames) => wrap_jso(_blink.BlinkElement.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), classNames));
   
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) => wrap_jso_list(_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), name));
+  List<Node> _getElementsByTagName(String name) => wrap_jso(_blink.BlinkElement.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), name));
   
   @DomName('Element.hasAttribute')
   @DocsEditable()
@@ -13814,7 +15862,7 @@
   
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children => wrap_jso_list(_blink.BlinkElement.instance.children_Getter_(unwrap_jso(this)));
+  List<Node> get _children => wrap_jso(_blink.BlinkElement.instance.children_Getter_(unwrap_jso(this)));
   
   @DomName('Element.firstElementChild')
   @DocsEditable()
@@ -13846,7 +15894,7 @@
   
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => wrap_jso_list(_blink.BlinkElement.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
+  List<Node> _querySelectorAll(String selectors) => wrap_jso(_blink.BlinkElement.instance.querySelectorAll_Callback_1_(unwrap_jso(this), selectors));
   
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -14360,6 +16408,18 @@
   @DomName('HTMLEmbedElement.HTMLEmbedElement')
   @DocsEditable()
   factory EmbedElement() => document.createElement("embed");
+
+
+  static EmbedElement internalCreateEmbedElement() {
+    return new EmbedElement._internalWrap();
+  }
+
+  factory EmbedElement._internalWrap() {
+    return new EmbedElement.internal_();
+  }
+
+  EmbedElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -14376,7 +16436,7 @@
   
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLEmbedElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.integrity')
   @DocsEditable()
@@ -14386,7 +16446,7 @@
   @DomName('HTMLEmbedElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLEmbedElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLEmbedElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
@@ -14394,7 +16454,7 @@
   
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLEmbedElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLEmbedElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
@@ -14402,7 +16462,7 @@
   
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLEmbedElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLEmbedElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
@@ -14410,7 +16470,7 @@
   
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLEmbedElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLEmbedElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
@@ -14418,7 +16478,7 @@
   
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLEmbedElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLEmbedElement.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
@@ -14455,6 +16515,21 @@
   // To suppress missing implicit constructor warnings.
   factory Entry._() { throw new UnsupportedError("Not supported"); }
 
+  static Entry internalCreateEntry() {
+    return new Entry._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Entry._internalWrap() {
+    return new Entry.internal_();
+  }
+
+  Entry.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Entry.filesystem')
   @DocsEditable()
   FileSystem get filesystem => wrap_jso(_blink.BlinkEntry.instance.filesystem_Getter_(unwrap_jso(this)));
@@ -14477,11 +16552,11 @@
   
   void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.copyTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkEntry.instance.copyTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.copyTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso(successCallback));
+      _blink.BlinkEntry.instance.copyTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
       return;
     }
     if (name != null) {
@@ -14502,10 +16577,10 @@
 
   void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.getMetadata_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkEntry.instance.getMetadata_Callback_2_(unwrap_jso(this), unwrap_jso((metadata) => successCallback(wrap_jso(metadata))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkEntry.instance.getMetadata_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkEntry.instance.getMetadata_Callback_1_(unwrap_jso(this), unwrap_jso((metadata) => successCallback(wrap_jso(metadata))));
     return;
   }
 
@@ -14519,11 +16594,11 @@
 
   void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.getParent_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkEntry.instance.getParent_Callback_2_(unwrap_jso(this), unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.getParent_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+      _blink.BlinkEntry.instance.getParent_Callback_1_(unwrap_jso(this), unwrap_jso((entry) => successCallback(wrap_jso(entry))));
       return;
     }
     _blink.BlinkEntry.instance.getParent_Callback_0_(unwrap_jso(this));
@@ -14540,11 +16615,11 @@
 
   void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.moveTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkEntry.instance.moveTo_Callback_4_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkEntry.instance.moveTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso(successCallback));
+      _blink.BlinkEntry.instance.moveTo_Callback_3_(unwrap_jso(this), unwrap_jso(parent), name, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
       return;
     }
     if (name != null) {
@@ -14565,10 +16640,10 @@
 
   void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkEntry.instance.remove_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkEntry.instance.remove_Callback_2_(unwrap_jso(this), unwrap_jso(() => successCallback()), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkEntry.instance.remove_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkEntry.instance.remove_Callback_1_(unwrap_jso(this), unwrap_jso(() => successCallback()));
     return;
   }
 
@@ -14621,6 +16696,18 @@
   // To suppress missing implicit constructor warnings.
   factory ErrorEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ErrorEvent internalCreateErrorEvent() {
+    return new ErrorEvent._internalWrap();
+  }
+
+  factory ErrorEvent._internalWrap() {
+    return new ErrorEvent.internal_();
+  }
+
+  ErrorEvent.internal_() : super.internal_();
+
+
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
@@ -14629,7 +16716,7 @@
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error => _blink.BlinkErrorEvent.instance.error_Getter_(unwrap_jso(this));
+  Object get error => wrap_jso(_blink.BlinkErrorEvent.instance.error_Getter_(unwrap_jso(this)));
   
   @DomName('ErrorEvent.filename')
   @DocsEditable()
@@ -14705,6 +16792,21 @@
   // To suppress missing implicit constructor warnings.
   factory Event._() { throw new UnsupportedError("Not supported"); }
 
+  static Event internalCreateEvent() {
+    return new Event._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Event._internalWrap() {
+    return new Event.internal_();
+  }
+
+  Event.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /**
    * This event is being handled by the event target.
    *
@@ -14793,7 +16895,7 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path => wrap_jso_list(_blink.BlinkEvent.instance.path_Getter_(unwrap_jso(this)));
+  List<Node> get path => wrap_jso(_blink.BlinkEvent.instance.path_Getter_(unwrap_jso(this)));
   
   @DomName('Event.target')
   @DocsEditable()
@@ -14876,11 +16978,24 @@
   @DocsEditable()
   static EventSource _factoryEventSource(String url, [Map eventSourceInit]) {
     if (eventSourceInit != null) {
-      return _blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInit);
+      var eventSourceInit_1 = convertDartToNative_Dictionary(eventSourceInit);
+      return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_2_(url, eventSourceInit_1));
     }
-    return _blink.BlinkEventSource.instance.constructorCallback_1_(url);
+    return wrap_jso(_blink.BlinkEventSource.instance.constructorCallback_1_(url));
   }
 
+
+  static EventSource internalCreateEventSource() {
+    return new EventSource._internalWrap();
+  }
+
+  factory EventSource._internalWrap() {
+    return new EventSource.internal_();
+  }
+
+  EventSource.internal_() : super.internal_();
+
+
   @DomName('EventSource.CLOSED')
   @DocsEditable()
   static const int CLOSED = 2;
@@ -15019,6 +17134,10 @@
 @DomName('EventTarget')
 class EventTarget extends NativeFieldWrapperClass2 {
 
+  // Default constructor to allow other classes e.g. GlobalEventHandlers to be
+  // constructed using _internalWrap when mapping Blink object to Dart class.
+  EventTarget();
+
   // Custom element created callback.
   EventTarget._created();
 
@@ -15049,13 +17168,28 @@
   // To suppress missing implicit constructor warnings.
   factory EventTarget._() { throw new UnsupportedError("Not supported"); }
 
+  static EventTarget internalCreateEventTarget() {
+    return new EventTarget._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory EventTarget._internalWrap() {
+    return new EventTarget.internal_();
+  }
+
+  EventTarget.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   void _addEventListener([String type, EventListener listener, bool useCapture]) {
     if (useCapture != null) {
-      _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(listener), useCapture);
+      _blink.BlinkEventTarget.instance.addEventListener_Callback_3_(unwrap_jso(this), type, wrap_event_listener(this, listener), useCapture);
       return;
     }
     if (listener != null) {
-      _blink.BlinkEventTarget.instance.addEventListener_Callback_2_(unwrap_jso(this), type, unwrap_jso(listener));
+      _blink.BlinkEventTarget.instance.addEventListener_Callback_2_(unwrap_jso(this), type, wrap_event_listener(this, listener));
       return;
     }
     if (type != null) {
@@ -15072,11 +17206,11 @@
   
   void _removeEventListener([String type, EventListener listener, bool useCapture]) {
     if (useCapture != null) {
-      _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(unwrap_jso(this), type, unwrap_jso(listener), useCapture);
+      _blink.BlinkEventTarget.instance.removeEventListener_Callback_3_(unwrap_jso(this), type, _knownListeners[this.hashCode][identityHashCode(listener)], useCapture);
       return;
     }
     if (listener != null) {
-      _blink.BlinkEventTarget.instance.removeEventListener_Callback_2_(unwrap_jso(this), type, unwrap_jso(listener));
+      _blink.BlinkEventTarget.instance.removeEventListener_Callback_2_(unwrap_jso(this), type, _knownListeners[this.hashCode][identityHashCode(listener)]);
       return;
     }
     if (type != null) {
@@ -15102,6 +17236,18 @@
   // To suppress missing implicit constructor warnings.
   factory ExtendableEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ExtendableEvent internalCreateExtendableEvent() {
+    return new ExtendableEvent._internalWrap();
+  }
+
+  factory ExtendableEvent._internalWrap() {
+    return new ExtendableEvent.internal_();
+  }
+
+  ExtendableEvent.internal_() : super.internal_();
+
+
   @DomName('ExtendableEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15125,9 +17271,21 @@
   @DomName('FederatedCredential.FederatedCredential')
   @DocsEditable()
   factory FederatedCredential(String id, String name, String avatarURL, String federation) {
-    return _blink.BlinkFederatedCredential.instance.constructorCallback_4_(id, name, avatarURL, federation);
+    return wrap_jso(_blink.BlinkFederatedCredential.instance.constructorCallback_4_(id, name, avatarURL, federation));
   }
 
+
+  static FederatedCredential internalCreateFederatedCredential() {
+    return new FederatedCredential._internalWrap();
+  }
+
+  factory FederatedCredential._internalWrap() {
+    return new FederatedCredential.internal_();
+  }
+
+  FederatedCredential.internal_() : super.internal_();
+
+
   @DomName('FederatedCredential.federation')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15148,6 +17306,18 @@
   // To suppress missing implicit constructor warnings.
   factory FetchEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FetchEvent internalCreateFetchEvent() {
+    return new FetchEvent._internalWrap();
+  }
+
+  factory FetchEvent._internalWrap() {
+    return new FetchEvent.internal_();
+  }
+
+  FetchEvent.internal_() : super.internal_();
+
+
   @DomName('FetchEvent.isReload')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15181,6 +17351,18 @@
   @DomName('HTMLFieldSetElement.HTMLFieldSetElement')
   @DocsEditable()
   factory FieldSetElement() => document.createElement("fieldset");
+
+
+  static FieldSetElement internalCreateFieldSetElement() {
+    return new FieldSetElement._internalWrap();
+  }
+
+  factory FieldSetElement._internalWrap() {
+    return new FieldSetElement.internal_();
+  }
+
+  FieldSetElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -15194,11 +17376,11 @@
   
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements => wrap_jso_list(_blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(unwrap_jso(this)));
+  List<Node> get elements => wrap_jso(_blink.BlinkHTMLFieldSetElement.instance.elements_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
@@ -15210,7 +17392,7 @@
   
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLFieldSetElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLFieldSetElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
@@ -15250,6 +17432,18 @@
   // To suppress missing implicit constructor warnings.
   factory File._() { throw new UnsupportedError("Not supported"); }
 
+
+  static File internalCreateFile() {
+    return new File._internalWrap();
+  }
+
+  factory File._internalWrap() {
+    return new File.internal_();
+  }
+
+  File.internal_() : super.internal_();
+
+
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15298,12 +17492,24 @@
   // To suppress missing implicit constructor warnings.
   factory FileEntry._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FileEntry internalCreateFileEntry() {
+    return new FileEntry._internalWrap();
+  }
+
+  factory FileEntry._internalWrap() {
+    return new FileEntry.internal_();
+  }
+
+  FileEntry.internal_() : super.internal_();
+
+
   void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.instance.createWriter_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkFileEntry.instance.createWriter_Callback_2_(unwrap_jso(this), unwrap_jso((fileWriter) => successCallback(wrap_jso(fileWriter))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkFileEntry.instance.createWriter_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkFileEntry.instance.createWriter_Callback_1_(unwrap_jso(this), unwrap_jso((fileWriter) => successCallback(wrap_jso(fileWriter))));
     return;
   }
 
@@ -15317,10 +17523,10 @@
 
   void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkFileEntry.instance.file_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkFileEntry.instance.file_Callback_2_(unwrap_jso(this), unwrap_jso((file) => successCallback(wrap_jso(file))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkFileEntry.instance.file_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkFileEntry.instance.file_Callback_1_(unwrap_jso(this), unwrap_jso((file) => successCallback(wrap_jso(file))));
     return;
   }
 
@@ -15348,6 +17554,18 @@
   // To suppress missing implicit constructor warnings.
   factory FileError._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FileError internalCreateFileError() {
+    return new FileError._internalWrap();
+  }
+
+  factory FileError._internalWrap() {
+    return new FileError.internal_();
+  }
+
+  FileError.internal_() : super.internal_();
+
+
   @DomName('FileError.ABORT_ERR')
   @DocsEditable()
   static const int ABORT_ERR = 3;
@@ -15410,10 +17628,25 @@
 
 @DocsEditable()
 @DomName('FileList')
-class FileList extends NativeFieldWrapperClass2 with ListMixin<File>, ImmutableListMixin<File> implements List<File> {
+class FileList extends JsoNativeFieldWrapper with ListMixin<File>, ImmutableListMixin<File> implements List<File> {
   // To suppress missing implicit constructor warnings.
   factory FileList._() { throw new UnsupportedError("Not supported"); }
 
+  static FileList internalCreateFileList() {
+    return new FileList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory FileList._internalWrap() {
+    return new FileList.internal_();
+  }
+
+  FileList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('FileList.length')
   @DocsEditable()
   int get length => _blink.BlinkFileList.instance.length_Getter_(unwrap_jso(this));
@@ -15425,7 +17658,7 @@
   }
 
   File _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkFileList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -15433,7 +17666,7 @@
   // File is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -15481,7 +17714,7 @@
   @DomName('FileReader.result')
   @DocsEditable()
   Object get result {
-    var res = _blink.BlinkFileReader.result_Getter(unwrap_jso(this));
+    var res = _blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this));
     if (res is ByteBuffer) {
       return new Uint8List.view(res);
     }
@@ -15554,9 +17787,21 @@
   @DomName('FileReader.FileReader')
   @DocsEditable()
   factory FileReader() {
-    return _blink.BlinkFileReader.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkFileReader.instance.constructorCallback_0_());
   }
 
+
+  static FileReader internalCreateFileReader() {
+    return new FileReader._internalWrap();
+  }
+
+  factory FileReader._internalWrap() {
+    return new FileReader.internal_();
+  }
+
+  FileReader.internal_() : super.internal_();
+
+
   @DomName('FileReader.DONE')
   @DocsEditable()
   static const int DONE = 2;
@@ -15579,7 +17824,7 @@
   
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get _result => _blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this));
+  Object get _result => wrap_jso(_blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this)));
   
   @DomName('FileReader.abort')
   @DocsEditable()
@@ -15647,6 +17892,21 @@
   // To suppress missing implicit constructor warnings.
   factory FileStream._() { throw new UnsupportedError("Not supported"); }
 
+  static FileStream internalCreateFileStream() {
+    return new FileStream._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory FileStream._internalWrap() {
+    return new FileStream.internal_();
+  }
+
+  FileStream.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15669,6 +17929,21 @@
   // To suppress missing implicit constructor warnings.
   factory FileSystem._() { throw new UnsupportedError("Not supported"); }
 
+  static FileSystem internalCreateFileSystem() {
+    return new FileSystem._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory FileSystem._internalWrap() {
+    return new FileSystem.internal_();
+  }
+
+  FileSystem.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -15767,6 +18042,18 @@
   @DocsEditable()
   static const EventStreamProvider<ProgressEvent> writeStartEvent = const EventStreamProvider<ProgressEvent>('writestart');
 
+
+  static FileWriter internalCreateFileWriter() {
+    return new FileWriter._internalWrap();
+  }
+
+  factory FileWriter._internalWrap() {
+    return new FileWriter.internal_();
+  }
+
+  FileWriter.internal_() : super.internal_();
+
+
   @DomName('FileWriter.DONE')
   @DocsEditable()
   static const int DONE = 2;
@@ -15866,6 +18153,18 @@
   // To suppress missing implicit constructor warnings.
   factory FocusEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FocusEvent internalCreateFocusEvent() {
+    return new FocusEvent._internalWrap();
+  }
+
+  factory FocusEvent._internalWrap() {
+    return new FocusEvent.internal_();
+  }
+
+  FocusEvent.internal_() : super.internal_();
+
+
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
   EventTarget get relatedTarget => wrap_jso(_blink.BlinkFocusEvent.instance.relatedTarget_Getter_(unwrap_jso(this)));
@@ -15889,26 +18188,44 @@
   @DocsEditable()
   factory FontFace(String family, source, [Map descriptors]) {
     if ((source is String || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
+      return wrap_jso(_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.instance.constructorCallback_3_(family, source, descriptors);
+      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
+      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
     }
     if ((source is TypedData || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
+      return wrap_jso(_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.instance.constructorCallback_3_(family, source, descriptors);
+      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
+      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
     }
     if ((source is ByteBuffer || source == null) && (family is String || family == null) && descriptors == null) {
-      return _blink.BlinkFontFace.instance.constructorCallback_2_(family, source);
+      return wrap_jso(_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.instance.constructorCallback_3_(family, source, descriptors);
+      var descriptors_1 = convertDartToNative_Dictionary(descriptors);
+      return wrap_jso(_blink.BlinkFontFace.instance.constructorCallback_3_(family, source, descriptors_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  static FontFace internalCreateFontFace() {
+    return new FontFace._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory FontFace._internalWrap() {
+    return new FontFace.internal_();
+  }
+
+  FontFace.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
@@ -15917,7 +18234,7 @@
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  void set family(String value) => _blink.BlinkFontFace.instance.family_Setter_(unwrap_jso(this), value);
+  set family(String value) => _blink.BlinkFontFace.instance.family_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.featureSettings')
   @DocsEditable()
@@ -15927,12 +18244,12 @@
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  void set featureSettings(String value) => _blink.BlinkFontFace.instance.featureSettings_Setter_(unwrap_jso(this), value);
+  set featureSettings(String value) => _blink.BlinkFontFace.instance.featureSettings_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.loaded')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get loaded => _blink.BlinkFontFace.instance.loaded_Getter_(unwrap_jso(this));
+  Future get loaded => wrap_jso(_blink.BlinkFontFace.instance.loaded_Getter_(unwrap_jso(this)));
   
   @DomName('FontFace.status')
   @DocsEditable()
@@ -15947,7 +18264,7 @@
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  void set stretch(String value) => _blink.BlinkFontFace.instance.stretch_Setter_(unwrap_jso(this), value);
+  set stretch(String value) => _blink.BlinkFontFace.instance.stretch_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.style')
   @DocsEditable()
@@ -15957,7 +18274,7 @@
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  void set style(String value) => _blink.BlinkFontFace.instance.style_Setter_(unwrap_jso(this), value);
+  set style(String value) => _blink.BlinkFontFace.instance.style_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
@@ -15967,7 +18284,7 @@
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void set unicodeRange(String value) => _blink.BlinkFontFace.instance.unicodeRange_Setter_(unwrap_jso(this), value);
+  set unicodeRange(String value) => _blink.BlinkFontFace.instance.unicodeRange_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.variant')
   @DocsEditable()
@@ -15977,7 +18294,7 @@
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  void set variant(String value) => _blink.BlinkFontFace.instance.variant_Setter_(unwrap_jso(this), value);
+  set variant(String value) => _blink.BlinkFontFace.instance.variant_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.weight')
   @DocsEditable()
@@ -15987,12 +18304,12 @@
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  void set weight(String value) => _blink.BlinkFontFace.instance.weight_Setter_(unwrap_jso(this), value);
+  set weight(String value) => _blink.BlinkFontFace.instance.weight_Setter_(unwrap_jso(this), value);
   
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  Future load() => _blink.BlinkFontFace.instance.load_Callback_0_(unwrap_jso(this));
+  Future load() => wrap_jso(_blink.BlinkFontFace.instance.load_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16009,6 +18326,18 @@
   // To suppress missing implicit constructor warnings.
   factory FontFaceSet._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FontFaceSet internalCreateFontFaceSet() {
+    return new FontFaceSet._internalWrap();
+  }
+
+  factory FontFaceSet._internalWrap() {
+    return new FontFaceSet.internal_();
+  }
+
+  FontFaceSet.internal_() : super.internal_();
+
+
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16043,10 +18372,10 @@
   
   void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
-      _blink.BlinkFontFaceSet.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso(callback), thisArg);
+      _blink.BlinkFontFaceSet.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso((fontFace, fontFaceAgain, set) => callback(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set))), thisArg);
       return;
     }
-    _blink.BlinkFontFaceSet.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+    _blink.BlinkFontFaceSet.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso((fontFace, fontFaceAgain, set) => callback(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set))));
     return;
   }
 
@@ -16080,6 +18409,18 @@
   // To suppress missing implicit constructor warnings.
   factory FontFaceSetLoadEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static FontFaceSetLoadEvent internalCreateFontFaceSetLoadEvent() {
+    return new FontFaceSetLoadEvent._internalWrap();
+  }
+
+  factory FontFaceSetLoadEvent._internalWrap() {
+    return new FontFaceSetLoadEvent.internal_();
+  }
+
+  FontFaceSetLoadEvent.internal_() : super.internal_();
+
+
   @DomName('FontFaceSetLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16108,7 +18449,22 @@
   factory FormData([FormElement form]) => wrap_jso(_create(form));
 
   @DocsEditable()
-  static FormData _create(form) => _blink.BlinkFormData.instance.constructorCallback_1_(form);
+  static FormData _create(form) => wrap_jso(_blink.BlinkFormData.instance.constructorCallback_1_(form));
+
+  static FormData internalCreateFormData() {
+    return new FormData._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory FormData._internalWrap() {
+    return new FormData.internal_();
+  }
+
+  FormData.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -16138,6 +18494,18 @@
   @DomName('HTMLFormElement.HTMLFormElement')
   @DocsEditable()
   factory FormElement() => document.createElement("form");
+
+
+  static FormElement internalCreateFormElement() {
+    return new FormElement._internalWrap();
+  }
+
+  factory FormElement._internalWrap() {
+    return new FormElement.internal_();
+  }
+
+  FormElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -16151,7 +18519,7 @@
   
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  void set acceptCharset(String value) => _blink.BlinkHTMLFormElement.instance.acceptCharset_Setter_(unwrap_jso(this), value);
+  set acceptCharset(String value) => _blink.BlinkHTMLFormElement.instance.acceptCharset_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.action')
   @DocsEditable()
@@ -16159,7 +18527,7 @@
   
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  void set action(String value) => _blink.BlinkHTMLFormElement.instance.action_Setter_(unwrap_jso(this), value);
+  set action(String value) => _blink.BlinkHTMLFormElement.instance.action_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
@@ -16171,7 +18539,7 @@
   @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.instance.autocomplete_Setter_(unwrap_jso(this), value);
+  set autocomplete(String value) => _blink.BlinkHTMLFormElement.instance.autocomplete_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
@@ -16179,7 +18547,7 @@
   
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.BlinkHTMLFormElement.instance.encoding_Setter_(unwrap_jso(this), value);
+  set encoding(String value) => _blink.BlinkHTMLFormElement.instance.encoding_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
@@ -16187,7 +18555,7 @@
   
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  void set enctype(String value) => _blink.BlinkHTMLFormElement.instance.enctype_Setter_(unwrap_jso(this), value);
+  set enctype(String value) => _blink.BlinkHTMLFormElement.instance.enctype_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.length')
   @DocsEditable()
@@ -16199,7 +18567,7 @@
   
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  void set method(String value) => _blink.BlinkHTMLFormElement.instance.method_Setter_(unwrap_jso(this), value);
+  set method(String value) => _blink.BlinkHTMLFormElement.instance.method_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.name')
   @DocsEditable()
@@ -16207,7 +18575,7 @@
   
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLFormElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLFormElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
@@ -16215,7 +18583,7 @@
   
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  void set noValidate(bool value) => _blink.BlinkHTMLFormElement.instance.noValidate_Setter_(unwrap_jso(this), value);
+  set noValidate(bool value) => _blink.BlinkHTMLFormElement.instance.noValidate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLFormElement.target')
   @DocsEditable()
@@ -16223,14 +18591,14 @@
   
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(unwrap_jso(this), value);
+  set target(String value) => _blink.BlinkHTMLFormElement.instance.target_Setter_(unwrap_jso(this), value);
   
   Element __getter__(index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
       return wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return _blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return wrap_jso(_blink.BlinkHTMLFormElement.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -16243,7 +18611,7 @@
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.instance.requestAutocomplete_Callback_1_(unwrap_jso(this), details);
+  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.instance.requestAutocomplete_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(details));
   
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
@@ -16269,6 +18637,21 @@
   // To suppress missing implicit constructor warnings.
   factory Gamepad._() { throw new UnsupportedError("Not supported"); }
 
+  static Gamepad internalCreateGamepad() {
+    return new Gamepad._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Gamepad._internalWrap() {
+    return new Gamepad.internal_();
+  }
+
+  Gamepad.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Gamepad.axes')
   @DocsEditable()
   List<num> get axes => _blink.BlinkGamepad.instance.axes_Getter_(unwrap_jso(this));
@@ -16310,6 +18693,21 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadButton._() { throw new UnsupportedError("Not supported"); }
 
+  static GamepadButton internalCreateGamepadButton() {
+    return new GamepadButton._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory GamepadButton._internalWrap() {
+    return new GamepadButton.internal_();
+  }
+
+  GamepadButton.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('GamepadButton.pressed')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16318,7 +18716,7 @@
   @DomName('GamepadButton.value')
   @DocsEditable()
   @Experimental() // untriaged
-  double get value => _blink.BlinkGamepadButton.instance.value_Getter_(unwrap_jso(this));
+  num get value => _blink.BlinkGamepadButton.instance.value_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16335,6 +18733,18 @@
   // To suppress missing implicit constructor warnings.
   factory GamepadEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static GamepadEvent internalCreateGamepadEvent() {
+    return new GamepadEvent._internalWrap();
+  }
+
+  factory GamepadEvent._internalWrap() {
+    return new GamepadEvent.internal_();
+  }
+
+  GamepadEvent.internal_() : super.internal_();
+
+
   @DomName('GamepadEvent.gamepad')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16355,20 +18765,35 @@
   // To suppress missing implicit constructor warnings.
   factory Geofencing._() { throw new UnsupportedError("Not supported"); }
 
+  static Geofencing internalCreateGeofencing() {
+    return new Geofencing._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Geofencing._internalWrap() {
+    return new Geofencing.internal_();
+  }
+
+  Geofencing.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Geofencing.getRegisteredRegions')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getRegisteredRegions() => _blink.BlinkGeofencing.instance.getRegisteredRegions_Callback_0_(unwrap_jso(this));
+  Future getRegisteredRegions() => wrap_jso(_blink.BlinkGeofencing.instance.getRegisteredRegions_Callback_0_(unwrap_jso(this)));
   
   @DomName('Geofencing.registerRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future registerRegion(GeofencingRegion region) => _blink.BlinkGeofencing.instance.registerRegion_Callback_1_(unwrap_jso(this), unwrap_jso(region));
+  Future registerRegion(GeofencingRegion region) => wrap_jso(_blink.BlinkGeofencing.instance.registerRegion_Callback_1_(unwrap_jso(this), unwrap_jso(region)));
   
   @DomName('Geofencing.unregisterRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregisterRegion(String regionId) => _blink.BlinkGeofencing.instance.unregisterRegion_Callback_1_(unwrap_jso(this), regionId);
+  Future unregisterRegion(String regionId) => wrap_jso(_blink.BlinkGeofencing.instance.unregisterRegion_Callback_1_(unwrap_jso(this), regionId));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16385,6 +18810,21 @@
   // To suppress missing implicit constructor warnings.
   factory GeofencingRegion._() { throw new UnsupportedError("Not supported"); }
 
+  static GeofencingRegion internalCreateGeofencingRegion() {
+    return new GeofencingRegion._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory GeofencingRegion._internalWrap() {
+    return new GeofencingRegion.internal_();
+  }
+
+  GeofencingRegion.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('GeofencingRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
@@ -16474,31 +18914,46 @@
   // To suppress missing implicit constructor warnings.
   factory Geolocation._() { throw new UnsupportedError("Not supported"); }
 
+  static Geolocation internalCreateGeolocation() {
+    return new Geolocation._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Geolocation._internalWrap() {
+    return new Geolocation.internal_();
+  }
+
+  Geolocation.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
   void _clearWatch(int watchID) => _blink.BlinkGeolocation.instance.clearWatch_Callback_1_(unwrap_jso(this), watchID);
   
   void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_3_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback), options);
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_3_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))), convertDartToNative_Dictionary(options));
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_2_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    _blink.BlinkGeolocation.instance.getCurrentPosition_Callback_1_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))));
     return;
   }
 
   int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Map options]) {
     if (options != null) {
-      return _blink.BlinkGeolocation.instance.watchPosition_Callback_3_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback), options);
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_3_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))), convertDartToNative_Dictionary(options));
     }
     if (errorCallback != null) {
-      return _blink.BlinkGeolocation.instance.watchPosition_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      return _blink.BlinkGeolocation.instance.watchPosition_Callback_2_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
     }
-    return _blink.BlinkGeolocation.instance.watchPosition_Callback_1_(unwrap_jso(this), unwrap_jso(successCallback));
+    return _blink.BlinkGeolocation.instance.watchPosition_Callback_1_(unwrap_jso(this), unwrap_jso((position) => successCallback(wrap_jso(position))));
   }
 }
 
@@ -16516,6 +18971,21 @@
   // To suppress missing implicit constructor warnings.
   factory Geoposition._() { throw new UnsupportedError("Not supported"); }
 
+  static Geoposition internalCreateGeoposition() {
+    return new Geoposition._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Geoposition._internalWrap() {
+    return new Geoposition.internal_();
+  }
+
+  Geoposition.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Geoposition.coords')
   @DocsEditable()
   Coordinates get coords => wrap_jso(_blink.BlinkGeoposition.instance.coords_Getter_(unwrap_jso(this)));
@@ -17076,6 +19546,18 @@
   @DomName('HTMLHRElement.HTMLHRElement')
   @DocsEditable()
   factory HRElement() => document.createElement("hr");
+
+
+  static HRElement internalCreateHRElement() {
+    return new HRElement._internalWrap();
+  }
+
+  factory HRElement._internalWrap() {
+    return new HRElement.internal_();
+  }
+
+  HRElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -17091,7 +19573,7 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  void set color(String value) => _blink.BlinkHTMLHRElement.instance.color_Setter_(unwrap_jso(this), value);
+  set color(String value) => _blink.BlinkHTMLHRElement.instance.color_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -17116,6 +19598,18 @@
   // To suppress missing implicit constructor warnings.
   factory HashChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static HashChangeEvent internalCreateHashChangeEvent() {
+    return new HashChangeEvent._internalWrap();
+  }
+
+  factory HashChangeEvent._internalWrap() {
+    return new HashChangeEvent.internal_();
+  }
+
+  HashChangeEvent.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -17148,6 +19642,18 @@
   @DomName('HTMLHeadElement.HTMLHeadElement')
   @DocsEditable()
   factory HeadElement() => document.createElement("head");
+
+
+  static HeadElement internalCreateHeadElement() {
+    return new HeadElement._internalWrap();
+  }
+
+  factory HeadElement._internalWrap() {
+    return new HeadElement.internal_();
+  }
+
+  HeadElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -17174,17 +19680,33 @@
   @DocsEditable()
   factory Headers([input]) {
     if (input == null) {
-      return _blink.BlinkHeaders.instance.constructorCallback_0_();
+      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_0_());
     }
     if ((input is Headers || input == null)) {
-      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
+      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input));
     }
     if ((input is Map || input == null)) {
-      return _blink.BlinkHeaders.instance.constructorCallback_1_(input);
+      var input_1 = convertDartToNative_Dictionary(input);
+      return wrap_jso(_blink.BlinkHeaders.instance.constructorCallback_1_(input_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  static Headers internalCreateHeaders() {
+    return new Headers._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Headers._internalWrap() {
+    return new Headers.internal_();
+  }
+
+  Headers.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Headers.size')
   @DocsEditable()
   @Experimental() // untriaged
@@ -17192,10 +19714,10 @@
   
   void forEach(HeadersForEachCallback callback, [Object thisArg]) {
     if (thisArg != null) {
-      _blink.BlinkHeaders.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso(callback), thisArg);
+      _blink.BlinkHeaders.instance.forEach_Callback_2_(unwrap_jso(this), unwrap_jso((String value, String key, map) => callback(value, key, wrap_jso(map))), thisArg);
       return;
     }
-    _blink.BlinkHeaders.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+    _blink.BlinkHeaders.instance.forEach_Callback_1_(unwrap_jso(this), unwrap_jso((String value, String key, map) => callback(value, key, wrap_jso(map))));
     return;
   }
 
@@ -17246,6 +19768,18 @@
   @DomName('HTMLHeadingElement.HTMLHeadingElement')
   @DocsEditable()
   factory HeadingElement.h6() => document.createElement("h6");
+
+
+  static HeadingElement internalCreateHeadingElement() {
+    return new HeadingElement._internalWrap();
+  }
+
+  factory HeadingElement._internalWrap() {
+    return new HeadingElement.internal_();
+  }
+
+  HeadingElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -17275,6 +19809,21 @@
   // To suppress missing implicit constructor warnings.
   factory History._() { throw new UnsupportedError("Not supported"); }
 
+  static History internalCreateHistory() {
+    return new History._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory History._internalWrap() {
+    return new History.internal_();
+  }
+
+  History.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('History.length')
   @DocsEditable()
   int get length => _blink.BlinkHistory.instance.length_Getter_(unwrap_jso(this));
@@ -17320,10 +19869,25 @@
 
 @DocsEditable()
 @DomName('HTMLCollection')
-class HtmlCollection extends NativeFieldWrapperClass2 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
+class HtmlCollection extends JsoNativeFieldWrapper with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   // To suppress missing implicit constructor warnings.
   factory HtmlCollection._() { throw new UnsupportedError("Not supported"); }
 
+  static HtmlCollection internalCreateHtmlCollection() {
+    return new HtmlCollection._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory HtmlCollection._internalWrap() {
+    return new HtmlCollection.internal_();
+  }
+
+  HtmlCollection.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('HTMLCollection.length')
   @DocsEditable()
   int get length => _blink.BlinkHTMLCollection.instance.length_Getter_(unwrap_jso(this));
@@ -17335,7 +19899,7 @@
   }
 
   Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkHTMLCollection.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -17343,7 +19907,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -17396,11 +19960,23 @@
   factory HtmlDocument._() { throw new UnsupportedError("Not supported"); }
 
 
+  static HtmlDocument internalCreateHtmlDocument() {
+    return new HtmlDocument._internalWrap();
+  }
+
+  factory HtmlDocument._internalWrap() {
+    return new HtmlDocument.internal_();
+  }
+
+  HtmlDocument.internal_() : super.internal_();
+
+
+
   @DomName('Document.body')
   BodyElement get body => _body;
 
   @DomName('Document.body')
-  void set body(BodyElement value) {
+  set body(BodyElement value) {
     _body = value;
   }
 
@@ -17467,7 +20043,7 @@
 
   @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => _selectedStylesheetSet;
-  void set selectedStylesheetSet(String value) {
+  set selectedStylesheetSet(String value) {
     _selectedStylesheetSet = value;
   }
 
@@ -17478,7 +20054,7 @@
   String get title => _title;
 
   @DomName('Document.title')
-  void set title(String value) {
+  set title(String value) {
     _title = value;
   }
 
@@ -17559,6 +20135,39 @@
   @Experimental()
   String get visibilityState => _webkitVisibilityState;
 
+  /**
+   * Internal routine to find the DOM JS class name being extended for custom
+   * elements.
+   */
+  String _getJSClassName(ClassMirror classMirror) {
+    var jsClassName = null;
+    var isElement = false;
+
+    while (classMirror.superclass != null) {
+      var fullName = classMirror.superclass.qualifiedName;
+      isElement = isElement || (fullName == #dart.dom.html.Element);
+
+      var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.');
+      if (jsClassName == null && domLibrary) {
+        // Lookup JS class name (if not found).
+        var metadatas = classMirror.metadata;
+        for (var metadata in metadatas) {
+          var metaDataMirror = metadata.reflectee;
+          var metaType = reflectClass(metaDataMirror.runtimeType);
+          if (MirrorSystem.getName(metaType.simpleName) == 'DomName' &&
+              metaDataMirror.name.startsWith('HTML')) {
+            jsClassName = metadata.reflectee.name;
+          }
+        }
+      }
+
+      classMirror = classMirror.superclass;
+    }
+
+    // If we're an element then everything is okay.
+    return isElement ? jsClassName : null;
+  }
+
   @Experimental()
   /**
    * Register a custom subclass of Element to be instantiatable by the DOM.
@@ -17603,7 +20212,73 @@
    */
   void registerElement(String tag, Type customElementClass,
       {String extendsTag}) {
-    _Utils.register(this, tag, customElementClass, extendsTag);
+    // TODO(terry): Need to handle the extendsTag.
+
+    // Figure out which DOM class is being extended from the user's Dart class.
+    var classMirror = reflectClass(customElementClass);
+    var jsClassName = _getJSClassName(classMirror);
+    if (jsClassName == null) {
+      // Only components derived from HTML* can be extended.
+      throw new DomException.jsInterop("HierarchyRequestError: Only HTML elements can be customized.");
+    }
+
+    // Start the hookup the JS way create an <x-foo> element that extends the
+    // <x-base> custom element. Inherit its prototype and signal what tag is
+    // inherited:
+    //
+    //     var myProto = Object.create(HTMLElement.prototype);
+    //     var myElement = document.registerElement('x-foo', {prototype: myProto});
+    var baseElement = js.context[jsClassName];
+    if (baseElement == null) {
+      // Couldn't find the HTML element so use a generic one.
+      baseElement = js.context['HTMLElement'];
+    }
+    var elemProto = js.context['Object'].callMethod("create", [baseElement['prototype']]);
+
+    // TODO(terry): Hack to stop recursion re-creating custom element when the
+    //              created() constructor of the custom element does e.g.,
+    //
+    //                  MyElement.created() : super.created() {
+    //                    this.innerHtml = "<b>I'm an x-foo-with-markup!</b>";
+    //                  }
+    //
+    //              sanitizing causes custom element to created recursively
+    //              until stack overflow.
+    //
+    //              See https://github.com/dart-lang/sdk/issues/23666
+    int creating = 0;
+    elemProto['createdCallback'] = new js.JsFunction.withThis(($this) {
+      if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) {
+        creating++;
+
+        var dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
+
+        // Need to remember the Dart class that was created for this custom so
+        // return it and setup the blink_jsObject to the $this that we'll be working
+        // with as we talk to blink. 
+        $this['dart_class'] = dartClass;
+
+        creating--;
+      }
+    });
+    elemProto['attributeChangedCallback'] = new js.JsFunction.withThis(($this, attrName, oldVal, newVal) {
+      if ($this["dart_class"] != null && $this['dart_class'].attributeChanged != null) {
+        $this['dart_class'].attributeChanged(attrName, oldVal, newVal);
+      }
+    });
+    elemProto['attachedCallback'] = new js.JsFunction.withThis(($this) {
+      if ($this["dart_class"] != null && $this['dart_class'].attached != null) {
+        $this['dart_class'].attached();
+      }
+    });
+    elemProto['detachedCallback'] = new js.JsFunction.withThis(($this) {
+      if ($this["dart_class"] != null && $this['dart_class'].detached != null) {
+        $this['dart_class'].detached();
+      }
+    });
+    // document.registerElement('x-foo', {prototype: elemProto, extends: extendsTag});
+    var jsMap = new js.JsObject.jsify({'prototype': elemProto, 'extends': extendsTag});
+    js.context['document'].callMethod('registerElement', [tag, jsMap]);
   }
 
   /** *Deprecated*: use [registerElement] instead. */
@@ -17924,6 +20599,18 @@
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
+
+  static HtmlElement internalCreateHtmlElement() {
+    return new HtmlElement._internalWrap();
+  }
+
+  factory HtmlElement._internalWrap() {
+    return new HtmlElement.internal_();
+  }
+
+  HtmlElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -17937,7 +20624,7 @@
   
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  void set contentEditable(String value) => _blink.BlinkHTMLElement.instance.contentEditable_Setter_(unwrap_jso(this), value);
+  set contentEditable(String value) => _blink.BlinkHTMLElement.instance.contentEditable_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.contextMenu')
   @DocsEditable()
@@ -17947,7 +20634,7 @@
   @DomName('HTMLElement.contextMenu')
   @DocsEditable()
   @Experimental() // untriaged
-  void set contextMenu(MenuElement value) => _blink.BlinkHTMLElement.instance.contextMenu_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set contextMenu(MenuElement value) => _blink.BlinkHTMLElement.instance.contextMenu_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLElement.dir')
   @DocsEditable()
@@ -17955,7 +20642,7 @@
   
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  void set dir(String value) => _blink.BlinkHTMLElement.instance.dir_Setter_(unwrap_jso(this), value);
+  set dir(String value) => _blink.BlinkHTMLElement.instance.dir_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.draggable')
   @DocsEditable()
@@ -17963,7 +20650,7 @@
   
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  void set draggable(bool value) => _blink.BlinkHTMLElement.instance.draggable_Setter_(unwrap_jso(this), value);
+  set draggable(bool value) => _blink.BlinkHTMLElement.instance.draggable_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.hidden')
   @DocsEditable()
@@ -17971,7 +20658,7 @@
   
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  void set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(unwrap_jso(this), value);
+  set hidden(bool value) => _blink.BlinkHTMLElement.instance.hidden_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.inputMethodContext')
   @DocsEditable()
@@ -17988,7 +20675,7 @@
   
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkHTMLElement.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkHTMLElement.instance.lang_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
@@ -18000,7 +20687,7 @@
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  void set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(unwrap_jso(this), value);
+  set spellcheck(bool value) => _blink.BlinkHTMLElement.instance.spellcheck_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
@@ -18008,7 +20695,7 @@
   
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  void set tabIndex(int value) => _blink.BlinkHTMLElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
+  set tabIndex(int value) => _blink.BlinkHTMLElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.title')
   @DocsEditable()
@@ -18016,7 +20703,7 @@
   
   @DomName('HTMLElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.BlinkHTMLElement.instance.title_Setter_(unwrap_jso(this), value);
+  set title(String value) => _blink.BlinkHTMLElement.instance.title_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.translate')
   @DocsEditable()
@@ -18024,7 +20711,7 @@
   
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  void set translate(bool value) => _blink.BlinkHTMLElement.instance.translate_Setter_(unwrap_jso(this), value);
+  set translate(bool value) => _blink.BlinkHTMLElement.instance.translate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -18040,7 +20727,7 @@
   @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.instance.webkitdropzone_Setter_(unwrap_jso(this), value);
+  set dropzone(String value) => _blink.BlinkHTMLElement.instance.webkitdropzone_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLElement.click')
   @DocsEditable()
@@ -18320,6 +21007,18 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
 
+
+  static HtmlFormControlsCollection internalCreateHtmlFormControlsCollection() {
+    return new HtmlFormControlsCollection._internalWrap();
+  }
+
+  factory HtmlFormControlsCollection._internalWrap() {
+    return new HtmlFormControlsCollection.internal_();
+  }
+
+  HtmlFormControlsCollection.internal_() : super.internal_();
+
+
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
   Object namedItem(String name) => wrap_jso(_blink.BlinkHTMLFormControlsCollection.instance.namedItem_Callback_1_(unwrap_jso(this), name));
@@ -18341,6 +21040,18 @@
   @DomName('HTMLHtmlElement.HTMLHtmlElement')
   @DocsEditable()
   factory HtmlHtmlElement() => document.createElement("html");
+
+
+  static HtmlHtmlElement internalCreateHtmlHtmlElement() {
+    return new HtmlHtmlElement._internalWrap();
+  }
+
+  factory HtmlHtmlElement._internalWrap() {
+    return new HtmlHtmlElement.internal_();
+  }
+
+  HtmlHtmlElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -18362,6 +21073,18 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlOptionsCollection._() { throw new UnsupportedError("Not supported"); }
 
+
+  static HtmlOptionsCollection internalCreateHtmlOptionsCollection() {
+    return new HtmlOptionsCollection._internalWrap();
+  }
+
+  factory HtmlOptionsCollection._internalWrap() {
+    return new HtmlOptionsCollection.internal_();
+  }
+
+  HtmlOptionsCollection.internal_() : super.internal_();
+
+
 }
 // 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
@@ -18699,6 +21422,31 @@
     return headers;
   }
 
+  /**
+   * Specify the desired `url`, and `method` to use in making the request.
+   *
+   * By default the request is done asyncronously, with no user or password
+   * authentication information. If `async` is false, the request will be send
+   * synchronously.
+   *
+   * Calling `open` again on a currently active request is equivalent to
+   * calling `abort`.
+   *
+   * Note: Most simple HTTP requests can be accomplished using the [getString],
+   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+   * `open` method is intended only for more complext HTTP requests where
+   * finer-grained control is needed.
+   */
+  @DomName('XMLHttpRequest.open')
+  @DocsEditable()
+  void open(String method, String url, {bool async, String user, String password}) {
+    if (async == null && user == null && password == null) {
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(unwrap_jso(this), method, url);
+    } else {
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(unwrap_jso(this), method, url, async, user, password);
+    }
+  }
+
   // To suppress missing implicit constructor warnings.
   factory HttpRequest._() { throw new UnsupportedError("Not supported"); }
 
@@ -18733,7 +21481,19 @@
   factory HttpRequest() => wrap_jso(_create());
 
   @DocsEditable()
-  static HttpRequest _create() => _blink.BlinkXMLHttpRequest.instance.constructorCallback_0_();
+  static HttpRequest _create() => wrap_jso(_blink.BlinkXMLHttpRequest.instance.constructorCallback_0_());
+
+
+  static HttpRequest internalCreateHttpRequest() {
+    return new HttpRequest._internalWrap();
+  }
+
+  factory HttpRequest._internalWrap() {
+    return new HttpRequest.internal_();
+  }
+
+  HttpRequest.internal_() : super.internal_();
+
 
   @DomName('XMLHttpRequest.DONE')
   @DocsEditable()
@@ -18804,7 +21564,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response => _blink.BlinkXMLHttpRequest.instance.response_Getter_(unwrap_jso(this));
+  Object get response => wrap_jso(_blink.BlinkXMLHttpRequest.instance.response_Getter_(unwrap_jso(this)));
   
   /**
    * The response in String form or empty String on failure.
@@ -18839,7 +21599,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  void set responseType(String value) => _blink.BlinkXMLHttpRequest.instance.responseType_Setter_(unwrap_jso(this), value);
+  set responseType(String value) => _blink.BlinkXMLHttpRequest.instance.responseType_Setter_(unwrap_jso(this), value);
   
   @DomName('XMLHttpRequest.responseURL')
   @DocsEditable()
@@ -18913,7 +21673,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void set timeout(int value) => _blink.BlinkXMLHttpRequest.instance.timeout_Setter_(unwrap_jso(this), value);
+  set timeout(int value) => _blink.BlinkXMLHttpRequest.instance.timeout_Setter_(unwrap_jso(this), value);
   
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -18942,7 +21702,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  void set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.instance.withCredentials_Setter_(unwrap_jso(this), value);
+  set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.instance.withCredentials_Setter_(unwrap_jso(this), value);
   
   /**
    * Stop the current request.
@@ -18982,25 +21742,6 @@
   String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.instance.getResponseHeader_Callback_1_(unwrap_jso(this), header);
   
   /**
-   * Specify the desired `url`, and `method` to use in making the request.
-   *
-   * By default the request is done asyncronously, with no user or password
-   * authentication information. If `async` is false, the request will be send
-   * synchronously.
-   *
-   * Calling `open` again on a currently active request is equivalent to
-   * calling `abort`.
-   *
-   * Note: Most simple HTTP requests can be accomplished using the [getString],
-   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
-   * `open` method is intended only for more complext HTTP requests where
-   * finer-grained control is needed.
-   */
-  @DomName('XMLHttpRequest.open')
-  @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) => _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(unwrap_jso(this), method, url, async, user, password);
-  
-  /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
    * response.
    *
@@ -19155,6 +21896,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<ProgressEvent> timeoutEvent = const EventStreamProvider<ProgressEvent>('timeout');
 
+
+  static HttpRequestEventTarget internalCreateHttpRequestEventTarget() {
+    return new HttpRequestEventTarget._internalWrap();
+  }
+
+  factory HttpRequestEventTarget._internalWrap() {
+    return new HttpRequestEventTarget.internal_();
+  }
+
+  HttpRequestEventTarget.internal_() : super.internal_();
+
+
   /// Stream of `abort` events handled by this [HttpRequestEventTarget].
   @DomName('XMLHttpRequestEventTarget.onabort')
   @DocsEditable()
@@ -19221,6 +21974,18 @@
   // To suppress missing implicit constructor warnings.
   factory HttpRequestUpload._() { throw new UnsupportedError("Not supported"); }
 
+
+  static HttpRequestUpload internalCreateHttpRequestUpload() {
+    return new HttpRequestUpload._internalWrap();
+  }
+
+  factory HttpRequestUpload._internalWrap() {
+    return new HttpRequestUpload.internal_();
+  }
+
+  HttpRequestUpload.internal_() : super.internal_();
+
+
 }
 // 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
@@ -19238,6 +22003,18 @@
   @DomName('HTMLIFrameElement.HTMLIFrameElement')
   @DocsEditable()
   factory IFrameElement() => document.createElement("iframe");
+
+
+  static IFrameElement internalCreateIFrameElement() {
+    return new IFrameElement._internalWrap();
+  }
+
+  factory IFrameElement._internalWrap() {
+    return new IFrameElement.internal_();
+  }
+
+  IFrameElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -19253,7 +22030,7 @@
   @DomName('HTMLIFrameElement.allowFullscreen')
   @DocsEditable()
   @Experimental() // untriaged
-  void set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Setter_(unwrap_jso(this), value);
+  set allowFullscreen(bool value) => _blink.BlinkHTMLIFrameElement.instance.allowFullscreen_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
@@ -19265,7 +22042,7 @@
   
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLIFrameElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.integrity')
   @DocsEditable()
@@ -19275,7 +22052,7 @@
   @DomName('HTMLIFrameElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLIFrameElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLIFrameElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
@@ -19283,7 +22060,7 @@
   
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLIFrameElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLIFrameElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
@@ -19291,7 +22068,7 @@
   
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  void set sandbox(String value) => _blink.BlinkHTMLIFrameElement.instance.sandbox_Setter_(unwrap_jso(this), value);
+  set sandbox(String value) => _blink.BlinkHTMLIFrameElement.instance.sandbox_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
@@ -19299,7 +22076,7 @@
   
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLIFrameElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLIFrameElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
@@ -19307,7 +22084,7 @@
   
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  void set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Setter_(unwrap_jso(this), value);
+  set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.instance.srcdoc_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
@@ -19315,7 +22092,7 @@
   
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLIFrameElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLIFrameElement.instance.width_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19332,6 +22109,21 @@
   // To suppress missing implicit constructor warnings.
   factory ImageBitmap._() { throw new UnsupportedError("Not supported"); }
 
+  static ImageBitmap internalCreateImageBitmap() {
+    return new ImageBitmap._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ImageBitmap._internalWrap() {
+    return new ImageBitmap.internal_();
+  }
+
+  ImageBitmap.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
@@ -19365,17 +22157,32 @@
   @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.instance.constructorCallback_2_(data_OR_width, height_OR_width);
+      return wrap_jso(_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.instance.constructorCallback_3_(data_OR_width, height_OR_width, height);
+      return wrap_jso(_blink.BlinkImageData.instance.constructorCallback_3_(data_OR_width, height_OR_width, height));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  static ImageData internalCreateImageData() {
+    return new ImageData._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ImageData._internalWrap() {
+    return new ImageData.internal_();
+  }
+
+  ImageData.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ImageData.data')
   @DocsEditable()
-  Uint8ClampedList get _data => wrap_jso(_blink.BlinkImageData.instance.data_Getter_(unwrap_jso(this)));
+  Uint8ClampedList get _data => _blink.BlinkImageData.instance.data_Getter_(unwrap_jso(this));
   
   @DomName('ImageData.height')
   @DocsEditable()
@@ -19405,6 +22212,18 @@
     if (height != null) e.height = height;
     return e;
   }
+
+
+  static ImageElement internalCreateImageElement() {
+    return new ImageElement._internalWrap();
+  }
+
+  factory ImageElement._internalWrap() {
+    return new ImageElement.internal_();
+  }
+
+  ImageElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -19418,7 +22237,7 @@
   
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLImageElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLImageElement.instance.alt_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
@@ -19430,7 +22249,7 @@
   
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLImageElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.currentSrc')
   @DocsEditable()
@@ -19443,7 +22262,7 @@
   
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLImageElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.integrity')
   @DocsEditable()
@@ -19453,7 +22272,7 @@
   @DomName('HTMLImageElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLImageElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLImageElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
@@ -19461,7 +22280,7 @@
   
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  void set isMap(bool value) => _blink.BlinkHTMLImageElement.instance.isMap_Setter_(unwrap_jso(this), value);
+  set isMap(bool value) => _blink.BlinkHTMLImageElement.instance.isMap_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
@@ -19479,7 +22298,7 @@
   @DomName('HTMLImageElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  void set sizes(String value) => _blink.BlinkHTMLImageElement.instance.sizes_Setter_(unwrap_jso(this), value);
+  set sizes(String value) => _blink.BlinkHTMLImageElement.instance.sizes_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.src')
   @DocsEditable()
@@ -19487,7 +22306,7 @@
   
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLImageElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLImageElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
@@ -19497,7 +22316,7 @@
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.BlinkHTMLImageElement.instance.srcset_Setter_(unwrap_jso(this), value);
+  set srcset(String value) => _blink.BlinkHTMLImageElement.instance.srcset_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
@@ -19505,7 +22324,7 @@
   
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.BlinkHTMLImageElement.instance.useMap_Setter_(unwrap_jso(this), value);
+  set useMap(String value) => _blink.BlinkHTMLImageElement.instance.useMap_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLImageElement.width')
   @DocsEditable()
@@ -19513,7 +22332,7 @@
   
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLImageElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLImageElement.instance.width_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19530,6 +22349,21 @@
   // To suppress missing implicit constructor warnings.
   factory InjectedScriptHost._() { throw new UnsupportedError("Not supported"); }
 
+  static InjectedScriptHost internalCreateInjectedScriptHost() {
+    return new InjectedScriptHost._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory InjectedScriptHost._internalWrap() {
+    return new InjectedScriptHost.internal_();
+  }
+
+  InjectedScriptHost.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
@@ -19578,6 +22412,18 @@
 
   // To suppress missing implicit constructor warnings.
   factory InputElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static InputElement internalCreateInputElement() {
+    return new InputElement._internalWrap();
+  }
+
+  factory InputElement._internalWrap() {
+    return new InputElement.internal_();
+  }
+
+  InputElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -19591,7 +22437,7 @@
   
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  void set accept(String value) => _blink.BlinkHTMLInputElement.instance.accept_Setter_(unwrap_jso(this), value);
+  set accept(String value) => _blink.BlinkHTMLInputElement.instance.accept_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
@@ -19599,7 +22445,7 @@
   
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(unwrap_jso(this), value);
+  set alt(String value) => _blink.BlinkHTMLInputElement.instance.alt_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
@@ -19607,7 +22453,7 @@
   
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  void set autocomplete(String value) => _blink.BlinkHTMLInputElement.instance.autocomplete_Setter_(unwrap_jso(this), value);
+  set autocomplete(String value) => _blink.BlinkHTMLInputElement.instance.autocomplete_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
@@ -19615,7 +22461,7 @@
   
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLInputElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLInputElement.instance.autofocus_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
@@ -19625,7 +22471,7 @@
   @DomName('HTMLInputElement.capture')
   @DocsEditable()
   @Experimental() // untriaged
-  void set capture(bool value) => _blink.BlinkHTMLInputElement.instance.capture_Setter_(unwrap_jso(this), value);
+  set capture(bool value) => _blink.BlinkHTMLInputElement.instance.capture_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
@@ -19633,7 +22479,7 @@
   
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  void set checked(bool value) => _blink.BlinkHTMLInputElement.instance.checked_Setter_(unwrap_jso(this), value);
+  set checked(bool value) => _blink.BlinkHTMLInputElement.instance.checked_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
@@ -19641,7 +22487,7 @@
   
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  void set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.instance.defaultChecked_Setter_(unwrap_jso(this), value);
+  set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.instance.defaultChecked_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
@@ -19649,7 +22495,7 @@
   
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLInputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLInputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
@@ -19657,7 +22503,7 @@
   
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  void set dirName(String value) => _blink.BlinkHTMLInputElement.instance.dirName_Setter_(unwrap_jso(this), value);
+  set dirName(String value) => _blink.BlinkHTMLInputElement.instance.dirName_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
@@ -19665,15 +22511,15 @@
   
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLInputElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLInputElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files => wrap_jso_list(_blink.BlinkHTMLInputElement.instance.files_Getter_(unwrap_jso(this)));
+  List<File> get files => wrap_jso(_blink.BlinkHTMLInputElement.instance.files_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  void set files(List<File> value) => _blink.BlinkHTMLInputElement.instance.files_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set files(List<File> value) => _blink.BlinkHTMLInputElement.instance.files_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLInputElement.form')
   @DocsEditable()
@@ -19685,7 +22531,7 @@
   
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.BlinkHTMLInputElement.instance.formAction_Setter_(unwrap_jso(this), value);
+  set formAction(String value) => _blink.BlinkHTMLInputElement.instance.formAction_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
@@ -19693,7 +22539,7 @@
   
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.BlinkHTMLInputElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
+  set formEnctype(String value) => _blink.BlinkHTMLInputElement.instance.formEnctype_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
@@ -19701,7 +22547,7 @@
   
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.BlinkHTMLInputElement.instance.formMethod_Setter_(unwrap_jso(this), value);
+  set formMethod(String value) => _blink.BlinkHTMLInputElement.instance.formMethod_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
@@ -19709,7 +22555,7 @@
   
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
+  set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.instance.formNoValidate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
@@ -19717,7 +22563,7 @@
   
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.BlinkHTMLInputElement.instance.formTarget_Setter_(unwrap_jso(this), value);
+  set formTarget(String value) => _blink.BlinkHTMLInputElement.instance.formTarget_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.height')
   @DocsEditable()
@@ -19725,7 +22571,7 @@
   
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLInputElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLInputElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
@@ -19737,7 +22583,7 @@
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  void set incremental(bool value) => _blink.BlinkHTMLInputElement.instance.incremental_Setter_(unwrap_jso(this), value);
+  set incremental(bool value) => _blink.BlinkHTMLInputElement.instance.incremental_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
@@ -19745,7 +22591,7 @@
   
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  void set indeterminate(bool value) => _blink.BlinkHTMLInputElement.instance.indeterminate_Setter_(unwrap_jso(this), value);
+  set indeterminate(bool value) => _blink.BlinkHTMLInputElement.instance.indeterminate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
@@ -19755,11 +22601,11 @@
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.BlinkHTMLInputElement.instance.inputMode_Setter_(unwrap_jso(this), value);
+  set inputMode(String value) => _blink.BlinkHTMLInputElement.instance.inputMode_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLInputElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLInputElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLInputElement.list')
   @DocsEditable()
@@ -19771,7 +22617,7 @@
   
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  void set max(String value) => _blink.BlinkHTMLInputElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(String value) => _blink.BlinkHTMLInputElement.instance.max_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
@@ -19779,7 +22625,7 @@
   
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.BlinkHTMLInputElement.instance.maxLength_Setter_(unwrap_jso(this), value);
+  set maxLength(int value) => _blink.BlinkHTMLInputElement.instance.maxLength_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.min')
   @DocsEditable()
@@ -19787,7 +22633,7 @@
   
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  void set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(unwrap_jso(this), value);
+  set min(String value) => _blink.BlinkHTMLInputElement.instance.min_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
@@ -19795,7 +22641,7 @@
   
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.BlinkHTMLInputElement.instance.multiple_Setter_(unwrap_jso(this), value);
+  set multiple(bool value) => _blink.BlinkHTMLInputElement.instance.multiple_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.name')
   @DocsEditable()
@@ -19803,7 +22649,7 @@
   
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLInputElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLInputElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
@@ -19811,7 +22657,7 @@
   
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  void set pattern(String value) => _blink.BlinkHTMLInputElement.instance.pattern_Setter_(unwrap_jso(this), value);
+  set pattern(String value) => _blink.BlinkHTMLInputElement.instance.pattern_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
@@ -19819,7 +22665,7 @@
   
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.BlinkHTMLInputElement.instance.placeholder_Setter_(unwrap_jso(this), value);
+  set placeholder(String value) => _blink.BlinkHTMLInputElement.instance.placeholder_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
@@ -19827,7 +22673,7 @@
   
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.BlinkHTMLInputElement.instance.readOnly_Setter_(unwrap_jso(this), value);
+  set readOnly(bool value) => _blink.BlinkHTMLInputElement.instance.readOnly_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.required')
   @DocsEditable()
@@ -19835,7 +22681,7 @@
   
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLInputElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLInputElement.instance.required_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
@@ -19843,7 +22689,7 @@
   
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.BlinkHTMLInputElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
+  set selectionDirection(String value) => _blink.BlinkHTMLInputElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
@@ -19851,7 +22697,7 @@
   
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.BlinkHTMLInputElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
+  set selectionEnd(int value) => _blink.BlinkHTMLInputElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
@@ -19859,7 +22705,7 @@
   
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.BlinkHTMLInputElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
+  set selectionStart(int value) => _blink.BlinkHTMLInputElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.size')
   @DocsEditable()
@@ -19867,7 +22713,7 @@
   
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.BlinkHTMLInputElement.instance.size_Setter_(unwrap_jso(this), value);
+  set size(int value) => _blink.BlinkHTMLInputElement.instance.size_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.src')
   @DocsEditable()
@@ -19875,7 +22721,7 @@
   
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLInputElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLInputElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.step')
   @DocsEditable()
@@ -19883,7 +22729,7 @@
   
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  void set step(String value) => _blink.BlinkHTMLInputElement.instance.step_Setter_(unwrap_jso(this), value);
+  set step(String value) => _blink.BlinkHTMLInputElement.instance.step_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.type')
   @DocsEditable()
@@ -19891,7 +22737,7 @@
   
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLInputElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLInputElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
@@ -19907,7 +22753,7 @@
   
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLInputElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLInputElement.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
@@ -19915,7 +22761,7 @@
   
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  void set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.instance.valueAsDate_Setter_(unwrap_jso(this), value);
+  set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.instance.valueAsDate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
@@ -19923,7 +22769,7 @@
   
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  void set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Setter_(unwrap_jso(this), value);
+  set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.instance.valueAsNumber_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -19947,7 +22793,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  void set directory(bool value) => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Setter_(unwrap_jso(this), value);
+  set directory(bool value) => _blink.BlinkHTMLInputElement.instance.webkitdirectory_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.width')
   @DocsEditable()
@@ -19955,7 +22801,7 @@
   
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLInputElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLInputElement.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
@@ -20587,6 +23433,18 @@
   // To suppress missing implicit constructor warnings.
   factory InputMethodContext._() { throw new UnsupportedError("Not supported"); }
 
+
+  static InputMethodContext internalCreateInputMethodContext() {
+    return new InputMethodContext._internalWrap();
+  }
+
+  factory InputMethodContext._internalWrap() {
+    return new InputMethodContext.internal_();
+  }
+
+  InputMethodContext.internal_() : super.internal_();
+
+
   @DomName('InputMethodContext.compositionEndOffset')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20625,10 +23483,22 @@
   // To suppress missing implicit constructor warnings.
   factory InstallEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static InstallEvent internalCreateInstallEvent() {
+    return new InstallEvent._internalWrap();
+  }
+
+  factory InstallEvent._internalWrap() {
+    return new InstallEvent.internal_();
+  }
+
+  InstallEvent.internal_() : super.internal_();
+
+
   @DomName('InstallEvent.reloadAll')
   @DocsEditable()
   @Experimental() // untriaged
-  Future reloadAll() => _blink.BlinkInstallEvent.instance.reloadAll_Callback_0_(unwrap_jso(this));
+  Future reloadAll() => wrap_jso(_blink.BlinkInstallEvent.instance.reloadAll_Callback_0_(unwrap_jso(this)));
   
   @DomName('InstallEvent.replace')
   @DocsEditable()
@@ -20665,6 +23535,18 @@
   // To suppress missing implicit constructor warnings.
   factory KeyboardEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static KeyboardEvent internalCreateKeyboardEvent() {
+    return new KeyboardEvent._internalWrap();
+  }
+
+  factory KeyboardEvent._internalWrap() {
+    return new KeyboardEvent.internal_();
+  }
+
+  KeyboardEvent.internal_() : super.internal_();
+
+
   @DomName('KeyboardEvent.DOM_KEY_LOCATION_LEFT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -20751,6 +23633,18 @@
   @DomName('HTMLKeygenElement.HTMLKeygenElement')
   @DocsEditable()
   factory KeygenElement() => document.createElement("keygen");
+
+
+  static KeygenElement internalCreateKeygenElement() {
+    return new KeygenElement._internalWrap();
+  }
+
+  factory KeygenElement._internalWrap() {
+    return new KeygenElement.internal_();
+  }
+
+  KeygenElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20767,7 +23661,7 @@
   
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.instance.autofocus_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
@@ -20775,7 +23669,7 @@
   
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  void set challenge(String value) => _blink.BlinkHTMLKeygenElement.instance.challenge_Setter_(unwrap_jso(this), value);
+  set challenge(String value) => _blink.BlinkHTMLKeygenElement.instance.challenge_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
@@ -20783,7 +23677,7 @@
   
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLKeygenElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLKeygenElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
@@ -20795,12 +23689,12 @@
   
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  void set keytype(String value) => _blink.BlinkHTMLKeygenElement.instance.keytype_Setter_(unwrap_jso(this), value);
+  set keytype(String value) => _blink.BlinkHTMLKeygenElement.instance.keytype_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLKeygenElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLKeygenElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
@@ -20808,7 +23702,7 @@
   
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLKeygenElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLKeygenElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
@@ -20851,6 +23745,18 @@
   @DomName('HTMLLIElement.HTMLLIElement')
   @DocsEditable()
   factory LIElement() => document.createElement("li");
+
+
+  static LIElement internalCreateLIElement() {
+    return new LIElement._internalWrap();
+  }
+
+  factory LIElement._internalWrap() {
+    return new LIElement.internal_();
+  }
+
+  LIElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20864,7 +23770,7 @@
   
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  void set value(int value) => _blink.BlinkHTMLLIElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(int value) => _blink.BlinkHTMLLIElement.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20883,6 +23789,18 @@
   @DomName('HTMLLabelElement.HTMLLabelElement')
   @DocsEditable()
   factory LabelElement() => document.createElement("label");
+
+
+  static LabelElement internalCreateLabelElement() {
+    return new LabelElement._internalWrap();
+  }
+
+  factory LabelElement._internalWrap() {
+    return new LabelElement.internal_();
+  }
+
+  LabelElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20904,7 +23822,7 @@
   
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  void set htmlFor(String value) => _blink.BlinkHTMLLabelElement.instance.htmlFor_Setter_(unwrap_jso(this), value);
+  set htmlFor(String value) => _blink.BlinkHTMLLabelElement.instance.htmlFor_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20923,6 +23841,18 @@
   @DomName('HTMLLegendElement.HTMLLegendElement')
   @DocsEditable()
   factory LegendElement() => document.createElement("legend");
+
+
+  static LegendElement internalCreateLegendElement() {
+    return new LegendElement._internalWrap();
+  }
+
+  factory LegendElement._internalWrap() {
+    return new LegendElement.internal_();
+  }
+
+  LegendElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20949,6 +23879,18 @@
   @DomName('HTMLLinkElement.HTMLLinkElement')
   @DocsEditable()
   factory LinkElement() => document.createElement("link");
+
+
+  static LinkElement internalCreateLinkElement() {
+    return new LinkElement._internalWrap();
+  }
+
+  factory LinkElement._internalWrap() {
+    return new LinkElement.internal_();
+  }
+
+  LinkElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -20964,7 +23906,7 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
@@ -20972,7 +23914,7 @@
   
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLLinkElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLLinkElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
@@ -20980,7 +23922,7 @@
   
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkHTMLLinkElement.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkHTMLLinkElement.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
@@ -20988,7 +23930,7 @@
   
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.BlinkHTMLLinkElement.instance.hreflang_Setter_(unwrap_jso(this), value);
+  set hreflang(String value) => _blink.BlinkHTMLLinkElement.instance.hreflang_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
@@ -21004,7 +23946,7 @@
   @DomName('HTMLLinkElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLLinkElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLLinkElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
@@ -21012,7 +23954,7 @@
   
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLLinkElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLLinkElement.instance.media_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
@@ -21020,7 +23962,7 @@
   
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.BlinkHTMLLinkElement.instance.rel_Setter_(unwrap_jso(this), value);
+  set rel(String value) => _blink.BlinkHTMLLinkElement.instance.rel_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
@@ -21036,7 +23978,7 @@
   
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLLinkElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLLinkElement.instance.type_Setter_(unwrap_jso(this), value);
   
 
     /// Checks if HTML imports are supported on the current platform.
@@ -21061,9 +24003,21 @@
   @DomName('LocalCredential.LocalCredential')
   @DocsEditable()
   factory LocalCredential(String id, String name, String avatarURL, String password) {
-    return _blink.BlinkLocalCredential.instance.constructorCallback_4_(id, name, avatarURL, password);
+    return wrap_jso(_blink.BlinkLocalCredential.instance.constructorCallback_4_(id, name, avatarURL, password));
   }
 
+
+  static LocalCredential internalCreateLocalCredential() {
+    return new LocalCredential._internalWrap();
+  }
+
+  factory LocalCredential._internalWrap() {
+    return new LocalCredential.internal_();
+  }
+
+  LocalCredential.internal_() : super.internal_();
+
+
   @DomName('LocalCredential.password')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21081,6 +24035,21 @@
   // To suppress missing implicit constructor warnings.
   factory Location._() { throw new UnsupportedError("Not supported"); }
 
+  static Location internalCreateLocation() {
+    return new Location._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Location._internalWrap() {
+    return new Location.internal_();
+  }
+
+  Location.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
@@ -21092,7 +24061,7 @@
   
   @DomName('Location.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.BlinkLocation.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkLocation.instance.hash_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.host')
   @DocsEditable()
@@ -21100,7 +24069,7 @@
   
   @DomName('Location.host')
   @DocsEditable()
-  void set host(String value) => _blink.BlinkLocation.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkLocation.instance.host_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.hostname')
   @DocsEditable()
@@ -21108,7 +24077,7 @@
   
   @DomName('Location.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.BlinkLocation.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkLocation.instance.hostname_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.href')
   @DocsEditable()
@@ -21116,7 +24085,7 @@
   
   @DomName('Location.href')
   @DocsEditable()
-  void set href(String value) => _blink.BlinkLocation.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkLocation.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.origin')
   @DocsEditable()
@@ -21130,7 +24099,7 @@
   
   @DomName('Location.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.BlinkLocation.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkLocation.instance.pathname_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.port')
   @DocsEditable()
@@ -21138,7 +24107,7 @@
   
   @DomName('Location.port')
   @DocsEditable()
-  void set port(String value) => _blink.BlinkLocation.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkLocation.instance.port_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.protocol')
   @DocsEditable()
@@ -21146,7 +24115,7 @@
   
   @DomName('Location.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.BlinkLocation.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkLocation.instance.protocol_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.search')
   @DocsEditable()
@@ -21154,7 +24123,7 @@
   
   @DomName('Location.search')
   @DocsEditable()
-  void set search(String value) => _blink.BlinkLocation.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkLocation.instance.search_Setter_(unwrap_jso(this), value);
   
   @DomName('Location.assign')
   @DocsEditable()
@@ -21212,6 +24181,18 @@
   @DomName('HTMLMapElement.HTMLMapElement')
   @DocsEditable()
   factory MapElement() => document.createElement("map");
+
+
+  static MapElement internalCreateMapElement() {
+    return new MapElement._internalWrap();
+  }
+
+  factory MapElement._internalWrap() {
+    return new MapElement.internal_();
+  }
+
+  MapElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -21221,7 +24202,7 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas => wrap_jso_list(_blink.BlinkHTMLMapElement.instance.areas_Getter_(unwrap_jso(this)));
+  List<Node> get areas => wrap_jso(_blink.BlinkHTMLMapElement.instance.areas_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLMapElement.name')
   @DocsEditable()
@@ -21229,7 +24210,7 @@
   
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLMapElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLMapElement.instance.name_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21250,9 +24231,21 @@
   @DomName('MediaController.MediaController')
   @DocsEditable()
   factory MediaController() {
-    return _blink.BlinkMediaController.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkMediaController.instance.constructorCallback_0_());
   }
 
+
+  static MediaController internalCreateMediaController() {
+    return new MediaController._internalWrap();
+  }
+
+  factory MediaController._internalWrap() {
+    return new MediaController.internal_();
+  }
+
+  MediaController.internal_() : super.internal_();
+
+
   @DomName('MediaController.buffered')
   @DocsEditable()
   TimeRanges get buffered => wrap_jso(_blink.BlinkMediaController.instance.buffered_Getter_(unwrap_jso(this)));
@@ -21263,7 +24256,7 @@
   
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.BlinkMediaController.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkMediaController.instance.currentTime_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
@@ -21271,11 +24264,11 @@
   
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.BlinkMediaController.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
+  set defaultPlaybackRate(num value) => _blink.BlinkMediaController.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaController.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkMediaController.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkMediaController.instance.duration_Getter_(unwrap_jso(this));
   
   @DomName('MediaController.muted')
   @DocsEditable()
@@ -21283,7 +24276,7 @@
   
   @DomName('MediaController.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.BlinkMediaController.instance.muted_Setter_(unwrap_jso(this), value);
+  set muted(bool value) => _blink.BlinkMediaController.instance.muted_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaController.paused')
   @DocsEditable()
@@ -21295,7 +24288,7 @@
   
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.BlinkMediaController.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkMediaController.instance.playbackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaController.playbackState')
   @DocsEditable()
@@ -21315,7 +24308,7 @@
   
   @DomName('MediaController.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkMediaController.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkMediaController.instance.volume_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaController.pause')
   @DocsEditable()
@@ -21344,6 +24337,21 @@
   // To suppress missing implicit constructor warnings.
   factory MediaDeviceInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static MediaDeviceInfo internalCreateMediaDeviceInfo() {
+    return new MediaDeviceInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MediaDeviceInfo._internalWrap() {
+    return new MediaDeviceInfo.internal_();
+  }
+
+  MediaDeviceInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MediaDeviceInfo.deviceId')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21444,6 +24452,18 @@
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#dom-keyadded
   static const EventStreamProvider<MediaKeyEvent> needKeyEvent = const EventStreamProvider<MediaKeyEvent>('webkitneedkey');
+
+
+  static MediaElement internalCreateMediaElement() {
+    return new MediaElement._internalWrap();
+  }
+
+  factory MediaElement._internalWrap() {
+    return new MediaElement.internal_();
+  }
+
+  MediaElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -21498,7 +24518,7 @@
   
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  void set autoplay(bool value) => _blink.BlinkHTMLMediaElement.instance.autoplay_Setter_(unwrap_jso(this), value);
+  set autoplay(bool value) => _blink.BlinkHTMLMediaElement.instance.autoplay_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
@@ -21510,7 +24530,7 @@
   
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  void set controller(MediaController value) => _blink.BlinkHTMLMediaElement.instance.controller_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set controller(MediaController value) => _blink.BlinkHTMLMediaElement.instance.controller_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
@@ -21518,7 +24538,7 @@
   
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  void set controls(bool value) => _blink.BlinkHTMLMediaElement.instance.controls_Setter_(unwrap_jso(this), value);
+  set controls(bool value) => _blink.BlinkHTMLMediaElement.instance.controls_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
@@ -21528,7 +24548,7 @@
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
@@ -21540,7 +24560,7 @@
   
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.BlinkHTMLMediaElement.instance.currentTime_Setter_(unwrap_jso(this), value);
+  set currentTime(num value) => _blink.BlinkHTMLMediaElement.instance.currentTime_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
@@ -21548,7 +24568,7 @@
   
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  void set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Setter_(unwrap_jso(this), value);
+  set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.instance.defaultMuted_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
@@ -21556,11 +24576,11 @@
   
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
+  set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.instance.defaultPlaybackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkHTMLMediaElement.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkHTMLMediaElement.instance.duration_Getter_(unwrap_jso(this));
   
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
@@ -21578,7 +24598,7 @@
   @DomName('HTMLMediaElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLMediaElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLMediaElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
@@ -21586,7 +24606,7 @@
   
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.BlinkHTMLMediaElement.instance.loop_Setter_(unwrap_jso(this), value);
+  set loop(bool value) => _blink.BlinkHTMLMediaElement.instance.loop_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
@@ -21594,7 +24614,7 @@
   
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  void set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Setter_(unwrap_jso(this), value);
+  set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.instance.mediaGroup_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
@@ -21608,7 +24628,7 @@
   
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.BlinkHTMLMediaElement.instance.muted_Setter_(unwrap_jso(this), value);
+  set muted(bool value) => _blink.BlinkHTMLMediaElement.instance.muted_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
@@ -21624,7 +24644,7 @@
   
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.BlinkHTMLMediaElement.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkHTMLMediaElement.instance.playbackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
@@ -21636,7 +24656,7 @@
   
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  void set preload(String value) => _blink.BlinkHTMLMediaElement.instance.preload_Setter_(unwrap_jso(this), value);
+  set preload(String value) => _blink.BlinkHTMLMediaElement.instance.preload_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
@@ -21656,7 +24676,7 @@
   
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLMediaElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLMediaElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
@@ -21675,7 +24695,7 @@
   
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkHTMLMediaElement.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkHTMLMediaElement.instance.volume_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -21725,7 +24745,7 @@
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  Future setMediaKeys(MediaKeys mediaKeys) => _blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(unwrap_jso(this), unwrap_jso(mediaKeys));
+  Future setMediaKeys(MediaKeys mediaKeys) => wrap_jso(_blink.BlinkHTMLMediaElement.instance.setMediaKeys_Callback_1_(unwrap_jso(this), unwrap_jso(mediaKeys)));
   
   void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) {
     if (initData != null) {
@@ -21796,6 +24816,21 @@
   // To suppress missing implicit constructor warnings.
   factory MediaError._() { throw new UnsupportedError("Not supported"); }
 
+  static MediaError internalCreateMediaError() {
+    return new MediaError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MediaError._internalWrap() {
+    return new MediaError.internal_();
+  }
+
+  MediaError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MediaError.MEDIA_ERR_ABORTED')
   @DocsEditable()
   static const int MEDIA_ERR_ABORTED = 1;
@@ -21838,6 +24873,21 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyError._() { throw new UnsupportedError("Not supported"); }
 
+  static MediaKeyError internalCreateMediaKeyError() {
+    return new MediaKeyError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MediaKeyError._internalWrap() {
+    return new MediaKeyError.internal_();
+  }
+
+  MediaKeyError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MediaKeyError.MEDIA_KEYERR_CLIENT')
   @DocsEditable()
   static const int MEDIA_KEYERR_CLIENT = 2;
@@ -21887,6 +24937,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaKeyEvent internalCreateMediaKeyEvent() {
+    return new MediaKeyEvent._internalWrap();
+  }
+
+  factory MediaKeyEvent._internalWrap() {
+    return new MediaKeyEvent.internal_();
+  }
+
+  MediaKeyEvent.internal_() : super.internal_();
+
+
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
   String get defaultUrl => _blink.BlinkMediaKeyEvent.instance.defaultURL_Getter_(unwrap_jso(this));
@@ -21897,7 +24959,7 @@
   
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => wrap_jso(_blink.BlinkMediaKeyEvent.instance.initData_Getter_(unwrap_jso(this)));
+  Uint8List get initData => _blink.BlinkMediaKeyEvent.instance.initData_Getter_(unwrap_jso(this));
   
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
@@ -21905,7 +24967,7 @@
   
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => wrap_jso(_blink.BlinkMediaKeyEvent.instance.message_Getter_(unwrap_jso(this)));
+  Uint8List get message => _blink.BlinkMediaKeyEvent.instance.message_Getter_(unwrap_jso(this));
   
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
@@ -21931,13 +24993,25 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaKeyMessageEvent internalCreateMediaKeyMessageEvent() {
+    return new MediaKeyMessageEvent._internalWrap();
+  }
+
+  factory MediaKeyMessageEvent._internalWrap() {
+    return new MediaKeyMessageEvent.internal_();
+  }
+
+  MediaKeyMessageEvent.internal_() : super.internal_();
+
+
   @DomName('MediaKeyMessageEvent.destinationURL')
   @DocsEditable()
   String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.instance.destinationURL_Getter_(unwrap_jso(this));
   
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  ByteBuffer get message => wrap_jso(_blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(unwrap_jso(this)));
+  ByteBuffer get message => _blink.BlinkMediaKeyMessageEvent.instance.message_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21955,6 +25029,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeyNeededEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaKeyNeededEvent internalCreateMediaKeyNeededEvent() {
+    return new MediaKeyNeededEvent._internalWrap();
+  }
+
+  factory MediaKeyNeededEvent._internalWrap() {
+    return new MediaKeyNeededEvent.internal_();
+  }
+
+  MediaKeyNeededEvent.internal_() : super.internal_();
+
+
   @DomName('MediaKeyNeededEvent.contentType')
   @DocsEditable()
   @Experimental() // untriaged
@@ -21962,7 +25048,7 @@
   
   @DomName('MediaKeyNeededEvent.initData')
   @DocsEditable()
-  Uint8List get initData => wrap_jso(_blink.BlinkMediaKeyNeededEvent.instance.initData_Getter_(unwrap_jso(this)));
+  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.instance.initData_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21980,10 +25066,22 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeySession._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaKeySession internalCreateMediaKeySession() {
+    return new MediaKeySession._internalWrap();
+  }
+
+  factory MediaKeySession._internalWrap() {
+    return new MediaKeySession.internal_();
+  }
+
+  MediaKeySession.internal_() : super.internal_();
+
+
   @DomName('MediaKeySession.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => _blink.BlinkMediaKeySession.instance.closed_Getter_(unwrap_jso(this));
+  Future get closed => wrap_jso(_blink.BlinkMediaKeySession.instance.closed_Getter_(unwrap_jso(this)));
   
   @DomName('MediaKeySession.error')
   @DocsEditable()
@@ -21999,10 +25097,10 @@
   
   Future generateRequest(String initDataType, initData) {
     if ((initData is TypedData) && (initDataType is String)) {
-      return _blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData));
+      return wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData)));
     }
     if ((initData is ByteBuffer) && (initDataType is String)) {
-      return _blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData));
+      return wrap_jso(_blink.BlinkMediaKeySession.instance.generateRequest_Callback_2_(unwrap_jso(this), initDataType, unwrap_jso(initData)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -22010,14 +25108,14 @@
   @DomName('MediaKeySession.release')
   @DocsEditable()
   @Experimental() // untriaged
-  Future release() => _blink.BlinkMediaKeySession.instance.release_Callback_0_(unwrap_jso(this));
+  Future release() => wrap_jso(_blink.BlinkMediaKeySession.instance.release_Callback_0_(unwrap_jso(this)));
   
   Future _update(response) {
     if ((response is TypedData)) {
-      return _blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response));
+      return wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response)));
     }
     if ((response is ByteBuffer)) {
-      return _blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response));
+      return wrap_jso(_blink.BlinkMediaKeySession.instance.update_Callback_1_(unwrap_jso(this), unwrap_jso(response)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -22038,6 +25136,21 @@
   // To suppress missing implicit constructor warnings.
   factory MediaKeys._() { throw new UnsupportedError("Not supported"); }
 
+  static MediaKeys internalCreateMediaKeys() {
+    return new MediaKeys._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MediaKeys._internalWrap() {
+    return new MediaKeys.internal_();
+  }
+
+  MediaKeys.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
   String get keySystem => _blink.BlinkMediaKeys.instance.keySystem_Getter_(unwrap_jso(this));
@@ -22045,7 +25158,7 @@
   @DomName('MediaKeys.create')
   @DocsEditable()
   @Experimental() // untriaged
-  static Future create(String keySystem) => _blink.BlinkMediaKeys.instance.create_Callback_1_(keySystem);
+  static Future create(String keySystem) => wrap_jso(_blink.BlinkMediaKeys.instance.create_Callback_1_(keySystem));
   
   MediaKeySession _createSession([String sessionType]) {
     if (sessionType != null) {
@@ -22074,6 +25187,21 @@
   // To suppress missing implicit constructor warnings.
   factory MediaList._() { throw new UnsupportedError("Not supported"); }
 
+  static MediaList internalCreateMediaList() {
+    return new MediaList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MediaList._internalWrap() {
+    return new MediaList.internal_();
+  }
+
+  MediaList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MediaList.length')
   @DocsEditable()
   int get length => _blink.BlinkMediaList.instance.length_Getter_(unwrap_jso(this));
@@ -22084,7 +25212,7 @@
   
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  void set mediaText(String value) => _blink.BlinkMediaList.instance.mediaText_Setter_(unwrap_jso(this), value);
+  set mediaText(String value) => _blink.BlinkMediaList.instance.mediaText_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaList.appendMedium')
   @DocsEditable()
@@ -22118,6 +25246,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+
+  static MediaQueryList internalCreateMediaQueryList() {
+    return new MediaQueryList._internalWrap();
+  }
+
+  factory MediaQueryList._internalWrap() {
+    return new MediaQueryList.internal_();
+  }
+
+  MediaQueryList.internal_() : super.internal_();
+
+
   @DomName('MediaQueryList.matches')
   @DocsEditable()
   bool get matches => _blink.BlinkMediaQueryList.instance.matches_Getter_(unwrap_jso(this));
@@ -22128,7 +25268,7 @@
   
   @DomName('MediaQueryList.addListener')
   @DocsEditable()
-  void addListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.addListener_Callback_1_(unwrap_jso(this), unwrap_jso(listener));
+  void addListener(EventListener listener) => _blink.BlinkMediaQueryList.instance.addListener_Callback_1_(unwrap_jso(this), unwrap_jso((event) => listener(wrap_jso(event))));
   
   @DomName('MediaQueryList.removeListener')
   @DocsEditable()
@@ -22154,6 +25294,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaQueryListEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaQueryListEvent internalCreateMediaQueryListEvent() {
+    return new MediaQueryListEvent._internalWrap();
+  }
+
+  factory MediaQueryListEvent._internalWrap() {
+    return new MediaQueryListEvent.internal_();
+  }
+
+  MediaQueryListEvent.internal_() : super.internal_();
+
+
   @DomName('MediaQueryListEvent.matches')
   @DocsEditable()
   @Experimental() // untriaged
@@ -22185,9 +25337,21 @@
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
   factory MediaSource() {
-    return _blink.BlinkMediaSource.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkMediaSource.instance.constructorCallback_0_());
   }
 
+
+  static MediaSource internalCreateMediaSource() {
+    return new MediaSource._internalWrap();
+  }
+
+  factory MediaSource._internalWrap() {
+    return new MediaSource.internal_();
+  }
+
+  MediaSource.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -22201,7 +25365,7 @@
   
   @DomName('MediaSource.duration')
   @DocsEditable()
-  void set duration(num value) => _blink.BlinkMediaSource.instance.duration_Setter_(unwrap_jso(this), value);
+  set duration(num value) => _blink.BlinkMediaSource.instance.duration_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaSource.readyState')
   @DocsEditable()
@@ -22280,17 +25444,29 @@
   @DocsEditable()
   factory MediaStream([stream_OR_tracks]) {
     if (stream_OR_tracks == null) {
-      return _blink.BlinkMediaStream.instance.constructorCallback_0_();
+      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_0_());
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
+      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks));
     }
     if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return _blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks);
+      return wrap_jso(_blink.BlinkMediaStream.instance.constructorCallback_1_(stream_OR_tracks));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static MediaStream internalCreateMediaStream() {
+    return new MediaStream._internalWrap();
+  }
+
+  factory MediaStream._internalWrap() {
+    return new MediaStream.internal_();
+  }
+
+  MediaStream.internal_() : super.internal_();
+
+
   @DomName('MediaStream.ended')
   @DocsEditable()
   bool get ended => _blink.BlinkMediaStream.instance.ended_Getter_(unwrap_jso(this));
@@ -22315,7 +25491,7 @@
   
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.instance.getAudioTracks_Callback_0_(unwrap_jso(this));
+  List<MediaStreamTrack> getAudioTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getAudioTracks_Callback_0_(unwrap_jso(this)));
   
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
@@ -22324,11 +25500,11 @@
   @DomName('MediaStream.getTracks')
   @DocsEditable()
   @Experimental() // untriaged
-  List<MediaStreamTrack> getTracks() => _blink.BlinkMediaStream.instance.getTracks_Callback_0_(unwrap_jso(this));
+  List<MediaStreamTrack> getTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getTracks_Callback_0_(unwrap_jso(this)));
   
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() => _blink.BlinkMediaStream.instance.getVideoTracks_Callback_0_(unwrap_jso(this));
+  List<MediaStreamTrack> getVideoTracks() => wrap_jso(_blink.BlinkMediaStream.instance.getVideoTracks_Callback_0_(unwrap_jso(this)));
   
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
@@ -22379,6 +25555,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaStreamEvent internalCreateMediaStreamEvent() {
+    return new MediaStreamEvent._internalWrap();
+  }
+
+  factory MediaStreamEvent._internalWrap() {
+    return new MediaStreamEvent.internal_();
+  }
+
+  MediaStreamEvent.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -22433,13 +25621,25 @@
   @DocsEditable()
   static const EventStreamProvider<Event> unmuteEvent = const EventStreamProvider<Event>('unmute');
 
+
+  static MediaStreamTrack internalCreateMediaStreamTrack() {
+    return new MediaStreamTrack._internalWrap();
+  }
+
+  factory MediaStreamTrack._internalWrap() {
+    return new MediaStreamTrack.internal_();
+  }
+
+  MediaStreamTrack.internal_() : super.internal_();
+
+
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
   bool get enabled => _blink.BlinkMediaStreamTrack.instance.enabled_Getter_(unwrap_jso(this));
   
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  void set enabled(bool value) => _blink.BlinkMediaStreamTrack.instance.enabled_Setter_(unwrap_jso(this), value);
+  set enabled(bool value) => _blink.BlinkMediaStreamTrack.instance.enabled_Setter_(unwrap_jso(this), value);
   
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
@@ -22470,7 +25670,7 @@
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.instance.getSources_Callback_1_(unwrap_jso(callback));
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.instance.getSources_Callback_1_(unwrap_jso((sources) => callback(sources)));
   
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -22516,6 +25716,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamTrackEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaStreamTrackEvent internalCreateMediaStreamTrackEvent() {
+    return new MediaStreamTrackEvent._internalWrap();
+  }
+
+  factory MediaStreamTrackEvent._internalWrap() {
+    return new MediaStreamTrackEvent.internal_();
+  }
+
+  MediaStreamTrackEvent.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -22548,6 +25760,21 @@
   // To suppress missing implicit constructor warnings.
   factory MemoryInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static MemoryInfo internalCreateMemoryInfo() {
+    return new MemoryInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MemoryInfo._internalWrap() {
+    return new MemoryInfo.internal_();
+  }
+
+  MemoryInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
   int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.instance.jsHeapSizeLimit_Getter_(unwrap_jso(this));
@@ -22587,6 +25814,18 @@
   @DomName('HTMLMenuElement.HTMLMenuElement')
   @DocsEditable()
   factory MenuElement() => document.createElement("menu");
+
+
+  static MenuElement internalCreateMenuElement() {
+    return new MenuElement._internalWrap();
+  }
+
+  factory MenuElement._internalWrap() {
+    return new MenuElement.internal_();
+  }
+
+  MenuElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22602,7 +25841,7 @@
   @DomName('HTMLMenuElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  void set label(String value) => _blink.BlinkHTMLMenuElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLMenuElement.instance.label_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
@@ -22612,7 +25851,7 @@
   @DomName('HTMLMenuElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  void set type(String value) => _blink.BlinkHTMLMenuElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLMenuElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22628,6 +25867,18 @@
 class MenuItemElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory MenuItemElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static MenuItemElement internalCreateMenuItemElement() {
+    return new MenuItemElement._internalWrap();
+  }
+
+  factory MenuItemElement._internalWrap() {
+    return new MenuItemElement.internal_();
+  }
+
+  MenuItemElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22643,7 +25894,7 @@
   @DomName('HTMLMenuItemElement.checked')
   @DocsEditable()
   @Experimental() // untriaged
-  void set checked(bool value) => _blink.BlinkHTMLMenuItemElement.instance.checked_Setter_(unwrap_jso(this), value);
+  set checked(bool value) => _blink.BlinkHTMLMenuItemElement.instance.checked_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
@@ -22653,7 +25904,7 @@
   @DomName('HTMLMenuItemElement.default')
   @DocsEditable()
   @Experimental() // untriaged
-  void set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.instance.default_Setter_(unwrap_jso(this), value);
+  set defaultValue(bool value) => _blink.BlinkHTMLMenuItemElement.instance.default_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
@@ -22663,7 +25914,7 @@
   @DomName('HTMLMenuItemElement.disabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLMenuItemElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
@@ -22673,7 +25924,7 @@
   @DomName('HTMLMenuItemElement.label')
   @DocsEditable()
   @Experimental() // untriaged
-  void set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLMenuItemElement.instance.label_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
@@ -22683,7 +25934,7 @@
   @DomName('HTMLMenuItemElement.type')
   @DocsEditable()
   @Experimental() // untriaged
-  void set type(String value) => _blink.BlinkHTMLMenuItemElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLMenuItemElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22700,6 +25951,21 @@
   // To suppress missing implicit constructor warnings.
   factory MessageChannel._() { throw new UnsupportedError("Not supported"); }
 
+  static MessageChannel internalCreateMessageChannel() {
+    return new MessageChannel._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MessageChannel._internalWrap() {
+    return new MessageChannel.internal_();
+  }
+
+  MessageChannel.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MessageChannel.port1')
   @DocsEditable()
   MessagePort get port1 => wrap_jso(_blink.BlinkMessageChannel.instance.port1_Getter_(unwrap_jso(this)));
@@ -22733,9 +25999,21 @@
   // To suppress missing implicit constructor warnings.
   factory MessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MessageEvent internalCreateMessageEvent() {
+    return new MessageEvent._internalWrap();
+  }
+
+  factory MessageEvent._internalWrap() {
+    return new MessageEvent.internal_();
+  }
+
+  MessageEvent.internal_() : super.internal_();
+
+
   @DomName('MessageEvent.data')
   @DocsEditable()
-  Object get data => _blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this));
+  Object get data => wrap_jso(_blink.BlinkMessageEvent.instance.data_Getter_(unwrap_jso(this)));
   
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
@@ -22779,13 +26057,25 @@
   @DocsEditable()
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+
+  static MessagePort internalCreateMessagePort() {
+    return new MessagePort._internalWrap();
+  }
+
+  factory MessagePort._internalWrap() {
+    return new MessagePort.internal_();
+  }
+
+  MessagePort.internal_() : super.internal_();
+
+
   @DomName('MessagePort.close')
   @DocsEditable()
   void close() => _blink.BlinkMessagePort.instance.close_Callback_0_(unwrap_jso(this));
   
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkMessagePort.instance.postMessage_Callback_2_(unwrap_jso(this), message, transfer);
+  void postMessage(Object message, [List<MessagePort> transfer]) => _blink.BlinkMessagePort.instance.postMessage_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), transfer);
   
   @DomName('MessagePort.start')
   @DocsEditable()
@@ -22813,6 +26103,18 @@
   @DomName('HTMLMetaElement.HTMLMetaElement')
   @DocsEditable()
   factory MetaElement() => document.createElement("meta");
+
+
+  static MetaElement internalCreateMetaElement() {
+    return new MetaElement._internalWrap();
+  }
+
+  factory MetaElement._internalWrap() {
+    return new MetaElement.internal_();
+  }
+
+  MetaElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22826,7 +26128,7 @@
   
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  void set content(String value) => _blink.BlinkHTMLMetaElement.instance.content_Setter_(unwrap_jso(this), value);
+  set content(String value) => _blink.BlinkHTMLMetaElement.instance.content_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
@@ -22834,7 +26136,7 @@
   
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  void set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Setter_(unwrap_jso(this), value);
+  set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.instance.httpEquiv_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
@@ -22842,7 +26144,7 @@
   
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLMetaElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLMetaElement.instance.name_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22860,6 +26162,21 @@
   // To suppress missing implicit constructor warnings.
   factory Metadata._() { throw new UnsupportedError("Not supported"); }
 
+  static Metadata internalCreateMetadata() {
+    return new Metadata._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Metadata._internalWrap() {
+    return new Metadata.internal_();
+  }
+
+  Metadata.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Metadata.modificationTime')
   @DocsEditable()
   DateTime get modificationTime => _blink.BlinkMetadata.instance.modificationTime_Getter_(unwrap_jso(this));
@@ -22900,6 +26217,18 @@
   @DomName('HTMLMeterElement.HTMLMeterElement')
   @DocsEditable()
   factory MeterElement() => document.createElement("meter");
+
+
+  static MeterElement internalCreateMeterElement() {
+    return new MeterElement._internalWrap();
+  }
+
+  factory MeterElement._internalWrap() {
+    return new MeterElement.internal_();
+  }
+
+  MeterElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22916,12 +26245,12 @@
   
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  void set high(num value) => _blink.BlinkHTMLMeterElement.instance.high_Setter_(unwrap_jso(this), value);
+  set high(num value) => _blink.BlinkHTMLMeterElement.instance.high_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLMeterElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLMeterElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
@@ -22929,7 +26258,7 @@
   
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  void set low(num value) => _blink.BlinkHTMLMeterElement.instance.low_Setter_(unwrap_jso(this), value);
+  set low(num value) => _blink.BlinkHTMLMeterElement.instance.low_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
@@ -22937,7 +26266,7 @@
   
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.BlinkHTMLMeterElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(num value) => _blink.BlinkHTMLMeterElement.instance.max_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
@@ -22945,7 +26274,7 @@
   
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  void set min(num value) => _blink.BlinkHTMLMeterElement.instance.min_Setter_(unwrap_jso(this), value);
+  set min(num value) => _blink.BlinkHTMLMeterElement.instance.min_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
@@ -22953,7 +26282,7 @@
   
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  void set optimum(num value) => _blink.BlinkHTMLMeterElement.instance.optimum_Setter_(unwrap_jso(this), value);
+  set optimum(num value) => _blink.BlinkHTMLMeterElement.instance.optimum_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
@@ -22961,7 +26290,7 @@
   
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkHTMLMeterElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkHTMLMeterElement.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22999,6 +26328,18 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
+
+  static MidiAccess internalCreateMidiAccess() {
+    return new MidiAccess._internalWrap();
+  }
+
+  factory MidiAccess._internalWrap() {
+    return new MidiAccess.internal_();
+  }
+
+  MidiAccess.internal_() : super.internal_();
+
+
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
   MidiInputMap get inputs => wrap_jso(_blink.BlinkMIDIAccess.instance.inputs_Getter_(unwrap_jso(this)));
@@ -23038,6 +26379,18 @@
   // To suppress missing implicit constructor warnings.
   factory MidiConnectionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MidiConnectionEvent internalCreateMidiConnectionEvent() {
+    return new MidiConnectionEvent._internalWrap();
+  }
+
+  factory MidiConnectionEvent._internalWrap() {
+    return new MidiConnectionEvent.internal_();
+  }
+
+  MidiConnectionEvent.internal_() : super.internal_();
+
+
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
   MidiPort get port => wrap_jso(_blink.BlinkMIDIConnectionEvent.instance.port_Getter_(unwrap_jso(this)));
@@ -23068,6 +26421,18 @@
   @DocsEditable()
   static const EventStreamProvider<MidiMessageEvent> midiMessageEvent = const EventStreamProvider<MidiMessageEvent>('midimessage');
 
+
+  static MidiInput internalCreateMidiInput() {
+    return new MidiInput._internalWrap();
+  }
+
+  factory MidiInput._internalWrap() {
+    return new MidiInput.internal_();
+  }
+
+  MidiInput.internal_() : super.internal_();
+
+
   /// Stream of `midimessage` events handled by this [MidiInput].
   @DomName('MIDIInput.onmidimessage')
   @DocsEditable()
@@ -23088,6 +26453,21 @@
   // To suppress missing implicit constructor warnings.
   factory MidiInputMap._() { throw new UnsupportedError("Not supported"); }
 
+  static MidiInputMap internalCreateMidiInputMap() {
+    return new MidiInputMap._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MidiInputMap._internalWrap() {
+    return new MidiInputMap.internal_();
+  }
+
+  MidiInputMap.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MIDIInputMap.size')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23096,7 +26476,7 @@
   @DomName('MIDIInputMap.entries')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator entries() => _blink.BlinkMIDIInputMap.instance.entries_Callback_0_(unwrap_jso(this));
+  DomIterator entries() => wrap_jso(_blink.BlinkMIDIInputMap.instance.entries_Callback_0_(unwrap_jso(this)));
   
   @DomName('MIDIInputMap.get')
   @DocsEditable()
@@ -23111,12 +26491,12 @@
   @DomName('MIDIInputMap.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator keys() => _blink.BlinkMIDIInputMap.instance.keys_Callback_0_(unwrap_jso(this));
+  DomIterator keys() => wrap_jso(_blink.BlinkMIDIInputMap.instance.keys_Callback_0_(unwrap_jso(this)));
   
   @DomName('MIDIInputMap.values')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator values() => _blink.BlinkMIDIInputMap.instance.values_Callback_0_(unwrap_jso(this));
+  DomIterator values() => wrap_jso(_blink.BlinkMIDIInputMap.instance.values_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23134,13 +26514,25 @@
   // To suppress missing implicit constructor warnings.
   factory MidiMessageEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MidiMessageEvent internalCreateMidiMessageEvent() {
+    return new MidiMessageEvent._internalWrap();
+  }
+
+  factory MidiMessageEvent._internalWrap() {
+    return new MidiMessageEvent.internal_();
+  }
+
+  MidiMessageEvent.internal_() : super.internal_();
+
+
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => wrap_jso(_blink.BlinkMIDIMessageEvent.instance.data_Getter_(unwrap_jso(this)));
+  Uint8List get data => _blink.BlinkMIDIMessageEvent.instance.data_Getter_(unwrap_jso(this));
   
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  double get receivedTime => _blink.BlinkMIDIMessageEvent.instance.receivedTime_Getter_(unwrap_jso(this));
+  num get receivedTime => _blink.BlinkMIDIMessageEvent.instance.receivedTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23158,6 +26550,18 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MidiOutput internalCreateMidiOutput() {
+    return new MidiOutput._internalWrap();
+  }
+
+  factory MidiOutput._internalWrap() {
+    return new MidiOutput.internal_();
+  }
+
+  MidiOutput.internal_() : super.internal_();
+
+
   void send(Uint8List data, [num timestamp]) {
     if (timestamp != null) {
       _blink.BlinkMIDIOutput.instance.send_Callback_2_(unwrap_jso(this), data, timestamp);
@@ -23182,6 +26586,21 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutputMap._() { throw new UnsupportedError("Not supported"); }
 
+  static MidiOutputMap internalCreateMidiOutputMap() {
+    return new MidiOutputMap._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MidiOutputMap._internalWrap() {
+    return new MidiOutputMap.internal_();
+  }
+
+  MidiOutputMap.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MIDIOutputMap.size')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23190,7 +26609,7 @@
   @DomName('MIDIOutputMap.entries')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator entries() => _blink.BlinkMIDIOutputMap.instance.entries_Callback_0_(unwrap_jso(this));
+  DomIterator entries() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.entries_Callback_0_(unwrap_jso(this)));
   
   @DomName('MIDIOutputMap.get')
   @DocsEditable()
@@ -23205,12 +26624,12 @@
   @DomName('MIDIOutputMap.keys')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator keys() => _blink.BlinkMIDIOutputMap.instance.keys_Callback_0_(unwrap_jso(this));
+  DomIterator keys() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.keys_Callback_0_(unwrap_jso(this)));
   
   @DomName('MIDIOutputMap.values')
   @DocsEditable()
   @Experimental() // untriaged
-  DomIterator values() => _blink.BlinkMIDIOutputMap.instance.values_Callback_0_(unwrap_jso(this));
+  DomIterator values() => wrap_jso(_blink.BlinkMIDIOutputMap.instance.values_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23238,6 +26657,18 @@
   @DocsEditable()
   static const EventStreamProvider<MidiConnectionEvent> disconnectEvent = const EventStreamProvider<MidiConnectionEvent>('disconnect');
 
+
+  static MidiPort internalCreateMidiPort() {
+    return new MidiPort._internalWrap();
+  }
+
+  factory MidiPort._internalWrap() {
+    return new MidiPort.internal_();
+  }
+
+  MidiPort.internal_() : super.internal_();
+
+
   @DomName('MIDIPort.id')
   @DocsEditable()
   String get id => _blink.BlinkMIDIPort.instance.id_Getter_(unwrap_jso(this));
@@ -23278,6 +26709,21 @@
   // To suppress missing implicit constructor warnings.
   factory MimeType._() { throw new UnsupportedError("Not supported"); }
 
+  static MimeType internalCreateMimeType() {
+    return new MimeType._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MimeType._internalWrap() {
+    return new MimeType.internal_();
+  }
+
+  MimeType.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MimeType.description')
   @DocsEditable()
   String get description => _blink.BlinkMimeType.instance.description_Getter_(unwrap_jso(this));
@@ -23305,10 +26751,25 @@
 @DocsEditable()
 @DomName('MimeTypeArray')
 @Experimental() // non-standard
-class MimeTypeArray extends NativeFieldWrapperClass2 with ListMixin<MimeType>, ImmutableListMixin<MimeType> implements List<MimeType> {
+class MimeTypeArray extends JsoNativeFieldWrapper with ListMixin<MimeType>, ImmutableListMixin<MimeType> implements List<MimeType> {
   // To suppress missing implicit constructor warnings.
   factory MimeTypeArray._() { throw new UnsupportedError("Not supported"); }
 
+  static MimeTypeArray internalCreateMimeTypeArray() {
+    return new MimeTypeArray._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MimeTypeArray._internalWrap() {
+    return new MimeTypeArray.internal_();
+  }
+
+  MimeTypeArray.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MimeTypeArray.length')
   @DocsEditable()
   int get length => _blink.BlinkMimeTypeArray.instance.length_Getter_(unwrap_jso(this));
@@ -23320,7 +26781,7 @@
   }
 
   MimeType _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkMimeTypeArray.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -23328,7 +26789,7 @@
   // MimeType is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -23385,6 +26846,18 @@
 class ModElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory ModElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static ModElement internalCreateModElement() {
+    return new ModElement._internalWrap();
+  }
+
+  factory ModElement._internalWrap() {
+    return new ModElement.internal_();
+  }
+
+  ModElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -23398,7 +26871,7 @@
   
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.BlinkHTMLModElement.instance.cite_Setter_(unwrap_jso(this), value);
+  set cite(String value) => _blink.BlinkHTMLModElement.instance.cite_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
@@ -23406,7 +26879,7 @@
   
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  void set dateTime(String value) => _blink.BlinkHTMLModElement.instance.dateTime_Setter_(unwrap_jso(this), value);
+  set dateTime(String value) => _blink.BlinkHTMLModElement.instance.dateTime_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23436,6 +26909,18 @@
   // To suppress missing implicit constructor warnings.
   factory MouseEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MouseEvent internalCreateMouseEvent() {
+    return new MouseEvent._internalWrap();
+  }
+
+  factory MouseEvent._internalWrap() {
+    return new MouseEvent.internal_();
+  }
+
+  MouseEvent.internal_() : super.internal_();
+
+
   @DomName('MouseEvent.altKey')
   @DocsEditable()
   bool get altKey => _blink.BlinkMouseEvent.instance.altKey_Getter_(unwrap_jso(this));
@@ -23615,17 +27100,32 @@
   @DocsEditable()
   factory MutationObserver._(MutationCallback callback) => wrap_jso(_create(callback));
 
+  static MutationObserver internalCreateMutationObserver() {
+    return new MutationObserver._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MutationObserver._internalWrap() {
+    return new MutationObserver.internal_();
+  }
+
+  MutationObserver.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
   void disconnect() => _blink.BlinkMutationObserver.instance.disconnect_Callback_0_(unwrap_jso(this));
   
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.instance.observe_Callback_2_(unwrap_jso(this), unwrap_jso(target), options);
+  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.instance.observe_Callback_2_(unwrap_jso(this), unwrap_jso(target), convertDartToNative_Dictionary(options));
   
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() => _blink.BlinkMutationObserver.instance.takeRecords_Callback_0_(unwrap_jso(this));
+  List<MutationRecord> takeRecords() => wrap_jso(_blink.BlinkMutationObserver.instance.takeRecords_Callback_0_(unwrap_jso(this)));
   
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -23635,7 +27135,9 @@
     return true;
   }
   @DocsEditable()
-  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.instance.constructorCallback_1_(callback);
+  static MutationObserver _create(callback) => wrap_jso(_blink.BlinkMutationObserver.instance.constructorCallback_1_((mutations, observer) {
+    callback(mutations, wrap_jso(observer));
+  }));
 
   /**
    * Observes the target for the specified changes.
@@ -23710,9 +27212,24 @@
   // To suppress missing implicit constructor warnings.
   factory MutationRecord._() { throw new UnsupportedError("Not supported"); }
 
+  static MutationRecord internalCreateMutationRecord() {
+    return new MutationRecord._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory MutationRecord._internalWrap() {
+    return new MutationRecord.internal_();
+  }
+
+  MutationRecord.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes => wrap_jso_list(_blink.BlinkMutationRecord.instance.addedNodes_Getter_(unwrap_jso(this)));
+  List<Node> get addedNodes => wrap_jso(_blink.BlinkMutationRecord.instance.addedNodes_Getter_(unwrap_jso(this)));
   
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
@@ -23736,7 +27253,7 @@
   
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes => wrap_jso_list(_blink.BlinkMutationRecord.instance.removedNodes_Getter_(unwrap_jso(this)));
+  List<Node> get removedNodes => wrap_jso(_blink.BlinkMutationRecord.instance.removedNodes_Getter_(unwrap_jso(this)));
   
   @DomName('MutationRecord.target')
   @DocsEditable()
@@ -23814,6 +27331,21 @@
   // To suppress missing implicit constructor warnings.
   factory Navigator._() { throw new UnsupportedError("Not supported"); }
 
+  static Navigator internalCreateNavigator() {
+    return new Navigator._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Navigator._internalWrap() {
+    return new Navigator.internal_();
+  }
+
+  Navigator.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Navigator.connection')
   @DocsEditable()
   @Experimental() // untriaged
@@ -23909,12 +27441,12 @@
   @DomName('Navigator.getBattery')
   @DocsEditable()
   @Experimental() // untriaged
-  Future getBattery() => _blink.BlinkNavigator.instance.getBattery_Callback_0_(unwrap_jso(this));
+  Future getBattery() => wrap_jso(_blink.BlinkNavigator.instance.getBattery_Callback_0_(unwrap_jso(this)));
   
   @DomName('Navigator.getGamepads')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Gamepad> getGamepads() => _blink.BlinkNavigator.instance.getGamepads_Callback_0_(unwrap_jso(this));
+  List<Gamepad> getGamepads() => wrap_jso(_blink.BlinkNavigator.instance.getGamepads_Callback_0_(unwrap_jso(this)));
   
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
@@ -23922,11 +27454,6 @@
   @Experimental()
   void getStorageUpdates() => _blink.BlinkNavigator.instance.getStorageUpdates_Callback_0_(unwrap_jso(this));
   
-  @DomName('Navigator.isProtocolHandlerRegistered')
-  @DocsEditable()
-  @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) => _blink.BlinkNavigator.instance.isProtocolHandlerRegistered_Callback_2_(unwrap_jso(this), scheme, url);
-  
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
@@ -23948,16 +27475,11 @@
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-  @DomName('Navigator.unregisterProtocolHandler')
-  @DocsEditable()
-  @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.instance.unregisterProtocolHandler_Callback_2_(unwrap_jso(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.instance.webkitGetUserMedia_Callback_3_(unwrap_jso(this), options, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, _NavigatorUserMediaErrorCallback errorCallback) => _blink.BlinkNavigator.instance.webkitGetUserMedia_Callback_3_(unwrap_jso(this), convertDartToNative_Dictionary(options), unwrap_jso((stream) => successCallback(wrap_jso(stream))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
   
   @DomName('Navigator.hardwareConcurrency')
   @DocsEditable()
@@ -24140,6 +27662,21 @@
   // To suppress missing implicit constructor warnings.
   factory NavigatorUserMediaError._() { throw new UnsupportedError("Not supported"); }
 
+  static NavigatorUserMediaError internalCreateNavigatorUserMediaError() {
+    return new NavigatorUserMediaError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory NavigatorUserMediaError._internalWrap() {
+    return new NavigatorUserMediaError.internal_();
+  }
+
+  NavigatorUserMediaError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
   String get constraintName => _blink.BlinkNavigatorUserMediaError.instance.constraintName_Getter_(unwrap_jso(this));
@@ -24189,6 +27726,18 @@
   // To suppress missing implicit constructor warnings.
   factory NetworkInformation._() { throw new UnsupportedError("Not supported"); }
 
+
+  static NetworkInformation internalCreateNetworkInformation() {
+    return new NetworkInformation._internalWrap();
+  }
+
+  factory NetworkInformation._internalWrap() {
+    return new NetworkInformation.internal_();
+  }
+
+  NetworkInformation.internal_() : super.internal_();
+
+
   @DomName('NetworkInformation.type')
   @DocsEditable()
   @Experimental() // untriaged
@@ -24291,7 +27840,8 @@
   bool remove(Object object) {
     if (object is! Node) return false;
     Node node = object;
-    if (!identical(_this, node.parentNode)) return false;
+    // We aren't preserving identity of nodes in JSINTEROP mode
+    if (_this != node.parentNode) return false;
     _this._removeChild(node);
     return true;
   }
@@ -24355,7 +27905,7 @@
   // a local copy of childNodes is more efficient.
   int get length => _this.childNodes.length;
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
@@ -24379,7 +27929,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Iterable<Node> value) {
+  set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -24466,10 +28016,22 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => _blink.BlinkNode.instance.childNodes_Getter_(this);
+  List<Node> get childNodes => wrap_jso(_blink.BlinkNode.instance.childNodes_Getter_(unwrap_jso(this)));
   // To suppress missing implicit constructor warnings.
   factory Node._() { throw new UnsupportedError("Not supported"); }
 
+
+  static Node internalCreateNode() {
+    return new Node._internalWrap();
+  }
+
+  factory Node._internalWrap() {
+    return new Node.internal_();
+  }
+
+  Node.internal_() : super.internal_();
+
+
   @DomName('Node.ATTRIBUTE_NODE')
   @DocsEditable()
   static const int ATTRIBUTE_NODE = 2;
@@ -24709,7 +28271,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  void set text(String value) => _blink.BlinkNode.instance.textContent_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkNode.instance.textContent_Setter_(unwrap_jso(this), value);
   
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -24801,6 +28363,21 @@
   // To suppress missing implicit constructor warnings.
   factory NodeFilter._() { throw new UnsupportedError("Not supported"); }
 
+  static NodeFilter internalCreateNodeFilter() {
+    return new NodeFilter._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory NodeFilter._internalWrap() {
+    return new NodeFilter.internal_();
+  }
+
+  NodeFilter.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('NodeFilter.FILTER_ACCEPT')
   @DocsEditable()
   static const int FILTER_ACCEPT = 1;
@@ -24860,6 +28437,21 @@
   // To suppress missing implicit constructor warnings.
   factory NodeIterator._() { throw new UnsupportedError("Not supported"); }
 
+  static NodeIterator internalCreateNodeIterator() {
+    return new NodeIterator._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory NodeIterator._internalWrap() {
+    return new NodeIterator.internal_();
+  }
+
+  NodeIterator.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
   bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.instance.pointerBeforeReferenceNode_Getter_(unwrap_jso(this));
@@ -24898,10 +28490,25 @@
 
 @DocsEditable()
 @DomName('NodeList')
-class NodeList extends NativeFieldWrapperClass2 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
+class NodeList extends JsoNativeFieldWrapper with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   // To suppress missing implicit constructor warnings.
   factory NodeList._() { throw new UnsupportedError("Not supported"); }
 
+  static NodeList internalCreateNodeList() {
+    return new NodeList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory NodeList._internalWrap() {
+    return new NodeList.internal_();
+  }
+
+  NodeList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('NodeList.length')
   @DocsEditable()
   int get length => _blink.BlinkNodeList.instance.length_Getter_(unwrap_jso(this));
@@ -24913,7 +28520,7 @@
   }
 
   Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkNodeList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -24921,7 +28528,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -25025,11 +28632,24 @@
   @DocsEditable()
   static Notification _factoryNotification(String title, [Map options]) {
     if (options != null) {
-      return _blink.BlinkNotification.instance.constructorCallback_2_(title, options);
+      var options_1 = convertDartToNative_Dictionary(options);
+      return wrap_jso(_blink.BlinkNotification.instance.constructorCallback_2_(title, options_1));
     }
-    return _blink.BlinkNotification.instance.constructorCallback_1_(title);
+    return wrap_jso(_blink.BlinkNotification.instance.constructorCallback_1_(title));
   }
 
+
+  static Notification internalCreateNotification() {
+    return new Notification._internalWrap();
+  }
+
+  factory Notification._internalWrap() {
+    return new Notification.internal_();
+  }
+
+  Notification.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -25073,7 +28693,7 @@
   
   static void _requestPermission([_NotificationPermissionCallback callback]) {
     if (callback != null) {
-      _blink.BlinkNotification.instance.requestPermission_Callback_1_(unwrap_jso(callback));
+      _blink.BlinkNotification.instance.requestPermission_Callback_1_(unwrap_jso((permission) => callback(permission)));
       return;
     }
     _blink.BlinkNotification.instance.requestPermission_Callback_0_();
@@ -25135,6 +28755,18 @@
   @DomName('HTMLOListElement.HTMLOListElement')
   @DocsEditable()
   factory OListElement() => document.createElement("ol");
+
+
+  static OListElement internalCreateOListElement() {
+    return new OListElement._internalWrap();
+  }
+
+  factory OListElement._internalWrap() {
+    return new OListElement.internal_();
+  }
+
+  OListElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25148,7 +28780,7 @@
   
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  void set reversed(bool value) => _blink.BlinkHTMLOListElement.instance.reversed_Setter_(unwrap_jso(this), value);
+  set reversed(bool value) => _blink.BlinkHTMLOListElement.instance.reversed_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOListElement.start')
   @DocsEditable()
@@ -25156,7 +28788,7 @@
   
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  void set start(int value) => _blink.BlinkHTMLOListElement.instance.start_Setter_(unwrap_jso(this), value);
+  set start(int value) => _blink.BlinkHTMLOListElement.instance.start_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOListElement.type')
   @DocsEditable()
@@ -25164,7 +28796,7 @@
   
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLOListElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLOListElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25187,6 +28819,18 @@
   @DomName('HTMLObjectElement.HTMLObjectElement')
   @DocsEditable()
   factory ObjectElement() => document.createElement("object");
+
+
+  static ObjectElement internalCreateObjectElement() {
+    return new ObjectElement._internalWrap();
+  }
+
+  factory ObjectElement._internalWrap() {
+    return new ObjectElement.internal_();
+  }
+
+  ObjectElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25203,7 +28847,7 @@
   
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  void set data(String value) => _blink.BlinkHTMLObjectElement.instance.data_Setter_(unwrap_jso(this), value);
+  set data(String value) => _blink.BlinkHTMLObjectElement.instance.data_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
@@ -25215,7 +28859,7 @@
   
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(String value) => _blink.BlinkHTMLObjectElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.integrity')
   @DocsEditable()
@@ -25225,7 +28869,7 @@
   @DomName('HTMLObjectElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLObjectElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLObjectElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
@@ -25233,7 +28877,7 @@
   
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLObjectElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLObjectElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
@@ -25241,7 +28885,7 @@
   
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLObjectElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLObjectElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
@@ -25249,7 +28893,7 @@
   
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.BlinkHTMLObjectElement.instance.useMap_Setter_(unwrap_jso(this), value);
+  set useMap(String value) => _blink.BlinkHTMLObjectElement.instance.useMap_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
@@ -25265,7 +28909,7 @@
   
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.BlinkHTMLObjectElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(String value) => _blink.BlinkHTMLObjectElement.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
@@ -25304,6 +28948,18 @@
   @DomName('HTMLOptGroupElement.HTMLOptGroupElement')
   @DocsEditable()
   factory OptGroupElement() => document.createElement("optgroup");
+
+
+  static OptGroupElement internalCreateOptGroupElement() {
+    return new OptGroupElement._internalWrap();
+  }
+
+  factory OptGroupElement._internalWrap() {
+    return new OptGroupElement.internal_();
+  }
+
+  OptGroupElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25317,7 +28973,7 @@
   
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
@@ -25325,7 +28981,7 @@
   
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLOptGroupElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLOptGroupElement.instance.label_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -25342,8 +28998,20 @@
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
   factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) {
-    return _blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected);
+    return wrap_jso(_blink.BlinkHTMLOptionElement.instance.constructorCallback_4_(data, value, defaultSelected, selected));
   }
+
+
+  static OptionElement internalCreateOptionElement() {
+    return new OptionElement._internalWrap();
+  }
+
+  factory OptionElement._internalWrap() {
+    return new OptionElement.internal_();
+  }
+
+  OptionElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25357,7 +29025,7 @@
   
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  void set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Setter_(unwrap_jso(this), value);
+  set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.instance.defaultSelected_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
@@ -25365,7 +29033,7 @@
   
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLOptionElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLOptionElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
@@ -25381,7 +29049,7 @@
   
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLOptionElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLOptionElement.instance.label_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
@@ -25389,7 +29057,7 @@
   
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  void set selected(bool value) => _blink.BlinkHTMLOptionElement.instance.selected_Setter_(unwrap_jso(this), value);
+  set selected(bool value) => _blink.BlinkHTMLOptionElement.instance.selected_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
@@ -25397,7 +29065,7 @@
   
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLOptionElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLOptionElement.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25419,6 +29087,18 @@
   @DomName('HTMLOutputElement.HTMLOutputElement')
   @DocsEditable()
   factory OutputElement() => document.createElement("output");
+
+
+  static OutputElement internalCreateOutputElement() {
+    return new OutputElement._internalWrap();
+  }
+
+  factory OutputElement._internalWrap() {
+    return new OutputElement.internal_();
+  }
+
+  OutputElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25435,7 +29115,7 @@
   
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLOutputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLOutputElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
@@ -25448,7 +29128,7 @@
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLOutputElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLOutputElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
@@ -25456,7 +29136,7 @@
   
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLOutputElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLOutputElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
@@ -25476,7 +29156,7 @@
   
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLOutputElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLOutputElement.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
@@ -25505,6 +29185,18 @@
   // To suppress missing implicit constructor warnings.
   factory OverflowEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static OverflowEvent internalCreateOverflowEvent() {
+    return new OverflowEvent._internalWrap();
+  }
+
+  factory OverflowEvent._internalWrap() {
+    return new OverflowEvent.internal_();
+  }
+
+  OverflowEvent.internal_() : super.internal_();
+
+
   @DomName('OverflowEvent.BOTH')
   @DocsEditable()
   static const int BOTH = 2;
@@ -25545,6 +29237,18 @@
   // To suppress missing implicit constructor warnings.
   factory PageTransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PageTransitionEvent internalCreatePageTransitionEvent() {
+    return new PageTransitionEvent._internalWrap();
+  }
+
+  factory PageTransitionEvent._internalWrap() {
+    return new PageTransitionEvent.internal_();
+  }
+
+  PageTransitionEvent.internal_() : super.internal_();
+
+
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
   bool get persisted => _blink.BlinkPageTransitionEvent.instance.persisted_Getter_(unwrap_jso(this));
@@ -25566,6 +29270,18 @@
   @DomName('HTMLParagraphElement.HTMLParagraphElement')
   @DocsEditable()
   factory ParagraphElement() => document.createElement("p");
+
+
+  static ParagraphElement internalCreateParagraphElement() {
+    return new ParagraphElement._internalWrap();
+  }
+
+  factory ParagraphElement._internalWrap() {
+    return new ParagraphElement.internal_();
+  }
+
+  ParagraphElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25591,6 +29307,18 @@
   @DomName('HTMLParamElement.HTMLParamElement')
   @DocsEditable()
   factory ParamElement() => document.createElement("param");
+
+
+  static ParamElement internalCreateParamElement() {
+    return new ParamElement._internalWrap();
+  }
+
+  factory ParamElement._internalWrap() {
+    return new ParamElement.internal_();
+  }
+
+  ParamElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -25604,7 +29332,7 @@
   
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLParamElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLParamElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLParamElement.value')
   @DocsEditable()
@@ -25612,7 +29340,7 @@
   
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLParamElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLParamElement.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25678,17 +29406,32 @@
   @DocsEditable()
   factory Path2D([path_OR_text]) {
     if (path_OR_text == null) {
-      return _blink.BlinkPath2D.instance.constructorCallback_0_();
+      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_0_());
     }
     if ((path_OR_text is Path2D || path_OR_text == null)) {
-      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
+      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text));
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return _blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text);
+      return wrap_jso(_blink.BlinkPath2D.instance.constructorCallback_1_(path_OR_text));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+  static Path2D internalCreatePath2D() {
+    return new Path2D._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Path2D._internalWrap() {
+    return new Path2D.internal_();
+  }
+
+  Path2D.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   void addPath(Path2D path, [Matrix transform]) {
     if (transform != null) {
       _blink.BlinkPath2D.instance.addPath_Callback_2_(unwrap_jso(this), unwrap_jso(path), unwrap_jso(transform));
@@ -25774,6 +29517,18 @@
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
   static const EventStreamProvider<Event> resourceTimingBufferFullEvent = const EventStreamProvider<Event>('webkitresourcetimingbufferfull');
 
+
+  static Performance internalCreatePerformance() {
+    return new Performance._internalWrap();
+  }
+
+  factory Performance._internalWrap() {
+    return new Performance.internal_();
+  }
+
+  Performance.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -25806,19 +29561,19 @@
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() => _blink.BlinkPerformance.instance.getEntries_Callback_0_(unwrap_jso(this));
+  List<PerformanceEntry> getEntries() => wrap_jso(_blink.BlinkPerformance.instance.getEntries_Callback_0_(unwrap_jso(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.instance.getEntriesByName_Callback_2_(unwrap_jso(this), name, entryType);
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => wrap_jso(_blink.BlinkPerformance.instance.getEntriesByName_Callback_2_(unwrap_jso(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.instance.getEntriesByType_Callback_1_(unwrap_jso(this), entryType);
+  List<PerformanceEntry> getEntriesByType(String entryType) => wrap_jso(_blink.BlinkPerformance.instance.getEntriesByType_Callback_1_(unwrap_jso(this), entryType));
   
   @DomName('Performance.mark')
   @DocsEditable()
@@ -25834,7 +29589,7 @@
   
   @DomName('Performance.now')
   @DocsEditable()
-  double now() => _blink.BlinkPerformance.instance.now_Callback_0_(unwrap_jso(this));
+  num now() => _blink.BlinkPerformance.instance.now_Callback_0_(unwrap_jso(this));
   
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -25875,9 +29630,24 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceEntry._() { throw new UnsupportedError("Not supported"); }
 
+  static PerformanceEntry internalCreatePerformanceEntry() {
+    return new PerformanceEntry._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PerformanceEntry._internalWrap() {
+    return new PerformanceEntry.internal_();
+  }
+
+  PerformanceEntry.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkPerformanceEntry.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkPerformanceEntry.instance.duration_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
@@ -25889,7 +29659,7 @@
   
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  double get startTime => _blink.BlinkPerformanceEntry.instance.startTime_Getter_(unwrap_jso(this));
+  num get startTime => _blink.BlinkPerformanceEntry.instance.startTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25907,6 +29677,18 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceMark._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PerformanceMark internalCreatePerformanceMark() {
+    return new PerformanceMark._internalWrap();
+  }
+
+  factory PerformanceMark._internalWrap() {
+    return new PerformanceMark.internal_();
+  }
+
+  PerformanceMark.internal_() : super.internal_();
+
+
 }
 // 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
@@ -25923,6 +29705,18 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceMeasure._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PerformanceMeasure internalCreatePerformanceMeasure() {
+    return new PerformanceMeasure._internalWrap();
+  }
+
+  factory PerformanceMeasure._internalWrap() {
+    return new PerformanceMeasure.internal_();
+  }
+
+  PerformanceMeasure.internal_() : super.internal_();
+
+
 }
 // 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
@@ -25938,6 +29732,21 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceNavigation._() { throw new UnsupportedError("Not supported"); }
 
+  static PerformanceNavigation internalCreatePerformanceNavigation() {
+    return new PerformanceNavigation._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PerformanceNavigation._internalWrap() {
+    return new PerformanceNavigation.internal_();
+  }
+
+  PerformanceNavigation.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PerformanceNavigation.TYPE_BACK_FORWARD')
   @DocsEditable()
   static const int TYPE_BACK_FORWARD = 2;
@@ -25978,25 +29787,37 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceResourceTiming._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PerformanceResourceTiming internalCreatePerformanceResourceTiming() {
+    return new PerformanceResourceTiming._internalWrap();
+  }
+
+  factory PerformanceResourceTiming._internalWrap() {
+    return new PerformanceResourceTiming.internal_();
+  }
+
+  PerformanceResourceTiming.internal_() : super.internal_();
+
+
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  double get connectEnd => _blink.BlinkPerformanceResourceTiming.instance.connectEnd_Getter_(unwrap_jso(this));
+  num get connectEnd => _blink.BlinkPerformanceResourceTiming.instance.connectEnd_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  double get connectStart => _blink.BlinkPerformanceResourceTiming.instance.connectStart_Getter_(unwrap_jso(this));
+  num get connectStart => _blink.BlinkPerformanceResourceTiming.instance.connectStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  double get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.instance.domainLookupEnd_Getter_(unwrap_jso(this));
+  num get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.instance.domainLookupEnd_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  double get domainLookupStart => _blink.BlinkPerformanceResourceTiming.instance.domainLookupStart_Getter_(unwrap_jso(this));
+  num get domainLookupStart => _blink.BlinkPerformanceResourceTiming.instance.domainLookupStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  double get fetchStart => _blink.BlinkPerformanceResourceTiming.instance.fetchStart_Getter_(unwrap_jso(this));
+  num get fetchStart => _blink.BlinkPerformanceResourceTiming.instance.fetchStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
@@ -26004,30 +29825,30 @@
   
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  double get redirectEnd => _blink.BlinkPerformanceResourceTiming.instance.redirectEnd_Getter_(unwrap_jso(this));
+  num get redirectEnd => _blink.BlinkPerformanceResourceTiming.instance.redirectEnd_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  double get redirectStart => _blink.BlinkPerformanceResourceTiming.instance.redirectStart_Getter_(unwrap_jso(this));
+  num get redirectStart => _blink.BlinkPerformanceResourceTiming.instance.redirectStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get requestStart => _blink.BlinkPerformanceResourceTiming.instance.requestStart_Getter_(unwrap_jso(this));
+  num get requestStart => _blink.BlinkPerformanceResourceTiming.instance.requestStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseEnd => _blink.BlinkPerformanceResourceTiming.instance.responseEnd_Getter_(unwrap_jso(this));
+  num get responseEnd => _blink.BlinkPerformanceResourceTiming.instance.responseEnd_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseStart => _blink.BlinkPerformanceResourceTiming.instance.responseStart_Getter_(unwrap_jso(this));
+  num get responseStart => _blink.BlinkPerformanceResourceTiming.instance.responseStart_Getter_(unwrap_jso(this));
   
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  double get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(unwrap_jso(this));
+  num get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.instance.secureConnectionStart_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26044,6 +29865,21 @@
   // To suppress missing implicit constructor warnings.
   factory PerformanceTiming._() { throw new UnsupportedError("Not supported"); }
 
+  static PerformanceTiming internalCreatePerformanceTiming() {
+    return new PerformanceTiming._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PerformanceTiming._internalWrap() {
+    return new PerformanceTiming.internal_();
+  }
+
+  PerformanceTiming.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
   int get connectEnd => _blink.BlinkPerformanceTiming.instance.connectEnd_Getter_(unwrap_jso(this));
@@ -26142,6 +29978,18 @@
 class PictureElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory PictureElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static PictureElement internalCreatePictureElement() {
+    return new PictureElement._internalWrap();
+  }
+
+  factory PictureElement._internalWrap() {
+    return new PictureElement.internal_();
+  }
+
+  PictureElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26164,6 +30012,21 @@
   // To suppress missing implicit constructor warnings.
   factory Plugin._() { throw new UnsupportedError("Not supported"); }
 
+  static Plugin internalCreatePlugin() {
+    return new Plugin._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Plugin._internalWrap() {
+    return new Plugin.internal_();
+  }
+
+  Plugin.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Plugin.description')
   @DocsEditable()
   String get description => _blink.BlinkPlugin.instance.description_Getter_(unwrap_jso(this));
@@ -26203,10 +30066,25 @@
 @DocsEditable()
 @DomName('PluginArray')
 @Experimental() // non-standard
-class PluginArray extends NativeFieldWrapperClass2 with ListMixin<Plugin>, ImmutableListMixin<Plugin> implements List<Plugin> {
+class PluginArray extends JsoNativeFieldWrapper with ListMixin<Plugin>, ImmutableListMixin<Plugin> implements List<Plugin> {
   // To suppress missing implicit constructor warnings.
   factory PluginArray._() { throw new UnsupportedError("Not supported"); }
 
+  static PluginArray internalCreatePluginArray() {
+    return new PluginArray._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PluginArray._internalWrap() {
+    return new PluginArray.internal_();
+  }
+
+  PluginArray.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PluginArray.length')
   @DocsEditable()
   int get length => _blink.BlinkPluginArray.instance.length_Getter_(unwrap_jso(this));
@@ -26218,7 +30096,7 @@
   }
 
   Plugin _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkPluginArray.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -26226,7 +30104,7 @@
   // Plugin is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -26287,6 +30165,18 @@
 class PluginPlaceholderElement extends DivElement {
   // To suppress missing implicit constructor warnings.
   factory PluginPlaceholderElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static PluginPlaceholderElement internalCreatePluginPlaceholderElement() {
+    return new PluginPlaceholderElement._internalWrap();
+  }
+
+  factory PluginPlaceholderElement._internalWrap() {
+    return new PluginPlaceholderElement.internal_();
+  }
+
+  PluginPlaceholderElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26302,7 +30192,7 @@
   @DomName('PluginPlaceholderElement.message')
   @DocsEditable()
   @Experimental() // untriaged
-  void set message(String value) => _blink.BlinkPluginPlaceholderElement.instance.message_Setter_(unwrap_jso(this), value);
+  set message(String value) => _blink.BlinkPluginPlaceholderElement.instance.message_Setter_(unwrap_jso(this), value);
   
   @DomName('PluginPlaceholderElement.createdCallback')
   @DocsEditable()
@@ -26327,9 +30217,21 @@
   // To suppress missing implicit constructor warnings.
   factory PopStateEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PopStateEvent internalCreatePopStateEvent() {
+    return new PopStateEvent._internalWrap();
+  }
+
+  factory PopStateEvent._internalWrap() {
+    return new PopStateEvent.internal_();
+  }
+
+  PopStateEvent.internal_() : super.internal_();
+
+
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state => _blink.BlinkPopStateEvent.instance.state_Getter_(unwrap_jso(this));
+  Object get state => wrap_jso(_blink.BlinkPopStateEvent.instance.state_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26356,6 +30258,21 @@
   // To suppress missing implicit constructor warnings.
   factory PositionError._() { throw new UnsupportedError("Not supported"); }
 
+  static PositionError internalCreatePositionError() {
+    return new PositionError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PositionError._internalWrap() {
+    return new PositionError.internal_();
+  }
+
+  PositionError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PositionError.PERMISSION_DENIED')
   @DocsEditable()
   static const int PERMISSION_DENIED = 1;
@@ -26403,6 +30320,18 @@
   @DomName('HTMLPreElement.HTMLPreElement')
   @DocsEditable()
   factory PreElement() => document.createElement("pre");
+
+
+  static PreElement internalCreatePreElement() {
+    return new PreElement._internalWrap();
+  }
+
+  factory PreElement._internalWrap() {
+    return new PreElement.internal_();
+  }
+
+  PreElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26425,6 +30354,18 @@
   // To suppress missing implicit constructor warnings.
   factory Presentation._() { throw new UnsupportedError("Not supported"); }
 
+
+  static Presentation internalCreatePresentation() {
+    return new Presentation._internalWrap();
+  }
+
+  factory Presentation._internalWrap() {
+    return new Presentation.internal_();
+  }
+
+  Presentation.internal_() : super.internal_();
+
+
 }
 // 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
@@ -26440,6 +30381,18 @@
   // To suppress missing implicit constructor warnings.
   factory ProcessingInstruction._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ProcessingInstruction internalCreateProcessingInstruction() {
+    return new ProcessingInstruction._internalWrap();
+  }
+
+  factory ProcessingInstruction._internalWrap() {
+    return new ProcessingInstruction.internal_();
+  }
+
+  ProcessingInstruction.internal_() : super.internal_();
+
+
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
@@ -26470,6 +30423,18 @@
   @DomName('HTMLProgressElement.HTMLProgressElement')
   @DocsEditable()
   factory ProgressElement() => document.createElement("progress");
+
+
+  static ProgressElement internalCreateProgressElement() {
+    return new ProgressElement._internalWrap();
+  }
+
+  factory ProgressElement._internalWrap() {
+    return new ProgressElement.internal_();
+  }
+
+  ProgressElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26483,7 +30448,7 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLProgressElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLProgressElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
@@ -26491,11 +30456,11 @@
   
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.BlinkHTMLProgressElement.instance.max_Setter_(unwrap_jso(this), value);
+  set max(num value) => _blink.BlinkHTMLProgressElement.instance.max_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  double get position => _blink.BlinkHTMLProgressElement.instance.position_Getter_(unwrap_jso(this));
+  num get position => _blink.BlinkHTMLProgressElement.instance.position_Getter_(unwrap_jso(this));
   
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
@@ -26503,7 +30468,7 @@
   
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkHTMLProgressElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkHTMLProgressElement.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26519,6 +30484,18 @@
   // To suppress missing implicit constructor warnings.
   factory ProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ProgressEvent internalCreateProgressEvent() {
+    return new ProgressEvent._internalWrap();
+  }
+
+  factory ProgressEvent._internalWrap() {
+    return new ProgressEvent.internal_();
+  }
+
+  ProgressEvent.internal_() : super.internal_();
+
+
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
   bool get lengthComputable => _blink.BlinkProgressEvent.instance.lengthComputable_Getter_(unwrap_jso(this));
@@ -26546,6 +30523,18 @@
   // To suppress missing implicit constructor warnings.
   factory PushEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PushEvent internalCreatePushEvent() {
+    return new PushEvent._internalWrap();
+  }
+
+  factory PushEvent._internalWrap() {
+    return new PushEvent.internal_();
+  }
+
+  PushEvent.internal_() : super.internal_();
+
+
   @DomName('PushEvent.data')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26566,10 +30555,25 @@
   // To suppress missing implicit constructor warnings.
   factory PushManager._() { throw new UnsupportedError("Not supported"); }
 
+  static PushManager internalCreatePushManager() {
+    return new PushManager._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PushManager._internalWrap() {
+    return new PushManager.internal_();
+  }
+
+  PushManager.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PushManager.register')
   @DocsEditable()
   @Experimental() // untriaged
-  Future register(String senderId) => _blink.BlinkPushManager.instance.register_Callback_1_(unwrap_jso(this), senderId);
+  Future register(String senderId) => wrap_jso(_blink.BlinkPushManager.instance.register_Callback_1_(unwrap_jso(this), senderId));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26586,6 +30590,21 @@
   // To suppress missing implicit constructor warnings.
   factory PushRegistration._() { throw new UnsupportedError("Not supported"); }
 
+  static PushRegistration internalCreatePushRegistration() {
+    return new PushRegistration._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PushRegistration._internalWrap() {
+    return new PushRegistration.internal_();
+  }
+
+  PushRegistration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('PushRegistration.pushEndpoint')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26613,6 +30632,18 @@
   @DomName('HTMLQuoteElement.HTMLQuoteElement')
   @DocsEditable()
   factory QuoteElement() => document.createElement("q");
+
+
+  static QuoteElement internalCreateQuoteElement() {
+    return new QuoteElement._internalWrap();
+  }
+
+  factory QuoteElement._internalWrap() {
+    return new QuoteElement.internal_();
+  }
+
+  QuoteElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -26626,7 +30657,7 @@
   
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.BlinkHTMLQuoteElement.instance.cite_Setter_(unwrap_jso(this), value);
+  set cite(String value) => _blink.BlinkHTMLQuoteElement.instance.cite_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26679,6 +30710,21 @@
   // To suppress missing implicit constructor warnings.
   factory Range._() { throw new UnsupportedError("Not supported"); }
 
+  static Range internalCreateRange() {
+    return new Range._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Range._internalWrap() {
+    return new Range.internal_();
+  }
+
+  Range.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Range.END_TO_END')
   @DocsEditable()
   static const int END_TO_END = 2;
@@ -26792,7 +30838,7 @@
   
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.BlinkRange.instance.getClientRects_Callback_0_(unwrap_jso(this));
+  List<Rectangle> getClientRects() => wrap_jso(_blink.BlinkRange.instance.getClientRects_Callback_0_(unwrap_jso(this)));
   
   @DomName('Range.insertNode')
   @DocsEditable()
@@ -26862,10 +30908,25 @@
   // To suppress missing implicit constructor warnings.
   factory ReadableStream._() { throw new UnsupportedError("Not supported"); }
 
+  static ReadableStream internalCreateReadableStream() {
+    return new ReadableStream._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ReadableStream._internalWrap() {
+    return new ReadableStream.internal_();
+  }
+
+  ReadableStream.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ReadableStream.closed')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get closed => _blink.BlinkReadableStream.instance.closed_Getter_(unwrap_jso(this));
+  Future get closed => wrap_jso(_blink.BlinkReadableStream.instance.closed_Getter_(unwrap_jso(this)));
   
   @DomName('ReadableStream.state')
   @DocsEditable()
@@ -26875,7 +30936,7 @@
   @DomName('ReadableStream.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  Future cancel(Object reason) => _blink.BlinkReadableStream.instance.cancel_Callback_1_(unwrap_jso(this), reason);
+  Future cancel(Object reason) => wrap_jso(_blink.BlinkReadableStream.instance.cancel_Callback_1_(unwrap_jso(this), reason));
   
   @DomName('ReadableStream.read')
   @DocsEditable()
@@ -26885,7 +30946,7 @@
   @DomName('ReadableStream.wait')
   @DocsEditable()
   @Experimental() // untriaged
-  Future wait() => _blink.BlinkReadableStream.instance.wait_Callback_0_(unwrap_jso(this));
+  Future wait() => wrap_jso(_blink.BlinkReadableStream.instance.wait_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26902,6 +30963,18 @@
   // To suppress missing implicit constructor warnings.
   factory RelatedEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static RelatedEvent internalCreateRelatedEvent() {
+    return new RelatedEvent._internalWrap();
+  }
+
+  factory RelatedEvent._internalWrap() {
+    return new RelatedEvent.internal_();
+  }
+
+  RelatedEvent.internal_() : super.internal_();
+
+
   @DomName('RelatedEvent.relatedTarget')
   @DocsEditable()
   @Experimental() // untriaged
@@ -26932,6 +31005,18 @@
   // To suppress missing implicit constructor warnings.
   factory ResourceProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ResourceProgressEvent internalCreateResourceProgressEvent() {
+    return new ResourceProgressEvent._internalWrap();
+  }
+
+  factory ResourceProgressEvent._internalWrap() {
+    return new ResourceProgressEvent.internal_();
+  }
+
+  ResourceProgressEvent.internal_() : super.internal_();
+
+
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
   String get url => _blink.BlinkResourceProgressEvent.instance.url_Getter_(unwrap_jso(this));
@@ -26992,13 +31077,25 @@
   @DocsEditable()
   static const EventStreamProvider<Event> openEvent = const EventStreamProvider<Event>('open');
 
+
+  static RtcDataChannel internalCreateRtcDataChannel() {
+    return new RtcDataChannel._internalWrap();
+  }
+
+  factory RtcDataChannel._internalWrap() {
+    return new RtcDataChannel.internal_();
+  }
+
+  RtcDataChannel.internal_() : super.internal_();
+
+
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
   String get binaryType => _blink.BlinkRTCDataChannel.instance.binaryType_Getter_(unwrap_jso(this));
   
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.BlinkRTCDataChannel.instance.binaryType_Setter_(unwrap_jso(this), value);
+  set binaryType(String value) => _blink.BlinkRTCDataChannel.instance.binaryType_Setter_(unwrap_jso(this), value);
   
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
@@ -27122,6 +31219,18 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDataChannelEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static RtcDataChannelEvent internalCreateRtcDataChannelEvent() {
+    return new RtcDataChannelEvent._internalWrap();
+  }
+
+  factory RtcDataChannelEvent._internalWrap() {
+    return new RtcDataChannelEvent.internal_();
+  }
+
+  RtcDataChannelEvent.internal_() : super.internal_();
+
+
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
   RtcDataChannel get channel => wrap_jso(_blink.BlinkRTCDataChannelEvent.instance.channel_Getter_(unwrap_jso(this)));
@@ -27152,6 +31261,18 @@
   @DocsEditable()
   static const EventStreamProvider<RtcDtmfToneChangeEvent> toneChangeEvent = const EventStreamProvider<RtcDtmfToneChangeEvent>('tonechange');
 
+
+  static RtcDtmfSender internalCreateRtcDtmfSender() {
+    return new RtcDtmfSender._internalWrap();
+  }
+
+  factory RtcDtmfSender._internalWrap() {
+    return new RtcDtmfSender.internal_();
+  }
+
+  RtcDtmfSender.internal_() : super.internal_();
+
+
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
   bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.instance.canInsertDTMF_Getter_(unwrap_jso(this));
@@ -27206,6 +31327,18 @@
   // To suppress missing implicit constructor warnings.
   factory RtcDtmfToneChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static RtcDtmfToneChangeEvent internalCreateRtcDtmfToneChangeEvent() {
+    return new RtcDtmfToneChangeEvent._internalWrap();
+  }
+
+  factory RtcDtmfToneChangeEvent._internalWrap() {
+    return new RtcDtmfToneChangeEvent.internal_();
+  }
+
+  RtcDtmfToneChangeEvent.internal_() : super.internal_();
+
+
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
   String get tone => _blink.BlinkRTCDTMFToneChangeEvent.instance.tone_Getter_(unwrap_jso(this));
@@ -27230,16 +31363,32 @@
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
   factory RtcIceCandidate(Map dictionary) {
-    return _blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(dictionary);
+    var dictionary_1 = convertDartToNative_Dictionary(dictionary);
+    return wrap_jso(_blink.BlinkRTCIceCandidate.instance.constructorCallback_1_(dictionary_1));
   }
 
+  static RtcIceCandidate internalCreateRtcIceCandidate() {
+    return new RtcIceCandidate._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RtcIceCandidate._internalWrap() {
+    return new RtcIceCandidate.internal_();
+  }
+
+  RtcIceCandidate.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
   String get candidate => _blink.BlinkRTCIceCandidate.instance.candidate_Getter_(unwrap_jso(this));
   
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  void set candidate(String value) => _blink.BlinkRTCIceCandidate.instance.candidate_Setter_(unwrap_jso(this), value);
+  set candidate(String value) => _blink.BlinkRTCIceCandidate.instance.candidate_Setter_(unwrap_jso(this), value);
   
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
@@ -27247,7 +31396,7 @@
   
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  void set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Setter_(unwrap_jso(this), value);
+  set sdpMLineIndex(int value) => _blink.BlinkRTCIceCandidate.instance.sdpMLineIndex_Setter_(unwrap_jso(this), value);
   
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
@@ -27255,7 +31404,7 @@
   
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  void set sdpMid(String value) => _blink.BlinkRTCIceCandidate.instance.sdpMid_Setter_(unwrap_jso(this), value);
+  set sdpMid(String value) => _blink.BlinkRTCIceCandidate.instance.sdpMid_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27273,6 +31422,18 @@
   // To suppress missing implicit constructor warnings.
   factory RtcIceCandidateEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static RtcIceCandidateEvent internalCreateRtcIceCandidateEvent() {
+    return new RtcIceCandidateEvent._internalWrap();
+  }
+
+  factory RtcIceCandidateEvent._internalWrap() {
+    return new RtcIceCandidateEvent.internal_();
+  }
+
+  RtcIceCandidateEvent.internal_() : super.internal_();
+
+
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
   RtcIceCandidate get candidate => wrap_jso(_blink.BlinkRTCIceCandidateEvent.instance.candidate_Getter_(unwrap_jso(this)));
@@ -27393,11 +31554,26 @@
   @DocsEditable()
   factory RtcPeerConnection(Map rtcConfiguration, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      return _blink.BlinkRTCPeerConnection.instance.constructorCallback_2_(rtcConfiguration, mediaConstraints);
+      var rtcConfiguration_1 = convertDartToNative_Dictionary(rtcConfiguration);
+      var mediaConstraints_2 = convertDartToNative_Dictionary(mediaConstraints);
+      return wrap_jso(_blink.BlinkRTCPeerConnection.instance.constructorCallback_2_(rtcConfiguration_1, mediaConstraints_2));
     }
-    return _blink.BlinkRTCPeerConnection.instance.constructorCallback_1_(rtcConfiguration);
+    var rtcConfiguration_1 = convertDartToNative_Dictionary(rtcConfiguration);
+    return wrap_jso(_blink.BlinkRTCPeerConnection.instance.constructorCallback_1_(rtcConfiguration_1));
   }
 
+
+  static RtcPeerConnection internalCreateRtcPeerConnection() {
+    return new RtcPeerConnection._internalWrap();
+  }
+
+  factory RtcPeerConnection._internalWrap() {
+    return new RtcPeerConnection.internal_();
+  }
+
+  RtcPeerConnection.internal_() : super.internal_();
+
+
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
   String get iceConnectionState => _blink.BlinkRTCPeerConnection.instance.iceConnectionState_Getter_(unwrap_jso(this));
@@ -27420,11 +31596,11 @@
   
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.instance.addIceCandidate_Callback_3_(unwrap_jso(this), unwrap_jso(candidate), unwrap_jso(successCallback), unwrap_jso(failureCallback));
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.instance.addIceCandidate_Callback_3_(unwrap_jso(this), unwrap_jso(candidate), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
   
   void addStream(MediaStream stream, [Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.addStream_Callback_2_(unwrap_jso(this), unwrap_jso(stream), mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.addStream_Callback_2_(unwrap_jso(this), unwrap_jso(stream), convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
     _blink.BlinkRTCPeerConnection.instance.addStream_Callback_1_(unwrap_jso(this), unwrap_jso(stream));
@@ -27437,44 +31613,44 @@
   
   void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_3_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(failureCallback), mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_3_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)), convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(failureCallback));
+    _blink.BlinkRTCPeerConnection.instance.createAnswer_Callback_2_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
     return;
   }
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.instance.createDTMFSender_Callback_1_(unwrap_jso(this), unwrap_jso(track));
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDTMFSender_Callback_1_(unwrap_jso(this), unwrap_jso(track)));
   
   RtcDataChannel createDataChannel(String label, [Map options]) {
     if (options != null) {
-      return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_2_(unwrap_jso(this), label, options);
+      return wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_2_(unwrap_jso(this), label, convertDartToNative_Dictionary(options)));
     }
-    return _blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_1_(unwrap_jso(this), label);
+    return wrap_jso(_blink.BlinkRTCPeerConnection.instance.createDataChannel_Callback_1_(unwrap_jso(this), label));
   }
 
   void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map rtcOfferOptions]) {
     if (rtcOfferOptions != null) {
-      _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_3_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(failureCallback), rtcOfferOptions);
+      _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_3_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)), convertDartToNative_Dictionary(rtcOfferOptions));
       return;
     }
-    _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(failureCallback));
+    _blink.BlinkRTCPeerConnection.instance.createOffer_Callback_2_(unwrap_jso(this), unwrap_jso((sdp) => successCallback(wrap_jso(sdp))), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
     return;
   }
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() => _blink.BlinkRTCPeerConnection.instance.getLocalStreams_Callback_0_(unwrap_jso(this));
+  List<MediaStream> getLocalStreams() => wrap_jso(_blink.BlinkRTCPeerConnection.instance.getLocalStreams_Callback_0_(unwrap_jso(this)));
   
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() => _blink.BlinkRTCPeerConnection.instance.getRemoteStreams_Callback_0_(unwrap_jso(this));
+  List<MediaStream> getRemoteStreams() => wrap_jso(_blink.BlinkRTCPeerConnection.instance.getRemoteStreams_Callback_0_(unwrap_jso(this)));
   
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.instance.getStats_Callback_2_(unwrap_jso(this), unwrap_jso(successCallback), unwrap_jso(selector));
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.instance.getStats_Callback_2_(unwrap_jso(this), unwrap_jso((response) => successCallback(wrap_jso(response))), unwrap_jso(selector));
   
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
@@ -27486,7 +31662,7 @@
   
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setLocalDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(successCallback), unwrap_jso(failureCallback));
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setLocalDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
   
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -27498,7 +31674,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setRemoteDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(successCallback), unwrap_jso(failureCallback));
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.instance.setRemoteDescription_Callback_3_(unwrap_jso(this), unwrap_jso(description), unwrap_jso(() => successCallback()), unwrap_jso((errorInformation) => failureCallback(errorInformation)));
   
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -27510,11 +31686,11 @@
 
   void updateIce([Map configuration, Map mediaConstraints]) {
     if (mediaConstraints != null) {
-      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_2_(unwrap_jso(this), configuration, mediaConstraints);
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_2_(unwrap_jso(this), convertDartToNative_Dictionary(configuration), convertDartToNative_Dictionary(mediaConstraints));
       return;
     }
     if (configuration != null) {
-      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_1_(unwrap_jso(this), configuration);
+      _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(configuration));
       return;
     }
     _blink.BlinkRTCPeerConnection.instance.updateIce_Callback_0_(unwrap_jso(this));
@@ -27577,18 +31753,34 @@
   @DocsEditable()
   factory RtcSessionDescription([Map descriptionInitDict]) {
     if (descriptionInitDict != null) {
-      return _blink.BlinkRTCSessionDescription.instance.constructorCallback_1_(descriptionInitDict);
+      var descriptionInitDict_1 = convertDartToNative_Dictionary(descriptionInitDict);
+      return wrap_jso(_blink.BlinkRTCSessionDescription.instance.constructorCallback_1_(descriptionInitDict_1));
     }
-    return _blink.BlinkRTCSessionDescription.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkRTCSessionDescription.instance.constructorCallback_0_());
   }
 
+  static RtcSessionDescription internalCreateRtcSessionDescription() {
+    return new RtcSessionDescription._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RtcSessionDescription._internalWrap() {
+    return new RtcSessionDescription.internal_();
+  }
+
+  RtcSessionDescription.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
   String get sdp => _blink.BlinkRTCSessionDescription.instance.sdp_Getter_(unwrap_jso(this));
   
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  void set sdp(String value) => _blink.BlinkRTCSessionDescription.instance.sdp_Setter_(unwrap_jso(this), value);
+  set sdp(String value) => _blink.BlinkRTCSessionDescription.instance.sdp_Setter_(unwrap_jso(this), value);
   
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
@@ -27596,7 +31788,7 @@
   
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkRTCSessionDescription.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkRTCSessionDescription.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27614,6 +31806,21 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsReport._() { throw new UnsupportedError("Not supported"); }
 
+  static RtcStatsReport internalCreateRtcStatsReport() {
+    return new RtcStatsReport._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RtcStatsReport._internalWrap() {
+    return new RtcStatsReport.internal_();
+  }
+
+  RtcStatsReport.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('RTCStatsReport.id')
   @DocsEditable()
   String get id => _blink.BlinkRTCStatsReport.instance.id_Getter_(unwrap_jso(this));
@@ -27658,17 +31865,32 @@
   // To suppress missing implicit constructor warnings.
   factory RtcStatsResponse._() { throw new UnsupportedError("Not supported"); }
 
+  static RtcStatsResponse internalCreateRtcStatsResponse() {
+    return new RtcStatsResponse._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RtcStatsResponse._internalWrap() {
+    return new RtcStatsResponse.internal_();
+  }
+
+  RtcStatsResponse.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable()
-  RtcStatsReport __getter__(String name) => _blink.BlinkRTCStatsResponse.instance.$__getter___Callback_1_(unwrap_jso(this), name);
+  RtcStatsReport __getter__(String name) => wrap_jso(_blink.BlinkRTCStatsResponse.instance.$__getter___Callback_1_(unwrap_jso(this), name));
   
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) => _blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name);
+  RtcStatsReport namedItem(String name) => wrap_jso(_blink.BlinkRTCStatsResponse.instance.namedItem_Callback_1_(unwrap_jso(this), name));
   
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.instance.result_Callback_0_(unwrap_jso(this));
+  List<RtcStatsReport> result() => wrap_jso(_blink.BlinkRTCStatsResponse.instance.result_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27689,6 +31911,21 @@
   // To suppress missing implicit constructor warnings.
   factory Screen._() { throw new UnsupportedError("Not supported"); }
 
+  static Screen internalCreateScreen() {
+    return new Screen._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Screen._internalWrap() {
+    return new Screen.internal_();
+  }
+
+  Screen.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Screen.availHeight')
   @DocsEditable()
   int get _availHeight => _blink.BlinkScreen.instance.availHeight_Getter_(unwrap_jso(this));
@@ -27747,6 +31984,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+
+  static ScreenOrientation internalCreateScreenOrientation() {
+    return new ScreenOrientation._internalWrap();
+  }
+
+  factory ScreenOrientation._internalWrap() {
+    return new ScreenOrientation.internal_();
+  }
+
+  ScreenOrientation.internal_() : super.internal_();
+
+
   @DomName('ScreenOrientation.angle')
   @DocsEditable()
   @Experimental() // untriaged
@@ -27760,7 +32009,7 @@
   @DomName('ScreenOrientation.lock')
   @DocsEditable()
   @Experimental() // untriaged
-  Future lock(String orientation) => _blink.BlinkScreenOrientation.instance.lock_Callback_1_(unwrap_jso(this), orientation);
+  Future lock(String orientation) => wrap_jso(_blink.BlinkScreenOrientation.instance.lock_Callback_1_(unwrap_jso(this), orientation));
   
   @DomName('ScreenOrientation.unlock')
   @DocsEditable()
@@ -27789,6 +32038,18 @@
   @DomName('HTMLScriptElement.HTMLScriptElement')
   @DocsEditable()
   factory ScriptElement() => document.createElement("script");
+
+
+  static ScriptElement internalCreateScriptElement() {
+    return new ScriptElement._internalWrap();
+  }
+
+  factory ScriptElement._internalWrap() {
+    return new ScriptElement.internal_();
+  }
+
+  ScriptElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -27802,7 +32063,7 @@
   
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  void set async(bool value) => _blink.BlinkHTMLScriptElement.instance.async_Setter_(unwrap_jso(this), value);
+  set async(bool value) => _blink.BlinkHTMLScriptElement.instance.async_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
@@ -27810,7 +32071,7 @@
   
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  void set charset(String value) => _blink.BlinkHTMLScriptElement.instance.charset_Setter_(unwrap_jso(this), value);
+  set charset(String value) => _blink.BlinkHTMLScriptElement.instance.charset_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
@@ -27822,7 +32083,7 @@
   @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.instance.crossOrigin_Setter_(unwrap_jso(this), value);
+  set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.instance.crossOrigin_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
@@ -27830,7 +32091,7 @@
   
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  void set defer(bool value) => _blink.BlinkHTMLScriptElement.instance.defer_Setter_(unwrap_jso(this), value);
+  set defer(bool value) => _blink.BlinkHTMLScriptElement.instance.defer_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
@@ -27840,7 +32101,7 @@
   @DomName('HTMLScriptElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLScriptElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLScriptElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
@@ -27852,7 +32113,7 @@
   @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.instance.nonce_Setter_(unwrap_jso(this), value);
+  set nonce(String value) => _blink.BlinkHTMLScriptElement.instance.nonce_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
@@ -27860,7 +32121,7 @@
   
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLScriptElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLScriptElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
@@ -27868,7 +32129,7 @@
   
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLScriptElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLScriptElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27886,6 +32147,18 @@
   // To suppress missing implicit constructor warnings.
   factory SecurityPolicyViolationEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SecurityPolicyViolationEvent internalCreateSecurityPolicyViolationEvent() {
+    return new SecurityPolicyViolationEvent._internalWrap();
+  }
+
+  factory SecurityPolicyViolationEvent._internalWrap() {
+    return new SecurityPolicyViolationEvent.internal_();
+  }
+
+  SecurityPolicyViolationEvent.internal_() : super.internal_();
+
+
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
   String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.instance.blockedURI_Getter_(unwrap_jso(this));
@@ -27941,6 +32214,18 @@
   @DomName('HTMLSelectElement.HTMLSelectElement')
   @DocsEditable()
   factory SelectElement() => document.createElement("select");
+
+
+  static SelectElement internalCreateSelectElement() {
+    return new SelectElement._internalWrap();
+  }
+
+  factory SelectElement._internalWrap() {
+    return new SelectElement.internal_();
+  }
+
+  SelectElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -27954,7 +32239,7 @@
   
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLSelectElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLSelectElement.instance.autofocus_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
@@ -27962,7 +32247,7 @@
   
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLSelectElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLSelectElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
@@ -27971,7 +32256,7 @@
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLSelectElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLSelectElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
@@ -27979,7 +32264,7 @@
   
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  void set length(int value) => _blink.BlinkHTMLSelectElement.instance.length_Setter_(unwrap_jso(this), value);
+  set length(int value) => _blink.BlinkHTMLSelectElement.instance.length_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
@@ -27987,7 +32272,7 @@
   
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.BlinkHTMLSelectElement.instance.multiple_Setter_(unwrap_jso(this), value);
+  set multiple(bool value) => _blink.BlinkHTMLSelectElement.instance.multiple_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
@@ -27995,7 +32280,7 @@
   
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLSelectElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLSelectElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
@@ -28003,7 +32288,7 @@
   
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLSelectElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLSelectElement.instance.required_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
@@ -28011,7 +32296,7 @@
   
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  void set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Setter_(unwrap_jso(this), value);
+  set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.instance.selectedIndex_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
@@ -28019,7 +32304,7 @@
   
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.BlinkHTMLSelectElement.instance.size_Setter_(unwrap_jso(this), value);
+  set size(int value) => _blink.BlinkHTMLSelectElement.instance.size_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
@@ -28039,7 +32324,7 @@
   
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLSelectElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLSelectElement.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
@@ -28102,6 +32387,21 @@
   // To suppress missing implicit constructor warnings.
   factory Selection._() { throw new UnsupportedError("Not supported"); }
 
+  static Selection internalCreateSelection() {
+    return new Selection._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Selection._internalWrap() {
+    return new Selection.internal_();
+  }
+
+  Selection.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Selection.anchorNode')
   @DocsEditable()
   Node get anchorNode => wrap_jso(_blink.BlinkSelection.instance.anchorNode_Getter_(unwrap_jso(this)));
@@ -28241,6 +32541,21 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerClient._() { throw new UnsupportedError("Not supported"); }
 
+  static ServiceWorkerClient internalCreateServiceWorkerClient() {
+    return new ServiceWorkerClient._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ServiceWorkerClient._internalWrap() {
+    return new ServiceWorkerClient.internal_();
+  }
+
+  ServiceWorkerClient.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ServiceWorkerClient.id')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28266,11 +32581,26 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerClients._() { throw new UnsupportedError("Not supported"); }
 
+  static ServiceWorkerClients internalCreateServiceWorkerClients() {
+    return new ServiceWorkerClients._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ServiceWorkerClients._internalWrap() {
+    return new ServiceWorkerClients.internal_();
+  }
+
+  ServiceWorkerClients.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   Future getAll([Map options]) {
     if (options != null) {
-      return _blink.BlinkServiceWorkerClients.instance.getAll_Callback_1_(unwrap_jso(this), options);
+      return wrap_jso(_blink.BlinkServiceWorkerClients.instance.getAll_Callback_1_(unwrap_jso(this), convertDartToNative_Dictionary(options)));
     }
-    return _blink.BlinkServiceWorkerClients.instance.getAll_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkServiceWorkerClients.instance.getAll_Callback_0_(unwrap_jso(this)));
   }
 
 }
@@ -28288,6 +32618,21 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerContainer._() { throw new UnsupportedError("Not supported"); }
 
+  static ServiceWorkerContainer internalCreateServiceWorkerContainer() {
+    return new ServiceWorkerContainer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ServiceWorkerContainer._internalWrap() {
+    return new ServiceWorkerContainer.internal_();
+  }
+
+  ServiceWorkerContainer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ServiceWorkerContainer.controller')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28296,20 +32641,20 @@
   @DomName('ServiceWorkerContainer.ready')
   @DocsEditable()
   @Experimental() // untriaged
-  Future get ready => _blink.BlinkServiceWorkerContainer.instance.ready_Getter_(unwrap_jso(this));
+  Future get ready => wrap_jso(_blink.BlinkServiceWorkerContainer.instance.ready_Getter_(unwrap_jso(this)));
   
   Future getRegistration([String documentURL]) {
     if (documentURL != null) {
-      return _blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_1_(unwrap_jso(this), documentURL);
+      return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_1_(unwrap_jso(this), documentURL));
     }
-    return _blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.getRegistration_Callback_0_(unwrap_jso(this)));
   }
 
   Future register(String url, [Map options]) {
     if (options != null) {
-      return _blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(unwrap_jso(this), url, options);
+      return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_2_(unwrap_jso(this), url, convertDartToNative_Dictionary(options)));
     }
-    return _blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(unwrap_jso(this), url);
+    return wrap_jso(_blink.BlinkServiceWorkerContainer.instance.register_Callback_1_(unwrap_jso(this), url));
   }
 
 }
@@ -28332,6 +32677,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<MessageEvent> messageEvent = const EventStreamProvider<MessageEvent>('message');
 
+
+  static ServiceWorkerGlobalScope internalCreateServiceWorkerGlobalScope() {
+    return new ServiceWorkerGlobalScope._internalWrap();
+  }
+
+  factory ServiceWorkerGlobalScope._internalWrap() {
+    return new ServiceWorkerGlobalScope.internal_();
+  }
+
+  ServiceWorkerGlobalScope.internal_() : super.internal_();
+
+
   @DomName('ServiceWorkerGlobalScope.caches')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28354,16 +32711,16 @@
   
   Future _fetch(request, [Map requestInitDict]) {
     if ((request is String || request == null) && requestInitDict == null) {
-      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request));
+      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request)));
     }
     if ((requestInitDict is Map || requestInitDict == null) && (request is String || request == null)) {
-      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), requestInitDict);
+      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), convertDartToNative_Dictionary(requestInitDict)));
     }
     if ((request is _Request || request == null) && requestInitDict == null) {
-      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request));
+      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_1_(unwrap_jso(this), unwrap_jso(request)));
     }
     if ((requestInitDict is Map || requestInitDict == null) && (request is _Request || request == null)) {
-      return _blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), requestInitDict);
+      return wrap_jso(_blink.BlinkServiceWorkerGlobalScope.instance.fetch_Callback_2_(unwrap_jso(this), unwrap_jso(request), convertDartToNative_Dictionary(requestInitDict)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -28388,6 +32745,18 @@
   // To suppress missing implicit constructor warnings.
   factory ServiceWorkerRegistration._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ServiceWorkerRegistration internalCreateServiceWorkerRegistration() {
+    return new ServiceWorkerRegistration._internalWrap();
+  }
+
+  factory ServiceWorkerRegistration._internalWrap() {
+    return new ServiceWorkerRegistration.internal_();
+  }
+
+  ServiceWorkerRegistration.internal_() : super.internal_();
+
+
   @DomName('ServiceWorkerRegistration.active')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28411,7 +32780,7 @@
   @DomName('ServiceWorkerRegistration.unregister')
   @DocsEditable()
   @Experimental() // untriaged
-  Future unregister() => _blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(unwrap_jso(this));
+  Future unregister() => wrap_jso(_blink.BlinkServiceWorkerRegistration.instance.unregister_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28433,6 +32802,18 @@
   @DomName('HTMLShadowElement.HTMLShadowElement')
   @DocsEditable()
   factory ShadowElement() => document.createElement("shadow");
+
+
+  static ShadowElement internalCreateShadowElement() {
+    return new ShadowElement._internalWrap();
+  }
+
+  factory ShadowElement._internalWrap() {
+    return new ShadowElement.internal_();
+  }
+
+  ShadowElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -28446,7 +32827,7 @@
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() => wrap_jso_list(_blink.BlinkHTMLShadowElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
+  List<Node> getDistributedNodes() => wrap_jso(_blink.BlinkHTMLShadowElement.instance.getDistributedNodes_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28464,6 +32845,18 @@
   // To suppress missing implicit constructor warnings.
   factory ShadowRoot._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ShadowRoot internalCreateShadowRoot() {
+    return new ShadowRoot._internalWrap();
+  }
+
+  factory ShadowRoot._internalWrap() {
+    return new ShadowRoot.internal_();
+  }
+
+  ShadowRoot.internal_() : super.internal_();
+
+
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
   Element get activeElement => wrap_jso(_blink.BlinkShadowRoot.instance.activeElement_Getter_(unwrap_jso(this)));
@@ -28479,7 +32872,7 @@
   
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  void set innerHtml(String value) => _blink.BlinkShadowRoot.instance.innerHTML_Setter_(unwrap_jso(this), value);
+  set innerHtml(String value) => _blink.BlinkShadowRoot.instance.innerHTML_Setter_(unwrap_jso(this), value);
   
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
@@ -28489,7 +32882,7 @@
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets => wrap_jso_list(_blink.BlinkShadowRoot.instance.styleSheets_Getter_(unwrap_jso(this)));
+  List<StyleSheet> get styleSheets => wrap_jso(_blink.BlinkShadowRoot.instance.styleSheets_Getter_(unwrap_jso(this)));
   
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
@@ -28505,11 +32898,11 @@
   
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String className) => wrap_jso_list(_blink.BlinkShadowRoot.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), className));
+  List<Node> getElementsByClassName(String className) => wrap_jso(_blink.BlinkShadowRoot.instance.getElementsByClassName_Callback_1_(unwrap_jso(this), className));
   
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) => wrap_jso_list(_blink.BlinkShadowRoot.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), tagName));
+  List<Node> getElementsByTagName(String tagName) => wrap_jso(_blink.BlinkShadowRoot.instance.getElementsByTagName_Callback_1_(unwrap_jso(this), tagName));
   
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
@@ -28536,7 +32929,7 @@
   }
 
   @deprecated
-  void set resetStyleInheritance(bool value) {
+  set resetStyleInheritance(bool value) {
     _shadowRootDeprecationReport();
   }
 
@@ -28548,7 +32941,7 @@
   }
 
   @deprecated
-  void set applyAuthorStyles(bool value) {
+  set applyAuthorStyles(bool value) {
     _shadowRootDeprecationReport();
   }
 }
@@ -28575,9 +32968,21 @@
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
   factory SharedWorker(String scriptURL, [String name]) {
-    return _blink.BlinkSharedWorker.instance.constructorCallback_2_(scriptURL, name);
+    return wrap_jso(_blink.BlinkSharedWorker.instance.constructorCallback_2_(scriptURL, name));
   }
 
+
+  static SharedWorker internalCreateSharedWorker() {
+    return new SharedWorker._internalWrap();
+  }
+
+  factory SharedWorker._internalWrap() {
+    return new SharedWorker.internal_();
+  }
+
+  SharedWorker.internal_() : super.internal_();
+
+
   @DomName('SharedWorker.port')
   @DocsEditable()
   MessagePort get port => wrap_jso(_blink.BlinkSharedWorker.instance.port_Getter_(unwrap_jso(this)));
@@ -28585,7 +32990,7 @@
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  double get workerStart => _blink.BlinkSharedWorker.instance.workerStart_Getter_(unwrap_jso(this));
+  num get workerStart => _blink.BlinkSharedWorker.instance.workerStart_Getter_(unwrap_jso(this));
   
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -28618,6 +33023,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> connectEvent = const EventStreamProvider<Event>('connect');
 
+
+  static SharedWorkerGlobalScope internalCreateSharedWorkerGlobalScope() {
+    return new SharedWorkerGlobalScope._internalWrap();
+  }
+
+  factory SharedWorkerGlobalScope._internalWrap() {
+    return new SharedWorkerGlobalScope.internal_();
+  }
+
+  SharedWorkerGlobalScope.internal_() : super.internal_();
+
+
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28645,6 +33062,18 @@
   // To suppress missing implicit constructor warnings.
   factory SourceBuffer._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SourceBuffer internalCreateSourceBuffer() {
+    return new SourceBuffer._internalWrap();
+  }
+
+  factory SourceBuffer._internalWrap() {
+    return new SourceBuffer.internal_();
+  }
+
+  SourceBuffer.internal_() : super.internal_();
+
+
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28653,7 +33082,7 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Setter_(unwrap_jso(this), value);
+  set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.instance.appendWindowEnd_Setter_(unwrap_jso(this), value);
   
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
@@ -28663,7 +33092,7 @@
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowStart(num value) => _blink.BlinkSourceBuffer.instance.appendWindowStart_Setter_(unwrap_jso(this), value);
+  set appendWindowStart(num value) => _blink.BlinkSourceBuffer.instance.appendWindowStart_Setter_(unwrap_jso(this), value);
   
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
@@ -28677,7 +33106,7 @@
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set mode(String value) => _blink.BlinkSourceBuffer.instance.mode_Setter_(unwrap_jso(this), value);
+  set mode(String value) => _blink.BlinkSourceBuffer.instance.mode_Setter_(unwrap_jso(this), value);
   
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
@@ -28685,7 +33114,7 @@
   
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  void set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(unwrap_jso(this), value);
+  set timestampOffset(num value) => _blink.BlinkSourceBuffer.instance.timestampOffset_Setter_(unwrap_jso(this), value);
   
   @DomName('SourceBuffer.updating')
   @DocsEditable()
@@ -28736,6 +33165,18 @@
   // To suppress missing implicit constructor warnings.
   factory SourceBufferList._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SourceBufferList internalCreateSourceBufferList() {
+    return new SourceBufferList._internalWrap();
+  }
+
+  factory SourceBufferList._internalWrap() {
+    return new SourceBufferList.internal_();
+  }
+
+  SourceBufferList.internal_() : super.internal_();
+
+
   @DomName('SourceBufferList.length')
   @DocsEditable()
   int get length => _blink.BlinkSourceBufferList.instance.length_Getter_(unwrap_jso(this));
@@ -28747,7 +33188,7 @@
   }
 
   SourceBuffer _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSourceBufferList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -28755,7 +33196,7 @@
   // SourceBuffer is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -28807,6 +33248,18 @@
   @DomName('HTMLSourceElement.HTMLSourceElement')
   @DocsEditable()
   factory SourceElement() => document.createElement("source");
+
+
+  static SourceElement internalCreateSourceElement() {
+    return new SourceElement._internalWrap();
+  }
+
+  factory SourceElement._internalWrap() {
+    return new SourceElement.internal_();
+  }
+
+  SourceElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -28822,7 +33275,7 @@
   @DomName('HTMLSourceElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLSourceElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLSourceElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
@@ -28830,7 +33283,7 @@
   
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLSourceElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLSourceElement.instance.media_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
@@ -28840,7 +33293,7 @@
   @DomName('HTMLSourceElement.sizes')
   @DocsEditable()
   @Experimental() // untriaged
-  void set sizes(String value) => _blink.BlinkHTMLSourceElement.instance.sizes_Setter_(unwrap_jso(this), value);
+  set sizes(String value) => _blink.BlinkHTMLSourceElement.instance.sizes_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
@@ -28848,7 +33301,7 @@
   
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLSourceElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLSourceElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
@@ -28858,7 +33311,7 @@
   @DomName('HTMLSourceElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.BlinkHTMLSourceElement.instance.srcset_Setter_(unwrap_jso(this), value);
+  set srcset(String value) => _blink.BlinkHTMLSourceElement.instance.srcset_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
@@ -28866,7 +33319,7 @@
   
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLSourceElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLSourceElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28883,6 +33336,21 @@
   // To suppress missing implicit constructor warnings.
   factory SourceInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static SourceInfo internalCreateSourceInfo() {
+    return new SourceInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SourceInfo._internalWrap() {
+    return new SourceInfo.internal_();
+  }
+
+  SourceInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
@@ -28920,6 +33388,18 @@
   @DomName('HTMLSpanElement.HTMLSpanElement')
   @DocsEditable()
   factory SpanElement() => document.createElement("span");
+
+
+  static SpanElement internalCreateSpanElement() {
+    return new SpanElement._internalWrap();
+  }
+
+  factory SpanElement._internalWrap() {
+    return new SpanElement.internal_();
+  }
+
+  SpanElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -28946,16 +33426,31 @@
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
   factory SpeechGrammar() {
-    return _blink.BlinkSpeechGrammar.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkSpeechGrammar.instance.constructorCallback_0_());
   }
 
+  static SpeechGrammar internalCreateSpeechGrammar() {
+    return new SpeechGrammar._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SpeechGrammar._internalWrap() {
+    return new SpeechGrammar.internal_();
+  }
+
+  SpeechGrammar.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechGrammar.src')
   @DocsEditable()
   String get src => _blink.BlinkSpeechGrammar.instance.src_Getter_(unwrap_jso(this));
   
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkSpeechGrammar.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkSpeechGrammar.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
@@ -28963,7 +33458,7 @@
   
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  void set weight(num value) => _blink.BlinkSpeechGrammar.instance.weight_Setter_(unwrap_jso(this), value);
+  set weight(num value) => _blink.BlinkSpeechGrammar.instance.weight_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28977,16 +33472,31 @@
 @DomName('SpeechGrammarList')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#dfn-speechgrammarlist
 @Experimental()
-class SpeechGrammarList extends NativeFieldWrapperClass2 with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar> implements List<SpeechGrammar> {
+class SpeechGrammarList extends JsoNativeFieldWrapper with ListMixin<SpeechGrammar>, ImmutableListMixin<SpeechGrammar> implements List<SpeechGrammar> {
   // To suppress missing implicit constructor warnings.
   factory SpeechGrammarList._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
   factory SpeechGrammarList() {
-    return _blink.BlinkSpeechGrammarList.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkSpeechGrammarList.instance.constructorCallback_0_());
   }
 
+  static SpeechGrammarList internalCreateSpeechGrammarList() {
+    return new SpeechGrammarList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SpeechGrammarList._internalWrap() {
+    return new SpeechGrammarList.internal_();
+  }
+
+  SpeechGrammarList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
   int get length => _blink.BlinkSpeechGrammarList.instance.length_Getter_(unwrap_jso(this));
@@ -28998,7 +33508,7 @@
   }
 
   SpeechGrammar _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSpeechGrammarList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -29006,7 +33516,7 @@
   // SpeechGrammar is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -29189,9 +33699,21 @@
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
   factory SpeechRecognition() {
-    return _blink.BlinkSpeechRecognition.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkSpeechRecognition.instance.constructorCallback_0_());
   }
 
+
+  static SpeechRecognition internalCreateSpeechRecognition() {
+    return new SpeechRecognition._internalWrap();
+  }
+
+  factory SpeechRecognition._internalWrap() {
+    return new SpeechRecognition.internal_();
+  }
+
+  SpeechRecognition.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -29201,7 +33723,7 @@
   
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  void set continuous(bool value) => _blink.BlinkSpeechRecognition.instance.continuous_Setter_(unwrap_jso(this), value);
+  set continuous(bool value) => _blink.BlinkSpeechRecognition.instance.continuous_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
@@ -29209,7 +33731,7 @@
   
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  void set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.instance.grammars_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.instance.grammars_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
@@ -29217,7 +33739,7 @@
   
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  void set interimResults(bool value) => _blink.BlinkSpeechRecognition.instance.interimResults_Setter_(unwrap_jso(this), value);
+  set interimResults(bool value) => _blink.BlinkSpeechRecognition.instance.interimResults_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
@@ -29225,7 +33747,7 @@
   
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkSpeechRecognition.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkSpeechRecognition.instance.lang_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
@@ -29233,7 +33755,7 @@
   
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  void set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(unwrap_jso(this), value);
+  set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.instance.maxAlternatives_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
@@ -29319,9 +33841,24 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionAlternative._() { throw new UnsupportedError("Not supported"); }
 
+  static SpeechRecognitionAlternative internalCreateSpeechRecognitionAlternative() {
+    return new SpeechRecognitionAlternative._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SpeechRecognitionAlternative._internalWrap() {
+    return new SpeechRecognitionAlternative.internal_();
+  }
+
+  SpeechRecognitionAlternative.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  double get confidence => _blink.BlinkSpeechRecognitionAlternative.instance.confidence_Getter_(unwrap_jso(this));
+  num get confidence => _blink.BlinkSpeechRecognitionAlternative.instance.confidence_Getter_(unwrap_jso(this));
   
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
@@ -29344,6 +33881,18 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionError._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SpeechRecognitionError internalCreateSpeechRecognitionError() {
+    return new SpeechRecognitionError._internalWrap();
+  }
+
+  factory SpeechRecognitionError._internalWrap() {
+    return new SpeechRecognitionError.internal_();
+  }
+
+  SpeechRecognitionError.internal_() : super.internal_();
+
+
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
   String get error => _blink.BlinkSpeechRecognitionError.instance.error_Getter_(unwrap_jso(this));
@@ -29369,6 +33918,18 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SpeechRecognitionEvent internalCreateSpeechRecognitionEvent() {
+    return new SpeechRecognitionEvent._internalWrap();
+  }
+
+  factory SpeechRecognitionEvent._internalWrap() {
+    return new SpeechRecognitionEvent.internal_();
+  }
+
+  SpeechRecognitionEvent.internal_() : super.internal_();
+
+
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
   Document get emma => wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.emma_Getter_(unwrap_jso(this)));
@@ -29383,7 +33944,7 @@
   
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results => wrap_jso_list(_blink.BlinkSpeechRecognitionEvent.instance.results_Getter_(unwrap_jso(this)));
+  List<SpeechRecognitionResult> get results => wrap_jso(_blink.BlinkSpeechRecognitionEvent.instance.results_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -29402,6 +33963,21 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechRecognitionResult._() { throw new UnsupportedError("Not supported"); }
 
+  static SpeechRecognitionResult internalCreateSpeechRecognitionResult() {
+    return new SpeechRecognitionResult._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SpeechRecognitionResult._internalWrap() {
+    return new SpeechRecognitionResult.internal_();
+  }
+
+  SpeechRecognitionResult.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
   bool get isFinal => _blink.BlinkSpeechRecognitionResult.instance.isFinal_Getter_(unwrap_jso(this));
@@ -29430,6 +34006,18 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesis._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SpeechSynthesis internalCreateSpeechSynthesis() {
+    return new SpeechSynthesis._internalWrap();
+  }
+
+  factory SpeechSynthesis._internalWrap() {
+    return new SpeechSynthesis.internal_();
+  }
+
+  SpeechSynthesis.internal_() : super.internal_();
+
+
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
   bool get paused => _blink.BlinkSpeechSynthesis.instance.paused_Getter_(unwrap_jso(this));
@@ -29448,7 +34036,7 @@
   
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() => _blink.BlinkSpeechSynthesis.instance.getVoices_Callback_0_(unwrap_jso(this));
+  List<SpeechSynthesisVoice> getVoices() => wrap_jso(_blink.BlinkSpeechSynthesis.instance.getVoices_Callback_0_(unwrap_jso(this)));
   
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
@@ -29478,13 +34066,25 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static SpeechSynthesisEvent internalCreateSpeechSynthesisEvent() {
+    return new SpeechSynthesisEvent._internalWrap();
+  }
+
+  factory SpeechSynthesisEvent._internalWrap() {
+    return new SpeechSynthesisEvent.internal_();
+  }
+
+  SpeechSynthesisEvent.internal_() : super.internal_();
+
+
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
   int get charIndex => _blink.BlinkSpeechSynthesisEvent.instance.charIndex_Getter_(unwrap_jso(this));
   
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkSpeechSynthesisEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkSpeechSynthesisEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
   
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
@@ -29579,16 +34179,28 @@
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
   factory SpeechSynthesisUtterance([String text]) {
-    return _blink.BlinkSpeechSynthesisUtterance.instance.constructorCallback_1_(text);
+    return wrap_jso(_blink.BlinkSpeechSynthesisUtterance.instance.constructorCallback_1_(text));
   }
 
+
+  static SpeechSynthesisUtterance internalCreateSpeechSynthesisUtterance() {
+    return new SpeechSynthesisUtterance._internalWrap();
+  }
+
+  factory SpeechSynthesisUtterance._internalWrap() {
+    return new SpeechSynthesisUtterance.internal_();
+  }
+
+  SpeechSynthesisUtterance.internal_() : super.internal_();
+
+
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
   String get lang => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Getter_(unwrap_jso(this));
   
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Setter_(unwrap_jso(this), value);
+  set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.lang_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
@@ -29596,7 +34208,7 @@
   
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  void set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Setter_(unwrap_jso(this), value);
+  set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.pitch_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
@@ -29604,7 +34216,7 @@
   
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  void set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Setter_(unwrap_jso(this), value);
+  set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.rate_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
@@ -29612,7 +34224,7 @@
   
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  void set text(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.text_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkSpeechSynthesisUtterance.instance.text_Setter_(unwrap_jso(this), value);
   
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
@@ -29620,7 +34232,7 @@
   
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  void set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.instance.voice_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
@@ -29628,7 +34240,7 @@
   
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Setter_(unwrap_jso(this), value);
+  set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.instance.volume_Setter_(unwrap_jso(this), value);
   
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -29681,6 +34293,21 @@
   // To suppress missing implicit constructor warnings.
   factory SpeechSynthesisVoice._() { throw new UnsupportedError("Not supported"); }
 
+  static SpeechSynthesisVoice internalCreateSpeechSynthesisVoice() {
+    return new SpeechSynthesisVoice._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SpeechSynthesisVoice._internalWrap() {
+    return new SpeechSynthesisVoice.internal_();
+  }
+
+  SpeechSynthesisVoice.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
   bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.instance.default_Getter_(unwrap_jso(this));
@@ -29792,6 +34419,21 @@
   // To suppress missing implicit constructor warnings.
   factory Storage._() { throw new UnsupportedError("Not supported"); }
 
+  static Storage internalCreateStorage() {
+    return new Storage._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Storage._internalWrap() {
+    return new Storage.internal_();
+  }
+
+  Storage.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Storage.length')
   @DocsEditable()
   int get _length => _blink.BlinkStorage.instance.length_Getter_(unwrap_jso(this));
@@ -29882,6 +34524,18 @@
   // To suppress missing implicit constructor warnings.
   factory StorageEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static StorageEvent internalCreateStorageEvent() {
+    return new StorageEvent._internalWrap();
+  }
+
+  factory StorageEvent._internalWrap() {
+    return new StorageEvent.internal_();
+  }
+
+  StorageEvent.internal_() : super.internal_();
+
+
   @DomName('StorageEvent.key')
   @DocsEditable()
   String get key => _blink.BlinkStorageEvent.instance.key_Getter_(unwrap_jso(this));
@@ -29922,6 +34576,21 @@
   // To suppress missing implicit constructor warnings.
   factory StorageInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static StorageInfo internalCreateStorageInfo() {
+    return new StorageInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory StorageInfo._internalWrap() {
+    return new StorageInfo.internal_();
+  }
+
+  StorageInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29948,6 +34617,21 @@
   // To suppress missing implicit constructor warnings.
   factory StorageQuota._() { throw new UnsupportedError("Not supported"); }
 
+  static StorageQuota internalCreateStorageQuota() {
+    return new StorageQuota._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory StorageQuota._internalWrap() {
+    return new StorageQuota.internal_();
+  }
+
+  StorageQuota.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29956,12 +34640,12 @@
   @DomName('StorageQuota.queryInfo')
   @DocsEditable()
   @Experimental() // untriaged
-  Future queryInfo(String type) => _blink.BlinkStorageQuota.instance.queryInfo_Callback_1_(unwrap_jso(this), type);
+  Future queryInfo(String type) => wrap_jso(_blink.BlinkStorageQuota.instance.queryInfo_Callback_1_(unwrap_jso(this), type));
   
   @DomName('StorageQuota.requestPersistentQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  Future requestPersistentQuota(int newQuota) => _blink.BlinkStorageQuota.instance.requestPersistentQuota_Callback_1_(unwrap_jso(this), newQuota);
+  Future requestPersistentQuota(int newQuota) => wrap_jso(_blink.BlinkStorageQuota.instance.requestPersistentQuota_Callback_1_(unwrap_jso(this), newQuota));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30013,6 +34697,18 @@
   @DomName('HTMLStyleElement.HTMLStyleElement')
   @DocsEditable()
   factory StyleElement() => document.createElement("style");
+
+
+  static StyleElement internalCreateStyleElement() {
+    return new StyleElement._internalWrap();
+  }
+
+  factory StyleElement._internalWrap() {
+    return new StyleElement.internal_();
+  }
+
+  StyleElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30026,7 +34722,7 @@
   
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
@@ -30034,7 +34730,7 @@
   
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkHTMLStyleElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkHTMLStyleElement.instance.media_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
@@ -30046,7 +34742,7 @@
   
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkHTMLStyleElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkHTMLStyleElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30064,6 +34760,21 @@
   // To suppress missing implicit constructor warnings.
   factory StyleMedia._() { throw new UnsupportedError("Not supported"); }
 
+  static StyleMedia internalCreateStyleMedia() {
+    return new StyleMedia._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory StyleMedia._internalWrap() {
+    return new StyleMedia.internal_();
+  }
+
+  StyleMedia.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('StyleMedia.type')
   @DocsEditable()
   String get type => _blink.BlinkStyleMedia.instance.type_Getter_(unwrap_jso(this));
@@ -30086,13 +34797,28 @@
   // To suppress missing implicit constructor warnings.
   factory StyleSheet._() { throw new UnsupportedError("Not supported"); }
 
+  static StyleSheet internalCreateStyleSheet() {
+    return new StyleSheet._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory StyleSheet._internalWrap() {
+    return new StyleSheet.internal_();
+  }
+
+  StyleSheet.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('StyleSheet.disabled')
   @DocsEditable()
   bool get disabled => _blink.BlinkStyleSheet.instance.disabled_Getter_(unwrap_jso(this));
   
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkStyleSheet.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkStyleSheet.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('StyleSheet.href')
   @DocsEditable()
@@ -30135,6 +34861,18 @@
   @DomName('HTMLTableCaptionElement.HTMLTableCaptionElement')
   @DocsEditable()
   factory TableCaptionElement() => document.createElement("caption");
+
+
+  static TableCaptionElement internalCreateTableCaptionElement() {
+    return new TableCaptionElement._internalWrap();
+  }
+
+  factory TableCaptionElement._internalWrap() {
+    return new TableCaptionElement.internal_();
+  }
+
+  TableCaptionElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30159,6 +34897,18 @@
   @DomName('HTMLTableCellElement.HTMLTableCellElement')
   @DocsEditable()
   factory TableCellElement() => document.createElement("td");
+
+
+  static TableCellElement internalCreateTableCellElement() {
+    return new TableCellElement._internalWrap();
+  }
+
+  factory TableCellElement._internalWrap() {
+    return new TableCellElement.internal_();
+  }
+
+  TableCellElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30176,7 +34926,7 @@
   
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  void set colSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.colSpan_Setter_(unwrap_jso(this), value);
+  set colSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.colSpan_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
@@ -30184,7 +34934,7 @@
   
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  void set headers(String value) => _blink.BlinkHTMLTableCellElement.instance.headers_Setter_(unwrap_jso(this), value);
+  set headers(String value) => _blink.BlinkHTMLTableCellElement.instance.headers_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
@@ -30192,7 +34942,7 @@
   
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  void set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Setter_(unwrap_jso(this), value);
+  set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.instance.rowSpan_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30211,6 +34961,18 @@
   @DomName('HTMLTableColElement.HTMLTableColElement')
   @DocsEditable()
   factory TableColElement() => document.createElement("col");
+
+
+  static TableColElement internalCreateTableColElement() {
+    return new TableColElement._internalWrap();
+  }
+
+  factory TableColElement._internalWrap() {
+    return new TableColElement.internal_();
+  }
+
+  TableColElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30224,7 +34986,7 @@
   
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  void set span(int value) => _blink.BlinkHTMLTableColElement.instance.span_Setter_(unwrap_jso(this), value);
+  set span(int value) => _blink.BlinkHTMLTableColElement.instance.span_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30261,6 +35023,18 @@
   @DomName('HTMLTableElement.HTMLTableElement')
   @DocsEditable()
   factory TableElement() => document.createElement("table");
+
+
+  static TableElement internalCreateTableElement() {
+    return new TableElement._internalWrap();
+  }
+
+  factory TableElement._internalWrap() {
+    return new TableElement.internal_();
+  }
+
+  TableElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30274,15 +35048,15 @@
   
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  void set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.instance.caption_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.instance.caption_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows => wrap_jso_list(_blink.BlinkHTMLTableElement.instance.rows_Getter_(unwrap_jso(this)));
+  List<Node> get _rows => wrap_jso(_blink.BlinkHTMLTableElement.instance.rows_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies => wrap_jso_list(_blink.BlinkHTMLTableElement.instance.tBodies_Getter_(unwrap_jso(this)));
+  List<Node> get _tBodies => wrap_jso(_blink.BlinkHTMLTableElement.instance.tBodies_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
@@ -30290,7 +35064,7 @@
   
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  void set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tFoot_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tFoot_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
@@ -30298,7 +35072,7 @@
   
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  void set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tHead_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.instance.tHead_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
@@ -30334,9 +35108,9 @@
   
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_1_(unwrap_jso(this), index);
+      return wrap_jso(_blink.BlinkHTMLTableElement.instance.insertRow_Callback_1_(unwrap_jso(this), index));
     }
-    return _blink.BlinkHTMLTableElement.instance.insertRow_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkHTMLTableElement.instance.insertRow_Callback_0_(unwrap_jso(this)));
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30365,6 +35139,18 @@
   @DomName('HTMLTableRowElement.HTMLTableRowElement')
   @DocsEditable()
   factory TableRowElement() => document.createElement("tr");
+
+
+  static TableRowElement internalCreateTableRowElement() {
+    return new TableRowElement._internalWrap();
+  }
+
+  factory TableRowElement._internalWrap() {
+    return new TableRowElement.internal_();
+  }
+
+  TableRowElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30374,7 +35160,7 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells => wrap_jso_list(_blink.BlinkHTMLTableRowElement.instance.cells_Getter_(unwrap_jso(this)));
+  List<Node> get _cells => wrap_jso(_blink.BlinkHTMLTableRowElement.instance.cells_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
@@ -30390,9 +35176,9 @@
   
   HtmlElement _insertCell([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_1_(unwrap_jso(this), index);
+      return wrap_jso(_blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_1_(unwrap_jso(this), index));
     }
-    return _blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkHTMLTableRowElement.instance.insertCell_Callback_0_(unwrap_jso(this)));
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30417,6 +35203,18 @@
 
   // To suppress missing implicit constructor warnings.
   factory TableSectionElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static TableSectionElement internalCreateTableSectionElement() {
+    return new TableSectionElement._internalWrap();
+  }
+
+  factory TableSectionElement._internalWrap() {
+    return new TableSectionElement.internal_();
+  }
+
+  TableSectionElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30426,7 +35224,7 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows => wrap_jso_list(_blink.BlinkHTMLTableSectionElement.instance.rows_Getter_(unwrap_jso(this)));
+  List<Node> get _rows => wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.rows_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
@@ -30434,9 +35232,9 @@
   
   HtmlElement _insertRow([int index]) {
     if (index != null) {
-      return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_1_(unwrap_jso(this), index);
+      return wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_1_(unwrap_jso(this), index));
     }
-    return _blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_0_(unwrap_jso(this));
+    return wrap_jso(_blink.BlinkHTMLTableSectionElement.instance.insertRow_Callback_0_(unwrap_jso(this)));
   }
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -30458,6 +35256,18 @@
   @DomName('HTMLTemplateElement.HTMLTemplateElement')
   @DocsEditable()
   factory TemplateElement() => document.createElement("template");
+
+
+  static TemplateElement internalCreateTemplateElement() {
+    return new TemplateElement._internalWrap();
+  }
+
+  factory TemplateElement._internalWrap() {
+    return new TemplateElement.internal_();
+  }
+
+  TemplateElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30502,6 +35312,18 @@
   // To suppress missing implicit constructor warnings.
   factory Text._() { throw new UnsupportedError("Not supported"); }
 
+
+  static Text internalCreateText() {
+    return new Text._internalWrap();
+  }
+
+  factory Text._internalWrap() {
+    return new Text.internal_();
+  }
+
+  Text.internal_() : super.internal_();
+
+
   @DomName('Text.wholeText')
   @DocsEditable()
   String get wholeText => _blink.BlinkText.instance.wholeText_Getter_(unwrap_jso(this));
@@ -30509,7 +35331,7 @@
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => wrap_jso_list(_blink.BlinkText.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
+  List<Node> getDestinationInsertionPoints() => wrap_jso(_blink.BlinkText.instance.getDestinationInsertionPoints_Callback_0_(unwrap_jso(this)));
   
   @DomName('Text.splitText')
   @DocsEditable()
@@ -30532,6 +35354,18 @@
   @DomName('HTMLTextAreaElement.HTMLTextAreaElement')
   @DocsEditable()
   factory TextAreaElement() => document.createElement("textarea");
+
+
+  static TextAreaElement internalCreateTextAreaElement() {
+    return new TextAreaElement._internalWrap();
+  }
+
+  factory TextAreaElement._internalWrap() {
+    return new TextAreaElement.internal_();
+  }
+
+  TextAreaElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -30545,7 +35379,7 @@
   
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Setter_(unwrap_jso(this), value);
+  set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.instance.autofocus_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
@@ -30553,7 +35387,7 @@
   
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  void set cols(int value) => _blink.BlinkHTMLTextAreaElement.instance.cols_Setter_(unwrap_jso(this), value);
+  set cols(int value) => _blink.BlinkHTMLTextAreaElement.instance.cols_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
@@ -30561,7 +35395,7 @@
   
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
+  set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.instance.defaultValue_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
@@ -30573,7 +35407,7 @@
   @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.instance.dirName_Setter_(unwrap_jso(this), value);
+  set dirName(String value) => _blink.BlinkHTMLTextAreaElement.instance.dirName_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
@@ -30581,7 +35415,7 @@
   
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
@@ -30595,12 +35429,12 @@
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Setter_(unwrap_jso(this), value);
+  set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.instance.inputMode_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => wrap_jso_list(_blink.BlinkHTMLTextAreaElement.instance.labels_Getter_(unwrap_jso(this)));
+  List<Node> get labels => wrap_jso(_blink.BlinkHTMLTextAreaElement.instance.labels_Getter_(unwrap_jso(this)));
   
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
@@ -30608,7 +35442,7 @@
   
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(unwrap_jso(this), value);
+  set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.instance.maxLength_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
@@ -30616,7 +35450,7 @@
   
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkHTMLTextAreaElement.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkHTMLTextAreaElement.instance.name_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
@@ -30624,7 +35458,7 @@
   
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Setter_(unwrap_jso(this), value);
+  set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.instance.placeholder_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
@@ -30632,7 +35466,7 @@
   
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Setter_(unwrap_jso(this), value);
+  set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.instance.readOnly_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
@@ -30640,7 +35474,7 @@
   
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.BlinkHTMLTextAreaElement.instance.required_Setter_(unwrap_jso(this), value);
+  set required(bool value) => _blink.BlinkHTMLTextAreaElement.instance.required_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
@@ -30648,7 +35482,7 @@
   
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  void set rows(int value) => _blink.BlinkHTMLTextAreaElement.instance.rows_Setter_(unwrap_jso(this), value);
+  set rows(int value) => _blink.BlinkHTMLTextAreaElement.instance.rows_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
@@ -30656,7 +35490,7 @@
   
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
+  set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.instance.selectionDirection_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
@@ -30664,7 +35498,7 @@
   
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
+  set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionEnd_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
@@ -30672,7 +35506,7 @@
   
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
+  set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.instance.selectionStart_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
@@ -30696,7 +35530,7 @@
   
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkHTMLTextAreaElement.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkHTMLTextAreaElement.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
@@ -30708,7 +35542,7 @@
   
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  void set wrap(String value) => _blink.BlinkHTMLTextAreaElement.instance.wrap_Setter_(unwrap_jso(this), value);
+  set wrap(String value) => _blink.BlinkHTMLTextAreaElement.instance.wrap_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
@@ -30766,6 +35600,18 @@
   // To suppress missing implicit constructor warnings.
   factory TextEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static TextEvent internalCreateTextEvent() {
+    return new TextEvent._internalWrap();
+  }
+
+  factory TextEvent._internalWrap() {
+    return new TextEvent.internal_();
+  }
+
+  TextEvent.internal_() : super.internal_();
+
+
   @DomName('TextEvent.data')
   @DocsEditable()
   String get data => _blink.BlinkTextEvent.instance.data_Getter_(unwrap_jso(this));
@@ -30788,64 +35634,79 @@
   // To suppress missing implicit constructor warnings.
   factory TextMetrics._() { throw new UnsupportedError("Not supported"); }
 
+  static TextMetrics internalCreateTextMetrics() {
+    return new TextMetrics._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TextMetrics._internalWrap() {
+    return new TextMetrics.internal_();
+  }
+
+  TextMetrics.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('TextMetrics.actualBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxAscent => _blink.BlinkTextMetrics.instance.actualBoundingBoxAscent_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxAscent => _blink.BlinkTextMetrics.instance.actualBoundingBoxAscent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.actualBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxDescent => _blink.BlinkTextMetrics.instance.actualBoundingBoxDescent_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxDescent => _blink.BlinkTextMetrics.instance.actualBoundingBoxDescent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.actualBoundingBoxLeft')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxLeft => _blink.BlinkTextMetrics.instance.actualBoundingBoxLeft_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxLeft => _blink.BlinkTextMetrics.instance.actualBoundingBoxLeft_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.actualBoundingBoxRight')
   @DocsEditable()
   @Experimental() // untriaged
-  double get actualBoundingBoxRight => _blink.BlinkTextMetrics.instance.actualBoundingBoxRight_Getter_(unwrap_jso(this));
+  num get actualBoundingBoxRight => _blink.BlinkTextMetrics.instance.actualBoundingBoxRight_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.alphabeticBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get alphabeticBaseline => _blink.BlinkTextMetrics.instance.alphabeticBaseline_Getter_(unwrap_jso(this));
+  num get alphabeticBaseline => _blink.BlinkTextMetrics.instance.alphabeticBaseline_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.emHeightAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get emHeightAscent => _blink.BlinkTextMetrics.instance.emHeightAscent_Getter_(unwrap_jso(this));
+  num get emHeightAscent => _blink.BlinkTextMetrics.instance.emHeightAscent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.emHeightDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get emHeightDescent => _blink.BlinkTextMetrics.instance.emHeightDescent_Getter_(unwrap_jso(this));
+  num get emHeightDescent => _blink.BlinkTextMetrics.instance.emHeightDescent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.fontBoundingBoxAscent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get fontBoundingBoxAscent => _blink.BlinkTextMetrics.instance.fontBoundingBoxAscent_Getter_(unwrap_jso(this));
+  num get fontBoundingBoxAscent => _blink.BlinkTextMetrics.instance.fontBoundingBoxAscent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.fontBoundingBoxDescent')
   @DocsEditable()
   @Experimental() // untriaged
-  double get fontBoundingBoxDescent => _blink.BlinkTextMetrics.instance.fontBoundingBoxDescent_Getter_(unwrap_jso(this));
+  num get fontBoundingBoxDescent => _blink.BlinkTextMetrics.instance.fontBoundingBoxDescent_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.hangingBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get hangingBaseline => _blink.BlinkTextMetrics.instance.hangingBaseline_Getter_(unwrap_jso(this));
+  num get hangingBaseline => _blink.BlinkTextMetrics.instance.hangingBaseline_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.ideographicBaseline')
   @DocsEditable()
   @Experimental() // untriaged
-  double get ideographicBaseline => _blink.BlinkTextMetrics.instance.ideographicBaseline_Getter_(unwrap_jso(this));
+  num get ideographicBaseline => _blink.BlinkTextMetrics.instance.ideographicBaseline_Getter_(unwrap_jso(this));
   
   @DomName('TextMetrics.width')
   @DocsEditable()
-  double get width => _blink.BlinkTextMetrics.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkTextMetrics.instance.width_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30873,6 +35734,18 @@
   @DocsEditable()
   static const EventStreamProvider<Event> cueChangeEvent = const EventStreamProvider<Event>('cuechange');
 
+
+  static TextTrack internalCreateTextTrack() {
+    return new TextTrack._internalWrap();
+  }
+
+  factory TextTrack._internalWrap() {
+    return new TextTrack.internal_();
+  }
+
+  TextTrack.internal_() : super.internal_();
+
+
   @DomName('TextTrack.activeCues')
   @DocsEditable()
   TextTrackCueList get activeCues => wrap_jso(_blink.BlinkTextTrack.instance.activeCues_Getter_(unwrap_jso(this)));
@@ -30904,7 +35777,7 @@
   
   @DomName('TextTrack.mode')
   @DocsEditable()
-  void set mode(String value) => _blink.BlinkTextTrack.instance.mode_Setter_(unwrap_jso(this), value);
+  set mode(String value) => _blink.BlinkTextTrack.instance.mode_Setter_(unwrap_jso(this), value);
   
   @DomName('TextTrack.regions')
   @DocsEditable()
@@ -30970,13 +35843,25 @@
   @DocsEditable()
   static const EventStreamProvider<Event> exitEvent = const EventStreamProvider<Event>('exit');
 
+
+  static TextTrackCue internalCreateTextTrackCue() {
+    return new TextTrackCue._internalWrap();
+  }
+
+  factory TextTrackCue._internalWrap() {
+    return new TextTrackCue.internal_();
+  }
+
+  TextTrackCue.internal_() : super.internal_();
+
+
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
   num get endTime => _blink.BlinkTextTrackCue.instance.endTime_Getter_(unwrap_jso(this));
   
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  void set endTime(num value) => _blink.BlinkTextTrackCue.instance.endTime_Setter_(unwrap_jso(this), value);
+  set endTime(num value) => _blink.BlinkTextTrackCue.instance.endTime_Setter_(unwrap_jso(this), value);
   
   @DomName('TextTrackCue.id')
   @DocsEditable()
@@ -30984,7 +35869,7 @@
   
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  void set id(String value) => _blink.BlinkTextTrackCue.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkTextTrackCue.instance.id_Setter_(unwrap_jso(this), value);
   
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
@@ -30992,7 +35877,7 @@
   
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  void set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.instance.pauseOnExit_Setter_(unwrap_jso(this), value);
+  set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.instance.pauseOnExit_Setter_(unwrap_jso(this), value);
   
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
@@ -31000,7 +35885,7 @@
   
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  void set startTime(num value) => _blink.BlinkTextTrackCue.instance.startTime_Setter_(unwrap_jso(this), value);
+  set startTime(num value) => _blink.BlinkTextTrackCue.instance.startTime_Setter_(unwrap_jso(this), value);
   
   @DomName('TextTrackCue.track')
   @DocsEditable()
@@ -31028,10 +35913,25 @@
 @DomName('TextTrackCueList')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#texttrackcuelist
 @Experimental()
-class TextTrackCueList extends NativeFieldWrapperClass2 with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue> implements List<TextTrackCue> {
+class TextTrackCueList extends JsoNativeFieldWrapper with ListMixin<TextTrackCue>, ImmutableListMixin<TextTrackCue> implements List<TextTrackCue> {
   // To suppress missing implicit constructor warnings.
   factory TextTrackCueList._() { throw new UnsupportedError("Not supported"); }
 
+  static TextTrackCueList internalCreateTextTrackCueList() {
+    return new TextTrackCueList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TextTrackCueList._internalWrap() {
+    return new TextTrackCueList.internal_();
+  }
+
+  TextTrackCueList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('TextTrackCueList.length')
   @DocsEditable()
   int get length => _blink.BlinkTextTrackCueList.instance.length_Getter_(unwrap_jso(this));
@@ -31043,7 +35943,7 @@
   }
 
   TextTrackCue _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTextTrackCueList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -31051,7 +35951,7 @@
   // TextTrackCue is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -31121,6 +36021,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+
+  static TextTrackList internalCreateTextTrackList() {
+    return new TextTrackList._internalWrap();
+  }
+
+  factory TextTrackList._internalWrap() {
+    return new TextTrackList.internal_();
+  }
+
+  TextTrackList.internal_() : super.internal_();
+
+
   @DomName('TextTrackList.length')
   @DocsEditable()
   int get length => _blink.BlinkTextTrackList.instance.length_Getter_(unwrap_jso(this));
@@ -31132,7 +36044,7 @@
   }
 
   TextTrack _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTextTrackList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -31140,7 +36052,7 @@
   // TextTrack is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -31205,17 +36117,32 @@
   // To suppress missing implicit constructor warnings.
   factory TimeRanges._() { throw new UnsupportedError("Not supported"); }
 
+  static TimeRanges internalCreateTimeRanges() {
+    return new TimeRanges._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TimeRanges._internalWrap() {
+    return new TimeRanges.internal_();
+  }
+
+  TimeRanges.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('TimeRanges.length')
   @DocsEditable()
   int get length => _blink.BlinkTimeRanges.instance.length_Getter_(unwrap_jso(this));
   
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) => _blink.BlinkTimeRanges.instance.end_Callback_1_(unwrap_jso(this), index);
+  num end(int index) => _blink.BlinkTimeRanges.instance.end_Callback_1_(unwrap_jso(this), index);
   
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) => _blink.BlinkTimeRanges.instance.start_Callback_1_(unwrap_jso(this), index);
+  num start(int index) => _blink.BlinkTimeRanges.instance.start_Callback_1_(unwrap_jso(this), index);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31241,6 +36168,21 @@
   // To suppress missing implicit constructor warnings.
   factory Timing._() { throw new UnsupportedError("Not supported"); }
 
+  static Timing internalCreateTiming() {
+    return new Timing._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Timing._internalWrap() {
+    return new Timing.internal_();
+  }
+
+  Timing.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31249,7 +36191,7 @@
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set delay(num value) => _blink.BlinkTiming.instance.delay_Setter_(unwrap_jso(this), value);
+  set delay(num value) => _blink.BlinkTiming.instance.delay_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.direction')
   @DocsEditable()
@@ -31259,7 +36201,7 @@
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) => _blink.BlinkTiming.instance.direction_Setter_(unwrap_jso(this), value);
+  set direction(String value) => _blink.BlinkTiming.instance.direction_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.easing')
   @DocsEditable()
@@ -31269,7 +36211,7 @@
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  void set easing(String value) => _blink.BlinkTiming.instance.easing_Setter_(unwrap_jso(this), value);
+  set easing(String value) => _blink.BlinkTiming.instance.easing_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.endDelay')
   @DocsEditable()
@@ -31279,7 +36221,7 @@
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set endDelay(num value) => _blink.BlinkTiming.instance.endDelay_Setter_(unwrap_jso(this), value);
+  set endDelay(num value) => _blink.BlinkTiming.instance.endDelay_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.fill')
   @DocsEditable()
@@ -31289,7 +36231,7 @@
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  void set fill(String value) => _blink.BlinkTiming.instance.fill_Setter_(unwrap_jso(this), value);
+  set fill(String value) => _blink.BlinkTiming.instance.fill_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.iterationStart')
   @DocsEditable()
@@ -31299,7 +36241,7 @@
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterationStart(num value) => _blink.BlinkTiming.instance.iterationStart_Setter_(unwrap_jso(this), value);
+  set iterationStart(num value) => _blink.BlinkTiming.instance.iterationStart_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.iterations')
   @DocsEditable()
@@ -31309,7 +36251,7 @@
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterations(num value) => _blink.BlinkTiming.instance.iterations_Setter_(unwrap_jso(this), value);
+  set iterations(num value) => _blink.BlinkTiming.instance.iterations_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.playbackRate')
   @DocsEditable()
@@ -31319,7 +36261,7 @@
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.BlinkTiming.instance.playbackRate_Setter_(unwrap_jso(this), value);
+  set playbackRate(num value) => _blink.BlinkTiming.instance.playbackRate_Setter_(unwrap_jso(this), value);
   
   @DomName('Timing.__getter__')
   @DocsEditable()
@@ -31348,6 +36290,18 @@
   @DomName('HTMLTitleElement.HTMLTitleElement')
   @DocsEditable()
   factory TitleElement() => document.createElement("title");
+
+
+  static TitleElement internalCreateTitleElement() {
+    return new TitleElement._internalWrap();
+  }
+
+  factory TitleElement._internalWrap() {
+    return new TitleElement.internal_();
+  }
+
+  TitleElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -31369,18 +36323,33 @@
   // To suppress missing implicit constructor warnings.
   factory Touch._() { throw new UnsupportedError("Not supported"); }
 
+  static Touch internalCreateTouch() {
+    return new Touch._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Touch._internalWrap() {
+    return new Touch.internal_();
+  }
+
+  Touch.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('Touch.clientX')
   @DocsEditable()
-  double get _clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this));
+  num get _clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this));
   
   @DomName('Touch.clientY')
   @DocsEditable()
-  double get _clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this));
+  num get _clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this));
   
   @DomName('Touch.force')
   @DocsEditable()
   @Experimental() // untriaged
-  double get force => _blink.BlinkTouch.instance.force_Getter_(unwrap_jso(this));
+  num get force => _blink.BlinkTouch.instance.force_Getter_(unwrap_jso(this));
   
   @DomName('Touch.identifier')
   @DocsEditable()
@@ -31388,29 +36357,29 @@
   
   @DomName('Touch.pageX')
   @DocsEditable()
-  double get _pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this));
+  num get _pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this));
   
   @DomName('Touch.pageY')
   @DocsEditable()
-  double get _pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this));
+  num get _pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this));
   
   @DomName('Touch.radiusX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this));
+  num get _radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this));
   
   @DomName('Touch.radiusY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this));
+  num get _radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this));
   
   @DomName('Touch.screenX')
   @DocsEditable()
-  double get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this));
+  num get _screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this));
   
   @DomName('Touch.screenY')
   @DocsEditable()
-  double get _screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this));
+  num get _screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this));
   
   @DomName('Touch.target')
   @DocsEditable()
@@ -31421,19 +36390,19 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get rotationAngle => _blink.BlinkTouch.instance.webkitRotationAngle_Getter_(unwrap_jso(this));
+  num get rotationAngle => _blink.BlinkTouch.instance.webkitRotationAngle_Getter_(unwrap_jso(this));
   
 
 // As of Chrome 37, these all changed from long to double.  This code
 // preserves backwards compatability for the time being.
-  int get __clientX => _blink.BlinkTouch.clientX_Getter(unwrap_jso(this)).round();
-  int get __clientY => _blink.BlinkTouch.clientY_Getter(unwrap_jso(this)).round();
-  int get __screenX => _blink.BlinkTouch.screenX_Getter(unwrap_jso(this)).round();
-  int get __screenY => _blink.BlinkTouch.screenY_Getter(unwrap_jso(this)).round();
-  int get __pageX => _blink.BlinkTouch.pageX_Getter(unwrap_jso(this)).round();
-  int get __pageY => _blink.BlinkTouch.pageY_Getter(unwrap_jso(this)).round();
-  int get __radiusX => _blink.BlinkTouch.radiusX_Getter(unwrap_jso(this)).round();
-  int get __radiusY => _blink.BlinkTouch.radiusY_Getter(unwrap_jso(this)).round();
+  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this)).round();
+  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this)).round();
+  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this)).round();
+  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this)).round();
+  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this)).round();
+  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this)).round();
+  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this)).round();
+  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this)).round();
 
   @DomName('Touch.clientX')
   @DomName('Touch.clientY')
@@ -31489,6 +36458,18 @@
   // To suppress missing implicit constructor warnings.
   factory TouchEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static TouchEvent internalCreateTouchEvent() {
+    return new TouchEvent._internalWrap();
+  }
+
+  factory TouchEvent._internalWrap() {
+    return new TouchEvent.internal_();
+  }
+
+  TouchEvent.internal_() : super.internal_();
+
+
   @DomName('TouchEvent.altKey')
   @DocsEditable()
   bool get altKey => _blink.BlinkTouchEvent.instance.altKey_Getter_(unwrap_jso(this));
@@ -31540,7 +36521,7 @@
 @DomName('TouchList')
 // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
 @Experimental()
-class TouchList extends NativeFieldWrapperClass2 with ListMixin<Touch>, ImmutableListMixin<Touch> implements List<Touch> {
+class TouchList extends JsoNativeFieldWrapper with ListMixin<Touch>, ImmutableListMixin<Touch> implements List<Touch> {
   /// NB: This constructor likely does not work as you might expect it to! This
   /// constructor will simply fail (returning null) if you are not on a device
   /// with touch enabled. See dartbug.com/8314.
@@ -31549,6 +36530,21 @@
   // To suppress missing implicit constructor warnings.
   factory TouchList._() { throw new UnsupportedError("Not supported"); }
 
+  static TouchList internalCreateTouchList() {
+    return new TouchList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TouchList._internalWrap() {
+    return new TouchList.internal_();
+  }
+
+  TouchList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -31563,7 +36559,7 @@
   }
 
   Touch _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkTouchList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -31571,7 +36567,7 @@
   // Touch is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -31628,6 +36624,18 @@
   @DomName('HTMLTrackElement.HTMLTrackElement')
   @DocsEditable()
   factory TrackElement() => document.createElement("track");
+
+
+  static TrackElement internalCreateTrackElement() {
+    return new TrackElement._internalWrap();
+  }
+
+  factory TrackElement._internalWrap() {
+    return new TrackElement.internal_();
+  }
+
+  TrackElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -31660,7 +36668,7 @@
   
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(unwrap_jso(this), value);
+  set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.instance.default_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.integrity')
   @DocsEditable()
@@ -31670,7 +36678,7 @@
   @DomName('HTMLTrackElement.integrity')
   @DocsEditable()
   @Experimental() // untriaged
-  void set integrity(String value) => _blink.BlinkHTMLTrackElement.instance.integrity_Setter_(unwrap_jso(this), value);
+  set integrity(String value) => _blink.BlinkHTMLTrackElement.instance.integrity_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
@@ -31678,7 +36686,7 @@
   
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  void set kind(String value) => _blink.BlinkHTMLTrackElement.instance.kind_Setter_(unwrap_jso(this), value);
+  set kind(String value) => _blink.BlinkHTMLTrackElement.instance.kind_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
@@ -31686,7 +36694,7 @@
   
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.BlinkHTMLTrackElement.instance.label_Setter_(unwrap_jso(this), value);
+  set label(String value) => _blink.BlinkHTMLTrackElement.instance.label_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
@@ -31698,7 +36706,7 @@
   
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.BlinkHTMLTrackElement.instance.src_Setter_(unwrap_jso(this), value);
+  set src(String value) => _blink.BlinkHTMLTrackElement.instance.src_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
@@ -31706,7 +36714,7 @@
   
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  void set srclang(String value) => _blink.BlinkHTMLTrackElement.instance.srclang_Setter_(unwrap_jso(this), value);
+  set srclang(String value) => _blink.BlinkHTMLTrackElement.instance.srclang_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
@@ -31727,9 +36735,21 @@
   // To suppress missing implicit constructor warnings.
   factory TrackEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static TrackEvent internalCreateTrackEvent() {
+    return new TrackEvent._internalWrap();
+  }
+
+  factory TrackEvent._internalWrap() {
+    return new TrackEvent.internal_();
+  }
+
+  TrackEvent.internal_() : super.internal_();
+
+
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track => _blink.BlinkTrackEvent.instance.track_Getter_(unwrap_jso(this));
+  Object get track => wrap_jso(_blink.BlinkTrackEvent.instance.track_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31745,9 +36765,21 @@
   // To suppress missing implicit constructor warnings.
   factory TransitionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static TransitionEvent internalCreateTransitionEvent() {
+    return new TransitionEvent._internalWrap();
+  }
+
+  factory TransitionEvent._internalWrap() {
+    return new TransitionEvent.internal_();
+  }
+
+  TransitionEvent.internal_() : super.internal_();
+
+
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.BlinkTransitionEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
+  num get elapsedTime => _blink.BlinkTransitionEvent.instance.elapsedTime_Getter_(unwrap_jso(this));
   
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
@@ -31772,13 +36804,28 @@
   // To suppress missing implicit constructor warnings.
   factory TreeWalker._() { throw new UnsupportedError("Not supported"); }
 
+  static TreeWalker internalCreateTreeWalker() {
+    return new TreeWalker._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TreeWalker._internalWrap() {
+    return new TreeWalker.internal_();
+  }
+
+  TreeWalker.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
   Node get currentNode => wrap_jso(_blink.BlinkTreeWalker.instance.currentNode_Getter_(unwrap_jso(this)));
   
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  void set currentNode(Node value) => _blink.BlinkTreeWalker.instance.currentNode_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set currentNode(Node value) => _blink.BlinkTreeWalker.instance.currentNode_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('TreeWalker.filter')
   @DocsEditable()
@@ -31849,6 +36896,18 @@
   // To suppress missing implicit constructor warnings.
   factory UIEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static UIEvent internalCreateUIEvent() {
+    return new UIEvent._internalWrap();
+  }
+
+  factory UIEvent._internalWrap() {
+    return new UIEvent.internal_();
+  }
+
+  UIEvent.internal_() : super.internal_();
+
+
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
@@ -31925,6 +36984,18 @@
   @DomName('HTMLUListElement.HTMLUListElement')
   @DocsEditable()
   factory UListElement() => document.createElement("ul");
+
+
+  static UListElement internalCreateUListElement() {
+    return new UListElement._internalWrap();
+  }
+
+  factory UListElement._internalWrap() {
+    return new UListElement.internal_();
+  }
+
+  UListElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -31945,6 +37016,18 @@
 class UnknownElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory UnknownElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static UnknownElement internalCreateUnknownElement() {
+    return new UnknownElement._internalWrap();
+  }
+
+  factory UnknownElement._internalWrap() {
+    return new UnknownElement.internal_();
+  }
+
+  UnknownElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -31966,6 +37049,21 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
+  static Url internalCreateUrl() {
+    return new Url._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Url._internalWrap() {
+    return new Url.internal_();
+  }
+
+  Url.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   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.instance.createObjectURL_Callback_1_(unwrap_jso(blob_OR_source_OR_stream));
@@ -32003,7 +37101,7 @@
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.BlinkURL.instance.hash_Setter_(unwrap_jso(this), value);
+  set hash(String value) => _blink.BlinkURL.instance.hash_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.host')
   @DocsEditable()
@@ -32013,7 +37111,7 @@
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.BlinkURL.instance.host_Setter_(unwrap_jso(this), value);
+  set host(String value) => _blink.BlinkURL.instance.host_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.hostname')
   @DocsEditable()
@@ -32023,7 +37121,7 @@
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.BlinkURL.instance.hostname_Setter_(unwrap_jso(this), value);
+  set hostname(String value) => _blink.BlinkURL.instance.hostname_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.href')
   @DocsEditable()
@@ -32033,7 +37131,7 @@
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.BlinkURL.instance.href_Setter_(unwrap_jso(this), value);
+  set href(String value) => _blink.BlinkURL.instance.href_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.origin')
   @DocsEditable()
@@ -32048,7 +37146,7 @@
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.BlinkURL.instance.password_Setter_(unwrap_jso(this), value);
+  set password(String value) => _blink.BlinkURL.instance.password_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.pathname')
   @DocsEditable()
@@ -32058,7 +37156,7 @@
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.BlinkURL.instance.pathname_Setter_(unwrap_jso(this), value);
+  set pathname(String value) => _blink.BlinkURL.instance.pathname_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.port')
   @DocsEditable()
@@ -32068,7 +37166,7 @@
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.BlinkURL.instance.port_Setter_(unwrap_jso(this), value);
+  set port(String value) => _blink.BlinkURL.instance.port_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.protocol')
   @DocsEditable()
@@ -32078,7 +37176,7 @@
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.BlinkURL.instance.protocol_Setter_(unwrap_jso(this), value);
+  set protocol(String value) => _blink.BlinkURL.instance.protocol_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.search')
   @DocsEditable()
@@ -32088,7 +37186,7 @@
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.BlinkURL.instance.search_Setter_(unwrap_jso(this), value);
+  set search(String value) => _blink.BlinkURL.instance.search_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.username')
   @DocsEditable()
@@ -32098,7 +37196,7 @@
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.BlinkURL.instance.username_Setter_(unwrap_jso(this), value);
+  set username(String value) => _blink.BlinkURL.instance.username_Setter_(unwrap_jso(this), value);
   
   @DomName('URL.toString')
   @DocsEditable()
@@ -32128,7 +37226,7 @@
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value);
+  set hash(String value);
 
   @DomName('URLUtils.host')
   @DocsEditable()
@@ -32138,7 +37236,7 @@
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value);
+  set host(String value);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
@@ -32148,7 +37246,7 @@
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value);
+  set hostname(String value);
 
   @DomName('URLUtils.href')
   @DocsEditable()
@@ -32158,7 +37256,7 @@
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value);
+  set href(String value);
 
   @DomName('URLUtils.origin')
   @DocsEditable()
@@ -32173,7 +37271,7 @@
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value);
+  set password(String value);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
@@ -32183,7 +37281,7 @@
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value);
+  set pathname(String value);
 
   @DomName('URLUtils.port')
   @DocsEditable()
@@ -32193,7 +37291,7 @@
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value);
+  set port(String value);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
@@ -32203,7 +37301,7 @@
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value);
+  set protocol(String value);
 
   @DomName('URLUtils.search')
   @DocsEditable()
@@ -32213,7 +37311,7 @@
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value);
+  set search(String value);
 
   @DomName('URLUtils.username')
   @DocsEditable()
@@ -32223,7 +37321,7 @@
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value);
+  set username(String value);
 
   @DomName('URLUtils.toString')
   @DocsEditable()
@@ -32309,6 +37407,21 @@
   // To suppress missing implicit constructor warnings.
   factory ValidityState._() { throw new UnsupportedError("Not supported"); }
 
+  static ValidityState internalCreateValidityState() {
+    return new ValidityState._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ValidityState._internalWrap() {
+    return new ValidityState.internal_();
+  }
+
+  ValidityState.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ValidityState.badInput')
   @DocsEditable()
   bool get badInput => _blink.BlinkValidityState.instance.badInput_Getter_(unwrap_jso(this));
@@ -32363,6 +37476,18 @@
   @DomName('HTMLVideoElement.HTMLVideoElement')
   @DocsEditable()
   factory VideoElement() => document.createElement("video");
+
+
+  static VideoElement internalCreateVideoElement() {
+    return new VideoElement._internalWrap();
+  }
+
+  factory VideoElement._internalWrap() {
+    return new VideoElement.internal_();
+  }
+
+  VideoElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -32376,7 +37501,7 @@
   
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.BlinkHTMLVideoElement.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkHTMLVideoElement.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
@@ -32384,7 +37509,7 @@
   
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  void set poster(String value) => _blink.BlinkHTMLVideoElement.instance.poster_Setter_(unwrap_jso(this), value);
+  set poster(String value) => _blink.BlinkHTMLVideoElement.instance.poster_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
@@ -32414,7 +37539,7 @@
   
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.BlinkHTMLVideoElement.instance.width_Setter_(unwrap_jso(this), value);
+  set width(int value) => _blink.BlinkHTMLVideoElement.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
@@ -32452,6 +37577,21 @@
   // To suppress missing implicit constructor warnings.
   factory VideoPlaybackQuality._() { throw new UnsupportedError("Not supported"); }
 
+  static VideoPlaybackQuality internalCreateVideoPlaybackQuality() {
+    return new VideoPlaybackQuality._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory VideoPlaybackQuality._internalWrap() {
+    return new VideoPlaybackQuality.internal_();
+  }
+
+  VideoPlaybackQuality.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32460,7 +37600,7 @@
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get creationTime => _blink.BlinkVideoPlaybackQuality.instance.creationTime_Getter_(unwrap_jso(this));
+  num get creationTime => _blink.BlinkVideoPlaybackQuality.instance.creationTime_Getter_(unwrap_jso(this));
   
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
@@ -32487,6 +37627,21 @@
   // To suppress missing implicit constructor warnings.
   factory VideoTrack._() { throw new UnsupportedError("Not supported"); }
 
+  static VideoTrack internalCreateVideoTrack() {
+    return new VideoTrack._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory VideoTrack._internalWrap() {
+    return new VideoTrack.internal_();
+  }
+
+  VideoTrack.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('VideoTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32515,7 +37670,7 @@
   @DomName('VideoTrack.selected')
   @DocsEditable()
   @Experimental() // untriaged
-  void set selected(bool value) => _blink.BlinkVideoTrack.instance.selected_Setter_(unwrap_jso(this), value);
+  set selected(bool value) => _blink.BlinkVideoTrack.instance.selected_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32537,6 +37692,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> changeEvent = const EventStreamProvider<Event>('change');
 
+
+  static VideoTrackList internalCreateVideoTrackList() {
+    return new VideoTrackList._internalWrap();
+  }
+
+  factory VideoTrackList._internalWrap() {
+    return new VideoTrackList.internal_();
+  }
+
+  VideoTrackList.internal_() : super.internal_();
+
+
   @DomName('VideoTrackList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32591,9 +37758,21 @@
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
   factory VttCue(num startTime, num endTime, String text) {
-    return _blink.BlinkVTTCue.instance.constructorCallback_3_(startTime, endTime, text);
+    return wrap_jso(_blink.BlinkVTTCue.instance.constructorCallback_3_(startTime, endTime, text));
   }
 
+
+  static VttCue internalCreateVttCue() {
+    return new VttCue._internalWrap();
+  }
+
+  factory VttCue._internalWrap() {
+    return new VttCue.internal_();
+  }
+
+  VttCue.internal_() : super.internal_();
+
+
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32602,7 +37781,7 @@
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  void set align(String value) => _blink.BlinkVTTCue.instance.align_Setter_(unwrap_jso(this), value);
+  set align(String value) => _blink.BlinkVTTCue.instance.align_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.line')
   @DocsEditable()
@@ -32612,7 +37791,7 @@
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  void set line(int value) => _blink.BlinkVTTCue.instance.line_Setter_(unwrap_jso(this), value);
+  set line(int value) => _blink.BlinkVTTCue.instance.line_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.position')
   @DocsEditable()
@@ -32622,7 +37801,7 @@
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  void set position(int value) => _blink.BlinkVTTCue.instance.position_Setter_(unwrap_jso(this), value);
+  set position(int value) => _blink.BlinkVTTCue.instance.position_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.regionId')
   @DocsEditable()
@@ -32632,7 +37811,7 @@
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionId(String value) => _blink.BlinkVTTCue.instance.regionId_Setter_(unwrap_jso(this), value);
+  set regionId(String value) => _blink.BlinkVTTCue.instance.regionId_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.size')
   @DocsEditable()
@@ -32642,7 +37821,7 @@
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  void set size(int value) => _blink.BlinkVTTCue.instance.size_Setter_(unwrap_jso(this), value);
+  set size(int value) => _blink.BlinkVTTCue.instance.size_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
@@ -32652,7 +37831,7 @@
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  void set snapToLines(bool value) => _blink.BlinkVTTCue.instance.snapToLines_Setter_(unwrap_jso(this), value);
+  set snapToLines(bool value) => _blink.BlinkVTTCue.instance.snapToLines_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.text')
   @DocsEditable()
@@ -32662,7 +37841,7 @@
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.BlinkVTTCue.instance.text_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkVTTCue.instance.text_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.vertical')
   @DocsEditable()
@@ -32672,7 +37851,7 @@
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  void set vertical(String value) => _blink.BlinkVTTCue.instance.vertical_Setter_(unwrap_jso(this), value);
+  set vertical(String value) => _blink.BlinkVTTCue.instance.vertical_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
@@ -32697,9 +37876,24 @@
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
   factory VttRegion() {
-    return _blink.BlinkVTTRegion.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkVTTRegion.instance.constructorCallback_0_());
   }
 
+  static VttRegion internalCreateVttRegion() {
+    return new VttRegion._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory VttRegion._internalWrap() {
+    return new VttRegion.internal_();
+  }
+
+  VttRegion.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32708,7 +37902,7 @@
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(int value) => _blink.BlinkVTTRegion.instance.height_Setter_(unwrap_jso(this), value);
+  set height(int value) => _blink.BlinkVTTRegion.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.id')
   @DocsEditable()
@@ -32718,7 +37912,7 @@
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  void set id(String value) => _blink.BlinkVTTRegion.instance.id_Setter_(unwrap_jso(this), value);
+  set id(String value) => _blink.BlinkVTTRegion.instance.id_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
@@ -32728,7 +37922,7 @@
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorX(num value) => _blink.BlinkVTTRegion.instance.regionAnchorX_Setter_(unwrap_jso(this), value);
+  set regionAnchorX(num value) => _blink.BlinkVTTRegion.instance.regionAnchorX_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
@@ -32738,7 +37932,7 @@
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorY(num value) => _blink.BlinkVTTRegion.instance.regionAnchorY_Setter_(unwrap_jso(this), value);
+  set regionAnchorY(num value) => _blink.BlinkVTTRegion.instance.regionAnchorY_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.scroll')
   @DocsEditable()
@@ -32748,7 +37942,7 @@
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void set scroll(String value) => _blink.BlinkVTTRegion.instance.scroll_Setter_(unwrap_jso(this), value);
+  set scroll(String value) => _blink.BlinkVTTRegion.instance.scroll_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.track')
   @DocsEditable()
@@ -32763,7 +37957,7 @@
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorX(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorX_Setter_(unwrap_jso(this), value);
+  set viewportAnchorX(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorX_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
@@ -32773,7 +37967,7 @@
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorY(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorY_Setter_(unwrap_jso(this), value);
+  set viewportAnchorY(num value) => _blink.BlinkVTTRegion.instance.viewportAnchorY_Setter_(unwrap_jso(this), value);
   
   @DomName('VTTRegion.width')
   @DocsEditable()
@@ -32783,7 +37977,7 @@
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.BlinkVTTRegion.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkVTTRegion.instance.width_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32800,6 +37994,21 @@
   // To suppress missing implicit constructor warnings.
   factory VttRegionList._() { throw new UnsupportedError("Not supported"); }
 
+  static VttRegionList internalCreateVttRegionList() {
+    return new VttRegionList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory VttRegionList._internalWrap() {
+    return new VttRegionList.internal_();
+  }
+
+  VttRegionList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32808,12 +38017,12 @@
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.instance.getRegionById_Callback_1_(unwrap_jso(this), id);
+  VttRegion getRegionById(String id) => wrap_jso(_blink.BlinkVTTRegionList.instance.getRegionById_Callback_1_(unwrap_jso(this), id));
   
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) => _blink.BlinkVTTRegionList.instance.item_Callback_1_(unwrap_jso(this), index);
+  VttRegion item(int index) => wrap_jso(_blink.BlinkVTTRegionList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32912,17 +38121,30 @@
   @DocsEditable()
   factory WebSocket(String url, [protocol_OR_protocols]) {
     if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return _blink.BlinkWebSocket.instance.constructorCallback_1_(url);
+      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_1_(url));
     }
     if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return _blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocol_OR_protocols);
+      return wrap_jso(_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.instance.constructorCallback_2_(url, protocol_OR_protocols);
+      List protocols_1 = convertDartToNative_StringArray(protocol_OR_protocols);
+      return wrap_jso(_blink.BlinkWebSocket.instance.constructorCallback_2_(url, protocols_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static WebSocket internalCreateWebSocket() {
+    return new WebSocket._internalWrap();
+  }
+
+  factory WebSocket._internalWrap() {
+    return new WebSocket.internal_();
+  }
+
+  WebSocket.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -32948,7 +38170,7 @@
   
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.BlinkWebSocket.instance.binaryType_Setter_(unwrap_jso(this), value);
+  set binaryType(String value) => _blink.BlinkWebSocket.instance.binaryType_Setter_(unwrap_jso(this), value);
   
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
@@ -33077,12 +38299,24 @@
       'relatedTarget': relatedTarget,
     };
 
-    return _blink.BlinkWheelEvent.constructorCallback_2(type, options);
+    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options)));
   }
 
   // To suppress missing implicit constructor warnings.
   factory WheelEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static WheelEvent internalCreateWheelEvent() {
+    return new WheelEvent._internalWrap();
+  }
+
+  factory WheelEvent._internalWrap() {
+    return new WheelEvent.internal_();
+  }
+
+  WheelEvent.internal_() : super.internal_();
+
+
   @DomName('WheelEvent.DOM_DELTA_LINE')
   @DocsEditable()
   static const int DOM_DELTA_LINE = 0x01;
@@ -33101,15 +38335,15 @@
   
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
-  double get _deltaX => _blink.BlinkWheelEvent.instance.deltaX_Getter_(unwrap_jso(this));
+  num get _deltaX => _blink.BlinkWheelEvent.instance.deltaX_Getter_(unwrap_jso(this));
   
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
-  double get _deltaY => _blink.BlinkWheelEvent.instance.deltaY_Getter_(unwrap_jso(this));
+  num get _deltaY => _blink.BlinkWheelEvent.instance.deltaY_Getter_(unwrap_jso(this));
   
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
-  double get deltaZ => _blink.BlinkWheelEvent.instance.deltaZ_Getter_(unwrap_jso(this));
+  num get deltaZ => _blink.BlinkWheelEvent.instance.deltaZ_Getter_(unwrap_jso(this));
   
 
   /**
@@ -33411,6 +38645,18 @@
   @Experimental()
   static const EventStreamProvider<AnimationEvent> animationStartEvent = const EventStreamProvider<AnimationEvent>('webkitAnimationStart');
 
+
+  static Window internalCreateWindow() {
+    return new Window._internalWrap();
+  }
+
+  factory Window._internalWrap() {
+    return new Window.internal_();
+  }
+
+  Window.internal_() : super.internal_();
+
+
   /**
    * Indicates that file system data cannot be cleared unless given user
    * permission.
@@ -33501,7 +38747,7 @@
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultStatus(String value) => _blink.BlinkWindow.instance.defaultStatus_Setter_(unwrap_jso(this), value);
+  set defaultStatus(String value) => _blink.BlinkWindow.instance.defaultStatus_Setter_(unwrap_jso(this), value);
   
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
@@ -33513,7 +38759,7 @@
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultstatus(String value) => _blink.BlinkWindow.instance.defaultstatus_Setter_(unwrap_jso(this), value);
+  set defaultstatus(String value) => _blink.BlinkWindow.instance.defaultstatus_Setter_(unwrap_jso(this), value);
   
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -33531,7 +38777,7 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  double get devicePixelRatio => _blink.BlinkWindow.instance.devicePixelRatio_Getter_(unwrap_jso(this));
+  num get devicePixelRatio => _blink.BlinkWindow.instance.devicePixelRatio_Getter_(unwrap_jso(this));
   
   @DomName('Window.document')
   @DocsEditable()
@@ -33655,7 +38901,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  void set name(String value) => _blink.BlinkWindow.instance.name_Setter_(unwrap_jso(this), value);
+  set name(String value) => _blink.BlinkWindow.instance.name_Setter_(unwrap_jso(this), value);
   
   /**
    * The user agent accessing this window.
@@ -33690,7 +38936,7 @@
   
   @DomName('Window.opener')
   @DocsEditable()
-  void set opener(Window value) => _blink.BlinkWindow.instance.opener_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set opener(Window value) => _blink.BlinkWindow.instance.opener_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('Window.orientation')
   @DocsEditable()
@@ -33737,7 +38983,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  double get _pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(unwrap_jso(this));
+  num get _pageXOffset => _blink.BlinkWindow.instance.pageXOffset_Getter_(unwrap_jso(this));
   
   /**
    * The distance this window has been scrolled vertically.
@@ -33753,7 +38999,7 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  double get _pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(unwrap_jso(this));
+  num get _pageYOffset => _blink.BlinkWindow.instance.pageYOffset_Getter_(unwrap_jso(this));
   
   @DomName('Window.parent')
   @DocsEditable()
@@ -33840,11 +39086,11 @@
   
   @DomName('Window.scrollX')
   @DocsEditable()
-  double get _scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(unwrap_jso(this));
+  num get _scrollX => _blink.BlinkWindow.instance.scrollX_Getter_(unwrap_jso(this));
   
   @DomName('Window.scrollY')
   @DocsEditable()
-  double get _scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(unwrap_jso(this));
+  num get _scrollY => _blink.BlinkWindow.instance.scrollY_Getter_(unwrap_jso(this));
   
   /**
    * This window's scroll bars.
@@ -33911,7 +39157,7 @@
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  void set status(String value) => _blink.BlinkWindow.instance.status_Setter_(unwrap_jso(this), value);
+  set status(String value) => _blink.BlinkWindow.instance.status_Setter_(unwrap_jso(this), value);
   
   /**
    * This window's status bar.
@@ -33972,10 +39218,10 @@
   
   WindowBase __getter__(index_OR_name) {
     if ((index_OR_name is int)) {
-      return _blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return wrap_jso(_blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
     }
     if ((index_OR_name is String)) {
-      return _blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name));
+      return wrap_jso(_blink.BlinkWindow.instance.$__getter___Callback_1_(unwrap_jso(this), unwrap_jso(index_OR_name)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -34019,7 +39265,7 @@
   
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.BlinkWindow.instance.getComputedStyle_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement);
+  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => wrap_jso(_blink.BlinkWindow.instance.getComputedStyle_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement));
   
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -34027,7 +39273,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.instance.getMatchedCSSRules_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement);
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => wrap_jso(_blink.BlinkWindow.instance.getMatchedCSSRules_Callback_2_(unwrap_jso(this), unwrap_jso(element), pseudoElement));
   
   /**
    * Returns the currently selected text.
@@ -34079,18 +39325,18 @@
   
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) => _blink.BlinkWindow.instance.open_Callback_3_(unwrap_jso(this), url, name, options);
+  WindowBase open(String url, String name, [String options]) => wrap_jso(_blink.BlinkWindow.instance.open_Callback_3_(unwrap_jso(this), url, name, options));
   
   SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
     if (creationCallback != null) {
-      return _blink.BlinkWindow.instance.openDatabase_Callback_5_(unwrap_jso(this), name, version, displayName, estimatedSize, unwrap_jso(creationCallback));
+      return wrap_jso(_blink.BlinkWindow.instance.openDatabase_Callback_5_(unwrap_jso(this), name, version, displayName, estimatedSize, unwrap_jso((database) => creationCallback(wrap_jso(database)))));
     }
-    return _blink.BlinkWindow.instance.openDatabase_Callback_4_(unwrap_jso(this), name, version, displayName, estimatedSize);
+    return wrap_jso(_blink.BlinkWindow.instance.openDatabase_Callback_4_(unwrap_jso(this), name, version, displayName, estimatedSize));
   }
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(unwrap_jso(this), message, targetOrigin, transfer);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
   
   /**
    * Opens the print dialog for this window.
@@ -34106,7 +39352,7 @@
   
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.instance.requestAnimationFrame_Callback_1_(unwrap_jso(this), unwrap_jso((highResTime) => callback(highResTime)));
   
   /**
    * Resizes this window by an offset.
@@ -34138,7 +39384,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     if ((y is int) && (x is int) && scrollOptions == null) {
@@ -34146,7 +39392,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scroll_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -34158,7 +39404,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     if ((y is int) && (x is int) && scrollOptions == null) {
@@ -34166,7 +39412,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scrollBy_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -34178,7 +39424,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is num) && (x is num)) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     if ((y is int) && (x is int) && scrollOptions == null) {
@@ -34186,7 +39432,7 @@
       return;
     }
     if ((scrollOptions is Map) && (y is int) && (x is int)) {
-      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), scrollOptions);
+      _blink.BlinkWindow.instance.scrollTo_Callback_3_(unwrap_jso(this), unwrap_jso(x), unwrap_jso(y), convertDartToNative_Dictionary(scrollOptions));
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
@@ -34220,10 +39466,10 @@
   
   void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso(successCallback));
+    _blink.BlinkWindow.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))));
     return;
   }
 
@@ -34237,10 +39483,10 @@
 
   void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso(successCallback));
+    _blink.BlinkWindow.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
     return;
   }
 
@@ -34873,9 +40119,21 @@
   @DomName('Worker.Worker')
   @DocsEditable()
   factory Worker(String scriptUrl) {
-    return _blink.BlinkWorker.instance.constructorCallback_1_(scriptUrl);
+    return wrap_jso(_blink.BlinkWorker.instance.constructorCallback_1_(scriptUrl));
   }
 
+
+  static Worker internalCreateWorker() {
+    return new Worker._internalWrap();
+  }
+
+  factory Worker._internalWrap() {
+    return new Worker.internal_();
+  }
+
+  Worker.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -34913,6 +40171,18 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerConsole._() { throw new UnsupportedError("Not supported"); }
 
+
+  static WorkerConsole internalCreateWorkerConsole() {
+    return new WorkerConsole._internalWrap();
+  }
+
+  factory WorkerConsole._internalWrap() {
+    return new WorkerConsole.internal_();
+  }
+
+  WorkerConsole.internal_() : super.internal_();
+
+
 }
 // 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
@@ -34939,6 +40209,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+
+  static WorkerGlobalScope internalCreateWorkerGlobalScope() {
+    return new WorkerGlobalScope._internalWrap();
+  }
+
+  factory WorkerGlobalScope._internalWrap() {
+    return new WorkerGlobalScope.internal_();
+  }
+
+  WorkerGlobalScope.internal_() : super.internal_();
+
+
   @DomName('WorkerGlobalScope.PERSISTENT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -34996,11 +40278,11 @@
   
   void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_4_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (successCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso(successCallback));
+      _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_3_(unwrap_jso(this), type, size, unwrap_jso((fileSystem) => successCallback(wrap_jso(fileSystem))));
       return;
     }
     _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystem_Callback_2_(unwrap_jso(this), type, size);
@@ -35021,7 +40303,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystemSync_Callback_2_(unwrap_jso(this), type, size);
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.webkitRequestFileSystemSync_Callback_2_(unwrap_jso(this), type, size));
   
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -35029,14 +40311,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemSyncURL_Callback_1_(unwrap_jso(this), url);
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => wrap_jso(_blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemSyncURL_Callback_1_(unwrap_jso(this), url));
   
   void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) {
     if (errorCallback != null) {
-      _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+      _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_3_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso(successCallback));
+    _blink.BlinkWorkerGlobalScope.instance.webkitResolveLocalFileSystemURL_Callback_2_(unwrap_jso(this), url, unwrap_jso((entry) => successCallback(wrap_jso(entry))));
     return;
   }
 
@@ -35099,6 +40381,21 @@
   // To suppress missing implicit constructor warnings.
   factory WorkerPerformance._() { throw new UnsupportedError("Not supported"); }
 
+  static WorkerPerformance internalCreateWorkerPerformance() {
+    return new WorkerPerformance._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory WorkerPerformance._internalWrap() {
+    return new WorkerPerformance.internal_();
+  }
+
+  WorkerPerformance.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WorkerPerformance.memory')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35107,7 +40404,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(unwrap_jso(this));
+  num now() => _blink.BlinkWorkerPerformance.instance.now_Callback_0_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35128,9 +40425,24 @@
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
   factory XPathEvaluator() {
-    return _blink.BlinkXPathEvaluator.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkXPathEvaluator.instance.constructorCallback_0_());
   }
 
+  static XPathEvaluator internalCreateXPathEvaluator() {
+    return new XPathEvaluator._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XPathEvaluator._internalWrap() {
+    return new XPathEvaluator.internal_();
+  }
+
+  XPathEvaluator.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
   XPathExpression createExpression(String expression, XPathNSResolver resolver) => wrap_jso(_blink.BlinkXPathEvaluator.instance.createExpression_Callback_2_(unwrap_jso(this), expression, unwrap_jso(resolver)));
@@ -35159,6 +40471,21 @@
   // To suppress missing implicit constructor warnings.
   factory XPathExpression._() { throw new UnsupportedError("Not supported"); }
 
+  static XPathExpression internalCreateXPathExpression() {
+    return new XPathExpression._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XPathExpression._internalWrap() {
+    return new XPathExpression.internal_();
+  }
+
+  XPathExpression.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
   XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => wrap_jso(_blink.BlinkXPathExpression.instance.evaluate_Callback_3_(unwrap_jso(this), unwrap_jso(contextNode), type, unwrap_jso(inResult)));
@@ -35179,6 +40506,21 @@
   // To suppress missing implicit constructor warnings.
   factory XPathNSResolver._() { throw new UnsupportedError("Not supported"); }
 
+  static XPathNSResolver internalCreateXPathNSResolver() {
+    return new XPathNSResolver._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XPathNSResolver._internalWrap() {
+    return new XPathNSResolver.internal_();
+  }
+
+  XPathNSResolver.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
   String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.instance.lookupNamespaceURI_Callback_1_(unwrap_jso(this), prefix);
@@ -35199,6 +40541,21 @@
   // To suppress missing implicit constructor warnings.
   factory XPathResult._() { throw new UnsupportedError("Not supported"); }
 
+  static XPathResult internalCreateXPathResult() {
+    return new XPathResult._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XPathResult._internalWrap() {
+    return new XPathResult.internal_();
+  }
+
+  XPathResult.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('XPathResult.ANY_TYPE')
   @DocsEditable()
   static const int ANY_TYPE = 0;
@@ -35249,7 +40606,7 @@
   
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  double get numberValue => _blink.BlinkXPathResult.instance.numberValue_Getter_(unwrap_jso(this));
+  num get numberValue => _blink.BlinkXPathResult.instance.numberValue_Getter_(unwrap_jso(this));
   
   @DomName('XPathResult.resultType')
   @DocsEditable()
@@ -35290,6 +40647,18 @@
   // To suppress missing implicit constructor warnings.
   factory XmlDocument._() { throw new UnsupportedError("Not supported"); }
 
+
+  static XmlDocument internalCreateXmlDocument() {
+    return new XmlDocument._internalWrap();
+  }
+
+  factory XmlDocument._internalWrap() {
+    return new XmlDocument.internal_();
+  }
+
+  XmlDocument.internal_() : super.internal_();
+
+
 }
 // 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
@@ -35309,9 +40678,24 @@
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
   factory XmlSerializer() {
-    return _blink.BlinkXMLSerializer.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkXMLSerializer.instance.constructorCallback_0_());
   }
 
+  static XmlSerializer internalCreateXmlSerializer() {
+    return new XmlSerializer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XmlSerializer._internalWrap() {
+    return new XmlSerializer.internal_();
+  }
+
+  XmlSerializer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
   String serializeToString(Node node) => _blink.BlinkXMLSerializer.instance.serializeToString_Callback_1_(unwrap_jso(this), unwrap_jso(node));
@@ -35337,9 +40721,24 @@
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
   factory XsltProcessor() {
-    return _blink.BlinkXSLTProcessor.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkXSLTProcessor.instance.constructorCallback_0_());
   }
 
+  static XsltProcessor internalCreateXsltProcessor() {
+    return new XsltProcessor._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory XsltProcessor._internalWrap() {
+    return new XsltProcessor.internal_();
+  }
+
+  XsltProcessor.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -35389,6 +40788,18 @@
   // To suppress missing implicit constructor warnings.
   factory _Attr._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _Attr internalCreate_Attr() {
+    return new _Attr._internalWrap();
+  }
+
+  factory _Attr._internalWrap() {
+    return new _Attr.internal_();
+  }
+
+  _Attr.internal_() : super.internal_();
+
+
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35416,7 +40827,7 @@
   @DomName('Attr.textContent')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.BlinkAttr.instance.textContent_Setter_(unwrap_jso(this), value);
+  set text(String value) => _blink.BlinkAttr.instance.textContent_Setter_(unwrap_jso(this), value);
   
   @DomName('Attr.value')
   @DocsEditable()
@@ -35424,7 +40835,7 @@
   
   @DomName('Attr.value')
   @DocsEditable()
-  void set value(String value) => _blink.BlinkAttr.instance.value_Setter_(unwrap_jso(this), value);
+  set value(String value) => _blink.BlinkAttr.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35438,10 +40849,22 @@
 @DomName('CSSPrimitiveValue')
 // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface
 @deprecated // deprecated
-abstract class _CSSPrimitiveValue extends _CSSValue {
+class _CSSPrimitiveValue extends _CSSValue {
   // To suppress missing implicit constructor warnings.
   factory _CSSPrimitiveValue._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _CSSPrimitiveValue internalCreate_CSSPrimitiveValue() {
+    return new _CSSPrimitiveValue._internalWrap();
+  }
+
+  factory _CSSPrimitiveValue._internalWrap() {
+    return new _CSSPrimitiveValue.internal_();
+  }
+
+  _CSSPrimitiveValue.internal_() : super.internal_();
+
+
 }
 // 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
@@ -35454,10 +40877,22 @@
 @DomName('CSSUnknownRule')
 // http://dev.w3.org/csswg/cssom/#the-cssstylesheet-interface
 @deprecated // deprecated
-abstract class _CSSUnknownRule extends CssRule {
+class _CSSUnknownRule extends CssRule {
   // To suppress missing implicit constructor warnings.
   factory _CSSUnknownRule._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _CSSUnknownRule internalCreate_CSSUnknownRule() {
+    return new _CSSUnknownRule._internalWrap();
+  }
+
+  factory _CSSUnknownRule._internalWrap() {
+    return new _CSSUnknownRule.internal_();
+  }
+
+  _CSSUnknownRule.internal_() : super.internal_();
+
+
 }
 // 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
@@ -35470,10 +40905,25 @@
 @DomName('CSSValue')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _CSSValue extends NativeFieldWrapperClass2 {
+class _CSSValue extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _CSSValue._() { throw new UnsupportedError("Not supported"); }
 
+  static _CSSValue internalCreate_CSSValue() {
+    return new _CSSValue._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _CSSValue._internalWrap() {
+    return new _CSSValue.internal_();
+  }
+
+  _CSSValue.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -35485,10 +40935,25 @@
 @DocsEditable()
 @DomName('Cache')
 @Experimental() // untriaged
-abstract class _Cache extends NativeFieldWrapperClass2 {
+class _Cache extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _Cache._() { throw new UnsupportedError("Not supported"); }
 
+  static _Cache internalCreate_Cache() {
+    return new _Cache._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _Cache._internalWrap() {
+    return new _Cache.internal_();
+  }
+
+  _Cache.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -35500,7 +40965,7 @@
 @DocsEditable()
 @DomName('CanvasPathMethods')
 @Experimental() // untriaged
-abstract class _CanvasPathMethods extends NativeFieldWrapperClass2 {
+class _CanvasPathMethods extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _CanvasPathMethods._() { throw new UnsupportedError("Not supported"); }
 
@@ -35606,29 +41071,42 @@
     // To suppress missing implicit constructor warnings.
   factory _ClientRect._() { throw new UnsupportedError("Not supported"); }
 
+  static _ClientRect internalCreate_ClientRect() {
+    return new _ClientRect._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _ClientRect._internalWrap() {
+    return new _ClientRect.internal_();
+  }
+
+  _ClientRect.internal_() { }
+
+
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  double get bottom => _blink.BlinkClientRect.instance.bottom_Getter_(unwrap_jso(this));
+  num get bottom => _blink.BlinkClientRect.instance.bottom_Getter_(unwrap_jso(this));
   
   @DomName('ClientRect.height')
   @DocsEditable()
-  double get height => _blink.BlinkClientRect.instance.height_Getter_(unwrap_jso(this));
+  num get height => _blink.BlinkClientRect.instance.height_Getter_(unwrap_jso(this));
   
   @DomName('ClientRect.left')
   @DocsEditable()
-  double get left => _blink.BlinkClientRect.instance.left_Getter_(unwrap_jso(this));
+  num get left => _blink.BlinkClientRect.instance.left_Getter_(unwrap_jso(this));
   
   @DomName('ClientRect.right')
   @DocsEditable()
-  double get right => _blink.BlinkClientRect.instance.right_Getter_(unwrap_jso(this));
+  num get right => _blink.BlinkClientRect.instance.right_Getter_(unwrap_jso(this));
   
   @DomName('ClientRect.top')
   @DocsEditable()
-  double get top => _blink.BlinkClientRect.instance.top_Getter_(unwrap_jso(this));
+  num get top => _blink.BlinkClientRect.instance.top_Getter_(unwrap_jso(this));
   
   @DomName('ClientRect.width')
   @DocsEditable()
-  double get width => _blink.BlinkClientRect.instance.width_Getter_(unwrap_jso(this));
+  num get width => _blink.BlinkClientRect.instance.width_Getter_(unwrap_jso(this));
   }
 
 /**
@@ -35676,10 +41154,25 @@
 
 @DocsEditable()
 @DomName('ClientRectList')
-class _ClientRectList extends NativeFieldWrapperClass2 with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle> {
+class _ClientRectList extends JsoNativeFieldWrapper with ListMixin<Rectangle>, ImmutableListMixin<Rectangle> implements List<Rectangle> {
   // To suppress missing implicit constructor warnings.
   factory _ClientRectList._() { throw new UnsupportedError("Not supported"); }
 
+  static _ClientRectList internalCreate_ClientRectList() {
+    return new _ClientRectList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _ClientRectList._internalWrap() {
+    return new _ClientRectList.internal_();
+  }
+
+  _ClientRectList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ClientRectList.length')
   @DocsEditable()
   int get length => _blink.BlinkClientRectList.instance.length_Getter_(unwrap_jso(this));
@@ -35691,7 +41184,7 @@
   }
 
   Rectangle _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkClientRectList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -35699,7 +41192,7 @@
   // Rectangle is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35746,10 +41239,25 @@
 @DomName('Counter')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _Counter extends NativeFieldWrapperClass2 {
+class _Counter extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _Counter._() { throw new UnsupportedError("Not supported"); }
 
+  static _Counter internalCreate_Counter() {
+    return new _Counter._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _Counter._internalWrap() {
+    return new _Counter.internal_();
+  }
+
+  _Counter.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -35760,10 +41268,25 @@
 
 @DocsEditable()
 @DomName('CSSRuleList')
-class _CssRuleList extends NativeFieldWrapperClass2 with ListMixin<CssRule>, ImmutableListMixin<CssRule> implements List<CssRule> {
+class _CssRuleList extends JsoNativeFieldWrapper with ListMixin<CssRule>, ImmutableListMixin<CssRule> implements List<CssRule> {
   // To suppress missing implicit constructor warnings.
   factory _CssRuleList._() { throw new UnsupportedError("Not supported"); }
 
+  static _CssRuleList internalCreate_CssRuleList() {
+    return new _CssRuleList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _CssRuleList._internalWrap() {
+    return new _CssRuleList.internal_();
+  }
+
+  _CssRuleList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('CSSRuleList.length')
   @DocsEditable()
   int get length => _blink.BlinkCSSRuleList.instance.length_Getter_(unwrap_jso(this));
@@ -35775,7 +41298,7 @@
   }
 
   CssRule _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -35783,7 +41306,7 @@
   // CssRule is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35816,7 +41339,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) => _blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index);
+  CssRule item(int index) => wrap_jso(_blink.BlinkCSSRuleList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35834,6 +41357,18 @@
   // To suppress missing implicit constructor warnings.
   factory _CssValueList._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _CssValueList internalCreate_CssValueList() {
+    return new _CssValueList._internalWrap();
+  }
+
+  factory _CssValueList._internalWrap() {
+    return new _CssValueList.internal_();
+  }
+
+  _CssValueList.internal_() : super.internal_();
+
+
   @DomName('CSSValueList.length')
   @DocsEditable()
   int get length => _blink.BlinkCSSValueList.instance.length_Getter_(unwrap_jso(this));
@@ -35845,7 +41380,7 @@
   }
 
   _CSSValue _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -35853,7 +41388,7 @@
   // _CSSValue is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -35886,7 +41421,7 @@
 
   @DomName('CSSValueList.item')
   @DocsEditable()
-  _CSSValue item(int index) => _blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index);
+  _CSSValue item(int index) => wrap_jso(_blink.BlinkCSSValueList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -35901,10 +41436,25 @@
 @SupportedBrowser(SupportedBrowser.CHROME)
 @Experimental()
 // http://www.w3.org/TR/file-system-api/#the-filesystemsync-interface
-abstract class _DOMFileSystemSync extends NativeFieldWrapperClass2 {
+class _DOMFileSystemSync extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _DOMFileSystemSync._() { throw new UnsupportedError("Not supported"); }
 
+  static _DOMFileSystemSync internalCreate_DOMFileSystemSync() {
+    return new _DOMFileSystemSync._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _DOMFileSystemSync._internalWrap() {
+    return new _DOMFileSystemSync.internal_();
+  }
+
+  _DOMFileSystemSync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -35917,10 +41467,22 @@
 @DomName('DirectoryEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-directoryentrysync-interface
 @Experimental()
-abstract class _DirectoryEntrySync extends _EntrySync {
+class _DirectoryEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
   factory _DirectoryEntrySync._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _DirectoryEntrySync internalCreate_DirectoryEntrySync() {
+    return new _DirectoryEntrySync._internalWrap();
+  }
+
+  factory _DirectoryEntrySync._internalWrap() {
+    return new _DirectoryEntrySync.internal_();
+  }
+
+  _DirectoryEntrySync.internal_() : super.internal_();
+
+
 }
 // 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
@@ -35933,27 +41495,56 @@
 @DomName('DirectoryReaderSync')
 // http://www.w3.org/TR/file-system-api/#idl-def-DirectoryReaderSync
 @Experimental()
-abstract class _DirectoryReaderSync extends NativeFieldWrapperClass2 {
+class _DirectoryReaderSync extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _DirectoryReaderSync._() { throw new UnsupportedError("Not supported"); }
 
+  static _DirectoryReaderSync internalCreate_DirectoryReaderSync() {
+    return new _DirectoryReaderSync._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _DirectoryReaderSync._internalWrap() {
+    return new _DirectoryReaderSync.internal_();
+  }
+
+  _DirectoryReaderSync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('DocumentType')
 // http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
 @deprecated // stable
-abstract class _DocumentType extends Node implements ChildNode {
+class _DocumentType extends Node implements ChildNode {
   // To suppress missing implicit constructor warnings.
   factory _DocumentType._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _DocumentType internalCreate_DocumentType() {
+    return new _DocumentType._internalWrap();
+  }
+
+  factory _DocumentType._internalWrap() {
+    return new _DocumentType.internal_();
+  }
+
+  _DocumentType.internal_() : super.internal_();
+
+
+  // Override this methods for Dartium _DocumentType can't be abstract.
+  Element get nextElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  Element get previousElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.previousElementSibling_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
@@ -35972,20 +41563,32 @@
   @DocsEditable()
   factory _DomRect([num x, num y, num width, num height]) {
     if (height != null) {
-      return _blink.BlinkDOMRect.instance.constructorCallback_4_(x, y, width, height);
+      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_4_(x, y, width, height));
     }
     if (width != null) {
-      return _blink.BlinkDOMRect.instance.constructorCallback_3_(x, y, width);
+      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_3_(x, y, width));
     }
     if (y != null) {
-      return _blink.BlinkDOMRect.instance.constructorCallback_2_(x, y);
+      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_2_(x, y));
     }
     if (x != null) {
-      return _blink.BlinkDOMRect.instance.constructorCallback_1_(x);
+      return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_1_(x));
     }
-    return _blink.BlinkDOMRect.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkDOMRect.instance.constructorCallback_0_());
   }
 
+
+  static _DomRect internalCreate_DomRect() {
+    return new _DomRect._internalWrap();
+  }
+
+  factory _DomRect._internalWrap() {
+    return new _DomRect.internal_();
+  }
+
+  _DomRect.internal_() : super.internal_();
+
+
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
@@ -35994,7 +41597,7 @@
   @DomName('DOMRect.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(num value) => _blink.BlinkDOMRect.instance.height_Setter_(unwrap_jso(this), value);
+  set height(num value) => _blink.BlinkDOMRect.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMRect.width')
   @DocsEditable()
@@ -36004,7 +41607,7 @@
   @DomName('DOMRect.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.BlinkDOMRect.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkDOMRect.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMRect.x')
   @DocsEditable()
@@ -36014,7 +41617,7 @@
   @DomName('DOMRect.x')
   @DocsEditable()
   @Experimental() // untriaged
-  void set x(num value) => _blink.BlinkDOMRect.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkDOMRect.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('DOMRect.y')
   @DocsEditable()
@@ -36024,7 +41627,7 @@
   @DomName('DOMRect.y')
   @DocsEditable()
   @Experimental() // untriaged
-  void set y(num value) => _blink.BlinkDOMRect.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkDOMRect.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36038,10 +41641,25 @@
 @DomName('EntrySync')
 // http://www.w3.org/TR/file-system-api/#idl-def-EntrySync
 @Experimental()
-abstract class _EntrySync extends NativeFieldWrapperClass2 {
+class _EntrySync extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _EntrySync._() { throw new UnsupportedError("Not supported"); }
 
+  static _EntrySync internalCreate_EntrySync() {
+    return new _EntrySync._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _EntrySync._internalWrap() {
+    return new _EntrySync.internal_();
+  }
+
+  _EntrySync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36054,10 +41672,22 @@
 @DomName('FileEntrySync')
 // http://www.w3.org/TR/file-system-api/#the-fileentrysync-interface
 @Experimental()
-abstract class _FileEntrySync extends _EntrySync {
+class _FileEntrySync extends _EntrySync {
   // To suppress missing implicit constructor warnings.
   factory _FileEntrySync._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _FileEntrySync internalCreate_FileEntrySync() {
+    return new _FileEntrySync._internalWrap();
+  }
+
+  factory _FileEntrySync._internalWrap() {
+    return new _FileEntrySync.internal_();
+  }
+
+  _FileEntrySync.internal_() : super.internal_();
+
+
 }
 // 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
@@ -36070,16 +41700,31 @@
 @DomName('FileReaderSync')
 // http://www.w3.org/TR/FileAPI/#FileReaderSync
 @Experimental()
-abstract class _FileReaderSync extends NativeFieldWrapperClass2 {
+class _FileReaderSync extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _FileReaderSync._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
   factory _FileReaderSync() {
-    return _blink.BlinkFileReaderSync.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkFileReaderSync.instance.constructorCallback_0_());
   }
 
+  static _FileReaderSync internalCreate_FileReaderSync() {
+    return new _FileReaderSync._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _FileReaderSync._internalWrap() {
+    return new _FileReaderSync.internal_();
+  }
+
+  _FileReaderSync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36092,10 +41737,25 @@
 @DomName('FileWriterSync')
 // http://www.w3.org/TR/file-writer-api/#idl-def-FileWriterSync
 @Experimental()
-abstract class _FileWriterSync extends NativeFieldWrapperClass2 {
+class _FileWriterSync extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _FileWriterSync._() { throw new UnsupportedError("Not supported"); }
 
+  static _FileWriterSync internalCreate_FileWriterSync() {
+    return new _FileWriterSync._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _FileWriterSync._internalWrap() {
+    return new _FileWriterSync.internal_();
+  }
+
+  _FileWriterSync.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36108,10 +41768,25 @@
 @DomName('GamepadList')
 // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html
 @Experimental()
-class _GamepadList extends NativeFieldWrapperClass2 with ListMixin<Gamepad>, ImmutableListMixin<Gamepad> implements List<Gamepad> {
+class _GamepadList extends JsoNativeFieldWrapper with ListMixin<Gamepad>, ImmutableListMixin<Gamepad> implements List<Gamepad> {
   // To suppress missing implicit constructor warnings.
   factory _GamepadList._() { throw new UnsupportedError("Not supported"); }
 
+  static _GamepadList internalCreate_GamepadList() {
+    return new _GamepadList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _GamepadList._internalWrap() {
+    return new _GamepadList.internal_();
+  }
+
+  _GamepadList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('GamepadList.length')
   @DocsEditable()
   int get length => _blink.BlinkGamepadList.instance.length_Getter_(unwrap_jso(this));
@@ -36123,7 +41798,7 @@
   }
 
   Gamepad _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkGamepadList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -36131,7 +41806,7 @@
   // Gamepad is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -36178,10 +41853,25 @@
 @DomName('HTMLAllCollection')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dom-document-all
 @deprecated // deprecated
-abstract class _HTMLAllCollection extends NativeFieldWrapperClass2 {
+class _HTMLAllCollection extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _HTMLAllCollection._() { throw new UnsupportedError("Not supported"); }
 
+  static _HTMLAllCollection internalCreate_HTMLAllCollection() {
+    return new _HTMLAllCollection._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _HTMLAllCollection._internalWrap() {
+    return new _HTMLAllCollection.internal_();
+  }
+
+  _HTMLAllCollection.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
   Element _item(int index) => wrap_jso(_blink.BlinkHTMLAllCollection.instance.item_Callback_1_(unwrap_jso(this), index));
@@ -36198,9 +41888,21 @@
 @DomName('HTMLAppletElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-applet-element
 @deprecated // deprecated
-abstract class _HTMLAppletElement extends HtmlElement {
+class _HTMLAppletElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLAppletElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLAppletElement internalCreate_HTMLAppletElement() {
+    return new _HTMLAppletElement._internalWrap();
+  }
+
+  factory _HTMLAppletElement._internalWrap() {
+    return new _HTMLAppletElement.internal_();
+  }
+
+  _HTMLAppletElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36220,9 +41922,21 @@
 @DomName('HTMLDirectoryElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#dir
 @deprecated // deprecated
-abstract class _HTMLDirectoryElement extends HtmlElement {
+class _HTMLDirectoryElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLDirectoryElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLDirectoryElement internalCreate_HTMLDirectoryElement() {
+    return new _HTMLDirectoryElement._internalWrap();
+  }
+
+  factory _HTMLDirectoryElement._internalWrap() {
+    return new _HTMLDirectoryElement.internal_();
+  }
+
+  _HTMLDirectoryElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36242,9 +41956,21 @@
 @DomName('HTMLFontElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlfontelement
 @deprecated // deprecated
-abstract class _HTMLFontElement extends HtmlElement {
+class _HTMLFontElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFontElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLFontElement internalCreate_HTMLFontElement() {
+    return new _HTMLFontElement._internalWrap();
+  }
+
+  factory _HTMLFontElement._internalWrap() {
+    return new _HTMLFontElement.internal_();
+  }
+
+  _HTMLFontElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36264,9 +41990,21 @@
 @DomName('HTMLFrameElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#htmlframeelement
 @deprecated // deprecated
-abstract class _HTMLFrameElement extends HtmlElement {
+class _HTMLFrameElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLFrameElement internalCreate_HTMLFrameElement() {
+    return new _HTMLFrameElement._internalWrap();
+  }
+
+  factory _HTMLFrameElement._internalWrap() {
+    return new _HTMLFrameElement.internal_();
+  }
+
+  _HTMLFrameElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36279,16 +42017,26 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('HTMLFrameSetElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#frameset
 @deprecated // deprecated
-abstract class _HTMLFrameSetElement extends HtmlElement implements WindowEventHandlers {
+class _HTMLFrameSetElement extends HtmlElement implements WindowEventHandlers {
   // To suppress missing implicit constructor warnings.
   factory _HTMLFrameSetElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLFrameSetElement internalCreate_HTMLFrameSetElement() {
+    return new _HTMLFrameSetElement._internalWrap();
+  }
+
+  factory _HTMLFrameSetElement._internalWrap() {
+    return new _HTMLFrameSetElement.internal_();
+  }
+
+  _HTMLFrameSetElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36296,7 +42044,16 @@
    */
   _HTMLFrameSetElement.created() : super.created();
 
+  // Override these methods for Dartium _HTMLFrameSetElement can't be abstract.
+  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+  Stream<Event> get onOffline => offlineEvent.forTarget(this);
+  Stream<Event> get onOnline => onlineEvent.forTarget(this);
+  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
+  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
+  Stream<Event> get onUnload => unloadEvent.forTarget(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
 // BSD-style license that can be found in the LICENSE file.
@@ -36308,9 +42065,21 @@
 @DomName('HTMLMarqueeElement')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/obsolete.html#the-marquee-element
 @deprecated // deprecated
-abstract class _HTMLMarqueeElement extends HtmlElement {
+class _HTMLMarqueeElement extends HtmlElement {
   // To suppress missing implicit constructor warnings.
   factory _HTMLMarqueeElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _HTMLMarqueeElement internalCreate_HTMLMarqueeElement() {
+    return new _HTMLMarqueeElement._internalWrap();
+  }
+
+  factory _HTMLMarqueeElement._internalWrap() {
+    return new _HTMLMarqueeElement.internal_();
+  }
+
+  _HTMLMarqueeElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -36327,7 +42096,7 @@
 @DomName('MutationEvent')
 // http://www.w3.org/TR/DOM-Level-3-Events/#events-mutationevents
 @deprecated
-abstract class _MutationEvent extends Event {
+class _MutationEvent extends Event {
   factory _MutationEvent(String type,
       {bool canBubble: false, bool cancelable: false, Node relatedNode,
       String prevValue, String newValue, String attrName, int attrChange: 0}) {
@@ -36340,6 +42109,18 @@
   // To suppress missing implicit constructor warnings.
   factory _MutationEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _MutationEvent internalCreate_MutationEvent() {
+    return new _MutationEvent._internalWrap();
+  }
+
+  factory _MutationEvent._internalWrap() {
+    return new _MutationEvent.internal_();
+  }
+
+  _MutationEvent.internal_() : super.internal_();
+
+
 }
 // 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
@@ -36352,10 +42133,25 @@
 @DomName('NamedNodeMap')
 // http://dom.spec.whatwg.org/#namednodemap
 @deprecated // deprecated
-class _NamedNodeMap extends NativeFieldWrapperClass2 with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
+class _NamedNodeMap extends JsoNativeFieldWrapper with ListMixin<Node>, ImmutableListMixin<Node> implements List<Node> {
   // To suppress missing implicit constructor warnings.
   factory _NamedNodeMap._() { throw new UnsupportedError("Not supported"); }
 
+  static _NamedNodeMap internalCreate_NamedNodeMap() {
+    return new _NamedNodeMap._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _NamedNodeMap._internalWrap() {
+    return new _NamedNodeMap.internal_();
+  }
+
+  _NamedNodeMap.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('NamedNodeMap.length')
   @DocsEditable()
   int get length => _blink.BlinkNamedNodeMap.instance.length_Getter_(unwrap_jso(this));
@@ -36367,7 +42163,7 @@
   }
 
   Node _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkNamedNodeMap.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -36375,7 +42171,7 @@
   // Node is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -36449,10 +42245,25 @@
 @DocsEditable()
 @DomName('PagePopupController')
 @deprecated // nonstandard
-abstract class _PagePopupController extends NativeFieldWrapperClass2 {
+class _PagePopupController extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _PagePopupController._() { throw new UnsupportedError("Not supported"); }
 
+  static _PagePopupController internalCreate_PagePopupController() {
+    return new _PagePopupController._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _PagePopupController._internalWrap() {
+    return new _PagePopupController.internal_();
+  }
+
+  _PagePopupController.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36465,10 +42276,25 @@
 @DomName('RGBColor')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _RGBColor extends NativeFieldWrapperClass2 {
+class _RGBColor extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _RGBColor._() { throw new UnsupportedError("Not supported"); }
 
+  static _RGBColor internalCreate_RGBColor() {
+    return new _RGBColor._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _RGBColor._internalWrap() {
+    return new _RGBColor.internal_();
+  }
+
+  _RGBColor.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36476,10 +42302,22 @@
 
 
 @DomName('RadioNodeList')
-abstract class _RadioNodeList extends NodeList {
+class _RadioNodeList extends NodeList {
   // To suppress missing implicit constructor warnings.
   factory _RadioNodeList._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _RadioNodeList internalCreate_RadioNodeList() {
+    return new _RadioNodeList._internalWrap();
+  }
+
+  factory _RadioNodeList._internalWrap() {
+    return new _RadioNodeList.internal_();
+  }
+
+  _RadioNodeList.internal_() : super.internal_();
+
+
 }
 // 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
@@ -36492,10 +42330,25 @@
 @DomName('Rect')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _Rect extends NativeFieldWrapperClass2 {
+class _Rect extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _Rect._() { throw new UnsupportedError("Not supported"); }
 
+  static _Rect internalCreate_Rect() {
+    return new _Rect._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _Rect._internalWrap() {
+    return new _Rect.internal_();
+  }
+
+  _Rect.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36515,20 +42368,34 @@
   @DocsEditable()
   factory _Request(input, [Map requestInitDict]) {
     if ((input is String || input == null) && requestInitDict == null) {
-      return _blink.BlinkRequest.instance.constructorCallback_1_(input);
+      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
     }
     if ((requestInitDict is Map || requestInitDict == null) && (input is String || input == null)) {
-      return _blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict);
+      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
+      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1));
     }
     if ((input is _Request || input == null) && requestInitDict == null) {
-      return _blink.BlinkRequest.instance.constructorCallback_1_(input);
+      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_1_(input));
     }
     if ((requestInitDict is Map || requestInitDict == null) && (input is _Request || input == null)) {
-      return _blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict);
+      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict);
+      return wrap_jso(_blink.BlinkRequest.instance.constructorCallback_2_(input, requestInitDict_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static _Request internalCreate_Request() {
+    return new _Request._internalWrap();
+  }
+
+  factory _Request._internalWrap() {
+    return new _Request.internal_();
+  }
+
+  _Request.internal_() : super.internal_();
+
+
   @DomName('Request.credentials')
   @DocsEditable()
   @Experimental() // untriaged
@@ -36557,7 +42424,7 @@
   @DomName('Request.clone')
   @DocsEditable()
   @Experimental() // untriaged
-  _Request clone() => _blink.BlinkRequest.instance.clone_Callback_0_(unwrap_jso(this));
+  _Request clone() => wrap_jso(_blink.BlinkRequest.instance.clone_Callback_0_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -36570,7 +42437,7 @@
 @DocsEditable()
 @DomName('Response')
 @Experimental() // untriaged
-abstract class _Response extends Body {
+class _Response extends Body {
   // To suppress missing implicit constructor warnings.
   factory _Response._() { throw new UnsupportedError("Not supported"); }
 
@@ -36578,48 +42445,77 @@
   @DocsEditable()
   factory _Response(body_OR_input, [Map requestInitDict_OR_responseInitDict]) {
     if ((body_OR_input is String || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
     }
     if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is String || body_OR_input == null)) {
-      return _blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_OR_responseInitDict);
+      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, responseInitDict_1));
     }
     if ((body_OR_input is Blob || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
     }
     if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is Blob || body_OR_input == null)) {
-      return _blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_OR_responseInitDict);
+      var responseInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, responseInitDict_1));
     }
     if ((body_OR_input is TypedData || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
     }
     if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is TypedData || body_OR_input == null)) {
-      return _blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_OR_responseInitDict);
+      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_1));
     }
     if ((body_OR_input is ByteBuffer || body_OR_input == null) && requestInitDict_OR_responseInitDict == null) {
-      return _blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_1_(body_OR_input));
     }
     if ((requestInitDict_OR_responseInitDict is Map || requestInitDict_OR_responseInitDict == null) && (body_OR_input is ByteBuffer || body_OR_input == null)) {
-      return _blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_OR_responseInitDict);
+      var requestInitDict_1 = convertDartToNative_Dictionary(requestInitDict_OR_responseInitDict);
+      return wrap_jso(_blink.BlinkResponse.instance.constructorCallback_2_(body_OR_input, requestInitDict_1));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
+
+  static _Response internalCreate_Response() {
+    return new _Response._internalWrap();
+  }
+
+  factory _Response._internalWrap() {
+    return new _Response.internal_();
+  }
+
+  _Response.internal_() : super.internal_();
+
+
 }
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('ServiceWorker')
 @Experimental() // untriaged
-abstract class _ServiceWorker extends EventTarget implements AbstractWorker {
+class _ServiceWorker extends EventTarget implements AbstractWorker {
   // To suppress missing implicit constructor warnings.
   factory _ServiceWorker._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _ServiceWorker internalCreate_ServiceWorker() {
+    return new _ServiceWorker._internalWrap();
+  }
+
+  factory _ServiceWorker._internalWrap() {
+    return new _ServiceWorker.internal_();
+  }
+
+  _ServiceWorker.internal_() : super.internal_();
+
+
+  // Override these methods for Dartium _ServiceWorker can't be abstract.
+  Stream<ErrorEvent> get onError => errorEvent.forTarget(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
 // BSD-style license that can be found in the LICENSE file.
@@ -36631,10 +42527,25 @@
 @DomName('SpeechRecognitionResultList')
 // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#speechrecognitionresultlist
 @Experimental()
-class _SpeechRecognitionResultList extends NativeFieldWrapperClass2 with ListMixin<SpeechRecognitionResult>, ImmutableListMixin<SpeechRecognitionResult> implements List<SpeechRecognitionResult> {
+class _SpeechRecognitionResultList extends JsoNativeFieldWrapper with ListMixin<SpeechRecognitionResult>, ImmutableListMixin<SpeechRecognitionResult> implements List<SpeechRecognitionResult> {
   // To suppress missing implicit constructor warnings.
   factory _SpeechRecognitionResultList._() { throw new UnsupportedError("Not supported"); }
 
+  static _SpeechRecognitionResultList internalCreate_SpeechRecognitionResultList() {
+    return new _SpeechRecognitionResultList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _SpeechRecognitionResultList._internalWrap() {
+    return new _SpeechRecognitionResultList.internal_();
+  }
+
+  _SpeechRecognitionResultList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
   int get length => _blink.BlinkSpeechRecognitionResultList.instance.length_Getter_(unwrap_jso(this));
@@ -36646,7 +42557,7 @@
   }
 
   SpeechRecognitionResult _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSpeechRecognitionResultList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -36654,7 +42565,7 @@
   // SpeechRecognitionResult is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -36699,10 +42610,25 @@
 
 @DocsEditable()
 @DomName('StyleSheetList')
-class _StyleSheetList extends NativeFieldWrapperClass2 with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet> implements List<StyleSheet> {
+class _StyleSheetList extends JsoNativeFieldWrapper with ListMixin<StyleSheet>, ImmutableListMixin<StyleSheet> implements List<StyleSheet> {
   // To suppress missing implicit constructor warnings.
   factory _StyleSheetList._() { throw new UnsupportedError("Not supported"); }
 
+  static _StyleSheetList internalCreate_StyleSheetList() {
+    return new _StyleSheetList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _StyleSheetList._internalWrap() {
+    return new _StyleSheetList.internal_();
+  }
+
+  _StyleSheetList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('StyleSheetList.length')
   @DocsEditable()
   int get length => _blink.BlinkStyleSheetList.instance.length_Getter_(unwrap_jso(this));
@@ -36714,7 +42640,7 @@
   }
 
   StyleSheet _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkStyleSheetList.instance.item_Callback_1_(unwrap_jso(this), index));
- 
+
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -36722,7 +42648,7 @@
   // StyleSheet is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -36755,7 +42681,7 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.instance.$__getter___Callback_1_(unwrap_jso(this), name);
+  CssStyleSheet __getter__(String name) => wrap_jso(_blink.BlinkStyleSheetList.instance.$__getter___Callback_1_(unwrap_jso(this), name));
   
   @DomName('StyleSheetList.item')
   @DocsEditable()
@@ -36772,10 +42698,25 @@
 @DocsEditable()
 @DomName('SubtleCrypto')
 @Experimental() // untriaged
-abstract class _SubtleCrypto extends NativeFieldWrapperClass2 {
+class _SubtleCrypto extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _SubtleCrypto._() { throw new UnsupportedError("Not supported"); }
 
+  static _SubtleCrypto internalCreate_SubtleCrypto() {
+    return new _SubtleCrypto._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _SubtleCrypto._internalWrap() {
+    return new _SubtleCrypto.internal_();
+  }
+
+  _SubtleCrypto.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36788,10 +42729,22 @@
 @DomName('WebKitCSSFilterValue')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _WebKitCSSFilterValue extends _CssValueList {
+class _WebKitCSSFilterValue extends _CssValueList {
   // To suppress missing implicit constructor warnings.
   factory _WebKitCSSFilterValue._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _WebKitCSSFilterValue internalCreate_WebKitCSSFilterValue() {
+    return new _WebKitCSSFilterValue._internalWrap();
+  }
+
+  factory _WebKitCSSFilterValue._internalWrap() {
+    return new _WebKitCSSFilterValue.internal_();
+  }
+
+  _WebKitCSSFilterValue.internal_() : super.internal_();
+
+
 }
 // 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
@@ -36807,16 +42760,31 @@
 @Experimental()
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _WebKitCSSMatrix extends NativeFieldWrapperClass2 {
+class _WebKitCSSMatrix extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _WebKitCSSMatrix._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
   factory _WebKitCSSMatrix([String cssValue]) {
-    return _blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue);
+    return wrap_jso(_blink.BlinkWebKitCSSMatrix.instance.constructorCallback_1_(cssValue));
   }
 
+  static _WebKitCSSMatrix internalCreate_WebKitCSSMatrix() {
+    return new _WebKitCSSMatrix._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _WebKitCSSMatrix._internalWrap() {
+    return new _WebKitCSSMatrix.internal_();
+  }
+
+  _WebKitCSSMatrix.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -36829,10 +42797,22 @@
 @DomName('WebKitCSSTransformValue')
 // http://dev.w3.org/csswg/cssom/
 @deprecated // deprecated
-abstract class _WebKitCSSTransformValue extends _CssValueList {
+class _WebKitCSSTransformValue extends _CssValueList {
   // To suppress missing implicit constructor warnings.
   factory _WebKitCSSTransformValue._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _WebKitCSSTransformValue internalCreate_WebKitCSSTransformValue() {
+    return new _WebKitCSSTransformValue._internalWrap();
+  }
+
+  factory _WebKitCSSTransformValue._internalWrap() {
+    return new _WebKitCSSTransformValue.internal_();
+  }
+
+  _WebKitCSSTransformValue.internal_() : super.internal_();
+
+
 }
 // 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
@@ -36873,34 +42853,82 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('WorkerLocation')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workerlocation
 @Experimental()
-abstract class _WorkerLocation extends NativeFieldWrapperClass2 implements UrlUtilsReadOnly {
+class _WorkerLocation extends NativeFieldWrapperClass2 implements UrlUtilsReadOnly {
   // To suppress missing implicit constructor warnings.
   factory _WorkerLocation._() { throw new UnsupportedError("Not supported"); }
 
+  static _WorkerLocation internalCreate_WorkerLocation() {
+    return new _WorkerLocation._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _WorkerLocation._internalWrap() {
+    return new _WorkerLocation.internal_();
+  }
+
+  _WorkerLocation.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  // Override these methods for Dartium _WorkerLocation can't be abstract.
+  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('WorkerNavigator')
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/workers.html#workernavigator
 @Experimental()
-abstract class _WorkerNavigator extends NativeFieldWrapperClass2 implements NavigatorCpu, NavigatorOnLine, NavigatorID {
+class _WorkerNavigator extends NativeFieldWrapperClass2 implements NavigatorCpu, NavigatorOnLine, NavigatorID {
   // To suppress missing implicit constructor warnings.
   factory _WorkerNavigator._() { throw new UnsupportedError("Not supported"); }
 
+  static _WorkerNavigator internalCreate_WorkerNavigator() {
+    return new _WorkerNavigator._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory _WorkerNavigator._internalWrap() {
+    return new _WorkerNavigator.internal_();
+  }
+
+  _WorkerNavigator.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
+  // Override these methods for Dartium _WorkerNavigator can't be abstract.
+  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
+  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
+  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(unwrap_jso(this));
+  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(unwrap_jso(this));
+  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(unwrap_jso(this));
+  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(unwrap_jso(this));
+  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(unwrap_jso(this));
+  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(unwrap_jso(this));
+  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
@@ -36915,6 +42943,18 @@
   // To suppress missing implicit constructor warnings.
   factory _XMLHttpRequestProgressEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static _XMLHttpRequestProgressEvent internalCreate_XMLHttpRequestProgressEvent() {
+    return new _XMLHttpRequestProgressEvent._internalWrap();
+  }
+
+  factory _XMLHttpRequestProgressEvent._internalWrap() {
+    return new _XMLHttpRequestProgressEvent.internal_();
+  }
+
+  _XMLHttpRequestProgressEvent.internal_() : super.internal_();
+
+
 }
 // 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
@@ -37605,7 +43645,7 @@
    * `height` function in jQuery and the calculated `height` CSS value,
    * converted to a num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     if (newHeight is Dimension) {
       if (newHeight.value < 0) newHeight = new Dimension.px(0);
       _element.style.height = newHeight.toString();
@@ -37623,7 +43663,7 @@
    * and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     if (newWidth is Dimension) {
       if (newWidth.value < 0) newWidth = new Dimension.px(0);
       _element.style.width = newWidth.toString();
@@ -37658,7 +43698,7 @@
    * function in jQuery and the calculated `height` CSS value, converted to a
    * num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     _elementList.forEach((e) => e.contentEdge.height = newHeight);
   }
 
@@ -37668,7 +43708,7 @@
    * This is equivalent to the `width` function in jQuery and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     _elementList.forEach((e) => e.contentEdge.width = newWidth);
   }
 }
@@ -37775,7 +43815,7 @@
    *
    * Note that only the content height can actually be set via this method.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     throw new UnsupportedError("Can only set height for content rect.");
   }
 
@@ -37789,7 +43829,7 @@
    *
    * Note that only the content width can be set via this method.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     throw new UnsupportedError("Can only set width for content rect.");
   }
 
@@ -38783,11 +44823,11 @@
   }
 
   bool allowsElement(Element element) {
-    return _allowedElements.contains(element.tagName);
+    return _allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     var validator = _attributeValidators['$tagName::$attributeName'];
     if (validator == null) {
       validator = _attributeValidators['*::$attributeName'];
@@ -40449,11 +46489,11 @@
   }
 
   bool allowsElement(Element element) {
-    return allowedElements.contains(element.tagName);
+    return allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     if (allowedUriAttributes.contains('$tagName::$attributeName')) {
       return uriPolicy.allowsUri(value);
     } else if (allowedUriAttributes.contains('*::$attributeName')) {
@@ -40494,10 +46534,10 @@
       var isAttr = element.attributes['is'];
       if (isAttr != null) {
         return allowedElements.contains(isAttr.toUpperCase()) &&
-          allowedElements.contains(element.tagName);
+          allowedElements.contains(element._safeTagName);
       }
     }
-    return allowCustomTag && allowedElements.contains(element.tagName);
+    return allowCustomTag && allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
@@ -40553,7 +46593,7 @@
     // foreignobject tag as SvgElement. We don't want foreignobject contents
     // anyway, so just remove the whole tree outright. And we can't rely
     // on IE recognizing the SvgForeignObject type, so go by tagName. Bug 23144
-    if (element is svg.SvgElement && element.tagName == 'foreignObject') {
+    if (element is svg.SvgElement && element._safeTagName == 'foreignObject') {
       return false;
     }
     if (element is svg.SvgElement) {
@@ -40667,7 +46707,7 @@
   /**
    * A sanitizer for trees that we trust. It does no validation and allows
    * any elements. It is also more efficient, since it can pass the text
-   * directly through to the underlying APIs without creating a document 
+   * directly through to the underlying APIs without creating a document
    * fragment to be sanitized.
    */
   static const trusted = const _TrustedHtmlTreeSanitizer();
@@ -40682,7 +46722,7 @@
 
   sanitizeTree(Node node) {}
 }
-  
+
 /**
  * Defines the policy for what types of uris are allowed for particular
  * attribute values.
@@ -40736,14 +46776,14 @@
 
   bool allowsElement(Element element) {
     if (!validator.allowsElement(element)) {
-      throw new ArgumentError(element.tagName);
+      throw new ArgumentError(element._safeTagName);
     }
     return true;
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
     if (!validator.allowsAttribute(element, attributeName, value)) {
-      throw new ArgumentError('${element.tagName}[$attributeName="$value"]');
+      throw new ArgumentError('${element._safeTagName}[$attributeName="$value"]');
     }
   }
 }
@@ -40808,10 +46848,7 @@
     try {
       elementText = element.toString();
     } catch(e) {}
-    var elementTagName = 'element tag unavailable';
-    try {
-      elementTagName = element.tagName;
-    } catch(e) {}
+    var elementTagName = element._safeTagName;
     _sanitizeElement(element, parent, corrupted, elementText, elementTagName,
         attrs, isAttr);
   }
@@ -40913,7 +46950,7 @@
 
   void operator []=(int index, E value) { _list[index] = value; }
 
-  void set length(int newLength) { _list.length = newLength; }
+  set length(int newLength) { _list.length = newLength; }
 
   void sort([int compare(E a, E b)]) { _list.sort(compare); }
 
@@ -41161,6 +47198,13 @@
 
 @Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
@@ -41313,6 +47357,13 @@
  * Helper class to implement custom events which wrap DOM events.
  */
 class _WrappedEvent implements Event {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   final Event wrapped;
 
   /** The CSS selector involved with event delegation. */
@@ -41655,9 +47706,7 @@
     return element;
   }
 
-  // TODO(terry): Enable below for Dartium w/ interop and remove other static window().
-  // static window() => wrap_jso(_blink.Blink_Utils.window()['window']);
-  static window() => _blink.Blink_Utils.window();
+  static window() => wrap_jso(js.context['window']);
 
   static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   static void spawnDomHelper(Function f, int replyTo) =>
@@ -42274,15 +48323,19 @@
   static Element createElement(Document document, String tagName) =>
     wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
 
-  static void initializeCustomElement(HtmlElement element) =>
-    _blink.Blink_Utils.initializeCustomElement(unwrap_jso(element));
-
   static Element changeElementWrapper(HtmlElement element, Type type) =>
     _blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
     WindowBase {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   _DOMWindowCrossFrame.internal();
 
   // Fields.
@@ -42341,7 +48394,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
+  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -42577,10 +48630,6 @@
   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/sdk/lib/html/html_common/conversions.dart b/sdk/lib/html/html_common/conversions.dart
index 042a784..10ef5b7 100644
--- a/sdk/lib/html/html_common/conversions.dart
+++ b/sdk/lib/html/html_common/conversions.dart
@@ -28,55 +28,9 @@
 
 part of html_common;
 
-
-/// Converts a JavaScript object with properties into a Dart Map.
-/// Not suitable for nested objects.
-Map convertNativeToDart_Dictionary(object) {
-  if (object == null) return null;
-  var dict = {};
-  var keys = JS('JSExtendableArray', 'Object.getOwnPropertyNames(#)', object);
-  for (final key in keys) {
-    dict[key] = JS('var', '#[#]', object, key);
-  }
-  return dict;
-}
-
-/// Converts a flat Dart map into a JavaScript object with properties.
-convertDartToNative_Dictionary(Map dict) {
-  if (dict == null) return null;
-  var object = JS('var', '{}');
-  dict.forEach((String key, value) {
-      JS('void', '#[#] = #', object, key, value);
-    });
-  return object;
-}
-
-
-/**
- * Ensures that the input is a JavaScript Array.
- *
- * Creates a new JavaScript array if necessary, otherwise returns the original.
- */
-List convertDartToNative_StringArray(List<String> input) {
-  // TODO(sra).  Implement this.
-  return input;
-}
-
-DateTime convertNativeToDart_DateTime(date) {
-  var millisSinceEpoch = JS('int', '#.getTime()', date);
-  return new DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, isUtc: true);
-}
-
-convertDartToNative_DateTime(DateTime date) {
-  return JS('', 'new Date(#)', date.millisecondsSinceEpoch);
-}
-
-
-// -----------------------------------------------------------------------------
-
 /// Converts a Dart value into a JavaScript SerializedScriptValue.
 convertDartToNative_SerializedScriptValue(value) {
-  return _convertDartToNative_PrepareForStructuredClone(value);
+  return convertDartToNative_PrepareForStructuredClone(value);
 }
 
 /// Since the source object may be viewed via a JavaScript event listener the
@@ -102,7 +56,7 @@
  * operations that perform the structured clone algorithm which does not mutate
  * its output, the result may share structure with the input [value].
  */
-_convertDartToNative_PrepareForStructuredClone(value) {
+abstract class _StructuredClone {
 
   // TODO(sra): Replace slots with identity hash table.
   var values = [];
@@ -120,6 +74,10 @@
   readSlot(int i) => copies[i];
   writeSlot(int i, x) { copies[i] = x; }
   cleanupSlots() {}  // Will be needed if we mark objects with a property.
+  bool cloneNotRequired(object);
+  newJsMap();
+  newJsList(length);
+  void putIntoMap(map, key, value);
 
   // Returns the input, or a clone of the input.
   walk(e) {
@@ -148,57 +106,52 @@
 
     // TODO(sra): Firefox: How to convert _TypedImageData on the other end?
     if (e is ImageData) return e;
-    if (e is NativeByteBuffer) return e;
-
-    if (e is NativeTypedData) return e;
+    if (cloneNotRequired(e)) return e;
 
     if (e is Map) {
       var slot = findSlot(e);
       var copy = readSlot(slot);
       if (copy != null) return copy;
-      copy = JS('var', '{}');
+      copy = newJsMap();
       writeSlot(slot, copy);
       e.forEach((key, value) {
-          JS('void', '#[#] = #', copy, key, walk(value));
-        });
+        putIntoMap(copy, key, walk(value));
+      });
       return copy;
     }
 
     if (e is List) {
-      // Since a JavaScript Array is an instance of Dart List it is possible to
-      // avoid making a copy of the list if there is no need to copy anything
-      // reachable from the array.  We defer creating a new array until a cycle
-      // is detected or a subgraph was copied.
-      int length = e.length;
+      // Since a JavaScript Array is an instance of Dart List it is tempting
+      // in dart2js to avoid making a copy of the list if there is no need
+      // to copy anything reachable from the array.  However, the list may have
+      // non-native properties or methods from interceptors and such, e.g.
+      // an immutability marker. So we  had to stop doing that.
       var slot = findSlot(e);
       var copy = readSlot(slot);
-      if (copy != null) {
-        if (true == copy) {  // Cycle, so commit to making a copy.
-          copy = JS('JSExtendableArray', 'new Array(#)', length);
-          writeSlot(slot, copy);
-        }
-        return copy;
-      }
-
-      int i = 0;
-
-      // Always clone the list, as it may have non-native properties or methods
-      // from interceptors and such.
-      copy = JS('JSExtendableArray', 'new Array(#)', length);
-      writeSlot(slot, copy);
-
-      for ( ; i < length; i++) {
-        copy[i] = walk(e[i]);
-      }
+      if (copy != null) return copy;
+      copy = copyList(e, slot);
       return copy;
     }
 
     throw new UnimplementedError('structured clone of other type');
   }
 
-  var copy = walk(value);
-  cleanupSlots();
-  return copy;
+  copyList(List e, int slot) {
+    int i = 0;
+    int length = e.length;
+    var copy = newJsList(length);
+    writeSlot(slot, copy);
+    for ( ; i < length; i++) {
+      copy[i] = walk(e[i]);
+    }
+    return copy;
+  }
+
+  convertDartToNative_PrepareForStructuredClone(value) {
+    var copy = walk(value);
+    cleanupSlots();
+    return copy;
+  }
 }
 
 /**
@@ -219,25 +172,36 @@
  * MessageEvents.  Mutating the object to make it more 'Dart-like' would corrupt
  * the value as seen from the JavaScript listeners.
  */
-convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) {
+abstract class _AcceptStructuredClone {
 
-  // TODO(sra): Replace slots with identity hash table that works on non-dart
-  // objects.
+  // TODO(sra): Replace slots with identity hash table.
   var values = [];
-  var copies = [];
+  var copies = [];  // initially 'null', 'true' during initial DFS, then a copy.
+  bool mustCopy = false;
 
   int findSlot(value) {
     int length = values.length;
     for (int i = 0; i < length; i++) {
-      if (identical(values[i], value)) return i;
+      if (identicalInJs(values[i], value)) return i;
     }
     values.add(value);
     copies.add(null);
     return length;
   }
+
+  /// Are the two objects identical, but taking into account that two JsObject
+  /// wrappers may not be identical, but their underlying Js Object might be.
+  bool identicalInJs(a, b);
   readSlot(int i) => copies[i];
   writeSlot(int i, x) { copies[i] = x; }
 
+  /// Iterate over the JS properties.
+  forEachJsField(object, action);
+
+  /// Create a new Dart list of the given length. May create a native List or
+  /// a JsArray, depending if we're in Dartium or dart2js.
+  newDartList(length);
+
   walk(e) {
     if (e == null) return e;
     if (e is bool) return e;
@@ -253,6 +217,10 @@
       throw new UnimplementedError('structured clone of RegExp');
     }
 
+    if (isJavaScriptPromise(e)) {
+      return convertNativePromiseToDartFuture(e);
+    }
+
     if (isJavaScriptSimpleObject(e)) {
       // TODO(sra): If mustCopy is false, swizzle the prototype for one of a Map
       // implementation that uses the properies as storage.
@@ -262,9 +230,7 @@
       copy = {};
 
       writeSlot(slot, copy);
-      for (final key in JS('JSExtendableArray', 'Object.keys(#)', e)) {
-        copy[key] = walk(JS('var', '#[#]', e, key));
-      }
+      forEachJsField(e, (key, value) => copy[key] = walk(value));
       return copy;
     }
 
@@ -276,7 +242,7 @@
       int length = e.length;
       // Since a JavaScript Array is an instance of Dart List, we can modify it
       // in-place unless we must copy.
-      copy = mustCopy ? JS('JSExtendableArray', 'new Array(#)', length) : e;
+      copy = mustCopy ? newDartList(length) : e;
       writeSlot(slot, copy);
 
       for (int i = 0; i < length; i++) {
@@ -290,8 +256,11 @@
     return e;
   }
 
-  var copy = walk(object);
-  return copy;
+  convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) {
+    this.mustCopy = mustCopy;
+    var copy = walk(object);
+    return copy;
+  }
 }
 
 // Conversions for ContextAttributes.
@@ -388,20 +357,6 @@
   return imageData;
 }
 
-
-bool isJavaScriptDate(value) => JS('bool', '# instanceof Date', value);
-bool isJavaScriptRegExp(value) => JS('bool', '# instanceof RegExp', value);
-bool isJavaScriptArray(value) => JS('bool', '# instanceof Array', value);
-bool isJavaScriptSimpleObject(value) {
-  var proto = JS('', 'Object.getPrototypeOf(#)', value);
-  return JS('bool', '# === Object.prototype', proto) ||
-      JS('bool', '# === null', proto);
-}
-bool isImmutableJavaScriptArray(value) =>
-    JS('bool', r'!!(#.immutable$list)', value);
-
-
-
 const String _serializedScriptValue =
     'num|String|bool|'
     'JSExtendableArray|=Object|'
diff --git a/sdk/lib/html/html_common/conversions_dart2js.dart b/sdk/lib/html/html_common/conversions_dart2js.dart
new file mode 100644
index 0000000..ac5b755
--- /dev/null
+++ b/sdk/lib/html/html_common/conversions_dart2js.dart
@@ -0,0 +1,93 @@
+part of html_common;
+
+/// Converts a JavaScript object with properties into a Dart Map.
+/// Not suitable for nested objects.
+Map convertNativeToDart_Dictionary(object) {
+  if (object == null) return null;
+  var dict = {};
+  var keys = JS('JSExtendableArray', 'Object.getOwnPropertyNames(#)', object);
+  for (final key in keys) {
+    dict[key] = JS('var', '#[#]', object, key);
+  }
+  return dict;
+}
+
+/// Converts a flat Dart map into a JavaScript object with properties.
+convertDartToNative_Dictionary(Map dict, [void postCreate(dynamic)]) {
+  if (dict == null) return null;
+  var object = JS('var', '{}');
+  if (postCreate != null) {
+    postCreate(object);
+  }
+  dict.forEach((String key, value) {
+      JS('void', '#[#] = #', object, key, value);
+    });
+  return object;
+}
+
+
+/**
+ * Ensures that the input is a JavaScript Array.
+ *
+ * Creates a new JavaScript array if necessary, otherwise returns the original.
+ */
+List convertDartToNative_StringArray(List<String> input) {
+  // TODO(sra).  Implement this.
+  return input;
+}
+
+DateTime convertNativeToDart_DateTime(date) {
+  var millisSinceEpoch = JS('int', '#.getTime()', date);
+  return new DateTime.fromMillisecondsSinceEpoch(millisSinceEpoch, isUtc: true);
+}
+
+convertDartToNative_DateTime(DateTime date) {
+  return JS('', 'new Date(#)', date.millisecondsSinceEpoch);
+}
+
+convertDartToNative_PrepareForStructuredClone(value) =>
+    new _StructuredCloneDart2Js().convertDartToNative_PrepareForStructuredClone(value);
+
+convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) =>
+    new _AcceptStructuredCloneDart2Js().convertNativeToDart_AcceptStructuredClone(object, mustCopy: mustCopy);
+
+class _StructuredCloneDart2Js extends _StructuredClone {
+  newJsMap() => JS('var', '{}');
+  putIntoMap(map, key, value) => JS('void', '#[#] = #', map, key, value);
+  newJsList(length) => JS('JSExtendableArray', 'new Array(#)', length);
+  cloneNotRequired(e) => (e is NativeByteBuffer || e is NativeTypedData);
+}
+
+class _AcceptStructuredCloneDart2Js extends _AcceptStructuredClone {
+
+  newJsList(length) => JS('JSExtendableArray', 'new Array(#)', length);
+  newDartList(length) => newJsList(length);
+  identicalInJs(a, b) => identical(a, b);
+
+  void forEachJsField(object, action) {
+      for (final key in JS('JSExtendableArray', 'Object.keys(#)', object)) {
+        action(key, JS('var', '#[#]', object, key));
+      }
+  }
+}
+
+bool isJavaScriptDate(value) => JS('bool', '# instanceof Date', value);
+bool isJavaScriptRegExp(value) => JS('bool', '# instanceof RegExp', value);
+bool isJavaScriptArray(value) => JS('bool', '# instanceof Array', value);
+bool isJavaScriptSimpleObject(value) {
+  var proto = JS('', 'Object.getPrototypeOf(#)', value);
+  return JS('bool', '# === Object.prototype', proto) ||
+      JS('bool', '# === null', proto);
+}
+bool isImmutableJavaScriptArray(value) =>
+    JS('bool', r'!!(#.immutable$list)', value);
+bool isJavaScriptPromise(value) =>
+    JS('bool', r'typeof Promise != "undefined" && # instanceof Promise', value);
+
+Future convertNativePromiseToDartFuture(promise) {
+  var completer = new Completer();
+  var then = convertDartClosureToJS((result) => completer.complete(result), 1);
+  var error = convertDartClosureToJS((result) => completer.completeError(result), 1);
+  var newPromise = JS('', '#.then(#).catch(#)', promise, then, error);
+  return completer.future;
+}
diff --git a/sdk/lib/html/html_common/conversions_dartium.dart b/sdk/lib/html/html_common/conversions_dartium.dart
new file mode 100644
index 0000000..ae7429a
--- /dev/null
+++ b/sdk/lib/html/html_common/conversions_dartium.dart
@@ -0,0 +1,63 @@
+part of html_common;
+
+convertDartToNative_PrepareForStructuredClone(value) =>
+    new _StructuredCloneDartium().convertDartToNative_PrepareForStructuredClone(value);
+
+convertNativeToDart_AcceptStructuredClone(object, {mustCopy: false}) =>
+    new _AcceptStructuredCloneDartium().convertNativeToDart_AcceptStructuredClone(object, mustCopy: mustCopy);
+
+class _StructuredCloneDartium extends _StructuredClone {
+  newJsMap() => new js.JsObject(js.context["Object"]);
+  putIntoMap(map, key, value) => map[key] = value;
+  newJsList(length) => new js.JsArray();
+  cloneNotRequired(e) => e is js.JsObject;
+}
+
+class _AcceptStructuredCloneDartium extends _AcceptStructuredClone {
+  newDartList(length) => new List(length);
+
+  // JsObjects won't be identical, but will be equal only if the underlying
+  // Js entities are identical.
+  bool identicalInJs(a, b) =>
+      (a is js.JsObject) ? a == b : identical(a, b);
+
+  void forEachJsField(jsObject, action) {
+    var keys = js.context["Object"].callMethod("keys", [jsObject]);
+    for (var key in keys) {
+      action(key, jsObject[key]);
+    }
+  }
+}
+
+final _dateConstructor = js.context["Date"];
+final _regexConstructor = js.context["RegExp"];
+
+bool isJavaScriptDate(value) => value is js.JsObject && value.instanceof(_dateConstructor);
+bool isJavaScriptRegExp(value) => value is js.JsObject && value.instanceof(_regexConstructor);
+bool isJavaScriptArray(value) => value is js.JsArray;
+
+final _object = js.context["Object"];
+final _getPrototypeOf = _object["getPrototypeOf"];
+_getProto(object) {
+  return _getPrototypeOf.apply([object]);
+}
+final _objectProto = js.context["Object"]["prototype"];
+
+bool isJavaScriptSimpleObject(value) {
+  if (value is! js.JsObject) return false;
+  var proto = _getProto(value);
+  return proto == _objectProto || proto == null;
+}
+bool isImmutableJavaScriptArray(value) =>
+    isJavaScriptArray(value) && value["immutable$list"] != null;
+
+final _promiseConstructor = js.context['Promise'];
+bool isJavaScriptPromise(value) => value is js.JsObject && value['constructor'] == _promiseConstructor;
+
+Future convertNativePromiseToDartFuture(js.JsObject promise) {
+  var completer = new Completer();
+  var newPromise = promise
+    .callMethod("then", [(result) => completer.complete(result)])
+    .callMethod("catch", [(result) => completer.completeError(result)]);
+  return completer.future;
+}
diff --git a/sdk/lib/html/html_common/filtered_element_list.dart b/sdk/lib/html/html_common/filtered_element_list.dart
index 1a55d79..e9e4718 100644
--- a/sdk/lib/html/html_common/filtered_element_list.dart
+++ b/sdk/lib/html/html_common/filtered_element_list.dart
@@ -45,7 +45,7 @@
     this[index].replaceWith(value);
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     final len = this.length;
     if (newLength >= len) {
       return;
diff --git a/sdk/lib/html/html_common/html_common.dart b/sdk/lib/html/html_common/html_common.dart
index a538266..42cf71a 100644
--- a/sdk/lib/html/html_common/html_common.dart
+++ b/sdk/lib/html/html_common/html_common.dart
@@ -4,9 +4,12 @@
 
 library html_common;
 
+import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
+import 'dart:js' as js;
 import 'dart:_internal' show WhereIterable;
+import 'dart:web_gl' as gl;
 
 import 'metadata.dart';
 export 'metadata.dart';
@@ -15,3 +18,5 @@
 part 'device.dart';
 part 'filtered_element_list.dart';
 part 'lists.dart';
+part 'conversions.dart';
+part 'conversions_dartium.dart';
diff --git a/sdk/lib/html/html_common/html_common_dart2js.dart b/sdk/lib/html/html_common/html_common_dart2js.dart
index 9dcd5b9..8d33d20 100644
--- a/sdk/lib/html/html_common/html_common_dart2js.dart
+++ b/sdk/lib/html/html_common/html_common_dart2js.dart
@@ -4,12 +4,13 @@
 
 library html_common;
 
+import 'dart:async';
 import 'dart:collection';
 import 'dart:html';
 import 'dart:_internal' show WhereIterable;
 import 'dart:web_gl' as gl;
 import 'dart:_native_typed_data';
-import 'dart:_js_helper' show Creates, Returns;
+import 'dart:_js_helper' show Creates, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 
@@ -18,6 +19,7 @@
 
 part 'css_class_set.dart';
 part 'conversions.dart';
+part 'conversions_dart2js.dart';
 part 'device.dart';
 part 'filtered_element_list.dart';
 part 'lists.dart';
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 3db17c2..034b2ce 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -77,7 +77,7 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, Returns, JSName, Native, Null;
+import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index eb045b0..300c5d4 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -62,7 +62,7 @@
  * and where both the keys and the values are strings.
  *
  * * [dart:web_sql]&mdash;a database that can be queried with SQL.
- * 
+ *
  * For a tutorial about using the indexed_db library with Dart,
  * check out
  * [Use IndexedDB](http://www.dartlang.org/docs/tutorials/indexeddb/).
@@ -77,6 +77,7 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 // 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.
@@ -122,6 +123,21 @@
 
 };
 
+// FIXME: Can we make this private?
+final indexed_dbBlinkFunctionMap = {
+  'IDBCursor': () => Cursor.internalCreateCursor,
+  'IDBCursorWithValue': () => CursorWithValue.internalCreateCursorWithValue,
+  'IDBDatabase': () => Database.internalCreateDatabase,
+  'IDBFactory': () => IdbFactory.internalCreateIdbFactory,
+  'IDBIndex': () => Index.internalCreateIndex,
+  'IDBKeyRange': () => KeyRange.internalCreateKeyRange,
+  'IDBObjectStore': () => ObjectStore.internalCreateObjectStore,
+  'IDBOpenDBRequest': () => OpenDBRequest.internalCreateOpenDBRequest,
+  'IDBRequest': () => Request.internalCreateRequest,
+  'IDBTransaction': () => Transaction.internalCreateTransaction,
+  'IDBVersionChangeEvent': () => VersionChangeEvent.internalCreateVersionChangeEvent,
+
+};
 // 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.
@@ -151,21 +167,36 @@
     // To suppress missing implicit constructor warnings.
   factory Cursor._() { throw new UnsupportedError("Not supported"); }
 
+  static Cursor internalCreateCursor() {
+    return new Cursor._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Cursor._internalWrap() {
+    return new Cursor.internal_();
+  }
+
+  Cursor.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('IDBCursor.direction')
   @DocsEditable()
   String get direction => _blink.BlinkIDBCursor.instance.direction_Getter_(unwrap_jso(this));
   
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key => _blink.BlinkIDBCursor.instance.key_Getter_(unwrap_jso(this));
+  Object get key => wrap_jso(_blink.BlinkIDBCursor.instance.key_Getter_(unwrap_jso(this)));
   
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey => _blink.BlinkIDBCursor.instance.primaryKey_Getter_(unwrap_jso(this));
+  Object get primaryKey => wrap_jso(_blink.BlinkIDBCursor.instance.primaryKey_Getter_(unwrap_jso(this)));
   
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source => _blink.BlinkIDBCursor.instance.source_Getter_(unwrap_jso(this));
+  Object get source => wrap_jso(_blink.BlinkIDBCursor.instance.source_Getter_(unwrap_jso(this)));
   
   @DomName('IDBCursor.advance')
   @DocsEditable()
@@ -191,7 +222,7 @@
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) => wrap_jso(_blink.BlinkIDBCursor.instance.update_Callback_1_(unwrap_jso(this), value));
+  Request _update(Object value) => wrap_jso(_blink.BlinkIDBCursor.instance.update_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -208,9 +239,21 @@
   // To suppress missing implicit constructor warnings.
   factory CursorWithValue._() { throw new UnsupportedError("Not supported"); }
 
+
+  static CursorWithValue internalCreateCursorWithValue() {
+    return new CursorWithValue._internalWrap();
+  }
+
+  factory CursorWithValue._internalWrap() {
+    return new CursorWithValue.internal_();
+  }
+
+  CursorWithValue.internal_() : super.internal_();
+
+
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value => _blink.BlinkIDBCursorWithValue.instance.value_Getter_(unwrap_jso(this));
+  Object get value => wrap_jso(_blink.BlinkIDBCursorWithValue.instance.value_Getter_(unwrap_jso(this)));
   
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -291,6 +334,18 @@
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> versionChangeEvent = const EventStreamProvider<VersionChangeEvent>('versionchange');
 
+
+  static Database internalCreateDatabase() {
+    return new Database._internalWrap();
+  }
+
+  factory Database._internalWrap() {
+    return new Database.internal_();
+  }
+
+  Database.internal_() : super.internal_();
+
+
   @DomName('IDBDatabase.name')
   @DocsEditable()
   String get name => _blink.BlinkIDBDatabase.instance.name_Getter_(unwrap_jso(this));
@@ -301,7 +356,7 @@
   
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version => _blink.BlinkIDBDatabase.instance.version_Getter_(unwrap_jso(this));
+  Object get version => wrap_jso(_blink.BlinkIDBDatabase.instance.version_Getter_(unwrap_jso(this)));
   
   @DomName('IDBDatabase.close')
   @DocsEditable()
@@ -309,9 +364,9 @@
   
   ObjectStore _createObjectStore(String name, [Map options]) {
     if (options != null) {
-      return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_(unwrap_jso(this), name, options);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.createObjectStore_Callback_2_(unwrap_jso(this), name, convertDartToNative_Dictionary(options)));
     }
-    return _blink.BlinkIDBDatabase.instance.createObjectStore_Callback_1_(unwrap_jso(this), name);
+    return wrap_jso(_blink.BlinkIDBDatabase.instance.createObjectStore_Callback_1_(unwrap_jso(this), name));
   }
 
   @DomName('IDBDatabase.deleteObjectStore')
@@ -320,45 +375,45 @@
   
   Transaction transaction(storeName_OR_storeNames, [String mode]) {
     if ((storeName_OR_storeNames is String || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames));
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames)));
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames), mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames), mode));
     }
     if ((storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames));
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames)));
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames), mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames), mode));
     }
     if ((storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null) && mode == null) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames));
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames)));
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is DomStringList || storeName_OR_storeNames == null)) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeName_OR_storeNames), mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(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.instance.transaction_Callback_2_(unwrap_jso(this), storeNames, mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), convertDartToNative_StringArray(storeNames), mode));
     }
-    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), storeNames);
+    return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), convertDartToNative_StringArray(storeNames)));
   }
 
   Transaction transactionStore(String storeName, [String mode]) {
     if (mode != null) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), storeName, mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), storeName, mode));
     }
-    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), storeName);
+    return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), storeName));
   }
 
   Transaction transactionStores(List<String> storeNames, [String mode]) {
     if (mode != null) {
-      return _blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeNames), mode);
+      return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(storeNames), mode));
     }
-    return _blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeNames));
+    return wrap_jso(_blink.BlinkIDBDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(storeNames)));
   }
 
   /// Stream of `abort` events handled by this [Database].
@@ -473,19 +528,34 @@
   // To suppress missing implicit constructor warnings.
   factory IdbFactory._() { throw new UnsupportedError("Not supported"); }
 
+  static IdbFactory internalCreateIdbFactory() {
+    return new IdbFactory._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory IdbFactory._internalWrap() {
+    return new IdbFactory.internal_();
+  }
+
+  IdbFactory.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('IDBFactory.cmp')
   @DocsEditable()
   int cmp(Object first, Object second) => _blink.BlinkIDBFactory.instance.cmp_Callback_2_(unwrap_jso(this), first, second);
   
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(unwrap_jso(this), name);
+  OpenDBRequest _deleteDatabase(String name) => wrap_jso(_blink.BlinkIDBFactory.instance.deleteDatabase_Callback_1_(unwrap_jso(this), name));
   
   OpenDBRequest _open(String name, [int version]) {
     if (version != null) {
-      return _blink.BlinkIDBFactory.instance.open_Callback_2_(unwrap_jso(this), name, version);
+      return wrap_jso(_blink.BlinkIDBFactory.instance.open_Callback_2_(unwrap_jso(this), name, version));
     }
-    return _blink.BlinkIDBFactory.instance.open_Callback_1_(unwrap_jso(this), name);
+    return wrap_jso(_blink.BlinkIDBFactory.instance.open_Callback_1_(unwrap_jso(this), name));
   }
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
@@ -611,9 +681,24 @@
     // To suppress missing implicit constructor warnings.
   factory Index._() { throw new UnsupportedError("Not supported"); }
 
+  static Index internalCreateIndex() {
+    return new Index._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Index._internalWrap() {
+    return new Index.internal_();
+  }
+
+  Index.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.BlinkIDBIndex.instance.keyPath_Getter_(unwrap_jso(this));
+  Object get keyPath => wrap_jso(_blink.BlinkIDBIndex.instance.keyPath_Getter_(unwrap_jso(this)));
   
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
@@ -687,9 +772,24 @@
   // To suppress missing implicit constructor warnings.
   factory KeyRange._() { throw new UnsupportedError("Not supported"); }
 
+  static KeyRange internalCreateKeyRange() {
+    return new KeyRange._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory KeyRange._internalWrap() {
+    return new KeyRange.internal_();
+  }
+
+  KeyRange.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower => _blink.BlinkIDBKeyRange.instance.lower_Getter_(unwrap_jso(this));
+  Object get lower => wrap_jso(_blink.BlinkIDBKeyRange.instance.lower_Getter_(unwrap_jso(this)));
   
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
@@ -697,7 +797,7 @@
   
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper => _blink.BlinkIDBKeyRange.instance.upper_Getter_(unwrap_jso(this));
+  Object get upper => wrap_jso(_blink.BlinkIDBKeyRange.instance.upper_Getter_(unwrap_jso(this)));
   
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
@@ -705,31 +805,31 @@
   
   static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) {
     if (upperOpen != null) {
-      return _blink.BlinkIDBKeyRange.instance.bound_Callback_4_(lower, upper, lowerOpen, upperOpen);
+      return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_4_(lower, upper, lowerOpen, upperOpen));
     }
     if (lowerOpen != null) {
-      return _blink.BlinkIDBKeyRange.instance.bound_Callback_3_(lower, upper, lowerOpen);
+      return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_3_(lower, upper, lowerOpen));
     }
-    return _blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper);
+    return wrap_jso(_blink.BlinkIDBKeyRange.instance.bound_Callback_2_(lower, upper));
   }
 
   static KeyRange lowerBound_(Object bound, [bool open]) {
     if (open != null) {
-      return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_2_(bound, open);
+      return wrap_jso(_blink.BlinkIDBKeyRange.instance.lowerBound_Callback_2_(bound, open));
     }
-    return _blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound);
+    return wrap_jso(_blink.BlinkIDBKeyRange.instance.lowerBound_Callback_1_(bound));
   }
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.instance.only_Callback_1_(value);
+  static KeyRange only_(Object value) => wrap_jso(_blink.BlinkIDBKeyRange.instance.only_Callback_1_(value));
   
   static KeyRange upperBound_(Object bound, [bool open]) {
     if (open != null) {
-      return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_2_(bound, open);
+      return wrap_jso(_blink.BlinkIDBKeyRange.instance.upperBound_Callback_2_(bound, open));
     }
-    return _blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound);
+    return wrap_jso(_blink.BlinkIDBKeyRange.instance.upperBound_Callback_1_(bound));
   }
 
 }
@@ -871,6 +971,21 @@
   // To suppress missing implicit constructor warnings.
   factory ObjectStore._() { throw new UnsupportedError("Not supported"); }
 
+  static ObjectStore internalCreateObjectStore() {
+    return new ObjectStore._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ObjectStore._internalWrap() {
+    return new ObjectStore.internal_();
+  }
+
+  ObjectStore.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
   bool get autoIncrement => _blink.BlinkIDBObjectStore.instance.autoIncrement_Getter_(unwrap_jso(this));
@@ -881,7 +996,7 @@
   
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.BlinkIDBObjectStore.instance.keyPath_Getter_(unwrap_jso(this));
+  Object get keyPath => wrap_jso(_blink.BlinkIDBObjectStore.instance.keyPath_Getter_(unwrap_jso(this)));
   
   @DomName('IDBObjectStore.name')
   @DocsEditable()
@@ -893,9 +1008,9 @@
   
   Request _add(Object value, [Object key]) {
     if (key != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_2_(unwrap_jso(this), value, key));
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key)));
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_1_(unwrap_jso(this), value));
+    return wrap_jso(_blink.BlinkIDBObjectStore.instance.add_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
   }
 
   @DomName('IDBObjectStore.clear')
@@ -908,16 +1023,16 @@
   
   Index _createIndex(String name, keyPath, [Map options]) {
     if ((keyPath is String || keyPath == null) && (name is String || name == null) && options == null) {
-      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath));
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath)));
     }
     if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), options);
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), convertDartToNative_Dictionary(options)));
     }
     if ((keyPath is List<String> || keyPath == null) && (name is String || name == null) && options == null) {
-      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath));
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_2_(unwrap_jso(this), name, unwrap_jso(keyPath)));
     }
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return _blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), options);
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.createIndex_Callback_3_(unwrap_jso(this), name, unwrap_jso(keyPath), convertDartToNative_Dictionary(options)));
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
@@ -936,7 +1051,7 @@
   
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) => _blink.BlinkIDBObjectStore.instance.index_Callback_1_(unwrap_jso(this), name);
+  Index index(String name) => wrap_jso(_blink.BlinkIDBObjectStore.instance.index_Callback_1_(unwrap_jso(this), name));
   
   Request _openCursor(Object range, [String direction]) {
     if (direction != null) {
@@ -954,9 +1069,9 @@
 
   Request _put(Object value, [Object key]) {
     if (key != null) {
-      return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_2_(unwrap_jso(this), value, key));
+      return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_2_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value), convertDartToNative_SerializedScriptValue(key)));
     }
-    return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_1_(unwrap_jso(this), value));
+    return wrap_jso(_blink.BlinkIDBObjectStore.instance.put_Callback_1_(unwrap_jso(this), convertDartToNative_SerializedScriptValue(value)));
   }
 
 
@@ -1021,6 +1136,18 @@
   @DocsEditable()
   static const EventStreamProvider<VersionChangeEvent> upgradeNeededEvent = const EventStreamProvider<VersionChangeEvent>('upgradeneeded');
 
+
+  static OpenDBRequest internalCreateOpenDBRequest() {
+    return new OpenDBRequest._internalWrap();
+  }
+
+  factory OpenDBRequest._internalWrap() {
+    return new OpenDBRequest.internal_();
+  }
+
+  OpenDBRequest.internal_() : super.internal_();
+
+
   /// Stream of `blocked` events handled by this [OpenDBRequest].
   @DomName('IDBOpenDBRequest.onblocked')
   @DocsEditable()
@@ -1066,6 +1193,18 @@
   @DocsEditable()
   static const EventStreamProvider<Event> successEvent = const EventStreamProvider<Event>('success');
 
+
+  static Request internalCreateRequest() {
+    return new Request._internalWrap();
+  }
+
+  factory Request._internalWrap() {
+    return new Request.internal_();
+  }
+
+  Request.internal_() : super.internal_();
+
+
   @DomName('IDBRequest.error')
   @DocsEditable()
   DomError get error => wrap_jso(_blink.BlinkIDBRequest.instance.error_Getter_(unwrap_jso(this)));
@@ -1076,11 +1215,11 @@
   
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result => _blink.BlinkIDBRequest.instance.result_Getter_(unwrap_jso(this));
+  Object get result => wrap_jso(_blink.BlinkIDBRequest.instance.result_Getter_(unwrap_jso(this)));
   
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source => _blink.BlinkIDBRequest.instance.source_Getter_(unwrap_jso(this));
+  Object get source => wrap_jso(_blink.BlinkIDBRequest.instance.source_Getter_(unwrap_jso(this)));
   
   @DomName('IDBRequest.transaction')
   @DocsEditable()
@@ -1167,6 +1306,18 @@
   @DocsEditable()
   static const EventStreamProvider<Event> errorEvent = const EventStreamProvider<Event>('error');
 
+
+  static Transaction internalCreateTransaction() {
+    return new Transaction._internalWrap();
+  }
+
+  factory Transaction._internalWrap() {
+    return new Transaction.internal_();
+  }
+
+  Transaction.internal_() : super.internal_();
+
+
   @DomName('IDBTransaction.db')
   @DocsEditable()
   Database get db => wrap_jso(_blink.BlinkIDBTransaction.instance.db_Getter_(unwrap_jso(this)));
@@ -1185,7 +1336,7 @@
   
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(unwrap_jso(this), name);
+  ObjectStore objectStore(String name) => wrap_jso(_blink.BlinkIDBTransaction.instance.objectStore_Callback_1_(unwrap_jso(this), name));
   
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1217,6 +1368,18 @@
   // To suppress missing implicit constructor warnings.
   factory VersionChangeEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static VersionChangeEvent internalCreateVersionChangeEvent() {
+    return new VersionChangeEvent._internalWrap();
+  }
+
+  factory VersionChangeEvent._internalWrap() {
+    return new VersionChangeEvent.internal_();
+  }
+
+  VersionChangeEvent.internal_() : super.internal_();
+
+
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
diff --git a/sdk/lib/internal/list.dart b/sdk/lib/internal/list.dart
index ed5c987..37ee3f8 100644
--- a/sdk/lib/internal/list.dart
+++ b/sdk/lib/internal/list.dart
@@ -11,7 +11,7 @@
  */
 abstract class FixedLengthListMixin<E> {
   /** This operation is not supported by a fixed length list. */
-  void set length(int newLength) {
+  set length(int newLength) {
     throw new UnsupportedError(
         "Cannot change the length of a fixed-length list");
   }
@@ -105,7 +105,7 @@
   }
 
   /** This operation is not supported by an unmodifiable list. */
-  void set length(int newLength) {
+  set length(int newLength) {
     throw new UnsupportedError(
         "Cannot change the length of an unmodifiable list");
   }
diff --git a/sdk/lib/io/io_sink.dart b/sdk/lib/io/io_sink.dart
index 89cd586..2d6719d 100644
--- a/sdk/lib/io/io_sink.dart
+++ b/sdk/lib/io/io_sink.dart
@@ -97,6 +97,9 @@
 
   /**
    * Adds all elements of the given [stream] to `this`.
+   *
+   * Returns a [Future] that completes when
+   * all elements of the given [stream] are added to `this`.
    */
   Future addStream(Stream<List<int>> stream);
 
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index d5534ba..c671220 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -237,6 +237,15 @@
    * WARNING: The [packageRoot] and [packages] parameters are not implemented
    * on all platforms yet.
    *
+   * The [environment] is a mapping from strings to strings which the
+   * spawned isolate uses when looking up [String.fromEnvironment] values.
+   * The system may add its own entries to environment as well.
+   * If `environment` is omitted, the spawned isolate has the same environment
+   * declarations as the spawning isolate.
+   *
+   * WARNING: The [environment] parameter is not implemented on all
+   * platforms yet.
+   *
    * Returns a future that will complete with an [Isolate] instance if the
    * spawning succeeded. It will complete with an error otherwise.
    */
@@ -245,12 +254,13 @@
       List<String> args,
       var message,
       {bool paused: false,
-       bool checked,
-       Uri packageRoot,
-       Map<String, Uri> packages,
-       bool errorsAreFatal,
        SendPort onExit,
-       SendPort onError});
+       SendPort onError,
+       bool errorsAreFatal,
+       bool checked,
+       Map<String, String> environment,
+       Uri packageRoot,
+       Map<String, Uri> packages});
 
   /**
    * Requests the isolate to pause.
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index 849de82..1d2c9e0 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -449,7 +449,7 @@
     throw new StateError('Bad JsArray length');
   }
 
-  void set length(int length) { super['length'] = length; }
+  set length(int length) { super['length'] = length; }
 
 
   // Methods overriden for better performance
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 0bb53c3..b6c7198 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -4,7 +4,7 @@
 
 /**
  * Support for interoperating with JavaScript.
- * 
+ *
  * This library provides access to JavaScript objects from Dart, allowing
  * Dart code to get and set properties, and call methods of JavaScript objects
  * and invoke JavaScript functions. The library takes care of converting
@@ -27,14 +27,14 @@
  * global function `alert()`:
  *
  *     import 'dart:js';
- *     
+ *
  *     main() => context.callMethod('alert', ['Hello from Dart!']);
  *
  * This example shows how to create a [JsObject] from a JavaScript constructor
  * and access its properties:
  *
  *     import 'dart:js';
- *     
+ *
  *     main() {
  *       var object = new JsObject(context['Object']);
  *       object['greeting'] = 'Hello';
@@ -44,7 +44,7 @@
  *     }
  *
  * ## Proxying and automatic conversion
- * 
+ *
  * When setting properties on a JsObject or passing arguments to a Javascript
  * method or function, Dart objects are automatically converted or proxied to
  * JavaScript objects. When accessing JavaScript properties, or when a Dart
@@ -80,7 +80,7 @@
  * `a` and `b` defined:
  *
  *     var jsMap = new JsObject.jsify({'a': 1, 'b': 2});
- * 
+ *
  * This expression creates a JavaScript array:
  *
  *     var jsArray = new JsObject.jsify([1, 2, 3]);
@@ -91,6 +91,7 @@
 import 'dart:nativewrappers';
 import 'dart:math' as math;
 import 'dart:mirrors' as mirrors;
+import 'dart:html' as html;
 
 // Pretend we are always in checked mode as we aren't interested in users
 // running Dartium code outside of checked mode.
@@ -491,8 +492,14 @@
    * Constructs a new JavaScript object from [constructor] and returns a proxy
    * to it.
    */
-  factory JsObject(JsFunction constructor, [List arguments]) =>
-      _create(constructor, arguments);
+  factory JsObject(JsFunction constructor, [List arguments]) {
+    try {
+      return _create(constructor, arguments);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new html.DomException.jsInterop(e);
+    }
+  }
 
   static JsObject _create(
       JsFunction constructor, arguments) native "JsObject_constructorCallback";
@@ -517,7 +524,7 @@
    * Use this constructor only if you wish to get access to JavaScript
    * properties attached to a browser host object, such as a Node or Blob, that
    * is normally automatically converted into a native Dart object.
-   * 
+   *
    * An exception will be thrown if [object] either is `null` or has the type
    * `bool`, `num`, or `String`.
    */
@@ -546,8 +553,7 @@
 
   static JsObject _jsify(object) native "JsObject_jsify";
 
-  static JsObject _fromBrowserObject(
-      object) native "JsObject_fromBrowserObject";
+  static JsObject _fromBrowserObject(object) => html.unwrap_jso(object);
 
   /**
    * Returns the value associated with [property] from the proxied JavaScript
@@ -555,7 +561,15 @@
    *
    * The type of [property] must be either [String] or [num].
    */
-  operator [](property) native "JsObject_[]";
+  operator [](property) {
+    try {
+      return _operator_getter(property);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new html.DomException.jsInterop(e);
+    }
+  }
+  _operator_getter(property) native "JsObject_[]";
 
   /**
    * Sets the value associated with [property] on the proxied JavaScript
@@ -563,11 +577,26 @@
    *
    * The type of [property] must be either [String] or [num].
    */
-  operator []=(property, value) native "JsObject_[]=";
+  operator []=(property, value) {
+    try {
+      _operator_setter(property, value);
+    } catch (e) {
+      // Re-throw any errors (returned as a string) as a DomException.
+      throw new html.DomException.jsInterop(e);
+    }
+  }
+  _operator_setter(property, value) native "JsObject_[]=";
 
   int get hashCode native "JsObject_hashCode";
 
-  operator ==(other) => other is JsObject && _identityEquality(this, other);
+  operator ==(other) {
+    var is_JsObject = other is JsObject;
+    if (!is_JsObject) {
+      other = html.unwrap_jso(other);
+      is_JsObject = other is JsObject;
+    }
+    return is_JsObject && _identityEquality(this, other);
+  }
 
   static bool _identityEquality(
       JsObject a, JsObject b) native "JsObject_identityEquality";
@@ -618,7 +647,8 @@
       return _callMethod(method, args);
     } catch (e) {
       if (hasProperty(method)) {
-        rethrow;
+        // Return a DomException if DOM call returned an error.
+        throw new html.DomException.jsInterop(e);
       } else {
         throw new NoSuchMethodError(this, new Symbol(method), args, null);
       }
@@ -754,7 +784,12 @@
     if (index is int) {
       _checkIndex(index);
     }
-    return super[index];
+
+    // Lazily create the Dart class that wraps the JS object when the object in
+    // a list if fetched.
+    var wrap_entry = html.wrap_jso(super[index]);
+    super[index] = wrap_entry;
+    return wrap_entry;
   }
 
   void operator []=(index, E value) {
@@ -766,7 +801,7 @@
 
   int get length native "JsArray_length";
 
-  void set length(int length) {
+  set length(int length) {
     super['length'] = length;
   }
 
diff --git a/sdk/lib/svg/dart2js/svg_dart2js.dart b/sdk/lib/svg/dart2js/svg_dart2js.dart
index 1e63bd2..5cb2ace 100644
--- a/sdk/lib/svg/dart2js/svg_dart2js.dart
+++ b/sdk/lib/svg/dart2js/svg_dart2js.dart
@@ -10,7 +10,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
@@ -2693,7 +2693,7 @@
   // Length is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -3145,7 +3145,7 @@
   // Number is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -3932,7 +3932,7 @@
   // PathSeg is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -4627,7 +4627,7 @@
   // String is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -4731,7 +4731,7 @@
   // Shadowing definition.
   String get title => JS("String", "#.title", this);
 
-  void set title(String value) {
+  set title(String value) {
     JS("void", "#.title = #", this, value);
   }
 
@@ -4801,7 +4801,7 @@
 
   List<Element> get children => new FilteredElementList(this);
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     final children = this.children;
     children.clear();
     children.addAll(value);
@@ -4821,7 +4821,7 @@
     return container.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
@@ -4886,6 +4886,7 @@
     var e = new SvgElement.tag(tag);
     return e is SvgElement && !(e is UnknownElement);
   }
+
   // To suppress missing implicit constructor warnings.
   factory SvgElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5169,7 +5170,7 @@
   // Shadowing definition.
   int get tabIndex => JS("int", "#.tabIndex", this);
 
-  void set tabIndex(int value) {
+  set tabIndex(int value) {
     JS("void", "#.tabIndex = #", this, value);
   }
 
@@ -6082,7 +6083,7 @@
   // Transform is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -6536,7 +6537,9 @@
   // From SVGTests
 
   // From SVGURIReference
+
 }
+
 // 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.
@@ -6557,7 +6560,9 @@
   _SVGFEDropShadowElement.created() : super.created();
 
   // From SVGFilterPrimitiveStandardAttributes
+
 }
+
 // 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.
@@ -6715,7 +6720,9 @@
   _SVGGlyphRefElement.created() : super.created();
 
   // From SVGURIReference
+
 }
+
 // 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.
@@ -6762,7 +6769,9 @@
   _SVGMPathElement.created() : super.created();
 
   // From SVGURIReference
+
 }
+
 // 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.
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index 8d52279..db45167 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -10,17 +10,23 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 // DO NOT EDIT
 // Auto-generated dart:svg library.
 
 
 
 
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
 
 // FIXME: Can we make this private?
 final svgBlinkMap = {
@@ -169,6 +175,147 @@
 
 };
 
+// FIXME: Can we make this private?
+final svgBlinkFunctionMap = {
+  'SVGAElement': () => AElement.internalCreateAElement,
+  'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement.internalCreate_SVGAltGlyphDefElement,
+  'SVGAltGlyphElement': () => AltGlyphElement.internalCreateAltGlyphElement,
+  'SVGAltGlyphItemElement': () => _SVGAltGlyphItemElement.internalCreate_SVGAltGlyphItemElement,
+  'SVGAngle': () => Angle.internalCreateAngle,
+  'SVGAnimateElement': () => AnimateElement.internalCreateAnimateElement,
+  'SVGAnimateMotionElement': () => AnimateMotionElement.internalCreateAnimateMotionElement,
+  'SVGAnimateTransformElement': () => AnimateTransformElement.internalCreateAnimateTransformElement,
+  'SVGAnimatedAngle': () => AnimatedAngle.internalCreateAnimatedAngle,
+  'SVGAnimatedBoolean': () => AnimatedBoolean.internalCreateAnimatedBoolean,
+  'SVGAnimatedEnumeration': () => AnimatedEnumeration.internalCreateAnimatedEnumeration,
+  'SVGAnimatedInteger': () => AnimatedInteger.internalCreateAnimatedInteger,
+  'SVGAnimatedLength': () => AnimatedLength.internalCreateAnimatedLength,
+  'SVGAnimatedLengthList': () => AnimatedLengthList.internalCreateAnimatedLengthList,
+  'SVGAnimatedNumber': () => AnimatedNumber.internalCreateAnimatedNumber,
+  'SVGAnimatedNumberList': () => AnimatedNumberList.internalCreateAnimatedNumberList,
+  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio.internalCreateAnimatedPreserveAspectRatio,
+  'SVGAnimatedRect': () => AnimatedRect.internalCreateAnimatedRect,
+  'SVGAnimatedString': () => AnimatedString.internalCreateAnimatedString,
+  'SVGAnimatedTransformList': () => AnimatedTransformList.internalCreateAnimatedTransformList,
+  'SVGAnimationElement': () => AnimationElement.internalCreateAnimationElement,
+  'SVGCircleElement': () => CircleElement.internalCreateCircleElement,
+  'SVGClipPathElement': () => ClipPathElement.internalCreateClipPathElement,
+  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement.internalCreate_SVGComponentTransferFunctionElement,
+  'SVGCursorElement': () => _SVGCursorElement.internalCreate_SVGCursorElement,
+  'SVGDefsElement': () => DefsElement.internalCreateDefsElement,
+  'SVGDescElement': () => DescElement.internalCreateDescElement,
+  'SVGDiscardElement': () => DiscardElement.internalCreateDiscardElement,
+  'SVGElement': () => SvgElement.internalCreateSvgElement,
+  'SVGEllipseElement': () => EllipseElement.internalCreateEllipseElement,
+  'SVGFEBlendElement': () => FEBlendElement.internalCreateFEBlendElement,
+  'SVGFEColorMatrixElement': () => FEColorMatrixElement.internalCreateFEColorMatrixElement,
+  'SVGFEComponentTransferElement': () => FEComponentTransferElement.internalCreateFEComponentTransferElement,
+  'SVGFECompositeElement': () => FECompositeElement.internalCreateFECompositeElement,
+  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement.internalCreateFEConvolveMatrixElement,
+  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement.internalCreateFEDiffuseLightingElement,
+  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement.internalCreateFEDisplacementMapElement,
+  'SVGFEDistantLightElement': () => FEDistantLightElement.internalCreateFEDistantLightElement,
+  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement.internalCreate_SVGFEDropShadowElement,
+  'SVGFEFloodElement': () => FEFloodElement.internalCreateFEFloodElement,
+  'SVGFEFuncAElement': () => FEFuncAElement.internalCreateFEFuncAElement,
+  'SVGFEFuncBElement': () => FEFuncBElement.internalCreateFEFuncBElement,
+  'SVGFEFuncGElement': () => FEFuncGElement.internalCreateFEFuncGElement,
+  'SVGFEFuncRElement': () => FEFuncRElement.internalCreateFEFuncRElement,
+  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement.internalCreateFEGaussianBlurElement,
+  'SVGFEImageElement': () => FEImageElement.internalCreateFEImageElement,
+  'SVGFEMergeElement': () => FEMergeElement.internalCreateFEMergeElement,
+  'SVGFEMergeNodeElement': () => FEMergeNodeElement.internalCreateFEMergeNodeElement,
+  'SVGFEMorphologyElement': () => FEMorphologyElement.internalCreateFEMorphologyElement,
+  'SVGFEOffsetElement': () => FEOffsetElement.internalCreateFEOffsetElement,
+  'SVGFEPointLightElement': () => FEPointLightElement.internalCreateFEPointLightElement,
+  'SVGFESpecularLightingElement': () => FESpecularLightingElement.internalCreateFESpecularLightingElement,
+  'SVGFESpotLightElement': () => FESpotLightElement.internalCreateFESpotLightElement,
+  'SVGFETileElement': () => FETileElement.internalCreateFETileElement,
+  'SVGFETurbulenceElement': () => FETurbulenceElement.internalCreateFETurbulenceElement,
+  'SVGFilterElement': () => FilterElement.internalCreateFilterElement,
+  'SVGFontElement': () => _SVGFontElement.internalCreate_SVGFontElement,
+  'SVGFontFaceElement': () => _SVGFontFaceElement.internalCreate_SVGFontFaceElement,
+  'SVGFontFaceFormatElement': () => _SVGFontFaceFormatElement.internalCreate_SVGFontFaceFormatElement,
+  'SVGFontFaceNameElement': () => _SVGFontFaceNameElement.internalCreate_SVGFontFaceNameElement,
+  'SVGFontFaceSrcElement': () => _SVGFontFaceSrcElement.internalCreate_SVGFontFaceSrcElement,
+  'SVGFontFaceUriElement': () => _SVGFontFaceUriElement.internalCreate_SVGFontFaceUriElement,
+  'SVGForeignObjectElement': () => ForeignObjectElement.internalCreateForeignObjectElement,
+  'SVGGElement': () => GElement.internalCreateGElement,
+  'SVGGeometryElement': () => GeometryElement.internalCreateGeometryElement,
+  'SVGGlyphElement': () => _SVGGlyphElement.internalCreate_SVGGlyphElement,
+  'SVGGlyphRefElement': () => _SVGGlyphRefElement.internalCreate_SVGGlyphRefElement,
+  'SVGGradientElement': () => _GradientElement.internalCreate_GradientElement,
+  'SVGGraphicsElement': () => GraphicsElement.internalCreateGraphicsElement,
+  'SVGHKernElement': () => _SVGHKernElement.internalCreate_SVGHKernElement,
+  'SVGImageElement': () => ImageElement.internalCreateImageElement,
+  'SVGLength': () => Length.internalCreateLength,
+  'SVGLengthList': () => LengthList.internalCreateLengthList,
+  'SVGLineElement': () => LineElement.internalCreateLineElement,
+  'SVGLinearGradientElement': () => LinearGradientElement.internalCreateLinearGradientElement,
+  'SVGMPathElement': () => _SVGMPathElement.internalCreate_SVGMPathElement,
+  'SVGMarkerElement': () => MarkerElement.internalCreateMarkerElement,
+  'SVGMaskElement': () => MaskElement.internalCreateMaskElement,
+  'SVGMatrix': () => Matrix.internalCreateMatrix,
+  'SVGMetadataElement': () => MetadataElement.internalCreateMetadataElement,
+  'SVGMissingGlyphElement': () => _SVGMissingGlyphElement.internalCreate_SVGMissingGlyphElement,
+  'SVGNumber': () => Number.internalCreateNumber,
+  'SVGNumberList': () => NumberList.internalCreateNumberList,
+  'SVGPathElement': () => PathElement.internalCreatePathElement,
+  'SVGPathSeg': () => PathSeg.internalCreatePathSeg,
+  'SVGPathSegArcAbs': () => PathSegArcAbs.internalCreatePathSegArcAbs,
+  'SVGPathSegArcRel': () => PathSegArcRel.internalCreatePathSegArcRel,
+  'SVGPathSegClosePath': () => PathSegClosePath.internalCreatePathSegClosePath,
+  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs.internalCreatePathSegCurvetoCubicAbs,
+  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel.internalCreatePathSegCurvetoCubicRel,
+  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs.internalCreatePathSegCurvetoCubicSmoothAbs,
+  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel.internalCreatePathSegCurvetoCubicSmoothRel,
+  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs.internalCreatePathSegCurvetoQuadraticAbs,
+  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel.internalCreatePathSegCurvetoQuadraticRel,
+  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs.internalCreatePathSegCurvetoQuadraticSmoothAbs,
+  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel.internalCreatePathSegCurvetoQuadraticSmoothRel,
+  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs.internalCreatePathSegLinetoAbs,
+  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs.internalCreatePathSegLinetoHorizontalAbs,
+  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel.internalCreatePathSegLinetoHorizontalRel,
+  'SVGPathSegLinetoRel': () => PathSegLinetoRel.internalCreatePathSegLinetoRel,
+  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs.internalCreatePathSegLinetoVerticalAbs,
+  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel.internalCreatePathSegLinetoVerticalRel,
+  'SVGPathSegList': () => PathSegList.internalCreatePathSegList,
+  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs.internalCreatePathSegMovetoAbs,
+  'SVGPathSegMovetoRel': () => PathSegMovetoRel.internalCreatePathSegMovetoRel,
+  'SVGPatternElement': () => PatternElement.internalCreatePatternElement,
+  'SVGPoint': () => Point.internalCreatePoint,
+  'SVGPointList': () => PointList.internalCreatePointList,
+  'SVGPolygonElement': () => PolygonElement.internalCreatePolygonElement,
+  'SVGPolylineElement': () => PolylineElement.internalCreatePolylineElement,
+  'SVGPreserveAspectRatio': () => PreserveAspectRatio.internalCreatePreserveAspectRatio,
+  'SVGRadialGradientElement': () => RadialGradientElement.internalCreateRadialGradientElement,
+  'SVGRect': () => Rect.internalCreateRect,
+  'SVGRectElement': () => RectElement.internalCreateRectElement,
+  'SVGRenderingIntent': () => RenderingIntent.internalCreateRenderingIntent,
+  'SVGSVGElement': () => SvgSvgElement.internalCreateSvgSvgElement,
+  'SVGScriptElement': () => ScriptElement.internalCreateScriptElement,
+  'SVGSetElement': () => SetElement.internalCreateSetElement,
+  'SVGStopElement': () => StopElement.internalCreateStopElement,
+  'SVGStringList': () => StringList.internalCreateStringList,
+  'SVGStyleElement': () => StyleElement.internalCreateStyleElement,
+  'SVGSwitchElement': () => SwitchElement.internalCreateSwitchElement,
+  'SVGSymbolElement': () => SymbolElement.internalCreateSymbolElement,
+  'SVGTSpanElement': () => TSpanElement.internalCreateTSpanElement,
+  'SVGTextContentElement': () => TextContentElement.internalCreateTextContentElement,
+  'SVGTextElement': () => TextElement.internalCreateTextElement,
+  'SVGTextPathElement': () => TextPathElement.internalCreateTextPathElement,
+  'SVGTextPositioningElement': () => TextPositioningElement.internalCreateTextPositioningElement,
+  'SVGTitleElement': () => TitleElement.internalCreateTitleElement,
+  'SVGTransform': () => Transform.internalCreateTransform,
+  'SVGTransformList': () => TransformList.internalCreateTransformList,
+  'SVGUnitTypes': () => UnitTypes.internalCreateUnitTypes,
+  'SVGUseElement': () => UseElement.internalCreateUseElement,
+  'SVGVKernElement': () => _SVGVKernElement.internalCreate_SVGVKernElement,
+  'SVGViewElement': () => ViewElement.internalCreateViewElement,
+  'SVGViewSpec': () => ViewSpec.internalCreateViewSpec,
+  'SVGZoomEvent': () => ZoomEvent.internalCreateZoomEvent,
+
+};
 // 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.
@@ -198,6 +345,18 @@
   @DomName('SVGAElement.SVGAElement')
   @DocsEditable()
   factory AElement() => _SvgElementFactoryProvider.createSvgElement_tag("a");
+
+
+  static AElement internalCreateAElement() {
+    return new AElement._internalWrap();
+  }
+
+  factory AElement._internalWrap() {
+    return new AElement.internal_();
+  }
+
+  AElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -234,6 +393,18 @@
   @DomName('SVGAltGlyphElement.SVGAltGlyphElement')
   @DocsEditable()
   factory AltGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("altGlyph");
+
+
+  static AltGlyphElement internalCreateAltGlyphElement() {
+    return new AltGlyphElement._internalWrap();
+  }
+
+  factory AltGlyphElement._internalWrap() {
+    return new AltGlyphElement.internal_();
+  }
+
+  AltGlyphElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -250,7 +421,7 @@
   
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  void set format(String value) => _blink.BlinkSVGAltGlyphElement.instance.format_Setter_(unwrap_jso(this), value);
+  set format(String value) => _blink.BlinkSVGAltGlyphElement.instance.format_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
@@ -258,7 +429,7 @@
   
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  void set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Setter_(unwrap_jso(this), value);
+  set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.instance.glyphRef_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGAltGlyphElement.href')
   @DocsEditable()
@@ -279,6 +450,21 @@
   // To suppress missing implicit constructor warnings.
   factory Angle._() { throw new UnsupportedError("Not supported"); }
 
+  static Angle internalCreateAngle() {
+    return new Angle._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Angle._internalWrap() {
+    return new Angle.internal_();
+  }
+
+  Angle.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAngle.SVG_ANGLETYPE_DEG')
   @DocsEditable()
   static const int SVG_ANGLETYPE_DEG = 2;
@@ -309,7 +495,7 @@
   
   @DomName('SVGAngle.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGAngle.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGAngle.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
@@ -317,7 +503,7 @@
   
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.BlinkSVGAngle.instance.valueAsString_Setter_(unwrap_jso(this), value);
+  set valueAsString(String value) => _blink.BlinkSVGAngle.instance.valueAsString_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
@@ -325,7 +511,7 @@
   
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
+  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
@@ -356,6 +542,18 @@
   @DomName('SVGAnimateElement.SVGAnimateElement')
   @DocsEditable()
   factory AnimateElement() => _SvgElementFactoryProvider.createSvgElement_tag("animate");
+
+
+  static AnimateElement internalCreateAnimateElement() {
+    return new AnimateElement._internalWrap();
+  }
+
+  factory AnimateElement._internalWrap() {
+    return new AnimateElement.internal_();
+  }
+
+  AnimateElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -387,6 +585,18 @@
   @DomName('SVGAnimateMotionElement.SVGAnimateMotionElement')
   @DocsEditable()
   factory AnimateMotionElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateMotion");
+
+
+  static AnimateMotionElement internalCreateAnimateMotionElement() {
+    return new AnimateMotionElement._internalWrap();
+  }
+
+  factory AnimateMotionElement._internalWrap() {
+    return new AnimateMotionElement.internal_();
+  }
+
+  AnimateMotionElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -418,6 +628,18 @@
   @DomName('SVGAnimateTransformElement.SVGAnimateTransformElement')
   @DocsEditable()
   factory AnimateTransformElement() => _SvgElementFactoryProvider.createSvgElement_tag("animateTransform");
+
+
+  static AnimateTransformElement internalCreateAnimateTransformElement() {
+    return new AnimateTransformElement._internalWrap();
+  }
+
+  factory AnimateTransformElement._internalWrap() {
+    return new AnimateTransformElement.internal_();
+  }
+
+  AnimateTransformElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -443,6 +665,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedAngle._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedAngle internalCreateAnimatedAngle() {
+    return new AnimatedAngle._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedAngle._internalWrap() {
+    return new AnimatedAngle.internal_();
+  }
+
+  AnimatedAngle.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
   Angle get animVal => wrap_jso(_blink.BlinkSVGAnimatedAngle.instance.animVal_Getter_(unwrap_jso(this)));
@@ -466,6 +703,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedBoolean._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedBoolean internalCreateAnimatedBoolean() {
+    return new AnimatedBoolean._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedBoolean._internalWrap() {
+    return new AnimatedBoolean.internal_();
+  }
+
+  AnimatedBoolean.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
   bool get animVal => _blink.BlinkSVGAnimatedBoolean.instance.animVal_Getter_(unwrap_jso(this));
@@ -476,7 +728,7 @@
   
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  void set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.instance.baseVal_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -493,6 +745,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedEnumeration._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedEnumeration internalCreateAnimatedEnumeration() {
+    return new AnimatedEnumeration._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedEnumeration._internalWrap() {
+    return new AnimatedEnumeration.internal_();
+  }
+
+  AnimatedEnumeration.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
   int get animVal => _blink.BlinkSVGAnimatedEnumeration.instance.animVal_Getter_(unwrap_jso(this));
@@ -503,7 +770,7 @@
   
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.instance.baseVal_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -520,6 +787,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedInteger._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedInteger internalCreateAnimatedInteger() {
+    return new AnimatedInteger._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedInteger._internalWrap() {
+    return new AnimatedInteger.internal_();
+  }
+
+  AnimatedInteger.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
   int get animVal => _blink.BlinkSVGAnimatedInteger.instance.animVal_Getter_(unwrap_jso(this));
@@ -530,7 +812,7 @@
   
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.instance.baseVal_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -547,6 +829,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLength._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedLength internalCreateAnimatedLength() {
+    return new AnimatedLength._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedLength._internalWrap() {
+    return new AnimatedLength.internal_();
+  }
+
+  AnimatedLength.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
   Length get animVal => wrap_jso(_blink.BlinkSVGAnimatedLength.instance.animVal_Getter_(unwrap_jso(this)));
@@ -570,6 +867,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedLengthList._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedLengthList internalCreateAnimatedLengthList() {
+    return new AnimatedLengthList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedLengthList._internalWrap() {
+    return new AnimatedLengthList.internal_();
+  }
+
+  AnimatedLengthList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
   LengthList get animVal => wrap_jso(_blink.BlinkSVGAnimatedLengthList.instance.animVal_Getter_(unwrap_jso(this)));
@@ -593,9 +905,24 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumber._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedNumber internalCreateAnimatedNumber() {
+    return new AnimatedNumber._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedNumber._internalWrap() {
+    return new AnimatedNumber.internal_();
+  }
+
+  AnimatedNumber.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  double get animVal => _blink.BlinkSVGAnimatedNumber.instance.animVal_Getter_(unwrap_jso(this));
+  num get animVal => _blink.BlinkSVGAnimatedNumber.instance.animVal_Getter_(unwrap_jso(this));
   
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
@@ -603,7 +930,7 @@
   
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  void set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.instance.baseVal_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -620,6 +947,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedNumberList._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedNumberList internalCreateAnimatedNumberList() {
+    return new AnimatedNumberList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedNumberList._internalWrap() {
+    return new AnimatedNumberList.internal_();
+  }
+
+  AnimatedNumberList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
   NumberList get animVal => wrap_jso(_blink.BlinkSVGAnimatedNumberList.instance.animVal_Getter_(unwrap_jso(this)));
@@ -643,6 +985,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedPreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedPreserveAspectRatio internalCreateAnimatedPreserveAspectRatio() {
+    return new AnimatedPreserveAspectRatio._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedPreserveAspectRatio._internalWrap() {
+    return new AnimatedPreserveAspectRatio.internal_();
+  }
+
+  AnimatedPreserveAspectRatio.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
   PreserveAspectRatio get animVal => wrap_jso(_blink.BlinkSVGAnimatedPreserveAspectRatio.instance.animVal_Getter_(unwrap_jso(this)));
@@ -666,6 +1023,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedRect._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedRect internalCreateAnimatedRect() {
+    return new AnimatedRect._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedRect._internalWrap() {
+    return new AnimatedRect.internal_();
+  }
+
+  AnimatedRect.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
   Rect get animVal => wrap_jso(_blink.BlinkSVGAnimatedRect.instance.animVal_Getter_(unwrap_jso(this)));
@@ -689,6 +1061,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedString._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedString internalCreateAnimatedString() {
+    return new AnimatedString._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedString._internalWrap() {
+    return new AnimatedString.internal_();
+  }
+
+  AnimatedString.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
   String get animVal => _blink.BlinkSVGAnimatedString.instance.animVal_Getter_(unwrap_jso(this));
@@ -699,7 +1086,7 @@
   
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  void set baseVal(String value) => _blink.BlinkSVGAnimatedString.instance.baseVal_Setter_(unwrap_jso(this), value);
+  set baseVal(String value) => _blink.BlinkSVGAnimatedString.instance.baseVal_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -716,6 +1103,21 @@
   // To suppress missing implicit constructor warnings.
   factory AnimatedTransformList._() { throw new UnsupportedError("Not supported"); }
 
+  static AnimatedTransformList internalCreateAnimatedTransformList() {
+    return new AnimatedTransformList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AnimatedTransformList._internalWrap() {
+    return new AnimatedTransformList.internal_();
+  }
+
+  AnimatedTransformList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
   TransformList get animVal => wrap_jso(_blink.BlinkSVGAnimatedTransformList.instance.animVal_Getter_(unwrap_jso(this)));
@@ -742,6 +1144,18 @@
   @DomName('SVGAnimationElement.SVGAnimationElement')
   @DocsEditable()
   factory AnimationElement() => _SvgElementFactoryProvider.createSvgElement_tag("animation");
+
+
+  static AnimationElement internalCreateAnimationElement() {
+    return new AnimationElement._internalWrap();
+  }
+
+  factory AnimationElement._internalWrap() {
+    return new AnimationElement.internal_();
+  }
+
+  AnimationElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -771,15 +1185,15 @@
   
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.BlinkSVGAnimationElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
+  num getCurrentTime() => _blink.BlinkSVGAnimationElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() => _blink.BlinkSVGAnimationElement.instance.getSimpleDuration_Callback_0_(unwrap_jso(this));
+  num getSimpleDuration() => _blink.BlinkSVGAnimationElement.instance.getSimpleDuration_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() => _blink.BlinkSVGAnimationElement.instance.getStartTime_Callback_0_(unwrap_jso(this));
+  num getStartTime() => _blink.BlinkSVGAnimationElement.instance.getStartTime_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
@@ -815,6 +1229,18 @@
   @DomName('SVGCircleElement.SVGCircleElement')
   @DocsEditable()
   factory CircleElement() => _SvgElementFactoryProvider.createSvgElement_tag("circle");
+
+
+  static CircleElement internalCreateCircleElement() {
+    return new CircleElement._internalWrap();
+  }
+
+  factory CircleElement._internalWrap() {
+    return new CircleElement.internal_();
+  }
+
+  CircleElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -852,6 +1278,18 @@
   @DomName('SVGClipPathElement.SVGClipPathElement')
   @DocsEditable()
   factory ClipPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("clipPath");
+
+
+  static ClipPathElement internalCreateClipPathElement() {
+    return new ClipPathElement._internalWrap();
+  }
+
+  factory ClipPathElement._internalWrap() {
+    return new ClipPathElement.internal_();
+  }
+
+  ClipPathElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -881,6 +1319,18 @@
   @DomName('SVGDefsElement.SVGDefsElement')
   @DocsEditable()
   factory DefsElement() => _SvgElementFactoryProvider.createSvgElement_tag("defs");
+
+
+  static DefsElement internalCreateDefsElement() {
+    return new DefsElement._internalWrap();
+  }
+
+  factory DefsElement._internalWrap() {
+    return new DefsElement.internal_();
+  }
+
+  DefsElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -906,6 +1356,18 @@
   @DomName('SVGDescElement.SVGDescElement')
   @DocsEditable()
   factory DescElement() => _SvgElementFactoryProvider.createSvgElement_tag("desc");
+
+
+  static DescElement internalCreateDescElement() {
+    return new DescElement._internalWrap();
+  }
+
+  factory DescElement._internalWrap() {
+    return new DescElement.internal_();
+  }
+
+  DescElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -927,6 +1389,18 @@
 class DiscardElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory DiscardElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static DiscardElement internalCreateDiscardElement() {
+    return new DiscardElement._internalWrap();
+  }
+
+  factory DiscardElement._internalWrap() {
+    return new DiscardElement.internal_();
+  }
+
+  DiscardElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -952,6 +1426,18 @@
   @DomName('SVGEllipseElement.SVGEllipseElement')
   @DocsEditable()
   factory EllipseElement() => _SvgElementFactoryProvider.createSvgElement_tag("ellipse");
+
+
+  static EllipseElement internalCreateEllipseElement() {
+    return new EllipseElement._internalWrap();
+  }
+
+  factory EllipseElement._internalWrap() {
+    return new EllipseElement.internal_();
+  }
+
+  EllipseElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -997,6 +1483,18 @@
   @DomName('SVGFEBlendElement.SVGFEBlendElement')
   @DocsEditable()
   factory FEBlendElement() => _SvgElementFactoryProvider.createSvgElement_tag("feBlend");
+
+
+  static FEBlendElement internalCreateFEBlendElement() {
+    return new FEBlendElement._internalWrap();
+  }
+
+  factory FEBlendElement._internalWrap() {
+    return new FEBlendElement.internal_();
+  }
+
+  FEBlendElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1085,6 +1583,18 @@
   @DomName('SVGFEColorMatrixElement.SVGFEColorMatrixElement')
   @DocsEditable()
   factory FEColorMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feColorMatrix");
+
+
+  static FEColorMatrixElement internalCreateFEColorMatrixElement() {
+    return new FEColorMatrixElement._internalWrap();
+  }
+
+  factory FEColorMatrixElement._internalWrap() {
+    return new FEColorMatrixElement.internal_();
+  }
+
+  FEColorMatrixElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1169,6 +1679,18 @@
   @DomName('SVGFEComponentTransferElement.SVGFEComponentTransferElement')
   @DocsEditable()
   factory FEComponentTransferElement() => _SvgElementFactoryProvider.createSvgElement_tag("feComponentTransfer");
+
+
+  static FEComponentTransferElement internalCreateFEComponentTransferElement() {
+    return new FEComponentTransferElement._internalWrap();
+  }
+
+  factory FEComponentTransferElement._internalWrap() {
+    return new FEComponentTransferElement.internal_();
+  }
+
+  FEComponentTransferElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1217,6 +1739,18 @@
 class FECompositeElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
   factory FECompositeElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static FECompositeElement internalCreateFECompositeElement() {
+    return new FECompositeElement._internalWrap();
+  }
+
+  factory FECompositeElement._internalWrap() {
+    return new FECompositeElement.internal_();
+  }
+
+  FECompositeElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1322,6 +1856,18 @@
   @DomName('SVGFEConvolveMatrixElement.SVGFEConvolveMatrixElement')
   @DocsEditable()
   factory FEConvolveMatrixElement() => _SvgElementFactoryProvider.createSvgElement_tag("feConvolveMatrix");
+
+
+  static FEConvolveMatrixElement internalCreateFEConvolveMatrixElement() {
+    return new FEConvolveMatrixElement._internalWrap();
+  }
+
+  factory FEConvolveMatrixElement._internalWrap() {
+    return new FEConvolveMatrixElement.internal_();
+  }
+
+  FEConvolveMatrixElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1438,6 +1984,18 @@
   @DomName('SVGFEDiffuseLightingElement.SVGFEDiffuseLightingElement')
   @DocsEditable()
   factory FEDiffuseLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDiffuseLighting");
+
+
+  static FEDiffuseLightingElement internalCreateFEDiffuseLightingElement() {
+    return new FEDiffuseLightingElement._internalWrap();
+  }
+
+  factory FEDiffuseLightingElement._internalWrap() {
+    return new FEDiffuseLightingElement.internal_();
+  }
+
+  FEDiffuseLightingElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1510,6 +2068,18 @@
   @DomName('SVGFEDisplacementMapElement.SVGFEDisplacementMapElement')
   @DocsEditable()
   factory FEDisplacementMapElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDisplacementMap");
+
+
+  static FEDisplacementMapElement internalCreateFEDisplacementMapElement() {
+    return new FEDisplacementMapElement._internalWrap();
+  }
+
+  factory FEDisplacementMapElement._internalWrap() {
+    return new FEDisplacementMapElement.internal_();
+  }
+
+  FEDisplacementMapElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1602,6 +2172,18 @@
   @DomName('SVGFEDistantLightElement.SVGFEDistantLightElement')
   @DocsEditable()
   factory FEDistantLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feDistantLight");
+
+
+  static FEDistantLightElement internalCreateFEDistantLightElement() {
+    return new FEDistantLightElement._internalWrap();
+  }
+
+  factory FEDistantLightElement._internalWrap() {
+    return new FEDistantLightElement.internal_();
+  }
+
+  FEDistantLightElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1642,6 +2224,18 @@
   @DomName('SVGFEFloodElement.SVGFEFloodElement')
   @DocsEditable()
   factory FEFloodElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFlood");
+
+
+  static FEFloodElement internalCreateFEFloodElement() {
+    return new FEFloodElement._internalWrap();
+  }
+
+  factory FEFloodElement._internalWrap() {
+    return new FEFloodElement.internal_();
+  }
+
+  FEFloodElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1694,6 +2288,18 @@
   @DomName('SVGFEFuncAElement.SVGFEFuncAElement')
   @DocsEditable()
   factory FEFuncAElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncA");
+
+
+  static FEFuncAElement internalCreateFEFuncAElement() {
+    return new FEFuncAElement._internalWrap();
+  }
+
+  factory FEFuncAElement._internalWrap() {
+    return new FEFuncAElement.internal_();
+  }
+
+  FEFuncAElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1726,6 +2332,18 @@
   @DomName('SVGFEFuncBElement.SVGFEFuncBElement')
   @DocsEditable()
   factory FEFuncBElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncB");
+
+
+  static FEFuncBElement internalCreateFEFuncBElement() {
+    return new FEFuncBElement._internalWrap();
+  }
+
+  factory FEFuncBElement._internalWrap() {
+    return new FEFuncBElement.internal_();
+  }
+
+  FEFuncBElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1758,6 +2376,18 @@
   @DomName('SVGFEFuncGElement.SVGFEFuncGElement')
   @DocsEditable()
   factory FEFuncGElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncG");
+
+
+  static FEFuncGElement internalCreateFEFuncGElement() {
+    return new FEFuncGElement._internalWrap();
+  }
+
+  factory FEFuncGElement._internalWrap() {
+    return new FEFuncGElement.internal_();
+  }
+
+  FEFuncGElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1790,6 +2420,18 @@
   @DomName('SVGFEFuncRElement.SVGFEFuncRElement')
   @DocsEditable()
   factory FEFuncRElement() => _SvgElementFactoryProvider.createSvgElement_tag("feFuncR");
+
+
+  static FEFuncRElement internalCreateFEFuncRElement() {
+    return new FEFuncRElement._internalWrap();
+  }
+
+  factory FEFuncRElement._internalWrap() {
+    return new FEFuncRElement.internal_();
+  }
+
+  FEFuncRElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1822,6 +2464,18 @@
   @DomName('SVGFEGaussianBlurElement.SVGFEGaussianBlurElement')
   @DocsEditable()
   factory FEGaussianBlurElement() => _SvgElementFactoryProvider.createSvgElement_tag("feGaussianBlur");
+
+
+  static FEGaussianBlurElement internalCreateFEGaussianBlurElement() {
+    return new FEGaussianBlurElement._internalWrap();
+  }
+
+  factory FEGaussianBlurElement._internalWrap() {
+    return new FEGaussianBlurElement.internal_();
+  }
+
+  FEGaussianBlurElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1890,6 +2544,18 @@
   @DomName('SVGFEImageElement.SVGFEImageElement')
   @DocsEditable()
   factory FEImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("feImage");
+
+
+  static FEImageElement internalCreateFEImageElement() {
+    return new FEImageElement._internalWrap();
+  }
+
+  factory FEImageElement._internalWrap() {
+    return new FEImageElement.internal_();
+  }
+
+  FEImageElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1950,6 +2616,18 @@
   @DomName('SVGFEMergeElement.SVGFEMergeElement')
   @DocsEditable()
   factory FEMergeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMerge");
+
+
+  static FEMergeElement internalCreateFEMergeElement() {
+    return new FEMergeElement._internalWrap();
+  }
+
+  factory FEMergeElement._internalWrap() {
+    return new FEMergeElement.internal_();
+  }
+
+  FEMergeElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2002,6 +2680,18 @@
   @DomName('SVGFEMergeNodeElement.SVGFEMergeNodeElement')
   @DocsEditable()
   factory FEMergeNodeElement() => _SvgElementFactoryProvider.createSvgElement_tag("feMergeNode");
+
+
+  static FEMergeNodeElement internalCreateFEMergeNodeElement() {
+    return new FEMergeNodeElement._internalWrap();
+  }
+
+  factory FEMergeNodeElement._internalWrap() {
+    return new FEMergeNodeElement.internal_();
+  }
+
+  FEMergeNodeElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2034,6 +2724,18 @@
 class FEMorphologyElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
   factory FEMorphologyElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static FEMorphologyElement internalCreateFEMorphologyElement() {
+    return new FEMorphologyElement._internalWrap();
+  }
+
+  factory FEMorphologyElement._internalWrap() {
+    return new FEMorphologyElement.internal_();
+  }
+
+  FEMorphologyElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2111,6 +2813,18 @@
   @DomName('SVGFEOffsetElement.SVGFEOffsetElement')
   @DocsEditable()
   factory FEOffsetElement() => _SvgElementFactoryProvider.createSvgElement_tag("feOffset");
+
+
+  static FEOffsetElement internalCreateFEOffsetElement() {
+    return new FEOffsetElement._internalWrap();
+  }
+
+  factory FEOffsetElement._internalWrap() {
+    return new FEOffsetElement.internal_();
+  }
+
+  FEOffsetElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2175,6 +2889,18 @@
   @DomName('SVGFEPointLightElement.SVGFEPointLightElement')
   @DocsEditable()
   factory FEPointLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("fePointLight");
+
+
+  static FEPointLightElement internalCreateFEPointLightElement() {
+    return new FEPointLightElement._internalWrap();
+  }
+
+  factory FEPointLightElement._internalWrap() {
+    return new FEPointLightElement.internal_();
+  }
+
+  FEPointLightElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2219,6 +2945,18 @@
   @DomName('SVGFESpecularLightingElement.SVGFESpecularLightingElement')
   @DocsEditable()
   factory FESpecularLightingElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpecularLighting");
+
+
+  static FESpecularLightingElement internalCreateFESpecularLightingElement() {
+    return new FESpecularLightingElement._internalWrap();
+  }
+
+  factory FESpecularLightingElement._internalWrap() {
+    return new FESpecularLightingElement.internal_();
+  }
+
+  FESpecularLightingElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2287,6 +3025,18 @@
   @DomName('SVGFESpotLightElement.SVGFESpotLightElement')
   @DocsEditable()
   factory FESpotLightElement() => _SvgElementFactoryProvider.createSvgElement_tag("feSpotLight");
+
+
+  static FESpotLightElement internalCreateFESpotLightElement() {
+    return new FESpotLightElement._internalWrap();
+  }
+
+  factory FESpotLightElement._internalWrap() {
+    return new FESpotLightElement.internal_();
+  }
+
+  FESpotLightElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2351,6 +3101,18 @@
   @DomName('SVGFETileElement.SVGFETileElement')
   @DocsEditable()
   factory FETileElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTile");
+
+
+  static FETileElement internalCreateFETileElement() {
+    return new FETileElement._internalWrap();
+  }
+
+  factory FETileElement._internalWrap() {
+    return new FETileElement.internal_();
+  }
+
+  FETileElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2407,6 +3169,18 @@
   @DomName('SVGFETurbulenceElement.SVGFETurbulenceElement')
   @DocsEditable()
   factory FETurbulenceElement() => _SvgElementFactoryProvider.createSvgElement_tag("feTurbulence");
+
+
+  static FETurbulenceElement internalCreateFETurbulenceElement() {
+    return new FETurbulenceElement._internalWrap();
+  }
+
+  factory FETurbulenceElement._internalWrap() {
+    return new FETurbulenceElement.internal_();
+  }
+
+  FETurbulenceElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2507,6 +3281,18 @@
   @DomName('SVGFilterElement.SVGFilterElement')
   @DocsEditable()
   factory FilterElement() => _SvgElementFactoryProvider.createSvgElement_tag("filter");
+
+
+  static FilterElement internalCreateFilterElement() {
+    return new FilterElement._internalWrap();
+  }
+
+  factory FilterElement._internalWrap() {
+    return new FilterElement.internal_();
+  }
+
+  FilterElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2636,6 +3422,18 @@
   @DomName('SVGForeignObjectElement.SVGForeignObjectElement')
   @DocsEditable()
   factory ForeignObjectElement() => _SvgElementFactoryProvider.createSvgElement_tag("foreignObject");
+
+
+  static ForeignObjectElement internalCreateForeignObjectElement() {
+    return new ForeignObjectElement._internalWrap();
+  }
+
+  factory ForeignObjectElement._internalWrap() {
+    return new ForeignObjectElement.internal_();
+  }
+
+  ForeignObjectElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2680,6 +3478,18 @@
   @DomName('SVGGElement.SVGGElement')
   @DocsEditable()
   factory GElement() => _SvgElementFactoryProvider.createSvgElement_tag("g");
+
+
+  static GElement internalCreateGElement() {
+    return new GElement._internalWrap();
+  }
+
+  factory GElement._internalWrap() {
+    return new GElement.internal_();
+  }
+
+  GElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2701,6 +3511,18 @@
 class GeometryElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
   factory GeometryElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static GeometryElement internalCreateGeometryElement() {
+    return new GeometryElement._internalWrap();
+  }
+
+  factory GeometryElement._internalWrap() {
+    return new GeometryElement.internal_();
+  }
+
+  GeometryElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2732,6 +3554,18 @@
 class GraphicsElement extends SvgElement implements Tests {
   // To suppress missing implicit constructor warnings.
   factory GraphicsElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static GraphicsElement internalCreateGraphicsElement() {
+    return new GraphicsElement._internalWrap();
+  }
+
+  factory GraphicsElement._internalWrap() {
+    return new GraphicsElement.internal_();
+  }
+
+  GraphicsElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2762,17 +3596,17 @@
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.instance.getCTM_Callback_0_(unwrap_jso(this));
+  Matrix getCtm() => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getCTM_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.instance.getScreenCTM_Callback_0_(unwrap_jso(this));
+  Matrix getScreenCtm() => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getScreenCTM_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.instance.getTransformToElement_Callback_1_(unwrap_jso(this), unwrap_jso(element));
+  Matrix getTransformToElement(SvgElement element) => wrap_jso(_blink.BlinkSVGGraphicsElement.instance.getTransformToElement_Callback_1_(unwrap_jso(this), unwrap_jso(element)));
   
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
@@ -2812,6 +3646,18 @@
   @DomName('SVGImageElement.SVGImageElement')
   @DocsEditable()
   factory ImageElement() => _SvgElementFactoryProvider.createSvgElement_tag("image");
+
+
+  static ImageElement internalCreateImageElement() {
+    return new ImageElement._internalWrap();
+  }
+
+  factory ImageElement._internalWrap() {
+    return new ImageElement.internal_();
+  }
+
+  ImageElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -2858,6 +3704,21 @@
   // To suppress missing implicit constructor warnings.
   factory Length._() { throw new UnsupportedError("Not supported"); }
 
+  static Length internalCreateLength() {
+    return new Length._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Length._internalWrap() {
+    return new Length.internal_();
+  }
+
+  Length.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGLength.SVG_LENGTHTYPE_CM')
   @DocsEditable()
   static const int SVG_LENGTHTYPE_CM = 6;
@@ -2912,7 +3773,7 @@
   
   @DomName('SVGLength.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGLength.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGLength.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
@@ -2920,7 +3781,7 @@
   
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.BlinkSVGLength.instance.valueAsString_Setter_(unwrap_jso(this), value);
+  set valueAsString(String value) => _blink.BlinkSVGLength.instance.valueAsString_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
@@ -2928,7 +3789,7 @@
   
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
+  set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.instance.valueInSpecifiedUnits_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
@@ -2949,10 +3810,25 @@
 @DocsEditable()
 @DomName('SVGLengthList')
 @Unstable()
-class LengthList extends NativeFieldWrapperClass2 with ListMixin<Length>, ImmutableListMixin<Length> implements List<Length> {
+class LengthList extends JsoNativeFieldWrapper with ListMixin<Length>, ImmutableListMixin<Length> implements List<Length> {
   // To suppress missing implicit constructor warnings.
   factory LengthList._() { throw new UnsupportedError("Not supported"); }
 
+  static LengthList internalCreateLengthList() {
+    return new LengthList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory LengthList._internalWrap() {
+    return new LengthList.internal_();
+  }
+
+  LengthList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGLengthList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -2975,7 +3851,7 @@
   // Length is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -3013,7 +3889,7 @@
   
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) => _blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Length appendItem(Length item) => wrap_jso(_blink.BlinkSVGLengthList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGLengthList.clear')
   @DocsEditable()
@@ -3021,23 +3897,23 @@
   
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) => _blink.BlinkSVGLengthList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  Length getItem(int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.getItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) => _blink.BlinkSVGLengthList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Length initialize(Length item) => wrap_jso(_blink.BlinkSVGLengthList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) => _blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Length insertItemBefore(Length item, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) => _blink.BlinkSVGLengthList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  Length removeItem(int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) => _blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Length replaceItem(Length item, int index) => wrap_jso(_blink.BlinkSVGLengthList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3057,6 +3933,18 @@
   @DomName('SVGLineElement.SVGLineElement')
   @DocsEditable()
   factory LineElement() => _SvgElementFactoryProvider.createSvgElement_tag("line");
+
+
+  static LineElement internalCreateLineElement() {
+    return new LineElement._internalWrap();
+  }
+
+  factory LineElement._internalWrap() {
+    return new LineElement.internal_();
+  }
+
+  LineElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3098,6 +3986,18 @@
   @DomName('SVGLinearGradientElement.SVGLinearGradientElement')
   @DocsEditable()
   factory LinearGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("linearGradient");
+
+
+  static LinearGradientElement internalCreateLinearGradientElement() {
+    return new LinearGradientElement._internalWrap();
+  }
+
+  factory LinearGradientElement._internalWrap() {
+    return new LinearGradientElement.internal_();
+  }
+
+  LinearGradientElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3139,6 +4039,18 @@
   @DomName('SVGMarkerElement.SVGMarkerElement')
   @DocsEditable()
   factory MarkerElement() => _SvgElementFactoryProvider.createSvgElement_tag("marker");
+
+
+  static MarkerElement internalCreateMarkerElement() {
+    return new MarkerElement._internalWrap();
+  }
+
+  factory MarkerElement._internalWrap() {
+    return new MarkerElement.internal_();
+  }
+
+  MarkerElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3232,6 +4144,18 @@
   @DomName('SVGMaskElement.SVGMaskElement')
   @DocsEditable()
   factory MaskElement() => _SvgElementFactoryProvider.createSvgElement_tag("mask");
+
+
+  static MaskElement internalCreateMaskElement() {
+    return new MaskElement._internalWrap();
+  }
+
+  factory MaskElement._internalWrap() {
+    return new MaskElement.internal_();
+  }
+
+  MaskElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3294,13 +4218,28 @@
   // To suppress missing implicit constructor warnings.
   factory Matrix._() { throw new UnsupportedError("Not supported"); }
 
+  static Matrix internalCreateMatrix() {
+    return new Matrix._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Matrix._internalWrap() {
+    return new Matrix.internal_();
+  }
+
+  Matrix.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGMatrix.a')
   @DocsEditable()
   num get a => _blink.BlinkSVGMatrix.instance.a_Getter_(unwrap_jso(this));
   
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  void set a(num value) => _blink.BlinkSVGMatrix.instance.a_Setter_(unwrap_jso(this), value);
+  set a(num value) => _blink.BlinkSVGMatrix.instance.a_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.b')
   @DocsEditable()
@@ -3308,7 +4247,7 @@
   
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  void set b(num value) => _blink.BlinkSVGMatrix.instance.b_Setter_(unwrap_jso(this), value);
+  set b(num value) => _blink.BlinkSVGMatrix.instance.b_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.c')
   @DocsEditable()
@@ -3316,7 +4255,7 @@
   
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  void set c(num value) => _blink.BlinkSVGMatrix.instance.c_Setter_(unwrap_jso(this), value);
+  set c(num value) => _blink.BlinkSVGMatrix.instance.c_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.d')
   @DocsEditable()
@@ -3324,7 +4263,7 @@
   
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  void set d(num value) => _blink.BlinkSVGMatrix.instance.d_Setter_(unwrap_jso(this), value);
+  set d(num value) => _blink.BlinkSVGMatrix.instance.d_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.e')
   @DocsEditable()
@@ -3332,7 +4271,7 @@
   
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  void set e(num value) => _blink.BlinkSVGMatrix.instance.e_Setter_(unwrap_jso(this), value);
+  set e(num value) => _blink.BlinkSVGMatrix.instance.e_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.f')
   @DocsEditable()
@@ -3340,51 +4279,51 @@
   
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  void set f(num value) => _blink.BlinkSVGMatrix.instance.f_Setter_(unwrap_jso(this), value);
+  set f(num value) => _blink.BlinkSVGMatrix.instance.f_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() => _blink.BlinkSVGMatrix.instance.flipX_Callback_0_(unwrap_jso(this));
+  Matrix flipX() => wrap_jso(_blink.BlinkSVGMatrix.instance.flipX_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() => _blink.BlinkSVGMatrix.instance.flipY_Callback_0_(unwrap_jso(this));
+  Matrix flipY() => wrap_jso(_blink.BlinkSVGMatrix.instance.flipY_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() => _blink.BlinkSVGMatrix.instance.inverse_Callback_0_(unwrap_jso(this));
+  Matrix inverse() => wrap_jso(_blink.BlinkSVGMatrix.instance.inverse_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(secondMatrix));
+  Matrix multiply(Matrix secondMatrix) => wrap_jso(_blink.BlinkSVGMatrix.instance.multiply_Callback_1_(unwrap_jso(this), unwrap_jso(secondMatrix)));
   
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.instance.rotate_Callback_1_(unwrap_jso(this), angle);
+  Matrix rotate(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.rotate_Callback_1_(unwrap_jso(this), angle));
   
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.instance.rotateFromVector_Callback_2_(unwrap_jso(this), x, y);
+  Matrix rotateFromVector(num x, num y) => wrap_jso(_blink.BlinkSVGMatrix.instance.rotateFromVector_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.instance.scale_Callback_1_(unwrap_jso(this), scaleFactor);
+  Matrix scale(num scaleFactor) => wrap_jso(_blink.BlinkSVGMatrix.instance.scale_Callback_1_(unwrap_jso(this), scaleFactor));
   
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), scaleFactorX, scaleFactorY);
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => wrap_jso(_blink.BlinkSVGMatrix.instance.scaleNonUniform_Callback_2_(unwrap_jso(this), scaleFactorX, scaleFactorY));
   
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.instance.skewX_Callback_1_(unwrap_jso(this), angle);
+  Matrix skewX(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.skewX_Callback_1_(unwrap_jso(this), angle));
   
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.instance.skewY_Callback_1_(unwrap_jso(this), angle);
+  Matrix skewY(num angle) => wrap_jso(_blink.BlinkSVGMatrix.instance.skewY_Callback_1_(unwrap_jso(this), angle));
   
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.instance.translate_Callback_2_(unwrap_jso(this), x, y);
+  Matrix translate(num x, num y) => wrap_jso(_blink.BlinkSVGMatrix.instance.translate_Callback_2_(unwrap_jso(this), x, y));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3400,6 +4339,18 @@
 class MetadataElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory MetadataElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static MetadataElement internalCreateMetadataElement() {
+    return new MetadataElement._internalWrap();
+  }
+
+  factory MetadataElement._internalWrap() {
+    return new MetadataElement.internal_();
+  }
+
+  MetadataElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3422,13 +4373,28 @@
   // To suppress missing implicit constructor warnings.
   factory Number._() { throw new UnsupportedError("Not supported"); }
 
+  static Number internalCreateNumber() {
+    return new Number._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Number._internalWrap() {
+    return new Number.internal_();
+  }
+
+  Number.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGNumber.value')
   @DocsEditable()
   num get value => _blink.BlinkSVGNumber.instance.value_Getter_(unwrap_jso(this));
   
   @DomName('SVGNumber.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkSVGNumber.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkSVGNumber.instance.value_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3441,10 +4407,25 @@
 @DocsEditable()
 @DomName('SVGNumberList')
 @Unstable()
-class NumberList extends NativeFieldWrapperClass2 with ListMixin<Number>, ImmutableListMixin<Number> implements List<Number> {
+class NumberList extends JsoNativeFieldWrapper with ListMixin<Number>, ImmutableListMixin<Number> implements List<Number> {
   // To suppress missing implicit constructor warnings.
   factory NumberList._() { throw new UnsupportedError("Not supported"); }
 
+  static NumberList internalCreateNumberList() {
+    return new NumberList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory NumberList._internalWrap() {
+    return new NumberList.internal_();
+  }
+
+  NumberList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGNumberList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -3467,7 +4448,7 @@
   // Number is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -3505,7 +4486,7 @@
   
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) => _blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Number appendItem(Number item) => wrap_jso(_blink.BlinkSVGNumberList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGNumberList.clear')
   @DocsEditable()
@@ -3513,23 +4494,23 @@
   
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) => _blink.BlinkSVGNumberList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  Number getItem(int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.getItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) => _blink.BlinkSVGNumberList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Number initialize(Number item) => wrap_jso(_blink.BlinkSVGNumberList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) => _blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Number insertItemBefore(Number item, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) => _blink.BlinkSVGNumberList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  Number removeItem(int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) => _blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Number replaceItem(Number item, int index) => wrap_jso(_blink.BlinkSVGNumberList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3549,6 +4530,18 @@
   @DomName('SVGPathElement.SVGPathElement')
   @DocsEditable()
   factory PathElement() => _SvgElementFactoryProvider.createSvgElement_tag("path");
+
+
+  static PathElement internalCreatePathElement() {
+    return new PathElement._internalWrap();
+  }
+
+  factory PathElement._internalWrap() {
+    return new PathElement.internal_();
+  }
+
+  PathElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -3578,79 +4571,79 @@
   
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.instance.createSVGPathSegArcAbs_Callback_7_(unwrap_jso(this), x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegArcAbs_Callback_7_(unwrap_jso(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.instance.createSVGPathSegArcRel_Callback_7_(unwrap_jso(this), x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegArcRel_Callback_7_(unwrap_jso(this), x, y, r1, r2, angle, largeArcFlag, sweepFlag));
   
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.instance.createSVGPathSegClosePath_Callback_0_(unwrap_jso(this));
+  PathSegClosePath createSvgPathSegClosePath() => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegClosePath_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicAbs_Callback_6_(unwrap_jso(this), x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicAbs_Callback_6_(unwrap_jso(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.instance.createSVGPathSegCurvetoCubicRel_Callback_6_(unwrap_jso(this), x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicRel_Callback_6_(unwrap_jso(this), x, y, x1, y1, x2, y2));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(unwrap_jso(this), x, y, x2, y2);
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothAbs_Callback_4_(unwrap_jso(this), x, y, x2, y2));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(unwrap_jso(this), x, y, x2, y2);
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoCubicSmoothRel_Callback_4_(unwrap_jso(this), x, y, x2, y2));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticAbs_Callback_4_(unwrap_jso(this), x, y, x1, y1);
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticAbs_Callback_4_(unwrap_jso(this), x, y, x1, y1));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticRel_Callback_4_(unwrap_jso(this), x, y, x1, y1);
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticRel_Callback_4_(unwrap_jso(this), x, y, x1, y1));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(unwrap_jso(this), x, y);
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(unwrap_jso(this), x, y);
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegCurvetoQuadraticSmoothRel_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoAbs_Callback_2_(unwrap_jso(this), x, y);
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoAbs_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalAbs_Callback_1_(unwrap_jso(this), x);
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalAbs_Callback_1_(unwrap_jso(this), x));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalRel_Callback_1_(unwrap_jso(this), x);
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoHorizontalRel_Callback_1_(unwrap_jso(this), x));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoRel_Callback_2_(unwrap_jso(this), x, y);
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoRel_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalAbs_Callback_1_(unwrap_jso(this), y);
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalAbs_Callback_1_(unwrap_jso(this), y));
   
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalRel_Callback_1_(unwrap_jso(this), y);
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegLinetoVerticalRel_Callback_1_(unwrap_jso(this), y));
   
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoAbs_Callback_2_(unwrap_jso(this), x, y);
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoAbs_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoRel_Callback_2_(unwrap_jso(this), x, y);
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => wrap_jso(_blink.BlinkSVGPathElement.instance.createSVGPathSegMovetoRel_Callback_2_(unwrap_jso(this), x, y));
   
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
@@ -3658,11 +4651,11 @@
   
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.instance.getPointAtLength_Callback_1_(unwrap_jso(this), distance);
+  Point getPointAtLength(num distance) => wrap_jso(_blink.BlinkSVGPathElement.instance.getPointAtLength_Callback_1_(unwrap_jso(this), distance));
   
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() => _blink.BlinkSVGPathElement.instance.getTotalLength_Callback_0_(unwrap_jso(this));
+  num getTotalLength() => _blink.BlinkSVGPathElement.instance.getTotalLength_Callback_0_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3679,6 +4672,21 @@
   // To suppress missing implicit constructor warnings.
   factory PathSeg._() { throw new UnsupportedError("Not supported"); }
 
+  static PathSeg internalCreatePathSeg() {
+    return new PathSeg._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PathSeg._internalWrap() {
+    return new PathSeg.internal_();
+  }
+
+  PathSeg.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGPathSeg.PATHSEG_ARC_ABS')
   @DocsEditable()
   static const int PATHSEG_ARC_ABS = 10;
@@ -3782,13 +4790,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegArcAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegArcAbs internalCreatePathSegArcAbs() {
+    return new PathSegArcAbs._internalWrap();
+  }
+
+  factory PathSegArcAbs._internalWrap() {
+    return new PathSegArcAbs.internal_();
+  }
+
+  PathSegArcAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
   num get angle => _blink.BlinkSVGPathSegArcAbs.instance.angle_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.BlinkSVGPathSegArcAbs.instance.angle_Setter_(unwrap_jso(this), value);
+  set angle(num value) => _blink.BlinkSVGPathSegArcAbs.instance.angle_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
@@ -3796,7 +4816,7 @@
   
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
+  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
@@ -3804,7 +4824,7 @@
   
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r1_Setter_(unwrap_jso(this), value);
+  set r1(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
@@ -3812,7 +4832,7 @@
   
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r2_Setter_(unwrap_jso(this), value);
+  set r2(num value) => _blink.BlinkSVGPathSegArcAbs.instance.r2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
@@ -3820,7 +4840,7 @@
   
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Setter_(unwrap_jso(this), value);
+  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.instance.sweepFlag_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
@@ -3828,7 +4848,7 @@
   
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegArcAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegArcAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
@@ -3836,7 +4856,7 @@
   
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegArcAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegArcAbs.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3853,13 +4873,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegArcRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegArcRel internalCreatePathSegArcRel() {
+    return new PathSegArcRel._internalWrap();
+  }
+
+  factory PathSegArcRel._internalWrap() {
+    return new PathSegArcRel.internal_();
+  }
+
+  PathSegArcRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
   num get angle => _blink.BlinkSVGPathSegArcRel.instance.angle_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.BlinkSVGPathSegArcRel.instance.angle_Setter_(unwrap_jso(this), value);
+  set angle(num value) => _blink.BlinkSVGPathSegArcRel.instance.angle_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
@@ -3867,7 +4899,7 @@
   
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
+  set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.largeArcFlag_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
@@ -3875,7 +4907,7 @@
   
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.BlinkSVGPathSegArcRel.instance.r1_Setter_(unwrap_jso(this), value);
+  set r1(num value) => _blink.BlinkSVGPathSegArcRel.instance.r1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
@@ -3883,7 +4915,7 @@
   
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.BlinkSVGPathSegArcRel.instance.r2_Setter_(unwrap_jso(this), value);
+  set r2(num value) => _blink.BlinkSVGPathSegArcRel.instance.r2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
@@ -3891,7 +4923,7 @@
   
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Setter_(unwrap_jso(this), value);
+  set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.instance.sweepFlag_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
@@ -3899,7 +4931,7 @@
   
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegArcRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegArcRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
@@ -3907,7 +4939,7 @@
   
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegArcRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegArcRel.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3924,6 +4956,18 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegClosePath._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegClosePath internalCreatePathSegClosePath() {
+    return new PathSegClosePath._internalWrap();
+  }
+
+  factory PathSegClosePath._internalWrap() {
+    return new PathSegClosePath.internal_();
+  }
+
+  PathSegClosePath.internal_() : super.internal_();
+
+
 }
 // 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
@@ -3939,13 +4983,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoCubicAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoCubicAbs internalCreatePathSegCurvetoCubicAbs() {
+    return new PathSegCurvetoCubicAbs._internalWrap();
+  }
+
+  factory PathSegCurvetoCubicAbs._internalWrap() {
+    return new PathSegCurvetoCubicAbs.internal_();
+  }
+
+  PathSegCurvetoCubicAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
@@ -3953,7 +5009,7 @@
   
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
@@ -3961,7 +5017,7 @@
   
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.x2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
@@ -3969,7 +5025,7 @@
   
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
@@ -3977,7 +5033,7 @@
   
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
@@ -3985,7 +5041,7 @@
   
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.instance.y2_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4002,13 +5058,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoCubicRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoCubicRel internalCreatePathSegCurvetoCubicRel() {
+    return new PathSegCurvetoCubicRel._internalWrap();
+  }
+
+  factory PathSegCurvetoCubicRel._internalWrap() {
+    return new PathSegCurvetoCubicRel.internal_();
+  }
+
+  PathSegCurvetoCubicRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
@@ -4016,7 +5084,7 @@
   
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
@@ -4024,7 +5092,7 @@
   
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.x2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
@@ -4032,7 +5100,7 @@
   
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
@@ -4040,7 +5108,7 @@
   
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
@@ -4048,7 +5116,7 @@
   
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.instance.y2_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4065,13 +5133,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoCubicSmoothAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoCubicSmoothAbs internalCreatePathSegCurvetoCubicSmoothAbs() {
+    return new PathSegCurvetoCubicSmoothAbs._internalWrap();
+  }
+
+  factory PathSegCurvetoCubicSmoothAbs._internalWrap() {
+    return new PathSegCurvetoCubicSmoothAbs.internal_();
+  }
+
+  PathSegCurvetoCubicSmoothAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
@@ -4079,7 +5159,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.x2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
@@ -4087,7 +5167,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
@@ -4095,7 +5175,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.instance.y2_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4112,13 +5192,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoCubicSmoothRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoCubicSmoothRel internalCreatePathSegCurvetoCubicSmoothRel() {
+    return new PathSegCurvetoCubicSmoothRel._internalWrap();
+  }
+
+  factory PathSegCurvetoCubicSmoothRel._internalWrap() {
+    return new PathSegCurvetoCubicSmoothRel.internal_();
+  }
+
+  PathSegCurvetoCubicSmoothRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
@@ -4126,7 +5218,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Setter_(unwrap_jso(this), value);
+  set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.x2_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
@@ -4134,7 +5226,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
@@ -4142,7 +5234,7 @@
   
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Setter_(unwrap_jso(this), value);
+  set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.instance.y2_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4159,13 +5251,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoQuadraticAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoQuadraticAbs internalCreatePathSegCurvetoQuadraticAbs() {
+    return new PathSegCurvetoQuadraticAbs._internalWrap();
+  }
+
+  factory PathSegCurvetoQuadraticAbs._internalWrap() {
+    return new PathSegCurvetoQuadraticAbs.internal_();
+  }
+
+  PathSegCurvetoQuadraticAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
@@ -4173,7 +5277,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.x1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
@@ -4181,7 +5285,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
@@ -4189,7 +5293,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.instance.y1_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4206,13 +5310,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoQuadraticRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoQuadraticRel internalCreatePathSegCurvetoQuadraticRel() {
+    return new PathSegCurvetoQuadraticRel._internalWrap();
+  }
+
+  factory PathSegCurvetoQuadraticRel._internalWrap() {
+    return new PathSegCurvetoQuadraticRel.internal_();
+  }
+
+  PathSegCurvetoQuadraticRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
@@ -4220,7 +5336,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Setter_(unwrap_jso(this), value);
+  set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.x1_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
@@ -4228,7 +5344,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
@@ -4236,7 +5352,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Setter_(unwrap_jso(this), value);
+  set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.instance.y1_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4253,13 +5369,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoQuadraticSmoothAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoQuadraticSmoothAbs internalCreatePathSegCurvetoQuadraticSmoothAbs() {
+    return new PathSegCurvetoQuadraticSmoothAbs._internalWrap();
+  }
+
+  factory PathSegCurvetoQuadraticSmoothAbs._internalWrap() {
+    return new PathSegCurvetoQuadraticSmoothAbs.internal_();
+  }
+
+  PathSegCurvetoQuadraticSmoothAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
@@ -4267,7 +5395,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4284,13 +5412,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegCurvetoQuadraticSmoothRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegCurvetoQuadraticSmoothRel internalCreatePathSegCurvetoQuadraticSmoothRel() {
+    return new PathSegCurvetoQuadraticSmoothRel._internalWrap();
+  }
+
+  factory PathSegCurvetoQuadraticSmoothRel._internalWrap() {
+    return new PathSegCurvetoQuadraticSmoothRel.internal_();
+  }
+
+  PathSegCurvetoQuadraticSmoothRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
@@ -4298,7 +5438,7 @@
   
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4315,13 +5455,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoAbs internalCreatePathSegLinetoAbs() {
+    return new PathSegLinetoAbs._internalWrap();
+  }
+
+  factory PathSegLinetoAbs._internalWrap() {
+    return new PathSegLinetoAbs.internal_();
+  }
+
+  PathSegLinetoAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
@@ -4329,7 +5481,7 @@
   
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4346,13 +5498,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoHorizontalAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoHorizontalAbs internalCreatePathSegLinetoHorizontalAbs() {
+    return new PathSegLinetoHorizontalAbs._internalWrap();
+  }
+
+  factory PathSegLinetoHorizontalAbs._internalWrap() {
+    return new PathSegLinetoHorizontalAbs.internal_();
+  }
+
+  PathSegLinetoHorizontalAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.instance.x_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4369,13 +5533,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoHorizontalRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoHorizontalRel internalCreatePathSegLinetoHorizontalRel() {
+    return new PathSegLinetoHorizontalRel._internalWrap();
+  }
+
+  factory PathSegLinetoHorizontalRel._internalWrap() {
+    return new PathSegLinetoHorizontalRel.internal_();
+  }
+
+  PathSegLinetoHorizontalRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.instance.x_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4392,13 +5568,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoRel internalCreatePathSegLinetoRel() {
+    return new PathSegLinetoRel._internalWrap();
+  }
+
+  factory PathSegLinetoRel._internalWrap() {
+    return new PathSegLinetoRel.internal_();
+  }
+
+  PathSegLinetoRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegLinetoRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
@@ -4406,7 +5594,7 @@
   
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoRel.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4423,13 +5611,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoVerticalAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoVerticalAbs internalCreatePathSegLinetoVerticalAbs() {
+    return new PathSegLinetoVerticalAbs._internalWrap();
+  }
+
+  factory PathSegLinetoVerticalAbs._internalWrap() {
+    return new PathSegLinetoVerticalAbs.internal_();
+  }
+
+  PathSegLinetoVerticalAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
   num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4446,13 +5646,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegLinetoVerticalRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegLinetoVerticalRel internalCreatePathSegLinetoVerticalRel() {
+    return new PathSegLinetoVerticalRel._internalWrap();
+  }
+
+  factory PathSegLinetoVerticalRel._internalWrap() {
+    return new PathSegLinetoVerticalRel.internal_();
+  }
+
+  PathSegLinetoVerticalRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
   num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4465,10 +5677,25 @@
 @DocsEditable()
 @DomName('SVGPathSegList')
 @Unstable()
-class PathSegList extends NativeFieldWrapperClass2 with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements List<PathSeg> {
+class PathSegList extends JsoNativeFieldWrapper with ListMixin<PathSeg>, ImmutableListMixin<PathSeg> implements List<PathSeg> {
   // To suppress missing implicit constructor warnings.
   factory PathSegList._() { throw new UnsupportedError("Not supported"); }
 
+  static PathSegList internalCreatePathSegList() {
+    return new PathSegList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PathSegList._internalWrap() {
+    return new PathSegList.internal_();
+  }
+
+  PathSegList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGPathSegList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -4491,7 +5718,7 @@
   // PathSeg is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -4529,7 +5756,7 @@
   
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem));
+  PathSeg appendItem(PathSeg newItem) => wrap_jso(_blink.BlinkSVGPathSegList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
@@ -4537,23 +5764,23 @@
   
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  PathSeg getItem(int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.getItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem));
+  PathSeg initialize(PathSeg newItem) => wrap_jso(_blink.BlinkSVGPathSegList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(newItem)));
   
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index);
+  PathSeg insertItemBefore(PathSeg newItem, int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  PathSeg removeItem(int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index);
+  PathSeg replaceItem(PathSeg newItem, int index) => wrap_jso(_blink.BlinkSVGPathSegList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(newItem), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4570,13 +5797,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegMovetoAbs._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegMovetoAbs internalCreatePathSegMovetoAbs() {
+    return new PathSegMovetoAbs._internalWrap();
+  }
+
+  factory PathSegMovetoAbs._internalWrap() {
+    return new PathSegMovetoAbs.internal_();
+  }
+
+  PathSegMovetoAbs.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
@@ -4584,7 +5823,7 @@
   
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4601,13 +5840,25 @@
   // To suppress missing implicit constructor warnings.
   factory PathSegMovetoRel._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PathSegMovetoRel internalCreatePathSegMovetoRel() {
+    return new PathSegMovetoRel._internalWrap();
+  }
+
+  factory PathSegMovetoRel._internalWrap() {
+    return new PathSegMovetoRel.internal_();
+  }
+
+  PathSegMovetoRel.internal_() : super.internal_();
+
+
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPathSegMovetoRel.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
@@ -4615,7 +5866,7 @@
   
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPathSegMovetoRel.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4635,6 +5886,18 @@
   @DomName('SVGPatternElement.SVGPatternElement')
   @DocsEditable()
   factory PatternElement() => _SvgElementFactoryProvider.createSvgElement_tag("pattern");
+
+
+  static PatternElement internalCreatePatternElement() {
+    return new PatternElement._internalWrap();
+  }
+
+  factory PatternElement._internalWrap() {
+    return new PatternElement.internal_();
+  }
+
+  PatternElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4713,13 +5976,28 @@
   // To suppress missing implicit constructor warnings.
   factory Point._() { throw new UnsupportedError("Not supported"); }
 
+  static Point internalCreatePoint() {
+    return new Point._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Point._internalWrap() {
+    return new Point.internal_();
+  }
+
+  Point.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGPoint.x')
   @DocsEditable()
   num get x => _blink.BlinkSVGPoint.instance.x_Getter_(unwrap_jso(this));
   
   @DomName('SVGPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGPoint.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGPoint.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPoint.y')
   @DocsEditable()
@@ -4727,11 +6005,11 @@
   
   @DomName('SVGPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGPoint.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGPoint.instance.y_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.instance.matrixTransform_Callback_1_(unwrap_jso(this), unwrap_jso(matrix));
+  Point matrixTransform(Matrix matrix) => wrap_jso(_blink.BlinkSVGPoint.instance.matrixTransform_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4748,6 +6026,21 @@
   // To suppress missing implicit constructor warnings.
   factory PointList._() { throw new UnsupportedError("Not supported"); }
 
+  static PointList internalCreatePointList() {
+    return new PointList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PointList._internalWrap() {
+    return new PointList.internal_();
+  }
+
+  PointList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGPointList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -4764,7 +6057,7 @@
   
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) => _blink.BlinkSVGPointList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Point appendItem(Point item) => wrap_jso(_blink.BlinkSVGPointList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGPointList.clear')
   @DocsEditable()
@@ -4772,23 +6065,23 @@
   
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) => _blink.BlinkSVGPointList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  Point getItem(int index) => wrap_jso(_blink.BlinkSVGPointList.instance.getItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) => _blink.BlinkSVGPointList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Point initialize(Point item) => wrap_jso(_blink.BlinkSVGPointList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) => _blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Point insertItemBefore(Point item, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) => _blink.BlinkSVGPointList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  Point removeItem(int index) => wrap_jso(_blink.BlinkSVGPointList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) => _blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Point replaceItem(Point item, int index) => wrap_jso(_blink.BlinkSVGPointList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4808,6 +6101,18 @@
   @DomName('SVGPolygonElement.SVGPolygonElement')
   @DocsEditable()
   factory PolygonElement() => _SvgElementFactoryProvider.createSvgElement_tag("polygon");
+
+
+  static PolygonElement internalCreatePolygonElement() {
+    return new PolygonElement._internalWrap();
+  }
+
+  factory PolygonElement._internalWrap() {
+    return new PolygonElement.internal_();
+  }
+
+  PolygonElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4841,6 +6146,18 @@
   @DomName('SVGPolylineElement.SVGPolylineElement')
   @DocsEditable()
   factory PolylineElement() => _SvgElementFactoryProvider.createSvgElement_tag("polyline");
+
+
+  static PolylineElement internalCreatePolylineElement() {
+    return new PolylineElement._internalWrap();
+  }
+
+  factory PolylineElement._internalWrap() {
+    return new PolylineElement.internal_();
+  }
+
+  PolylineElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -4871,6 +6188,21 @@
   // To suppress missing implicit constructor warnings.
   factory PreserveAspectRatio._() { throw new UnsupportedError("Not supported"); }
 
+  static PreserveAspectRatio internalCreatePreserveAspectRatio() {
+    return new PreserveAspectRatio._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PreserveAspectRatio._internalWrap() {
+    return new PreserveAspectRatio.internal_();
+  }
+
+  PreserveAspectRatio.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGPreserveAspectRatio.SVG_MEETORSLICE_MEET')
   @DocsEditable()
   static const int SVG_MEETORSLICE_MEET = 1;
@@ -4933,7 +6265,7 @@
   
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  void set align(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.align_Setter_(unwrap_jso(this), value);
+  set align(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.align_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
@@ -4941,7 +6273,7 @@
   
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  void set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Setter_(unwrap_jso(this), value);
+  set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.instance.meetOrSlice_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4961,6 +6293,18 @@
   @DomName('SVGRadialGradientElement.SVGRadialGradientElement')
   @DocsEditable()
   factory RadialGradientElement() => _SvgElementFactoryProvider.createSvgElement_tag("radialGradient");
+
+
+  static RadialGradientElement internalCreateRadialGradientElement() {
+    return new RadialGradientElement._internalWrap();
+  }
+
+  factory RadialGradientElement._internalWrap() {
+    return new RadialGradientElement.internal_();
+  }
+
+  RadialGradientElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5007,13 +6351,28 @@
   // To suppress missing implicit constructor warnings.
   factory Rect._() { throw new UnsupportedError("Not supported"); }
 
+  static Rect internalCreateRect() {
+    return new Rect._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Rect._internalWrap() {
+    return new Rect.internal_();
+  }
+
+  Rect.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGRect.height')
   @DocsEditable()
   num get height => _blink.BlinkSVGRect.instance.height_Getter_(unwrap_jso(this));
   
   @DomName('SVGRect.height')
   @DocsEditable()
-  void set height(num value) => _blink.BlinkSVGRect.instance.height_Setter_(unwrap_jso(this), value);
+  set height(num value) => _blink.BlinkSVGRect.instance.height_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGRect.width')
   @DocsEditable()
@@ -5021,7 +6380,7 @@
   
   @DomName('SVGRect.width')
   @DocsEditable()
-  void set width(num value) => _blink.BlinkSVGRect.instance.width_Setter_(unwrap_jso(this), value);
+  set width(num value) => _blink.BlinkSVGRect.instance.width_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGRect.x')
   @DocsEditable()
@@ -5029,7 +6388,7 @@
   
   @DomName('SVGRect.x')
   @DocsEditable()
-  void set x(num value) => _blink.BlinkSVGRect.instance.x_Setter_(unwrap_jso(this), value);
+  set x(num value) => _blink.BlinkSVGRect.instance.x_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGRect.y')
   @DocsEditable()
@@ -5037,7 +6396,7 @@
   
   @DomName('SVGRect.y')
   @DocsEditable()
-  void set y(num value) => _blink.BlinkSVGRect.instance.y_Setter_(unwrap_jso(this), value);
+  set y(num value) => _blink.BlinkSVGRect.instance.y_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5057,6 +6416,18 @@
   @DomName('SVGRectElement.SVGRectElement')
   @DocsEditable()
   factory RectElement() => _SvgElementFactoryProvider.createSvgElement_tag("rect");
+
+
+  static RectElement internalCreateRectElement() {
+    return new RectElement._internalWrap();
+  }
+
+  factory RectElement._internalWrap() {
+    return new RectElement.internal_();
+  }
+
+  RectElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5103,6 +6474,21 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingIntent._() { throw new UnsupportedError("Not supported"); }
 
+  static RenderingIntent internalCreateRenderingIntent() {
+    return new RenderingIntent._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RenderingIntent._internalWrap() {
+    return new RenderingIntent.internal_();
+  }
+
+  RenderingIntent.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGRenderingIntent.RENDERING_INTENT_ABSOLUTE_COLORIMETRIC')
   @DocsEditable()
   static const int RENDERING_INTENT_ABSOLUTE_COLORIMETRIC = 5;
@@ -5145,6 +6531,18 @@
   @DomName('SVGScriptElement.SVGScriptElement')
   @DocsEditable()
   factory ScriptElement() => _SvgElementFactoryProvider.createSvgElement_tag("script");
+
+
+  static ScriptElement internalCreateScriptElement() {
+    return new ScriptElement._internalWrap();
+  }
+
+  factory ScriptElement._internalWrap() {
+    return new ScriptElement.internal_();
+  }
+
+  ScriptElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5158,7 +6556,7 @@
   
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkSVGScriptElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkSVGScriptElement.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGScriptElement.href')
   @DocsEditable()
@@ -5185,6 +6583,18 @@
   @DomName('SVGSetElement.SVGSetElement')
   @DocsEditable()
   factory SetElement() => _SvgElementFactoryProvider.createSvgElement_tag("set");
+
+
+  static SetElement internalCreateSetElement() {
+    return new SetElement._internalWrap();
+  }
+
+  factory SetElement._internalWrap() {
+    return new SetElement.internal_();
+  }
+
+  SetElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5213,6 +6623,18 @@
   @DomName('SVGStopElement.SVGStopElement')
   @DocsEditable()
   factory StopElement() => _SvgElementFactoryProvider.createSvgElement_tag("stop");
+
+
+  static StopElement internalCreateStopElement() {
+    return new StopElement._internalWrap();
+  }
+
+  factory StopElement._internalWrap() {
+    return new StopElement.internal_();
+  }
+
+  StopElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5235,10 +6657,25 @@
 @DocsEditable()
 @DomName('SVGStringList')
 @Unstable()
-class StringList extends NativeFieldWrapperClass2 with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
+class StringList extends JsoNativeFieldWrapper with ListMixin<String>, ImmutableListMixin<String> implements List<String> {
   // To suppress missing implicit constructor warnings.
   factory StringList._() { throw new UnsupportedError("Not supported"); }
 
+  static StringList internalCreateStringList() {
+    return new StringList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory StringList._internalWrap() {
+    return new StringList.internal_();
+  }
+
+  StringList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGStringList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -5261,7 +6698,7 @@
   // String is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -5344,6 +6781,18 @@
   @DomName('SVGStyleElement.SVGStyleElement')
   @DocsEditable()
   factory StyleElement() => _SvgElementFactoryProvider.createSvgElement_tag("style");
+
+
+  static StyleElement internalCreateStyleElement() {
+    return new StyleElement._internalWrap();
+  }
+
+  factory StyleElement._internalWrap() {
+    return new StyleElement.internal_();
+  }
+
+  StyleElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5357,7 +6806,7 @@
   
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.BlinkSVGStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
+  set disabled(bool value) => _blink.BlinkSVGStyleElement.instance.disabled_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGStyleElement.media')
   @DocsEditable()
@@ -5365,7 +6814,7 @@
   
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.BlinkSVGStyleElement.instance.media_Setter_(unwrap_jso(this), value);
+  set media(String value) => _blink.BlinkSVGStyleElement.instance.media_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGStyleElement.sheet')
   @DocsEditable()
@@ -5378,7 +6827,7 @@
   
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.BlinkSVGStyleElement.instance.title_Setter_(unwrap_jso(this), value);
+  set title(String value) => _blink.BlinkSVGStyleElement.instance.title_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGStyleElement.type')
   @DocsEditable()
@@ -5386,7 +6835,7 @@
   
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkSVGStyleElement.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkSVGStyleElement.instance.type_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -5450,7 +6899,7 @@
 
   List<Element> get children => new FilteredElementList(this);
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     final children = this.children;
     children.clear();
     children.addAll(value);
@@ -5470,7 +6919,7 @@
     return container.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
@@ -5535,6 +6984,20 @@
     var e = new SvgElement.tag(tag);
     return e is SvgElement && !(e is UnknownElement);
   }
+
+  set _svgClassName(AnimatedString value) =>
+      _blink.BlinkSVGElement.instance.className_Setter_(unwrap_jso(this), unwrap_jso(value));
+
+  String get className => _svgClassName.baseVal;
+
+  // Unbelievable hack. We can't create an SvgAnimatedString, but we can get
+  // the existing one and change its baseVal. Then we call the blink setter directly
+  // TODO(alanknight): Handle suppressing the SVGAnimated<*> better
+  set className(String s) {
+    var oldClass = _svgClassName;
+    oldClass.baseVal = s;
+    _svgClassName = oldClass;
+  }
   // To suppress missing implicit constructor warnings.
   factory SvgElement._() { throw new UnsupportedError("Not supported"); }
 
@@ -5797,6 +7260,18 @@
   @DocsEditable()
   @Experimental() // untriaged
   static const EventStreamProvider<Event> waitingEvent = const EventStreamProvider<Event>('waiting');
+
+
+  static SvgElement internalCreateSvgElement() {
+    return new SvgElement._internalWrap();
+  }
+
+  factory SvgElement._internalWrap() {
+    return new SvgElement.internal_();
+  }
+
+  SvgElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -5826,7 +7301,7 @@
   @DomName('SVGElement.tabIndex')
   @DocsEditable()
   @Experimental() // untriaged
-  void set tabIndex(int value) => _blink.BlinkSVGElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
+  set tabIndex(int value) => _blink.BlinkSVGElement.instance.tabIndex_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
@@ -5838,7 +7313,7 @@
   
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  void set xmlbase(String value) => _blink.BlinkSVGElement.instance.xmlbase_Setter_(unwrap_jso(this), value);
+  set xmlbase(String value) => _blink.BlinkSVGElement.instance.xmlbase_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGElement.xmllang')
   @DocsEditable()
@@ -5848,7 +7323,7 @@
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmllang(String value) => _blink.BlinkSVGElement.instance.xmllang_Setter_(unwrap_jso(this), value);
+  set xmllang(String value) => _blink.BlinkSVGElement.instance.xmllang_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
@@ -5858,7 +7333,7 @@
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmlspace(String value) => _blink.BlinkSVGElement.instance.xmlspace_Setter_(unwrap_jso(this), value);
+  set xmlspace(String value) => _blink.BlinkSVGElement.instance.xmlspace_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -6138,6 +7613,18 @@
 
   // To suppress missing implicit constructor warnings.
   factory SvgSvgElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static SvgSvgElement internalCreateSvgSvgElement() {
+    return new SvgSvgElement._internalWrap();
+  }
+
+  factory SvgSvgElement._internalWrap() {
+    return new SvgSvgElement.internal_();
+  }
+
+  SvgSvgElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6151,7 +7638,7 @@
   
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  void set currentScale(num value) => _blink.BlinkSVGSVGElement.instance.currentScale_Setter_(unwrap_jso(this), value);
+  set currentScale(num value) => _blink.BlinkSVGSVGElement.instance.currentScale_Setter_(unwrap_jso(this), value);
   
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
@@ -6167,19 +7654,19 @@
   
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  double get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterX_Getter_(unwrap_jso(this));
+  num get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterX_Getter_(unwrap_jso(this));
   
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  double get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterY_Getter_(unwrap_jso(this));
+  num get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.instance.pixelUnitToMillimeterY_Getter_(unwrap_jso(this));
   
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  double get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterX_Getter_(unwrap_jso(this));
+  num get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterX_Getter_(unwrap_jso(this));
   
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  double get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterY_Getter_(unwrap_jso(this));
+  num get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.instance.screenPixelToMillimeterY_Getter_(unwrap_jso(this));
   
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
@@ -6215,23 +7702,23 @@
   
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.instance.createSVGAngle_Callback_0_(unwrap_jso(this));
+  Angle createSvgAngle() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGAngle_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() => _blink.BlinkSVGSVGElement.instance.createSVGLength_Callback_0_(unwrap_jso(this));
+  Length createSvgLength() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGLength_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.instance.createSVGMatrix_Callback_0_(unwrap_jso(this));
+  Matrix createSvgMatrix() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGMatrix_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() => _blink.BlinkSVGSVGElement.instance.createSVGNumber_Callback_0_(unwrap_jso(this));
+  Number createSvgNumber() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGNumber_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() => _blink.BlinkSVGSVGElement.instance.createSVGPoint_Callback_0_(unwrap_jso(this));
+  Point createSvgPoint() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGPoint_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
@@ -6239,11 +7726,11 @@
   
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.instance.createSVGTransform_Callback_0_(unwrap_jso(this));
+  Transform createSvgTransform() => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGTransform_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix));
+  Transform createSvgTransformFromMatrix(Matrix matrix) => wrap_jso(_blink.BlinkSVGSVGElement.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
   
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
@@ -6255,7 +7742,7 @@
   
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.BlinkSVGSVGElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
+  num getCurrentTime() => _blink.BlinkSVGSVGElement.instance.getCurrentTime_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
@@ -6263,11 +7750,11 @@
   
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => wrap_jso_list(_blink.BlinkSVGSVGElement.instance.getEnclosureList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => wrap_jso(_blink.BlinkSVGSVGElement.instance.getEnclosureList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
   
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => wrap_jso_list(_blink.BlinkSVGSVGElement.instance.getIntersectionList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => wrap_jso(_blink.BlinkSVGSVGElement.instance.getIntersectionList_Callback_2_(unwrap_jso(this), unwrap_jso(rect), unwrap_jso(referenceElement)));
   
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
@@ -6307,7 +7794,7 @@
   
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6327,6 +7814,18 @@
   @DomName('SVGSwitchElement.SVGSwitchElement')
   @DocsEditable()
   factory SwitchElement() => _SvgElementFactoryProvider.createSvgElement_tag("switch");
+
+
+  static SwitchElement internalCreateSwitchElement() {
+    return new SwitchElement._internalWrap();
+  }
+
+  factory SwitchElement._internalWrap() {
+    return new SwitchElement.internal_();
+  }
+
+  SwitchElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6352,6 +7851,18 @@
   @DomName('SVGSymbolElement.SVGSymbolElement')
   @DocsEditable()
   factory SymbolElement() => _SvgElementFactoryProvider.createSvgElement_tag("symbol");
+
+
+  static SymbolElement internalCreateSymbolElement() {
+    return new SymbolElement._internalWrap();
+  }
+
+  factory SymbolElement._internalWrap() {
+    return new SymbolElement.internal_();
+  }
+
+  SymbolElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6385,6 +7896,18 @@
   @DomName('SVGTSpanElement.SVGTSpanElement')
   @DocsEditable()
   factory TSpanElement() => _SvgElementFactoryProvider.createSvgElement_tag("tspan");
+
+
+  static TSpanElement internalCreateTSpanElement() {
+    return new TSpanElement._internalWrap();
+  }
+
+  factory TSpanElement._internalWrap() {
+    return new TSpanElement.internal_();
+  }
+
+  TSpanElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6437,6 +7960,18 @@
 class TextContentElement extends GraphicsElement {
   // To suppress missing implicit constructor warnings.
   factory TextContentElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static TextContentElement internalCreateTextContentElement() {
+    return new TextContentElement._internalWrap();
+  }
+
+  factory TextContentElement._internalWrap() {
+    return new TextContentElement.internal_();
+  }
+
+  TextContentElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6470,11 +8005,11 @@
   
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() => _blink.BlinkSVGTextContentElement.instance.getComputedTextLength_Callback_0_(unwrap_jso(this));
+  num getComputedTextLength() => _blink.BlinkSVGTextContentElement.instance.getComputedTextLength_Callback_0_(unwrap_jso(this));
   
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(unwrap_jso(this), offset);
+  Point getEndPositionOfChar(int offset) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getEndPositionOfChar_Callback_1_(unwrap_jso(this), offset));
   
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
@@ -6486,15 +8021,15 @@
   
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(unwrap_jso(this), offset);
+  num getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getRotationOfChar_Callback_1_(unwrap_jso(this), offset);
   
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(unwrap_jso(this), offset);
+  Point getStartPositionOfChar(int offset) => wrap_jso(_blink.BlinkSVGTextContentElement.instance.getStartPositionOfChar_Callback_1_(unwrap_jso(this), offset));
   
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(unwrap_jso(this), offset, length);
+  num getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.instance.getSubStringLength_Callback_2_(unwrap_jso(this), offset, length);
   
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
@@ -6518,6 +8053,18 @@
   @DomName('SVGTextElement.SVGTextElement')
   @DocsEditable()
   factory TextElement() => _SvgElementFactoryProvider.createSvgElement_tag("text");
+
+
+  static TextElement internalCreateTextElement() {
+    return new TextElement._internalWrap();
+  }
+
+  factory TextElement._internalWrap() {
+    return new TextElement.internal_();
+  }
+
+  TextElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6539,6 +8086,18 @@
 class TextPathElement extends TextContentElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory TextPathElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static TextPathElement internalCreateTextPathElement() {
+    return new TextPathElement._internalWrap();
+  }
+
+  factory TextPathElement._internalWrap() {
+    return new TextPathElement.internal_();
+  }
+
+  TextPathElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6600,6 +8159,18 @@
 class TextPositioningElement extends TextContentElement {
   // To suppress missing implicit constructor warnings.
   factory TextPositioningElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static TextPositioningElement internalCreateTextPositioningElement() {
+    return new TextPositioningElement._internalWrap();
+  }
+
+  factory TextPositioningElement._internalWrap() {
+    return new TextPositioningElement.internal_();
+  }
+
+  TextPositioningElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6645,6 +8216,18 @@
   @DomName('SVGTitleElement.SVGTitleElement')
   @DocsEditable()
   factory TitleElement() => _SvgElementFactoryProvider.createSvgElement_tag("title");
+
+
+  static TitleElement internalCreateTitleElement() {
+    return new TitleElement._internalWrap();
+  }
+
+  factory TitleElement._internalWrap() {
+    return new TitleElement.internal_();
+  }
+
+  TitleElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6667,6 +8250,21 @@
   // To suppress missing implicit constructor warnings.
   factory Transform._() { throw new UnsupportedError("Not supported"); }
 
+  static Transform internalCreateTransform() {
+    return new Transform._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Transform._internalWrap() {
+    return new Transform.internal_();
+  }
+
+  Transform.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGTransform.SVG_TRANSFORM_MATRIX')
   @DocsEditable()
   static const int SVG_TRANSFORM_MATRIX = 1;
@@ -6697,7 +8295,7 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  double get angle => _blink.BlinkSVGTransform.instance.angle_Getter_(unwrap_jso(this));
+  num get angle => _blink.BlinkSVGTransform.instance.angle_Getter_(unwrap_jso(this));
   
   @DomName('SVGTransform.matrix')
   @DocsEditable()
@@ -6742,10 +8340,25 @@
 @DocsEditable()
 @DomName('SVGTransformList')
 @Unstable()
-class TransformList extends NativeFieldWrapperClass2 with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform> {
+class TransformList extends JsoNativeFieldWrapper with ListMixin<Transform>, ImmutableListMixin<Transform> implements List<Transform> {
   // To suppress missing implicit constructor warnings.
   factory TransformList._() { throw new UnsupportedError("Not supported"); }
 
+  static TransformList internalCreateTransformList() {
+    return new TransformList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory TransformList._internalWrap() {
+    return new TransformList.internal_();
+  }
+
+  TransformList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGTransformList.length')
   @DocsEditable()
   @Experimental() // untriaged
@@ -6768,7 +8381,7 @@
   // Transform is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -6806,7 +8419,7 @@
   
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Transform appendItem(Transform item) => wrap_jso(_blink.BlinkSVGTransformList.instance.appendItem_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGTransformList.clear')
   @DocsEditable()
@@ -6814,31 +8427,31 @@
   
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() => _blink.BlinkSVGTransformList.instance.consolidate_Callback_0_(unwrap_jso(this));
+  Transform consolidate() => wrap_jso(_blink.BlinkSVGTransformList.instance.consolidate_Callback_0_(unwrap_jso(this)));
   
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix));
+  Transform createSvgTransformFromMatrix(Matrix matrix) => wrap_jso(_blink.BlinkSVGTransformList.instance.createSVGTransformFromMatrix_Callback_1_(unwrap_jso(this), unwrap_jso(matrix)));
   
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) => _blink.BlinkSVGTransformList.instance.getItem_Callback_1_(unwrap_jso(this), index);
+  Transform getItem(int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.getItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) => _blink.BlinkSVGTransformList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item));
+  Transform initialize(Transform item) => wrap_jso(_blink.BlinkSVGTransformList.instance.initialize_Callback_1_(unwrap_jso(this), unwrap_jso(item)));
   
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) => _blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Transform insertItemBefore(Transform item, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.insertItemBefore_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) => _blink.BlinkSVGTransformList.instance.removeItem_Callback_1_(unwrap_jso(this), index);
+  Transform removeItem(int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.removeItem_Callback_1_(unwrap_jso(this), index));
   
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) => _blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index);
+  Transform replaceItem(Transform item, int index) => wrap_jso(_blink.BlinkSVGTransformList.instance.replaceItem_Callback_2_(unwrap_jso(this), unwrap_jso(item), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6855,6 +8468,21 @@
   // To suppress missing implicit constructor warnings.
   factory UnitTypes._() { throw new UnsupportedError("Not supported"); }
 
+  static UnitTypes internalCreateUnitTypes() {
+    return new UnitTypes._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory UnitTypes._internalWrap() {
+    return new UnitTypes.internal_();
+  }
+
+  UnitTypes.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX')
   @DocsEditable()
   static const int SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
@@ -6904,6 +8532,18 @@
   @DomName('SVGUseElement.SVGUseElement')
   @DocsEditable()
   factory UseElement() => _SvgElementFactoryProvider.createSvgElement_tag("use");
+
+
+  static UseElement internalCreateUseElement() {
+    return new UseElement._internalWrap();
+  }
+
+  factory UseElement._internalWrap() {
+    return new UseElement.internal_();
+  }
+
+  UseElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6949,6 +8589,18 @@
   @DomName('SVGViewElement.SVGViewElement')
   @DocsEditable()
   factory ViewElement() => _SvgElementFactoryProvider.createSvgElement_tag("view");
+
+
+  static ViewElement internalCreateViewElement() {
+    return new ViewElement._internalWrap();
+  }
+
+  factory ViewElement._internalWrap() {
+    return new ViewElement.internal_();
+  }
+
+  ViewElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -6974,7 +8626,7 @@
   
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.BlinkSVGViewElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGViewElement.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6991,6 +8643,21 @@
   // To suppress missing implicit constructor warnings.
   factory ViewSpec._() { throw new UnsupportedError("Not supported"); }
 
+  static ViewSpec internalCreateViewSpec() {
+    return new ViewSpec._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ViewSpec._internalWrap() {
+    return new ViewSpec.internal_();
+  }
+
+  ViewSpec.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
   String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.instance.preserveAspectRatioString_Getter_(unwrap_jso(this));
@@ -7033,7 +8700,7 @@
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  void set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
+  set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.instance.zoomAndPan_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7068,7 +8735,7 @@
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value);
+  set zoomAndPan(int value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7085,9 +8752,21 @@
   // To suppress missing implicit constructor warnings.
   factory ZoomEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ZoomEvent internalCreateZoomEvent() {
+    return new ZoomEvent._internalWrap();
+  }
+
+  factory ZoomEvent._internalWrap() {
+    return new ZoomEvent.internal_();
+  }
+
+  ZoomEvent.internal_() : super.internal_();
+
+
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  double get newScale => _blink.BlinkSVGZoomEvent.instance.newScale_Getter_(unwrap_jso(this));
+  num get newScale => _blink.BlinkSVGZoomEvent.instance.newScale_Getter_(unwrap_jso(this));
   
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
@@ -7095,7 +8774,7 @@
   
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  double get previousScale => _blink.BlinkSVGZoomEvent.instance.previousScale_Getter_(unwrap_jso(this));
+  num get previousScale => _blink.BlinkSVGZoomEvent.instance.previousScale_Getter_(unwrap_jso(this));
   
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
@@ -7119,6 +8798,18 @@
 class _GradientElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory _GradientElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _GradientElement internalCreate_GradientElement() {
+    return new _GradientElement._internalWrap();
+  }
+
+  factory _GradientElement._internalWrap() {
+    return new _GradientElement.internal_();
+  }
+
+  _GradientElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7169,9 +8860,21 @@
 @DocsEditable()
 @DomName('SVGAltGlyphDefElement')
 @Unstable()
-abstract class _SVGAltGlyphDefElement extends SvgElement {
+class _SVGAltGlyphDefElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGAltGlyphDefElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGAltGlyphDefElement internalCreate_SVGAltGlyphDefElement() {
+    return new _SVGAltGlyphDefElement._internalWrap();
+  }
+
+  factory _SVGAltGlyphDefElement._internalWrap() {
+    return new _SVGAltGlyphDefElement.internal_();
+  }
+
+  _SVGAltGlyphDefElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7190,9 +8893,21 @@
 @DocsEditable()
 @DomName('SVGAltGlyphItemElement')
 @Unstable()
-abstract class _SVGAltGlyphItemElement extends SvgElement {
+class _SVGAltGlyphItemElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGAltGlyphItemElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGAltGlyphItemElement internalCreate_SVGAltGlyphItemElement() {
+    return new _SVGAltGlyphItemElement._internalWrap();
+  }
+
+  factory _SVGAltGlyphItemElement._internalWrap() {
+    return new _SVGAltGlyphItemElement.internal_();
+  }
+
+  _SVGAltGlyphItemElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7211,9 +8926,21 @@
 @DocsEditable()
 @DomName('SVGComponentTransferFunctionElement')
 @Unstable()
-abstract class _SVGComponentTransferFunctionElement extends SvgElement {
+class _SVGComponentTransferFunctionElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGComponentTransferFunctionElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGComponentTransferFunctionElement internalCreate_SVGComponentTransferFunctionElement() {
+    return new _SVGComponentTransferFunctionElement._internalWrap();
+  }
+
+  factory _SVGComponentTransferFunctionElement._internalWrap() {
+    return new _SVGComponentTransferFunctionElement.internal_();
+  }
+
+  _SVGComponentTransferFunctionElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7226,19 +8953,29 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('SVGCursorElement')
 @Unstable()
-abstract class _SVGCursorElement extends SvgElement implements UriReference, Tests {
+class _SVGCursorElement extends SvgElement implements UriReference, Tests {
   // To suppress missing implicit constructor warnings.
   factory _SVGCursorElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGCursorElement.SVGCursorElement')
   @DocsEditable()
   factory _SVGCursorElement() => _SvgElementFactoryProvider.createSvgElement_tag("cursor");
+
+
+  static _SVGCursorElement internalCreate_SVGCursorElement() {
+    return new _SVGCursorElement._internalWrap();
+  }
+
+  factory _SVGCursorElement._internalWrap() {
+    return new _SVGCursorElement.internal_();
+  }
+
+  _SVGCursorElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7249,20 +8986,37 @@
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
+  // Override these methods for Dartium _SVGCursorElement can't be abstract.
+  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGCursorElement.instance.href_Getter_(unwrap_jso(this)));
+  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
 }
+
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('SVGFEDropShadowElement')
 @Experimental() // nonstandard
-abstract class _SVGFEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes {
+class _SVGFEDropShadowElement extends SvgElement implements FilterPrimitiveStandardAttributes {
   // To suppress missing implicit constructor warnings.
   factory _SVGFEDropShadowElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFEDropShadowElement internalCreate_SVGFEDropShadowElement() {
+    return new _SVGFEDropShadowElement._internalWrap();
+  }
+
+  factory _SVGFEDropShadowElement._internalWrap() {
+    return new _SVGFEDropShadowElement.internal_();
+  }
+
+  _SVGFEDropShadowElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7270,7 +9024,14 @@
    */
   _SVGFEDropShadowElement.created() : super.created();
 
+  // Override these methods for Dartium _SVGFEDropShadowElement can't be abstract.
+  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
@@ -7281,9 +9042,21 @@
 @DocsEditable()
 @DomName('SVGFontElement')
 @Unstable()
-abstract class _SVGFontElement extends SvgElement {
+class _SVGFontElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontElement internalCreate_SVGFontElement() {
+    return new _SVGFontElement._internalWrap();
+  }
+
+  factory _SVGFontElement._internalWrap() {
+    return new _SVGFontElement.internal_();
+  }
+
+  _SVGFontElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7302,9 +9075,21 @@
 @DocsEditable()
 @DomName('SVGFontFaceElement')
 @Unstable()
-abstract class _SVGFontFaceElement extends SvgElement {
+class _SVGFontFaceElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontFaceElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontFaceElement internalCreate_SVGFontFaceElement() {
+    return new _SVGFontFaceElement._internalWrap();
+  }
+
+  factory _SVGFontFaceElement._internalWrap() {
+    return new _SVGFontFaceElement.internal_();
+  }
+
+  _SVGFontFaceElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7323,9 +9108,21 @@
 @DocsEditable()
 @DomName('SVGFontFaceFormatElement')
 @Unstable()
-abstract class _SVGFontFaceFormatElement extends SvgElement {
+class _SVGFontFaceFormatElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontFaceFormatElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontFaceFormatElement internalCreate_SVGFontFaceFormatElement() {
+    return new _SVGFontFaceFormatElement._internalWrap();
+  }
+
+  factory _SVGFontFaceFormatElement._internalWrap() {
+    return new _SVGFontFaceFormatElement.internal_();
+  }
+
+  _SVGFontFaceFormatElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7344,9 +9141,21 @@
 @DocsEditable()
 @DomName('SVGFontFaceNameElement')
 @Unstable()
-abstract class _SVGFontFaceNameElement extends SvgElement {
+class _SVGFontFaceNameElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontFaceNameElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontFaceNameElement internalCreate_SVGFontFaceNameElement() {
+    return new _SVGFontFaceNameElement._internalWrap();
+  }
+
+  factory _SVGFontFaceNameElement._internalWrap() {
+    return new _SVGFontFaceNameElement.internal_();
+  }
+
+  _SVGFontFaceNameElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7365,9 +9174,21 @@
 @DocsEditable()
 @DomName('SVGFontFaceSrcElement')
 @Unstable()
-abstract class _SVGFontFaceSrcElement extends SvgElement {
+class _SVGFontFaceSrcElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontFaceSrcElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontFaceSrcElement internalCreate_SVGFontFaceSrcElement() {
+    return new _SVGFontFaceSrcElement._internalWrap();
+  }
+
+  factory _SVGFontFaceSrcElement._internalWrap() {
+    return new _SVGFontFaceSrcElement.internal_();
+  }
+
+  _SVGFontFaceSrcElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7386,9 +9207,21 @@
 @DocsEditable()
 @DomName('SVGFontFaceUriElement')
 @Unstable()
-abstract class _SVGFontFaceUriElement extends SvgElement {
+class _SVGFontFaceUriElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGFontFaceUriElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGFontFaceUriElement internalCreate_SVGFontFaceUriElement() {
+    return new _SVGFontFaceUriElement._internalWrap();
+  }
+
+  factory _SVGFontFaceUriElement._internalWrap() {
+    return new _SVGFontFaceUriElement.internal_();
+  }
+
+  _SVGFontFaceUriElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7407,13 +9240,25 @@
 @DocsEditable()
 @DomName('SVGGlyphElement')
 @Unstable()
-abstract class _SVGGlyphElement extends SvgElement {
+class _SVGGlyphElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGGlyphElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGGlyphElement.SVGGlyphElement')
   @DocsEditable()
   factory _SVGGlyphElement() => _SvgElementFactoryProvider.createSvgElement_tag("glyph");
+
+
+  static _SVGGlyphElement internalCreate_SVGGlyphElement() {
+    return new _SVGGlyphElement._internalWrap();
+  }
+
+  factory _SVGGlyphElement._internalWrap() {
+    return new _SVGGlyphElement.internal_();
+  }
+
+  _SVGGlyphElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7426,15 +9271,25 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('SVGGlyphRefElement')
 @Unstable()
-abstract class _SVGGlyphRefElement extends SvgElement implements UriReference {
+class _SVGGlyphRefElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory _SVGGlyphRefElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGGlyphRefElement internalCreate_SVGGlyphRefElement() {
+    return new _SVGGlyphRefElement._internalWrap();
+  }
+
+  factory _SVGGlyphRefElement._internalWrap() {
+    return new _SVGGlyphRefElement.internal_();
+  }
+
+  _SVGGlyphRefElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7442,7 +9297,10 @@
    */
   _SVGGlyphRefElement.created() : super.created();
 
+  // Override these methods for Dartium _SVGGlyphRefElement can't be abstract.
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGGlyphRefElement.instance.href_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
@@ -7453,13 +9311,25 @@
 @DocsEditable()
 @DomName('SVGHKernElement')
 @Unstable()
-abstract class _SVGHKernElement extends SvgElement {
+class _SVGHKernElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGHKernElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGHKernElement.SVGHKernElement')
   @DocsEditable()
   factory _SVGHKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("hkern");
+
+
+  static _SVGHKernElement internalCreate_SVGHKernElement() {
+    return new _SVGHKernElement._internalWrap();
+  }
+
+  factory _SVGHKernElement._internalWrap() {
+    return new _SVGHKernElement.internal_();
+  }
+
+  _SVGHKernElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7472,18 +9342,28 @@
 // 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.
 
-// WARNING: Do not edit - generated code.
-
 
 @DocsEditable()
 @DomName('SVGMPathElement')
-abstract class _SVGMPathElement extends SvgElement implements UriReference {
+class _SVGMPathElement extends SvgElement implements UriReference {
   // To suppress missing implicit constructor warnings.
   factory _SVGMPathElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGMPathElement.SVGMPathElement')
   @DocsEditable()
   factory _SVGMPathElement() => _SvgElementFactoryProvider.createSvgElement_tag("mpath");
+
+
+  static _SVGMPathElement internalCreate_SVGMPathElement() {
+    return new _SVGMPathElement._internalWrap();
+  }
+
+  factory _SVGMPathElement._internalWrap() {
+    return new _SVGMPathElement.internal_();
+  }
+
+  _SVGMPathElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7491,7 +9371,10 @@
    */
   _SVGMPathElement.created() : super.created();
 
+  // Override these methods for Dartium _SVGMPathElement can't be abstract.
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGMPathElement.instance.href_Getter_(unwrap_jso(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
 // BSD-style license that can be found in the LICENSE file.
@@ -7502,9 +9385,21 @@
 @DocsEditable()
 @DomName('SVGMissingGlyphElement')
 @Unstable()
-abstract class _SVGMissingGlyphElement extends SvgElement {
+class _SVGMissingGlyphElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGMissingGlyphElement._() { throw new UnsupportedError("Not supported"); }
+
+
+  static _SVGMissingGlyphElement internalCreate_SVGMissingGlyphElement() {
+    return new _SVGMissingGlyphElement._internalWrap();
+  }
+
+  factory _SVGMissingGlyphElement._internalWrap() {
+    return new _SVGMissingGlyphElement.internal_();
+  }
+
+  _SVGMissingGlyphElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -7523,13 +9418,25 @@
 @DocsEditable()
 @DomName('SVGVKernElement')
 @Unstable()
-abstract class _SVGVKernElement extends SvgElement {
+class _SVGVKernElement extends SvgElement {
   // To suppress missing implicit constructor warnings.
   factory _SVGVKernElement._() { throw new UnsupportedError("Not supported"); }
 
   @DomName('SVGVKernElement.SVGVKernElement')
   @DocsEditable()
   factory _SVGVKernElement() => _SvgElementFactoryProvider.createSvgElement_tag("vkern");
+
+
+  static _SVGVKernElement internalCreate_SVGVKernElement() {
+    return new _SVGVKernElement._internalWrap();
+  }
+
+  factory _SVGVKernElement._internalWrap() {
+    return new _SVGVKernElement.internal_();
+  }
+
+  _SVGVKernElement.internal_() : super.internal_();
+
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 9524b80..6005329 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -5,7 +5,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_native_typed_data';
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index f38441b..00f927d 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -5,12 +5,13 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 // DO NOT EDIT
 // Auto-generated dart:audio library.
 
@@ -49,6 +50,37 @@
 
 };
 
+// FIXME: Can we make this private?
+final web_audioBlinkFunctionMap = {
+  'AnalyserNode': () => AnalyserNode.internalCreateAnalyserNode,
+  'AudioBuffer': () => AudioBuffer.internalCreateAudioBuffer,
+  'AudioBufferSourceNode': () => AudioBufferSourceNode.internalCreateAudioBufferSourceNode,
+  'AudioContext': () => AudioContext.internalCreateAudioContext,
+  'AudioDestinationNode': () => AudioDestinationNode.internalCreateAudioDestinationNode,
+  'AudioListener': () => AudioListener.internalCreateAudioListener,
+  'AudioNode': () => AudioNode.internalCreateAudioNode,
+  'AudioParam': () => AudioParam.internalCreateAudioParam,
+  'AudioProcessingEvent': () => AudioProcessingEvent.internalCreateAudioProcessingEvent,
+  'AudioSourceNode': () => AudioSourceNode.internalCreateAudioSourceNode,
+  'BiquadFilterNode': () => BiquadFilterNode.internalCreateBiquadFilterNode,
+  'ChannelMergerNode': () => ChannelMergerNode.internalCreateChannelMergerNode,
+  'ChannelSplitterNode': () => ChannelSplitterNode.internalCreateChannelSplitterNode,
+  'ConvolverNode': () => ConvolverNode.internalCreateConvolverNode,
+  'DelayNode': () => DelayNode.internalCreateDelayNode,
+  'DynamicsCompressorNode': () => DynamicsCompressorNode.internalCreateDynamicsCompressorNode,
+  'GainNode': () => GainNode.internalCreateGainNode,
+  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode.internalCreateMediaElementAudioSourceNode,
+  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode.internalCreateMediaStreamAudioDestinationNode,
+  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode.internalCreateMediaStreamAudioSourceNode,
+  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent.internalCreateOfflineAudioCompletionEvent,
+  'OfflineAudioContext': () => OfflineAudioContext.internalCreateOfflineAudioContext,
+  'OscillatorNode': () => OscillatorNode.internalCreateOscillatorNode,
+  'PannerNode': () => PannerNode.internalCreatePannerNode,
+  'PeriodicWave': () => PeriodicWave.internalCreatePeriodicWave,
+  'ScriptProcessorNode': () => ScriptProcessorNode.internalCreateScriptProcessorNode,
+  'WaveShaperNode': () => WaveShaperNode.internalCreateWaveShaperNode,
+
+};
 // 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.
@@ -64,13 +96,25 @@
   // To suppress missing implicit constructor warnings.
   factory AnalyserNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AnalyserNode internalCreateAnalyserNode() {
+    return new AnalyserNode._internalWrap();
+  }
+
+  factory AnalyserNode._internalWrap() {
+    return new AnalyserNode.internal_();
+  }
+
+  AnalyserNode.internal_() : super.internal_();
+
+
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
   int get fftSize => _blink.BlinkAnalyserNode.instance.fftSize_Getter_(unwrap_jso(this));
   
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  void set fftSize(int value) => _blink.BlinkAnalyserNode.instance.fftSize_Setter_(unwrap_jso(this), value);
+  set fftSize(int value) => _blink.BlinkAnalyserNode.instance.fftSize_Setter_(unwrap_jso(this), value);
   
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
@@ -82,7 +126,7 @@
   
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.instance.maxDecibels_Setter_(unwrap_jso(this), value);
+  set maxDecibels(num value) => _blink.BlinkAnalyserNode.instance.maxDecibels_Setter_(unwrap_jso(this), value);
   
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
@@ -90,7 +134,7 @@
   
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) => _blink.BlinkAnalyserNode.instance.minDecibels_Setter_(unwrap_jso(this), value);
+  set minDecibels(num value) => _blink.BlinkAnalyserNode.instance.minDecibels_Setter_(unwrap_jso(this), value);
   
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
@@ -98,7 +142,7 @@
   
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Setter_(unwrap_jso(this), value);
+  set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.instance.smoothingTimeConstant_Setter_(unwrap_jso(this), value);
   
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
@@ -133,9 +177,24 @@
   // To suppress missing implicit constructor warnings.
   factory AudioBuffer._() { throw new UnsupportedError("Not supported"); }
 
+  static AudioBuffer internalCreateAudioBuffer() {
+    return new AudioBuffer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AudioBuffer._internalWrap() {
+    return new AudioBuffer.internal_();
+  }
+
+  AudioBuffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  double get duration => _blink.BlinkAudioBuffer.instance.duration_Getter_(unwrap_jso(this));
+  num get duration => _blink.BlinkAudioBuffer.instance.duration_Getter_(unwrap_jso(this));
   
   @DomName('AudioBuffer.length')
   @DocsEditable()
@@ -147,7 +206,7 @@
   
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(unwrap_jso(this));
+  num get sampleRate => _blink.BlinkAudioBuffer.instance.sampleRate_Getter_(unwrap_jso(this));
   
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
@@ -193,13 +252,25 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+
+  static AudioBufferSourceNode internalCreateAudioBufferSourceNode() {
+    return new AudioBufferSourceNode._internalWrap();
+  }
+
+  factory AudioBufferSourceNode._internalWrap() {
+    return new AudioBufferSourceNode.internal_();
+  }
+
+  AudioBufferSourceNode.internal_() : super.internal_();
+
+
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
   AudioBuffer get buffer => wrap_jso(_blink.BlinkAudioBufferSourceNode.instance.buffer_Getter_(unwrap_jso(this)));
   
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
@@ -207,7 +278,7 @@
   
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.BlinkAudioBufferSourceNode.instance.loop_Setter_(unwrap_jso(this), value);
+  set loop(bool value) => _blink.BlinkAudioBufferSourceNode.instance.loop_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
@@ -215,7 +286,7 @@
   
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  void set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Setter_(unwrap_jso(this), value);
+  set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopEnd_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
@@ -223,7 +294,7 @@
   
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  void set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Setter_(unwrap_jso(this), value);
+  set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.instance.loopStart_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
@@ -289,15 +360,27 @@
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
   factory AudioContext() {
-    return _blink.BlinkAudioContext.instance.constructorCallback_0_();
+    return wrap_jso(_blink.BlinkAudioContext.instance.constructorCallback_0_());
   }
 
+
+  static AudioContext internalCreateAudioContext() {
+    return new AudioContext._internalWrap();
+  }
+
+  factory AudioContext._internalWrap() {
+    return new AudioContext.internal_();
+  }
+
+  AudioContext.internal_() : super.internal_();
+
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  double get currentTime => _blink.BlinkAudioContext.instance.currentTime_Getter_(unwrap_jso(this));
+  num get currentTime => _blink.BlinkAudioContext.instance.currentTime_Getter_(unwrap_jso(this));
   
   @DomName('AudioContext.destination')
   @DocsEditable()
@@ -309,7 +392,7 @@
   
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(unwrap_jso(this));
+  num get sampleRate => _blink.BlinkAudioContext.instance.sampleRate_Getter_(unwrap_jso(this));
   
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
@@ -404,7 +487,7 @@
   
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(unwrap_jso(this), audioData, unwrap_jso(successCallback), unwrap_jso(errorCallback));
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.instance.decodeAudioData_Callback_3_(unwrap_jso(this), audioData, unwrap_jso((audioBuffer) => successCallback(wrap_jso(audioBuffer))), unwrap_jso((audioBuffer) => errorCallback(wrap_jso(audioBuffer))));
   
   @DomName('AudioContext.startRendering')
   @DocsEditable()
@@ -445,6 +528,18 @@
   // To suppress missing implicit constructor warnings.
   factory AudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AudioDestinationNode internalCreateAudioDestinationNode() {
+    return new AudioDestinationNode._internalWrap();
+  }
+
+  factory AudioDestinationNode._internalWrap() {
+    return new AudioDestinationNode.internal_();
+  }
+
+  AudioDestinationNode.internal_() : super.internal_();
+
+
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
   int get maxChannelCount => _blink.BlinkAudioDestinationNode.instance.maxChannelCount_Getter_(unwrap_jso(this));
@@ -465,13 +560,28 @@
   // To suppress missing implicit constructor warnings.
   factory AudioListener._() { throw new UnsupportedError("Not supported"); }
 
+  static AudioListener internalCreateAudioListener() {
+    return new AudioListener._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AudioListener._internalWrap() {
+    return new AudioListener.internal_();
+  }
+
+  AudioListener.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
   num get dopplerFactor => _blink.BlinkAudioListener.instance.dopplerFactor_Getter_(unwrap_jso(this));
   
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  void set dopplerFactor(num value) => _blink.BlinkAudioListener.instance.dopplerFactor_Setter_(unwrap_jso(this), value);
+  set dopplerFactor(num value) => _blink.BlinkAudioListener.instance.dopplerFactor_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
@@ -479,7 +589,7 @@
   
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  void set speedOfSound(num value) => _blink.BlinkAudioListener.instance.speedOfSound_Setter_(unwrap_jso(this), value);
+  set speedOfSound(num value) => _blink.BlinkAudioListener.instance.speedOfSound_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
@@ -506,13 +616,25 @@
   // To suppress missing implicit constructor warnings.
   factory AudioNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AudioNode internalCreateAudioNode() {
+    return new AudioNode._internalWrap();
+  }
+
+  factory AudioNode._internalWrap() {
+    return new AudioNode.internal_();
+  }
+
+  AudioNode.internal_() : super.internal_();
+
+
   @DomName('AudioNode.channelCount')
   @DocsEditable()
   int get channelCount => _blink.BlinkAudioNode.instance.channelCount_Getter_(unwrap_jso(this));
   
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  void set channelCount(int value) => _blink.BlinkAudioNode.instance.channelCount_Setter_(unwrap_jso(this), value);
+  set channelCount(int value) => _blink.BlinkAudioNode.instance.channelCount_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
@@ -520,7 +642,7 @@
   
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  void set channelCountMode(String value) => _blink.BlinkAudioNode.instance.channelCountMode_Setter_(unwrap_jso(this), value);
+  set channelCountMode(String value) => _blink.BlinkAudioNode.instance.channelCountMode_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
@@ -528,7 +650,7 @@
   
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  void set channelInterpretation(String value) => _blink.BlinkAudioNode.instance.channelInterpretation_Setter_(unwrap_jso(this), value);
+  set channelInterpretation(String value) => _blink.BlinkAudioNode.instance.channelInterpretation_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioNode.context')
   @DocsEditable()
@@ -581,9 +703,24 @@
   // To suppress missing implicit constructor warnings.
   factory AudioParam._() { throw new UnsupportedError("Not supported"); }
 
+  static AudioParam internalCreateAudioParam() {
+    return new AudioParam._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AudioParam._internalWrap() {
+    return new AudioParam.internal_();
+  }
+
+  AudioParam.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  double get defaultValue => _blink.BlinkAudioParam.instance.defaultValue_Getter_(unwrap_jso(this));
+  num get defaultValue => _blink.BlinkAudioParam.instance.defaultValue_Getter_(unwrap_jso(this));
   
   @DomName('AudioParam.value')
   @DocsEditable()
@@ -591,7 +728,7 @@
   
   @DomName('AudioParam.value')
   @DocsEditable()
-  void set value(num value) => _blink.BlinkAudioParam.instance.value_Setter_(unwrap_jso(this), value);
+  set value(num value) => _blink.BlinkAudioParam.instance.value_Setter_(unwrap_jso(this), value);
   
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
@@ -633,6 +770,18 @@
   // To suppress missing implicit constructor warnings.
   factory AudioProcessingEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AudioProcessingEvent internalCreateAudioProcessingEvent() {
+    return new AudioProcessingEvent._internalWrap();
+  }
+
+  factory AudioProcessingEvent._internalWrap() {
+    return new AudioProcessingEvent.internal_();
+  }
+
+  AudioProcessingEvent.internal_() : super.internal_();
+
+
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
   AudioBuffer get inputBuffer => wrap_jso(_blink.BlinkAudioProcessingEvent.instance.inputBuffer_Getter_(unwrap_jso(this)));
@@ -644,7 +793,7 @@
   @DomName('AudioProcessingEvent.playbackTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get playbackTime => _blink.BlinkAudioProcessingEvent.instance.playbackTime_Getter_(unwrap_jso(this));
+  num get playbackTime => _blink.BlinkAudioProcessingEvent.instance.playbackTime_Getter_(unwrap_jso(this));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -662,6 +811,18 @@
   // To suppress missing implicit constructor warnings.
   factory AudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static AudioSourceNode internalCreateAudioSourceNode() {
+    return new AudioSourceNode._internalWrap();
+  }
+
+  factory AudioSourceNode._internalWrap() {
+    return new AudioSourceNode.internal_();
+  }
+
+  AudioSourceNode.internal_() : super.internal_();
+
+
 }
 // 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
@@ -678,6 +839,18 @@
   // To suppress missing implicit constructor warnings.
   factory BiquadFilterNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static BiquadFilterNode internalCreateBiquadFilterNode() {
+    return new BiquadFilterNode._internalWrap();
+  }
+
+  factory BiquadFilterNode._internalWrap() {
+    return new BiquadFilterNode.internal_();
+  }
+
+  BiquadFilterNode.internal_() : super.internal_();
+
+
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
   AudioParam get Q => wrap_jso(_blink.BlinkBiquadFilterNode.instance.Q_Getter_(unwrap_jso(this)));
@@ -700,7 +873,7 @@
   
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkBiquadFilterNode.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkBiquadFilterNode.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
@@ -722,6 +895,18 @@
   // To suppress missing implicit constructor warnings.
   factory ChannelMergerNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ChannelMergerNode internalCreateChannelMergerNode() {
+    return new ChannelMergerNode._internalWrap();
+  }
+
+  factory ChannelMergerNode._internalWrap() {
+    return new ChannelMergerNode.internal_();
+  }
+
+  ChannelMergerNode.internal_() : super.internal_();
+
+
 }
 // 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
@@ -738,6 +923,18 @@
   // To suppress missing implicit constructor warnings.
   factory ChannelSplitterNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ChannelSplitterNode internalCreateChannelSplitterNode() {
+    return new ChannelSplitterNode._internalWrap();
+  }
+
+  factory ChannelSplitterNode._internalWrap() {
+    return new ChannelSplitterNode.internal_();
+  }
+
+  ChannelSplitterNode.internal_() : super.internal_();
+
+
 }
 // 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
@@ -754,13 +951,25 @@
   // To suppress missing implicit constructor warnings.
   factory ConvolverNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ConvolverNode internalCreateConvolverNode() {
+    return new ConvolverNode._internalWrap();
+  }
+
+  factory ConvolverNode._internalWrap() {
+    return new ConvolverNode.internal_();
+  }
+
+  ConvolverNode.internal_() : super.internal_();
+
+
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
   AudioBuffer get buffer => wrap_jso(_blink.BlinkConvolverNode.instance.buffer_Getter_(unwrap_jso(this)));
   
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.instance.buffer_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
@@ -768,7 +977,7 @@
   
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  void set normalize(bool value) => _blink.BlinkConvolverNode.instance.normalize_Setter_(unwrap_jso(this), value);
+  set normalize(bool value) => _blink.BlinkConvolverNode.instance.normalize_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -786,6 +995,18 @@
   // To suppress missing implicit constructor warnings.
   factory DelayNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DelayNode internalCreateDelayNode() {
+    return new DelayNode._internalWrap();
+  }
+
+  factory DelayNode._internalWrap() {
+    return new DelayNode.internal_();
+  }
+
+  DelayNode.internal_() : super.internal_();
+
+
   @DomName('DelayNode.delayTime')
   @DocsEditable()
   AudioParam get delayTime => wrap_jso(_blink.BlinkDelayNode.instance.delayTime_Getter_(unwrap_jso(this)));
@@ -806,6 +1027,18 @@
   // To suppress missing implicit constructor warnings.
   factory DynamicsCompressorNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static DynamicsCompressorNode internalCreateDynamicsCompressorNode() {
+    return new DynamicsCompressorNode._internalWrap();
+  }
+
+  factory DynamicsCompressorNode._internalWrap() {
+    return new DynamicsCompressorNode.internal_();
+  }
+
+  DynamicsCompressorNode.internal_() : super.internal_();
+
+
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
   AudioParam get attack => wrap_jso(_blink.BlinkDynamicsCompressorNode.instance.attack_Getter_(unwrap_jso(this)));
@@ -846,6 +1079,18 @@
   // To suppress missing implicit constructor warnings.
   factory GainNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static GainNode internalCreateGainNode() {
+    return new GainNode._internalWrap();
+  }
+
+  factory GainNode._internalWrap() {
+    return new GainNode.internal_();
+  }
+
+  GainNode.internal_() : super.internal_();
+
+
   @DomName('GainNode.gain')
   @DocsEditable()
   AudioParam get gain => wrap_jso(_blink.BlinkGainNode.instance.gain_Getter_(unwrap_jso(this)));
@@ -866,6 +1111,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaElementAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaElementAudioSourceNode internalCreateMediaElementAudioSourceNode() {
+    return new MediaElementAudioSourceNode._internalWrap();
+  }
+
+  factory MediaElementAudioSourceNode._internalWrap() {
+    return new MediaElementAudioSourceNode.internal_();
+  }
+
+  MediaElementAudioSourceNode.internal_() : super.internal_();
+
+
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
@@ -887,6 +1144,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamAudioDestinationNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaStreamAudioDestinationNode internalCreateMediaStreamAudioDestinationNode() {
+    return new MediaStreamAudioDestinationNode._internalWrap();
+  }
+
+  factory MediaStreamAudioDestinationNode._internalWrap() {
+    return new MediaStreamAudioDestinationNode.internal_();
+  }
+
+  MediaStreamAudioDestinationNode.internal_() : super.internal_();
+
+
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
   MediaStream get stream => wrap_jso(_blink.BlinkMediaStreamAudioDestinationNode.instance.stream_Getter_(unwrap_jso(this)));
@@ -907,6 +1176,18 @@
   // To suppress missing implicit constructor warnings.
   factory MediaStreamAudioSourceNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static MediaStreamAudioSourceNode internalCreateMediaStreamAudioSourceNode() {
+    return new MediaStreamAudioSourceNode._internalWrap();
+  }
+
+  factory MediaStreamAudioSourceNode._internalWrap() {
+    return new MediaStreamAudioSourceNode.internal_();
+  }
+
+  MediaStreamAudioSourceNode.internal_() : super.internal_();
+
+
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
   MediaStream get mediaStream => wrap_jso(_blink.BlinkMediaStreamAudioSourceNode.instance.mediaStream_Getter_(unwrap_jso(this)));
@@ -927,6 +1208,18 @@
   // To suppress missing implicit constructor warnings.
   factory OfflineAudioCompletionEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static OfflineAudioCompletionEvent internalCreateOfflineAudioCompletionEvent() {
+    return new OfflineAudioCompletionEvent._internalWrap();
+  }
+
+  factory OfflineAudioCompletionEvent._internalWrap() {
+    return new OfflineAudioCompletionEvent.internal_();
+  }
+
+  OfflineAudioCompletionEvent.internal_() : super.internal_();
+
+
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
   AudioBuffer get renderedBuffer => wrap_jso(_blink.BlinkOfflineAudioCompletionEvent.instance.renderedBuffer_Getter_(unwrap_jso(this)));
@@ -950,9 +1243,21 @@
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
   factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) {
-    return _blink.BlinkOfflineAudioContext.instance.constructorCallback_3_(numberOfChannels, numberOfFrames, sampleRate);
+    return wrap_jso(_blink.BlinkOfflineAudioContext.instance.constructorCallback_3_(numberOfChannels, numberOfFrames, sampleRate));
   }
 
+
+  static OfflineAudioContext internalCreateOfflineAudioContext() {
+    return new OfflineAudioContext._internalWrap();
+  }
+
+  factory OfflineAudioContext._internalWrap() {
+    return new OfflineAudioContext.internal_();
+  }
+
+  OfflineAudioContext.internal_() : super.internal_();
+
+
 }
 // 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
@@ -980,6 +1285,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> endedEvent = const EventStreamProvider<Event>('ended');
 
+
+  static OscillatorNode internalCreateOscillatorNode() {
+    return new OscillatorNode._internalWrap();
+  }
+
+  factory OscillatorNode._internalWrap() {
+    return new OscillatorNode.internal_();
+  }
+
+  OscillatorNode.internal_() : super.internal_();
+
+
   @DomName('OscillatorNode.detune')
   @DocsEditable()
   AudioParam get detune => wrap_jso(_blink.BlinkOscillatorNode.instance.detune_Getter_(unwrap_jso(this)));
@@ -994,7 +1311,7 @@
   
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(unwrap_jso(this), value);
+  set type(String value) => _blink.BlinkOscillatorNode.instance.type_Setter_(unwrap_jso(this), value);
   
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
@@ -1049,13 +1366,25 @@
   // To suppress missing implicit constructor warnings.
   factory PannerNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static PannerNode internalCreatePannerNode() {
+    return new PannerNode._internalWrap();
+  }
+
+  factory PannerNode._internalWrap() {
+    return new PannerNode.internal_();
+  }
+
+  PannerNode.internal_() : super.internal_();
+
+
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
   num get coneInnerAngle => _blink.BlinkPannerNode.instance.coneInnerAngle_Getter_(unwrap_jso(this));
   
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  void set coneInnerAngle(num value) => _blink.BlinkPannerNode.instance.coneInnerAngle_Setter_(unwrap_jso(this), value);
+  set coneInnerAngle(num value) => _blink.BlinkPannerNode.instance.coneInnerAngle_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
@@ -1063,7 +1392,7 @@
   
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  void set coneOuterAngle(num value) => _blink.BlinkPannerNode.instance.coneOuterAngle_Setter_(unwrap_jso(this), value);
+  set coneOuterAngle(num value) => _blink.BlinkPannerNode.instance.coneOuterAngle_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
@@ -1071,7 +1400,7 @@
   
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  void set coneOuterGain(num value) => _blink.BlinkPannerNode.instance.coneOuterGain_Setter_(unwrap_jso(this), value);
+  set coneOuterGain(num value) => _blink.BlinkPannerNode.instance.coneOuterGain_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
@@ -1079,7 +1408,7 @@
   
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  void set distanceModel(String value) => _blink.BlinkPannerNode.instance.distanceModel_Setter_(unwrap_jso(this), value);
+  set distanceModel(String value) => _blink.BlinkPannerNode.instance.distanceModel_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
@@ -1087,7 +1416,7 @@
   
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  void set maxDistance(num value) => _blink.BlinkPannerNode.instance.maxDistance_Setter_(unwrap_jso(this), value);
+  set maxDistance(num value) => _blink.BlinkPannerNode.instance.maxDistance_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.panningModel')
   @DocsEditable()
@@ -1095,7 +1424,7 @@
   
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  void set panningModel(String value) => _blink.BlinkPannerNode.instance.panningModel_Setter_(unwrap_jso(this), value);
+  set panningModel(String value) => _blink.BlinkPannerNode.instance.panningModel_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.refDistance')
   @DocsEditable()
@@ -1103,7 +1432,7 @@
   
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  void set refDistance(num value) => _blink.BlinkPannerNode.instance.refDistance_Setter_(unwrap_jso(this), value);
+  set refDistance(num value) => _blink.BlinkPannerNode.instance.refDistance_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
@@ -1111,7 +1440,7 @@
   
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  void set rolloffFactor(num value) => _blink.BlinkPannerNode.instance.rolloffFactor_Setter_(unwrap_jso(this), value);
+  set rolloffFactor(num value) => _blink.BlinkPannerNode.instance.rolloffFactor_Setter_(unwrap_jso(this), value);
   
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
@@ -1140,6 +1469,21 @@
   // To suppress missing implicit constructor warnings.
   factory PeriodicWave._() { throw new UnsupportedError("Not supported"); }
 
+  static PeriodicWave internalCreatePeriodicWave() {
+    return new PeriodicWave._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory PeriodicWave._internalWrap() {
+    return new PeriodicWave.internal_();
+  }
+
+  PeriodicWave.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1167,6 +1511,18 @@
   @Experimental() // untriaged
   static const EventStreamProvider<AudioProcessingEvent> audioProcessEvent = const EventStreamProvider<AudioProcessingEvent>('audioprocess');
 
+
+  static ScriptProcessorNode internalCreateScriptProcessorNode() {
+    return new ScriptProcessorNode._internalWrap();
+  }
+
+  factory ScriptProcessorNode._internalWrap() {
+    return new ScriptProcessorNode.internal_();
+  }
+
+  ScriptProcessorNode.internal_() : super.internal_();
+
+
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
   int get bufferSize => _blink.BlinkScriptProcessorNode.instance.bufferSize_Getter_(unwrap_jso(this));
@@ -1174,7 +1530,7 @@
   @DomName('ScriptProcessorNode.setEventListener')
   @DocsEditable()
   @Experimental() // untriaged
-  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.instance.setEventListener_Callback_1_(unwrap_jso(this), unwrap_jso(eventListener));
+  void setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.instance.setEventListener_Callback_1_(unwrap_jso(this), unwrap_jso((event) => eventListener(wrap_jso(event))));
   
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -1205,13 +1561,25 @@
   // To suppress missing implicit constructor warnings.
   factory WaveShaperNode._() { throw new UnsupportedError("Not supported"); }
 
+
+  static WaveShaperNode internalCreateWaveShaperNode() {
+    return new WaveShaperNode._internalWrap();
+  }
+
+  factory WaveShaperNode._internalWrap() {
+    return new WaveShaperNode.internal_();
+  }
+
+  WaveShaperNode.internal_() : super.internal_();
+
+
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => wrap_jso(_blink.BlinkWaveShaperNode.instance.curve_Getter_(unwrap_jso(this)));
+  Float32List get curve => _blink.BlinkWaveShaperNode.instance.curve_Getter_(unwrap_jso(this));
   
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  void set curve(Float32List value) => _blink.BlinkWaveShaperNode.instance.curve_Setter_(unwrap_jso(this), unwrap_jso(value));
+  set curve(Float32List value) => _blink.BlinkWaveShaperNode.instance.curve_Setter_(unwrap_jso(this), unwrap_jso(value));
   
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
@@ -1219,6 +1587,6 @@
   
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  void set oversample(String value) => _blink.BlinkWaveShaperNode.instance.oversample_Setter_(unwrap_jso(this), value);
+  set oversample(String value) => _blink.BlinkWaveShaperNode.instance.oversample_Setter_(unwrap_jso(this), value);
   
 }
diff --git a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
index 29d3070..2ce52d4 100644
--- a/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
+++ b/sdk/lib/web_gl/dart2js/web_gl_dart2js.dart
@@ -4,12 +4,12 @@
 library dart.dom.web_gl;
 
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, JSName, Native, Null, Returns, convertDartClosureToJS;
+import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 // DO NOT EDIT - unless you are editing documentation as per:
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index d587afd..356cca8 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -5,12 +5,13 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 // DO NOT EDIT
 // Auto-generated dart:web_gl library.
 
@@ -58,6 +59,44 @@
 
 };
 
+// FIXME: Can we make this private?
+final web_glBlinkFunctionMap = {
+  'ANGLEInstancedArrays': () => AngleInstancedArrays.internalCreateAngleInstancedArrays,
+  'EXTBlendMinMax': () => ExtBlendMinMax.internalCreateExtBlendMinMax,
+  'EXTFragDepth': () => ExtFragDepth.internalCreateExtFragDepth,
+  'EXTShaderTextureLOD': () => ExtShaderTextureLod.internalCreateExtShaderTextureLod,
+  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic.internalCreateExtTextureFilterAnisotropic,
+  'OESElementIndexUint': () => OesElementIndexUint.internalCreateOesElementIndexUint,
+  'OESStandardDerivatives': () => OesStandardDerivatives.internalCreateOesStandardDerivatives,
+  'OESTextureFloat': () => OesTextureFloat.internalCreateOesTextureFloat,
+  'OESTextureFloatLinear': () => OesTextureFloatLinear.internalCreateOesTextureFloatLinear,
+  'OESTextureHalfFloat': () => OesTextureHalfFloat.internalCreateOesTextureHalfFloat,
+  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear.internalCreateOesTextureHalfFloatLinear,
+  'OESVertexArrayObject': () => OesVertexArrayObject.internalCreateOesVertexArrayObject,
+  'WebGLActiveInfo': () => ActiveInfo.internalCreateActiveInfo,
+  'WebGLBuffer': () => Buffer.internalCreateBuffer,
+  'WebGLCompressedTextureATC': () => CompressedTextureAtc.internalCreateCompressedTextureAtc,
+  'WebGLCompressedTextureETC1': () => CompressedTextureETC1.internalCreateCompressedTextureETC1,
+  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc.internalCreateCompressedTexturePvrtc,
+  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC.internalCreateCompressedTextureS3TC,
+  'WebGLContextAttributes': () => ContextAttributes.internalCreateContextAttributes,
+  'WebGLContextEvent': () => ContextEvent.internalCreateContextEvent,
+  'WebGLDebugRendererInfo': () => DebugRendererInfo.internalCreateDebugRendererInfo,
+  'WebGLDebugShaders': () => DebugShaders.internalCreateDebugShaders,
+  'WebGLDepthTexture': () => DepthTexture.internalCreateDepthTexture,
+  'WebGLDrawBuffers': () => DrawBuffers.internalCreateDrawBuffers,
+  'WebGLFramebuffer': () => Framebuffer.internalCreateFramebuffer,
+  'WebGLLoseContext': () => LoseContext.internalCreateLoseContext,
+  'WebGLProgram': () => Program.internalCreateProgram,
+  'WebGLRenderbuffer': () => Renderbuffer.internalCreateRenderbuffer,
+  'WebGLRenderingContext': () => RenderingContext.internalCreateRenderingContext,
+  'WebGLShader': () => Shader.internalCreateShader,
+  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat.internalCreateShaderPrecisionFormat,
+  'WebGLTexture': () => Texture.internalCreateTexture,
+  'WebGLUniformLocation': () => UniformLocation.internalCreateUniformLocation,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObject.internalCreateVertexArrayObject,
+
+};
 // 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.
@@ -373,6 +412,21 @@
   // To suppress missing implicit constructor warnings.
   factory ActiveInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static ActiveInfo internalCreateActiveInfo() {
+    return new ActiveInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ActiveInfo._internalWrap() {
+    return new ActiveInfo.internal_();
+  }
+
+  ActiveInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
   String get name => _blink.BlinkWebGLActiveInfo.instance.name_Getter_(unwrap_jso(this));
@@ -400,6 +454,21 @@
   // To suppress missing implicit constructor warnings.
   factory AngleInstancedArrays._() { throw new UnsupportedError("Not supported"); }
 
+  static AngleInstancedArrays internalCreateAngleInstancedArrays() {
+    return new AngleInstancedArrays._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory AngleInstancedArrays._internalWrap() {
+    return new AngleInstancedArrays.internal_();
+  }
+
+  AngleInstancedArrays.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('ANGLEInstancedArrays.VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE')
   @DocsEditable()
   @Experimental() // untriaged
@@ -435,6 +504,21 @@
   // To suppress missing implicit constructor warnings.
   factory Buffer._() { throw new UnsupportedError("Not supported"); }
 
+  static Buffer internalCreateBuffer() {
+    return new Buffer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Buffer._internalWrap() {
+    return new Buffer.internal_();
+  }
+
+  Buffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -451,6 +535,21 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureAtc._() { throw new UnsupportedError("Not supported"); }
 
+  static CompressedTextureAtc internalCreateCompressedTextureAtc() {
+    return new CompressedTextureAtc._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CompressedTextureAtc._internalWrap() {
+    return new CompressedTextureAtc.internal_();
+  }
+
+  CompressedTextureAtc.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLCompressedTextureATC.COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL')
   @DocsEditable()
   static const int COMPRESSED_RGBA_ATC_EXPLICIT_ALPHA_WEBGL = 0x8C93;
@@ -478,6 +577,21 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureETC1._() { throw new UnsupportedError("Not supported"); }
 
+  static CompressedTextureETC1 internalCreateCompressedTextureETC1() {
+    return new CompressedTextureETC1._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CompressedTextureETC1._internalWrap() {
+    return new CompressedTextureETC1.internal_();
+  }
+
+  CompressedTextureETC1.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLCompressedTextureETC1.COMPRESSED_RGB_ETC1_WEBGL')
   @DocsEditable()
   @Experimental() // untriaged
@@ -499,6 +613,21 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTexturePvrtc._() { throw new UnsupportedError("Not supported"); }
 
+  static CompressedTexturePvrtc internalCreateCompressedTexturePvrtc() {
+    return new CompressedTexturePvrtc._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CompressedTexturePvrtc._internalWrap() {
+    return new CompressedTexturePvrtc.internal_();
+  }
+
+  CompressedTexturePvrtc.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLCompressedTexturePVRTC.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG')
   @DocsEditable()
   static const int COMPRESSED_RGBA_PVRTC_2BPPV1_IMG = 0x8C03;
@@ -531,6 +660,21 @@
   // To suppress missing implicit constructor warnings.
   factory CompressedTextureS3TC._() { throw new UnsupportedError("Not supported"); }
 
+  static CompressedTextureS3TC internalCreateCompressedTextureS3TC() {
+    return new CompressedTextureS3TC._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory CompressedTextureS3TC._internalWrap() {
+    return new CompressedTextureS3TC.internal_();
+  }
+
+  CompressedTextureS3TC.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLCompressedTextureS3TC.COMPRESSED_RGBA_S3TC_DXT1_EXT')
   @DocsEditable()
   static const int COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;
@@ -584,13 +728,28 @@
   // To suppress missing implicit constructor warnings.
   factory ContextAttributes._() { throw new UnsupportedError("Not supported"); }
 
+  static ContextAttributes internalCreateContextAttributes() {
+    return new ContextAttributes._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ContextAttributes._internalWrap() {
+    return new ContextAttributes.internal_();
+  }
+
+  ContextAttributes.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
   bool get alpha => _blink.BlinkWebGLContextAttributes.instance.alpha_Getter_(unwrap_jso(this));
   
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
+  set alpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.alpha_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
@@ -598,7 +757,7 @@
   
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  void set antialias(bool value) => _blink.BlinkWebGLContextAttributes.instance.antialias_Setter_(unwrap_jso(this), value);
+  set antialias(bool value) => _blink.BlinkWebGLContextAttributes.instance.antialias_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
@@ -606,7 +765,7 @@
   
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  void set depth(bool value) => _blink.BlinkWebGLContextAttributes.instance.depth_Setter_(unwrap_jso(this), value);
+  set depth(bool value) => _blink.BlinkWebGLContextAttributes.instance.depth_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
@@ -616,7 +775,7 @@
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  void set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Setter_(unwrap_jso(this), value);
+  set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.instance.failIfMajorPerformanceCaveat_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
@@ -624,7 +783,7 @@
   
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  void set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Setter_(unwrap_jso(this), value);
+  set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.instance.premultipliedAlpha_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
@@ -632,7 +791,7 @@
   
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  void set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Setter_(unwrap_jso(this), value);
+  set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.instance.preserveDrawingBuffer_Setter_(unwrap_jso(this), value);
   
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
@@ -640,7 +799,7 @@
   
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  void set stencil(bool value) => _blink.BlinkWebGLContextAttributes.instance.stencil_Setter_(unwrap_jso(this), value);
+  set stencil(bool value) => _blink.BlinkWebGLContextAttributes.instance.stencil_Setter_(unwrap_jso(this), value);
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -657,6 +816,18 @@
   // To suppress missing implicit constructor warnings.
   factory ContextEvent._() { throw new UnsupportedError("Not supported"); }
 
+
+  static ContextEvent internalCreateContextEvent() {
+    return new ContextEvent._internalWrap();
+  }
+
+  factory ContextEvent._internalWrap() {
+    return new ContextEvent.internal_();
+  }
+
+  ContextEvent.internal_() : super.internal_();
+
+
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
   String get statusMessage => _blink.BlinkWebGLContextEvent.instance.statusMessage_Getter_(unwrap_jso(this));
@@ -677,6 +848,21 @@
   // To suppress missing implicit constructor warnings.
   factory DebugRendererInfo._() { throw new UnsupportedError("Not supported"); }
 
+  static DebugRendererInfo internalCreateDebugRendererInfo() {
+    return new DebugRendererInfo._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DebugRendererInfo._internalWrap() {
+    return new DebugRendererInfo.internal_();
+  }
+
+  DebugRendererInfo.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLDebugRendererInfo.UNMASKED_RENDERER_WEBGL')
   @DocsEditable()
   static const int UNMASKED_RENDERER_WEBGL = 0x9246;
@@ -701,6 +887,21 @@
   // To suppress missing implicit constructor warnings.
   factory DebugShaders._() { throw new UnsupportedError("Not supported"); }
 
+  static DebugShaders internalCreateDebugShaders() {
+    return new DebugShaders._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DebugShaders._internalWrap() {
+    return new DebugShaders.internal_();
+  }
+
+  DebugShaders.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
   String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.instance.getTranslatedShaderSource_Callback_1_(unwrap_jso(this), unwrap_jso(shader));
@@ -721,6 +922,21 @@
   // To suppress missing implicit constructor warnings.
   factory DepthTexture._() { throw new UnsupportedError("Not supported"); }
 
+  static DepthTexture internalCreateDepthTexture() {
+    return new DepthTexture._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DepthTexture._internalWrap() {
+    return new DepthTexture.internal_();
+  }
+
+  DepthTexture.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLDepthTexture.UNSIGNED_INT_24_8_WEBGL')
   @DocsEditable()
   static const int UNSIGNED_INT_24_8_WEBGL = 0x84FA;
@@ -741,6 +957,21 @@
   // To suppress missing implicit constructor warnings.
   factory DrawBuffers._() { throw new UnsupportedError("Not supported"); }
 
+  static DrawBuffers internalCreateDrawBuffers() {
+    return new DrawBuffers._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DrawBuffers._internalWrap() {
+    return new DrawBuffers.internal_();
+  }
+
+  DrawBuffers.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLDrawBuffers.COLOR_ATTACHMENT0_WEBGL')
   @DocsEditable()
   static const int COLOR_ATTACHMENT0_WEBGL = 0x8CE0;
@@ -896,6 +1127,21 @@
   // To suppress missing implicit constructor warnings.
   factory ExtBlendMinMax._() { throw new UnsupportedError("Not supported"); }
 
+  static ExtBlendMinMax internalCreateExtBlendMinMax() {
+    return new ExtBlendMinMax._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ExtBlendMinMax._internalWrap() {
+    return new ExtBlendMinMax.internal_();
+  }
+
+  ExtBlendMinMax.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('EXTBlendMinMax.MAX_EXT')
   @DocsEditable()
   @Experimental() // untriaged
@@ -922,6 +1168,21 @@
   // To suppress missing implicit constructor warnings.
   factory ExtFragDepth._() { throw new UnsupportedError("Not supported"); }
 
+  static ExtFragDepth internalCreateExtFragDepth() {
+    return new ExtFragDepth._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ExtFragDepth._internalWrap() {
+    return new ExtFragDepth.internal_();
+  }
+
+  ExtFragDepth.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -937,6 +1198,21 @@
   // To suppress missing implicit constructor warnings.
   factory ExtShaderTextureLod._() { throw new UnsupportedError("Not supported"); }
 
+  static ExtShaderTextureLod internalCreateExtShaderTextureLod() {
+    return new ExtShaderTextureLod._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ExtShaderTextureLod._internalWrap() {
+    return new ExtShaderTextureLod.internal_();
+  }
+
+  ExtShaderTextureLod.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -953,6 +1229,21 @@
   // To suppress missing implicit constructor warnings.
   factory ExtTextureFilterAnisotropic._() { throw new UnsupportedError("Not supported"); }
 
+  static ExtTextureFilterAnisotropic internalCreateExtTextureFilterAnisotropic() {
+    return new ExtTextureFilterAnisotropic._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ExtTextureFilterAnisotropic._internalWrap() {
+    return new ExtTextureFilterAnisotropic.internal_();
+  }
+
+  ExtTextureFilterAnisotropic.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('EXTTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT')
   @DocsEditable()
   static const int MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;
@@ -976,6 +1267,21 @@
   // To suppress missing implicit constructor warnings.
   factory Framebuffer._() { throw new UnsupportedError("Not supported"); }
 
+  static Framebuffer internalCreateFramebuffer() {
+    return new Framebuffer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Framebuffer._internalWrap() {
+    return new Framebuffer.internal_();
+  }
+
+  Framebuffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -992,6 +1298,21 @@
   // To suppress missing implicit constructor warnings.
   factory LoseContext._() { throw new UnsupportedError("Not supported"); }
 
+  static LoseContext internalCreateLoseContext() {
+    return new LoseContext._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory LoseContext._internalWrap() {
+    return new LoseContext.internal_();
+  }
+
+  LoseContext.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
   void loseContext() => _blink.BlinkWebGLLoseContext.instance.loseContext_Callback_0_(unwrap_jso(this));
@@ -1016,6 +1337,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesElementIndexUint._() { throw new UnsupportedError("Not supported"); }
 
+  static OesElementIndexUint internalCreateOesElementIndexUint() {
+    return new OesElementIndexUint._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesElementIndexUint._internalWrap() {
+    return new OesElementIndexUint.internal_();
+  }
+
+  OesElementIndexUint.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1032,6 +1368,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesStandardDerivatives._() { throw new UnsupportedError("Not supported"); }
 
+  static OesStandardDerivatives internalCreateOesStandardDerivatives() {
+    return new OesStandardDerivatives._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesStandardDerivatives._internalWrap() {
+    return new OesStandardDerivatives.internal_();
+  }
+
+  OesStandardDerivatives.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('OESStandardDerivatives.FRAGMENT_SHADER_DERIVATIVE_HINT_OES')
   @DocsEditable()
   static const int FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;
@@ -1052,6 +1403,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloat._() { throw new UnsupportedError("Not supported"); }
 
+  static OesTextureFloat internalCreateOesTextureFloat() {
+    return new OesTextureFloat._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesTextureFloat._internalWrap() {
+    return new OesTextureFloat.internal_();
+  }
+
+  OesTextureFloat.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1068,6 +1434,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
+  static OesTextureFloatLinear internalCreateOesTextureFloatLinear() {
+    return new OesTextureFloatLinear._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesTextureFloatLinear._internalWrap() {
+    return new OesTextureFloatLinear.internal_();
+  }
+
+  OesTextureFloatLinear.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1084,6 +1465,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloat._() { throw new UnsupportedError("Not supported"); }
 
+  static OesTextureHalfFloat internalCreateOesTextureHalfFloat() {
+    return new OesTextureHalfFloat._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesTextureHalfFloat._internalWrap() {
+    return new OesTextureHalfFloat.internal_();
+  }
+
+  OesTextureHalfFloat.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('OESTextureHalfFloat.HALF_FLOAT_OES')
   @DocsEditable()
   static const int HALF_FLOAT_OES = 0x8D61;
@@ -1104,6 +1500,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesTextureHalfFloatLinear._() { throw new UnsupportedError("Not supported"); }
 
+  static OesTextureHalfFloatLinear internalCreateOesTextureHalfFloatLinear() {
+    return new OesTextureHalfFloatLinear._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesTextureHalfFloatLinear._internalWrap() {
+    return new OesTextureHalfFloatLinear.internal_();
+  }
+
+  OesTextureHalfFloatLinear.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1120,6 +1531,21 @@
   // To suppress missing implicit constructor warnings.
   factory OesVertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
+  static OesVertexArrayObject internalCreateOesVertexArrayObject() {
+    return new OesVertexArrayObject._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory OesVertexArrayObject._internalWrap() {
+    return new OesVertexArrayObject.internal_();
+  }
+
+  OesVertexArrayObject.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('OESVertexArrayObject.VERTEX_ARRAY_BINDING_OES')
   @DocsEditable()
   static const int VERTEX_ARRAY_BINDING_OES = 0x85B5;
@@ -1130,7 +1556,7 @@
   
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() => _blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(unwrap_jso(this));
+  VertexArrayObject createVertexArray() => wrap_jso(_blink.BlinkOESVertexArrayObject.instance.createVertexArrayOES_Callback_0_(unwrap_jso(this)));
   
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
@@ -1155,6 +1581,21 @@
   // To suppress missing implicit constructor warnings.
   factory Program._() { throw new UnsupportedError("Not supported"); }
 
+  static Program internalCreateProgram() {
+    return new Program._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Program._internalWrap() {
+    return new Program.internal_();
+  }
+
+  Program.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1170,6 +1611,21 @@
   // To suppress missing implicit constructor warnings.
   factory Renderbuffer._() { throw new UnsupportedError("Not supported"); }
 
+  static Renderbuffer internalCreateRenderbuffer() {
+    return new Renderbuffer._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Renderbuffer._internalWrap() {
+    return new Renderbuffer.internal_();
+  }
+
+  Renderbuffer.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -1185,6 +1641,21 @@
   // To suppress missing implicit constructor warnings.
   factory RenderingContext._() { throw new UnsupportedError("Not supported"); }
 
+  static RenderingContext internalCreateRenderingContext() {
+    return new RenderingContext._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory RenderingContext._internalWrap() {
+    return new RenderingContext.internal_();
+  }
+
+  RenderingContext.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -2529,27 +3000,27 @@
   
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.instance.createBuffer_Callback_0_(unwrap_jso(this));
+  Buffer createBuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createBuffer_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.instance.createFramebuffer_Callback_0_(unwrap_jso(this));
+  Framebuffer createFramebuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createFramebuffer_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() => _blink.BlinkWebGLRenderingContext.instance.createProgram_Callback_0_(unwrap_jso(this));
+  Program createProgram() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createProgram_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.instance.createRenderbuffer_Callback_0_(unwrap_jso(this));
+  Renderbuffer createRenderbuffer() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createRenderbuffer_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.instance.createShader_Callback_1_(unwrap_jso(this), type);
+  Shader createShader(int type) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createShader_Callback_1_(unwrap_jso(this), type));
   
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() => _blink.BlinkWebGLRenderingContext.instance.createTexture_Callback_0_(unwrap_jso(this));
+  Texture createTexture() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.createTexture_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
@@ -2645,15 +3116,15 @@
   
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveAttrib_Callback_2_(unwrap_jso(this), unwrap_jso(program), index);
+  ActiveInfo getActiveAttrib(Program program, int index) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getActiveAttrib_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
   
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.instance.getActiveUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), index);
+  ActiveInfo getActiveUniform(Program program, int index) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getActiveUniform_Callback_2_(unwrap_jso(this), unwrap_jso(program), index));
   
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  List<Shader> getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.instance.getAttachedShaders_Callback_1_(unwrap_jso(this), unwrap_jso(program));
+  List<Shader> getAttachedShaders(Program program) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getAttachedShaders_Callback_1_(unwrap_jso(this), unwrap_jso(program)));
   
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
@@ -2665,7 +3136,7 @@
   
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this));
+  ContextAttributes getContextAttributes() => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getContextAttributes_Callback_0_(unwrap_jso(this)));
   
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
@@ -2705,7 +3176,7 @@
   
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.instance.getShaderPrecisionFormat_Callback_2_(unwrap_jso(this), shadertype, precisiontype);
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getShaderPrecisionFormat_Callback_2_(unwrap_jso(this), shadertype, precisiontype));
   
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
@@ -2725,7 +3196,7 @@
   
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.instance.getUniformLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name);
+  UniformLocation getUniformLocation(Program program, String name) => wrap_jso(_blink.BlinkWebGLRenderingContext.instance.getUniformLocation_Callback_2_(unwrap_jso(this), unwrap_jso(program), name));
   
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
@@ -3117,6 +3588,21 @@
   // To suppress missing implicit constructor warnings.
   factory Shader._() { throw new UnsupportedError("Not supported"); }
 
+  static Shader internalCreateShader() {
+    return new Shader._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Shader._internalWrap() {
+    return new Shader.internal_();
+  }
+
+  Shader.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -3131,6 +3617,21 @@
   // To suppress missing implicit constructor warnings.
   factory ShaderPrecisionFormat._() { throw new UnsupportedError("Not supported"); }
 
+  static ShaderPrecisionFormat internalCreateShaderPrecisionFormat() {
+    return new ShaderPrecisionFormat._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory ShaderPrecisionFormat._internalWrap() {
+    return new ShaderPrecisionFormat.internal_();
+  }
+
+  ShaderPrecisionFormat.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
   int get precision => _blink.BlinkWebGLShaderPrecisionFormat.instance.precision_Getter_(unwrap_jso(this));
@@ -3157,6 +3658,21 @@
   // To suppress missing implicit constructor warnings.
   factory Texture._() { throw new UnsupportedError("Not supported"); }
 
+  static Texture internalCreateTexture() {
+    return new Texture._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory Texture._internalWrap() {
+    return new Texture.internal_();
+  }
+
+  Texture.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -3171,6 +3687,21 @@
   // To suppress missing implicit constructor warnings.
   factory UniformLocation._() { throw new UnsupportedError("Not supported"); }
 
+  static UniformLocation internalCreateUniformLocation() {
+    return new UniformLocation._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory UniformLocation._internalWrap() {
+    return new UniformLocation.internal_();
+  }
+
+  UniformLocation.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -3187,6 +3718,21 @@
   // To suppress missing implicit constructor warnings.
   factory VertexArrayObject._() { throw new UnsupportedError("Not supported"); }
 
+  static VertexArrayObject internalCreateVertexArrayObject() {
+    return new VertexArrayObject._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory VertexArrayObject._internalWrap() {
+    return new VertexArrayObject.internal_();
+  }
+
+  VertexArrayObject.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
 }
 // 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
@@ -3198,7 +3744,7 @@
 @DocsEditable()
 @DomName('WebGLRenderingContextBase')
 @Experimental() // untriaged
-abstract class _WebGLRenderingContextBase extends NativeFieldWrapperClass2 {
+class _WebGLRenderingContextBase extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
   factory _WebGLRenderingContextBase._() { throw new UnsupportedError("Not supported"); }
 
diff --git a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
index d19fa39..34838d5 100644
--- a/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
+++ b/sdk/lib/web_sql/dart2js/web_sql_dart2js.dart
@@ -12,7 +12,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName, Native;
@@ -228,7 +228,7 @@
   // Map is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 540f88d..73bc18c 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -12,17 +12,24 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
+
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
 
 
 
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
 
 // FIXME: Can we make this private?
 final web_sqlBlinkMap = {
@@ -34,6 +41,15 @@
 
 };
 
+// FIXME: Can we make this private?
+final web_sqlBlinkFunctionMap = {
+  'Database': () => SqlDatabase.internalCreateSqlDatabase,
+  'SQLError': () => SqlError.internalCreateSqlError,
+  'SQLResultSet': () => SqlResultSet.internalCreateSqlResultSet,
+  'SQLResultSetRowList': () => SqlResultSetRowList.internalCreateSqlResultSetRowList,
+  'SQLTransaction': () => SqlTransaction.internalCreateSqlTransaction,
+
+};
 // 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.
@@ -96,6 +112,21 @@
   // To suppress missing implicit constructor warnings.
   factory SqlDatabase._() { throw new UnsupportedError("Not supported"); }
 
+  static SqlDatabase internalCreateSqlDatabase() {
+    return new SqlDatabase._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SqlDatabase._internalWrap() {
+    return new SqlDatabase.internal_();
+  }
+
+  SqlDatabase.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
@@ -105,15 +136,15 @@
   
   void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_5_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso(callback), unwrap_jso(errorCallback), unwrap_jso(successCallback));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_5_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_4_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso(callback), unwrap_jso(errorCallback));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_4_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
     if (callback != null) {
-      _blink.BlinkDatabase.instance.changeVersion_Callback_3_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso(callback));
+      _blink.BlinkDatabase.instance.changeVersion_Callback_3_(unwrap_jso(this), oldVersion, newVersion, unwrap_jso((transaction) => callback(wrap_jso(transaction))));
       return;
     }
     _blink.BlinkDatabase.instance.changeVersion_Callback_2_(unwrap_jso(this), oldVersion, newVersion);
@@ -122,27 +153,27 @@
 
   void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.readTransaction_Callback_3_(unwrap_jso(this), unwrap_jso(callback), unwrap_jso(errorCallback), unwrap_jso(successCallback));
+      _blink.BlinkDatabase.instance.readTransaction_Callback_3_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.readTransaction_Callback_2_(unwrap_jso(this), unwrap_jso(callback), unwrap_jso(errorCallback));
+      _blink.BlinkDatabase.instance.readTransaction_Callback_2_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkDatabase.instance.readTransaction_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+    _blink.BlinkDatabase.instance.readTransaction_Callback_1_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))));
     return;
   }
 
   void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) {
     if (successCallback != null) {
-      _blink.BlinkDatabase.instance.transaction_Callback_3_(unwrap_jso(this), unwrap_jso(callback), unwrap_jso(errorCallback), unwrap_jso(successCallback));
+      _blink.BlinkDatabase.instance.transaction_Callback_3_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))), unwrap_jso(() => successCallback()));
       return;
     }
     if (errorCallback != null) {
-      _blink.BlinkDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso(callback), unwrap_jso(errorCallback));
+      _blink.BlinkDatabase.instance.transaction_Callback_2_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))), unwrap_jso((error) => errorCallback(wrap_jso(error))));
       return;
     }
-    _blink.BlinkDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso(callback));
+    _blink.BlinkDatabase.instance.transaction_Callback_1_(unwrap_jso(this), unwrap_jso((transaction) => callback(wrap_jso(transaction))));
     return;
   }
 
@@ -162,6 +193,21 @@
   // To suppress missing implicit constructor warnings.
   factory SqlError._() { throw new UnsupportedError("Not supported"); }
 
+  static SqlError internalCreateSqlError() {
+    return new SqlError._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SqlError._internalWrap() {
+    return new SqlError.internal_();
+  }
+
+  SqlError.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SQLError.CONSTRAINT_ERR')
   @DocsEditable()
   static const int CONSTRAINT_ERR = 6;
@@ -218,6 +264,21 @@
   // To suppress missing implicit constructor warnings.
   factory SqlResultSet._() { throw new UnsupportedError("Not supported"); }
 
+  static SqlResultSet internalCreateSqlResultSet() {
+    return new SqlResultSet._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SqlResultSet._internalWrap() {
+    return new SqlResultSet.internal_();
+  }
+
+  SqlResultSet.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
   int get insertId => _blink.BlinkSQLResultSet.instance.insertId_Getter_(unwrap_jso(this));
@@ -242,10 +303,25 @@
 @DomName('SQLResultSetRowList')
 // http://www.w3.org/TR/webdatabase/#sqlresultsetrowlist
 @Experimental() // deprecated
-class SqlResultSetRowList extends NativeFieldWrapperClass2 with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> {
+class SqlResultSetRowList extends JsoNativeFieldWrapper with ListMixin<Map>, ImmutableListMixin<Map> implements List<Map> {
   // To suppress missing implicit constructor warnings.
   factory SqlResultSetRowList._() { throw new UnsupportedError("Not supported"); }
 
+  static SqlResultSetRowList internalCreateSqlResultSetRowList() {
+    return new SqlResultSetRowList._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SqlResultSetRowList._internalWrap() {
+    return new SqlResultSetRowList.internal_();
+  }
+
+  SqlResultSetRowList.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
   int get length => _blink.BlinkSQLResultSetRowList.instance.length_Getter_(unwrap_jso(this));
@@ -253,11 +329,11 @@
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
-    return _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index);
+    return wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
   }
 
-  Map _nativeIndexedGetter(int index) => _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index);
- 
+  Map _nativeIndexedGetter(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
+
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
   }
@@ -265,7 +341,7 @@
   // Map is the element type.
 
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 
@@ -298,7 +374,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) => _blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index);
+  Map item(int index) => wrap_jso(_blink.BlinkSQLResultSetRowList.instance.item_Callback_1_(unwrap_jso(this), index));
   
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -319,8 +395,23 @@
   // To suppress missing implicit constructor warnings.
   factory SqlTransaction._() { throw new UnsupportedError("Not supported"); }
 
+  static SqlTransaction internalCreateSqlTransaction() {
+    return new SqlTransaction._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory SqlTransaction._internalWrap() {
+    return new SqlTransaction.internal_();
+  }
+
+  SqlTransaction.internal_() { }
+
+  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);
+  int get hashCode => unwrap_jso(this).hashCode;
+
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso(callback), unwrap_jso(errorCallback));
+  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.instance.executeSql_Callback_4_(unwrap_jso(this), sqlStatement, arguments, unwrap_jso((transaction, resultSet) => callback(wrap_jso(transaction), wrap_jso(resultSet))), unwrap_jso((transaction, error) => errorCallback(wrap_jso(transaction), wrap_jso(error))));
   
 }
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index ed616b4..c11877e 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -291,3 +291,4 @@
 WebPlatformTest/html/semantics/forms/the-input-element/email_t02: StaticWarning # co19 issue 701
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t01: MissingCompileTimeError # Issue 22010
 Language/12_Expressions/12_Instance_Creation/2_Const_A11_t03: MissingCompileTimeError # Issue 22010
+
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 6790464..ac59077 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -290,3 +290,26 @@
 Language/13_Statements/15_Assert_A04_t07: StaticWarning # Issue 23663
 Language/13_Statements/15_Assert_A03_t08: StaticWarning # Issue 23663
 
+# isProtocolHandlerRegistered and unregisterProtocolHandler don't exist
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: StaticWarning
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: StaticWarning
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: StaticWarning
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t04: StaticWarning
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: StaticWarning
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t06: StaticWarning
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: StaticWarning
+
+# Missing concrete implementation of setter 'XPathNSResolver.blink_jsObject' and getter 'XPathNSResolver.blink_jsObject'
+# TODO(terry): Dartium only because of implements instead of extends consider fixing by making blink_jsObject private
+#              with private wrap_jso and unwrap_jso in each library that delegates to the public wrap/unwrap_jso.
+LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: StaticWarning
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: StaticWarning
+LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: StaticWarning
+LayoutTests/fast/xpath/attr-namespace_t01: StaticWarning
+LayoutTests/fast/xpath/attr-namespace_t02: StaticWarning
+LayoutTests/fast/xpath/node-name-case-sensitivity_t01: StaticWarning
+LayoutTests/fast/xpath/node-name-case-sensitivity_t02: StaticWarning
+LayoutTests/fast/xpath/py-dom-xpath/data_t01: StaticWarning
+LayoutTests/fast/svg/getbbox_t01: StaticWarning
+
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 224f620..403ee76 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -198,8 +198,8 @@
 LibTest/typed_data/Uint8List/Uint8List_A02_t01: fail # co19-roll r576: Please triage this failure
 Utils/tests/Expect/identical_A01_t01: fail # co19-roll r546: Please triage this failure
 WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Document-createElement_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/nodes/DOMImplementation-createHTMLDocument_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Element-childElementCount-nochild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Pass, Slow
 LayoutTests/fast/loader/loadInProgress_t01: Skip # Issue 23466
@@ -373,7 +373,6 @@
 LayoutTests/fast/multicol/orphans-relayout_t01: Pass, RuntimeError
 LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
 LayoutTests/fast/media/media-query-serialization_t01: RuntimeError
-LayoutTests/fast/media/color-does-not-include-alpha_t01: RuntimeError
 LayoutTests/fast/media/mq-append-delete_t01: RuntimeError
 LayoutTests/fast/media/mq-color-index_t02: RuntimeError
 LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError
@@ -568,7 +567,7 @@
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-as-image-incremental-repaint_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is behind a flag.
 LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-invalid_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-getImageData-large-crash_t01: RuntimeError # Please triage this failure
@@ -778,7 +777,6 @@
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-protocol_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-search_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-autofocus_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unfocusable_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-node-is-unselectable_t01: RuntimeError # Please triage this failure
@@ -824,7 +822,6 @@
 LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # Please triage this failure
@@ -839,6 +836,7 @@
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/custom/element-names_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # Please triage this failure
@@ -852,9 +850,10 @@
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # Please triage this failure
@@ -927,7 +926,6 @@
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/focus_t01: Pass, RuntimeError # Please triage this failure
@@ -1108,6 +1106,7 @@
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
@@ -1116,6 +1115,7 @@
 LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
@@ -1254,7 +1254,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -1367,8 +1366,6 @@
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == chrome && $checked ]
 LayoutTests/fast/css-intrinsic-dimensions/css-tables_t01: RuntimeError # Please triage this failure
@@ -1430,6 +1427,8 @@
 LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/xpath-result-eventlistener-crash_t01: RuntimeError # Please triage this failure
 LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # Issue 18251
 WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # Please triage this failure
@@ -1549,6 +1548,15 @@
 LayoutTests/fast/multicol/balance-trailing-border_t01: Pass
 LayoutTests/fast/multicol/columns-shorthand-parsing_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/multicol/widows_t02: Pass
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Issue 24398
+
+[ $compiler == dart2js && $runtime == ff && $system == linux]
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/forms/change-form-element-document-crash_t01: RuntimeError # Dartium JSInterop failure, or else Firefox roll error. Issue 24409
+
+[ $compiler == dart2js && $runtime == chrome && $system == linux]
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
 
 [ $compiler == dart2js && $runtime == ff ]
 Language/12_Expressions/28_Postfix_Expressions_A07_t02: Skip # Times out. Please triage this failure
@@ -1586,7 +1594,7 @@
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented.
 LayoutTests/fast/canvas/canvas-drawImage-incomplete_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
@@ -2010,7 +2018,6 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -2115,7 +2122,6 @@
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
@@ -2184,7 +2190,7 @@
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/insertBefore-refChild-crash_t01: RuntimeError # Please triage this failure
@@ -2192,9 +2198,9 @@
 LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/location-hash_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/object-plugin-hides-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
@@ -2408,6 +2414,7 @@
 LayoutTests/fast/forms/date/input-valueasdate-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/forms/datetimelocal/ValidityState-rangeOverflow-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/ValidityState-rangeUnderflow-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/ValidityState-stepMismatch-datetimelocal_t01: RuntimeError # Please triage this failure
@@ -2415,7 +2422,6 @@
 LayoutTests/fast/forms/datetimelocal/datetimelocal-input-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/delete-text-with-invisible-br_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/fieldset/fieldset-disabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/fieldset/fieldset-elements_t01: RuntimeError # Please triage this failure
@@ -2521,7 +2527,6 @@
 LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/media/color-does-not-include-alpha_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/media/invalid-lengths_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/media/matchmedium-query-api_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/media/media-query-list-syntax_t01: RuntimeError # Please triage this failure
@@ -2701,6 +2706,7 @@
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
@@ -2709,6 +2715,8 @@
 LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/paths_t01: RuntimeError # Please triage this failure
@@ -2887,7 +2895,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -3063,36 +3070,13 @@
 WebPlatformTest/webstorage/event_constructor_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure. Note that Chrome also requires the Slow flag. (Could just be a slow test).
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == ff && $system == windows ]
 LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # Issue 22564
 WebPlatformTest/html/syntax/parsing/math-parse_t03: RuntimeError # Issue 22564
-LayoutTests/fast/dom/Attr/access-after-element-destruction_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-value_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/surroundContents-check-boundary-points_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/encoding/css-charset-dom_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/insertAdjacentElement_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/insertAllBefore_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/insertAllBefore_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/insertBefore_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/insertBefore_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/Element/nodes_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/Element/replaceWith_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/children_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/insertAdjacentElement_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/insertAllBefore_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/insertAllBefore_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/insertBefore_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/insertBefore_A02_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/nodes_A01_t02: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/nodes_setter_A01_t01: RuntimeError # Please triage this failure
-LibTest/html/IFrameElement/replaceWith_A01_t01: RuntimeError # Please triage this failure
-WebPlatformTest/dom/nodes/attributes/setAttributeNS_A03_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html-templates/serializing-html-templates/outerhtml_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/change-form-element-document-crash_t01: RuntimeError # Dartium JSInterop failure, or else Firefox roll error. Issue 24409
 
 [ $compiler == dart2js && $runtime == ff && $system != windows ]
 LayoutTests/fast/canvas/canvas-resetTransform_t01: RuntimeError # Please triage this failure
@@ -3153,7 +3137,7 @@
 LayoutTests/fast/canvas/canvas-blending-shadow_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-blending-transforms_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
@@ -3457,7 +3441,6 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -3520,7 +3503,6 @@
 LayoutTests/fast/dom/Range/range-on-detached-node_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
@@ -3567,14 +3549,13 @@
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/location-hash_t01: Skip # Times out. Please triage this failure
-LayoutTests/fast/dom/location-missing-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/object-plugin-hides-properties_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # Please triage this failure
@@ -3737,6 +3718,7 @@
 LayoutTests/fast/forms/color/input-value-sanitization-color_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datalist/datalist_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datalist/input-list_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date-multiple-fields/date-multiple-fields-onblur-setvalue-onfocusremoved_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/date/ValidityState-rangeOverflow-date_t01: RuntimeError # Please triage this failure
@@ -3759,7 +3741,6 @@
 LayoutTests/fast/forms/datetimelocal/datetimelocal-pseudo-classes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/datetimelocal-setrangetext_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/input-appearance-elementFromPoint_t01: RuntimeError # Please triage this failure
@@ -3981,6 +3962,7 @@
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
@@ -3989,6 +3971,7 @@
 LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
@@ -4171,7 +4154,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -4352,9 +4334,7 @@
 WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_session_storagearea_t01: Pass, RuntimeError # Fails on 7.1. Please triage this failure
 WebPlatformTest/webstorage/event_session_url_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_session_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: Skip # Times out. Please triage this failure
 
 [ $compiler == dart2js && $runtime == safarimobilesim ]
 LayoutTests/fast/alignment/parse-align-items_t01: RuntimeError # Please triage this failure
@@ -4402,7 +4382,7 @@
 LayoutTests/fast/canvas/canvas-composite-canvas_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-stroke-alpha_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-drawImage-scaled-copy-to-self_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
@@ -4715,7 +4695,6 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -4792,7 +4771,7 @@
 LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # Please triage this failure
@@ -4850,15 +4829,14 @@
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/html-collections-named-getter-mandatory-arg_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/location-hash_t01: Pass, RuntimeError # Please triage this failure
-LayoutTests/fast/dom/location-missing-arguments_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/option-properties_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # Please triage this failure
@@ -5035,7 +5013,7 @@
 LayoutTests/fast/forms/date/input-valueasnumber-date_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal-multiple-fields/datetimelocal-multiple-fields-change-layout-by-value_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/datetimelocal/input-valueasdate-datetimelocal_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/forms/datetimelocal/input-valueasnumber-datetimelocal_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/forms/focus-style-pending_t01: Skip # Times out. Please triage this failure
 LayoutTests/fast/forms/form-attribute_t01: RuntimeError # Please triage this failure
@@ -5274,6 +5252,7 @@
 LayoutTests/fast/xpath/4XPath/Core/test_core_functions_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/4XPath/Core/test_node_test_t02: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/ambiguous-operators_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/attr-namespace_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/ensure-null-namespace_t01: RuntimeError # Please triage this failure
@@ -5282,6 +5261,7 @@
 LayoutTests/fast/xpath/node-name-case-sensitivity_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/node-name-case-sensitivity_t02: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/position_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
 LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/data_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/xpath/py-dom-xpath/expressions_t01: RuntimeError # Please triage this failure
@@ -5493,7 +5473,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -5672,8 +5651,6 @@
 WebPlatformTest/webstorage/event_constructor_t02: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_local_key_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/event_session_key_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
 # This test is not flaky: IE10 on Windows 7 is different from IE10 on Windows 8.
 # The test fails on Windows 7's version, but it is currently not possible to test
@@ -5741,7 +5718,7 @@
 LayoutTests/fast/canvas/canvas-composite-canvas_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
@@ -6200,7 +6177,7 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Issue 24396
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -6375,7 +6352,6 @@
 LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
@@ -6473,7 +6449,6 @@
 LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/image-object_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # Please triage this failure
@@ -6483,9 +6458,9 @@
 LayoutTests/fast/dom/location-hash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/noscript-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # Please triage this failure
@@ -7499,7 +7474,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -7704,8 +7678,6 @@
 WebPlatformTest/webstorage/event_session_url_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $runtime == ie11 ]
 Language/05_Variables/05_Variables_A14_t07: Skip # Times out. Please triage this failure
@@ -7770,7 +7742,7 @@
 LayoutTests/fast/canvas/canvas-composite-text-alpha_t01: Pass, RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-css-crazy_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-currentColor_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is not implemented
 LayoutTests/fast/canvas/canvas-ellipse-360-winding_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-negative-radius_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/canvas/canvas-ellipse-zero-lineto_t01: RuntimeError # Please triage this failure
@@ -8213,7 +8185,7 @@
 LayoutTests/fast/dom/HTMLDialogElement/dialog-close-event_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-enabled_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-open_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/HTMLDialogElement/dialog-return-value_t01: RuntimeError # Issue 24396
 LayoutTests/fast/dom/HTMLDialogElement/dialog-scrolled-viewport_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/dialog-show-modal_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/HTMLDialogElement/inert-does-not-match-disabled-selector_t01: RuntimeError # Please triage this failure
@@ -8369,7 +8341,6 @@
 LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Please triage this failure
@@ -8464,7 +8435,6 @@
 LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/image-object_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # Please triage this failure
@@ -8473,9 +8443,9 @@
 LayoutTests/fast/dom/location-hash_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # Please triage this failure
-LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Please triage this failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: Skip # API not supported.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: Skip # API not supported.
 LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/noscript-style_t01: RuntimeError # Please triage this failure
 LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # Please triage this failure
@@ -9366,7 +9336,6 @@
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out. Please triage this failure
 WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # Please triage this failure
-WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # Please triage this failure
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # Please triage this failure
@@ -9569,8 +9538,6 @@
 WebPlatformTest/webstorage/event_session_url_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_builtins_t01: RuntimeError # Please triage this failure
 WebPlatformTest/webstorage/storage_local_setitem_quotaexceedederr_t01: Skip # Times out. Please triage this failure
-WebPlatformTest/webstorage/storage_local_setitem_t01: RuntimeError # Please triage this failure
-WebPlatformTest/webstorage/storage_session_setitem_t01: RuntimeError # Please triage this failure
 
 [ $compiler == dart2js && $cps_ir ]
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t12: RuntimeError # Please triage this failure.
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 26e1d15..47d5f46 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -11,6 +11,23 @@
 LayoutTests/fast/writing-mode/vertical-inline-block-hittest_t01: Pass, RuntimeError # Issue 21605
 LayoutTests/fast/writing-mode/flipped-blocks-hit-test-overflow_t01: Pass, RuntimeError # Issue 21605
 
+[ $compiler == none && $runtime == dartium ]
+LayoutTests/fast/canvas/canvas-lineDash-input-sequence_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/events/remove-event-listener_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/4XPath/Core/test_parser_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/py-dom-xpath/abbreviations_t01: RuntimeError # Dartium JSInterop failure
+LayoutTests/fast/xpath/py-dom-xpath/axes_t01: RuntimeError # Dartium JSInterop failure
+LibTest/html/Element/offsetParent_A01_t01: RuntimeError # Dartium JSInterop failure
+LibTest/html/Event/currentTarget_A01_t01: RuntimeError # Dartium JSInterop failure
+LibTest/html/Event/matchingTarget_A01_t01: RuntimeError # Dartium JSInterop failure
+LibTest/html/Event/target_A01_t01: RuntimeError # Dartium JSInterop failure
+
+[ $compiler == none && $runtime == dartium && $checked ]
+LayoutTests/fast/css/style-scoped/style-scoped-scoping-nodes-different-order_t01: RuntimeError # Dartium JSInterop failure
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgba4444_t01: Skip # Issue 20540
 LayoutTests/fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-rgb565_t01: Skip # Issue 20540
@@ -38,9 +55,6 @@
 LayoutTests/fast/sub-pixel/size-of-span-with-different-positions_t01: Skip # co19 issue 732.
 LayoutTests/fast/text/international/complex-text-rectangle_t01: Skip # co19 issue 732.
 LayoutTests/fast/text/line-breaks-after-hyphen-before-number_t01: Skip # co19 issue 732.
-LibTest/html/Window/document_A01_t01: RuntimeError # Issue 20146
-LibTest/html/Window/postMessage_A01_t02: RuntimeError # Issue 20146
-LibTest/html/Window/moveBy_A01_t01: RuntimeError # Issue 20146
 LayoutTests/fast/css-generated-content/bug91547_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/filesystem/file-after-reload-crash_t01: Skip # Test reloads itself. Issue 18558.
 LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Test reloads itself. Issue 18558.
@@ -204,7 +218,6 @@
 LibTest/html/IFrameElement/attributes_setter_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # co19-roll r706.  Issue 16574
 LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
-LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # co19-roll r706.  Please triage this failure.
 LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # co19-roll r706.  Please triage this failure.
@@ -253,7 +266,6 @@
 LayoutTests/fast/dom/HTMLDialogElement/multiple-centered-dialogs_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/non-anchored-dialog-positioning_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # Issue 18931
-LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/HTMLDialogElement/show-modal-focusing-steps_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -292,13 +304,11 @@
 WebPlatformTest/shadow-dom/events/event-dispatch/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-dispatch/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-retargeting/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # Not clear that any of this works. Also suppressed in dart2js
 WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError, Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Skip # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-003_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/html-elements-and-their-shadow-trees/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -323,7 +333,6 @@
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Issue 18250
 LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Issue 18249
 LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Issue 18253
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -369,9 +378,6 @@
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-content-html-element/test-004_t02: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/the-shadow-html-element/test-003_t02: RuntimeError # Please triage this failure.
-WebPlatformTest/shadow-dom/events/event-dispatch/test-002_t01: RuntimeError # Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-001_t01: RuntimeError # Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Please triage this failure.
 
 LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # Test is incorrect.
@@ -388,8 +394,6 @@
 LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # co19-roll r738: Please triage this failure.
-LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
 LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -413,7 +417,6 @@
 WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # co19-roll r738: Please triage this failure.
-WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # co19-roll r738: Please triage this failure.
 WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
@@ -446,8 +449,6 @@
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.negative_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.veryLarge_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/2d.text.draw.fill.maxWidth.verySmall_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/alpha_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/canvas-2d-imageData-create-nonfinite_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-arc-negative-radius_t01: Skip # Times out. co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-blending-text_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-empty-image-pattern_t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -456,12 +457,9 @@
 LayoutTests/fast/canvas/canvas-large-fills_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-lose-restore-googol-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/canvas-lose-restore-max-int-size_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/canvas-putImageData_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/draw-custom-focus-ring_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/drawImage-with-broken-image_t01: Timeout, Pass # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/getPutImageDataPairTest_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/linearGradient-infinite-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
-LayoutTests/fast/canvas/radialGradient-infinite-values_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/bad-arguments-test_t01: RuntimeError # co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/canvas-resize-crash_t01: Skip # Causes following tests to fail. co19-roll r761: Please triage this failure.
 LayoutTests/fast/canvas/webgl/context-attributes-alpha-depth-stencil-antialias-t01: RuntimeError # co19-roll r761: Please triage this failure.
@@ -576,6 +574,7 @@
 WebPlatformTest/html/semantics/tabular-data/the-table-element/table-rows_t01: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/semantics/tabular-data/the-tr-element/rowIndex_t01: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/syntax/serializing-html-fragments/outerHTML_t01: RuntimeError # co19-roll r761: Please triage this failure.
+WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t01: RuntimeError # Tests APIs that aren't yet visible. Tests should be deleted.
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t02: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t03: RuntimeError # co19-roll r761: Please triage this failure.
 WebPlatformTest/html/webappapis/system-state-and-capabilities/the-navigator-object/protocol/t05: RuntimeError # co19-roll r761: Please triage this failure.
@@ -679,9 +678,6 @@
 LayoutTests/fast/exclusions/parsing/parsing-wrap-through_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/files/blob-close-read_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/files/blob-close_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/files/blob-constructor_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/files/file-reader-methods-illegal-arguments_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/files/url-null_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/files/xhr-response-blob_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/filesystem/async-operations_t01: Pass, RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/filesystem/directory-entry-to-uri_t01: RuntimeError # co19-roll r786: Please triage this failure.
@@ -774,7 +770,6 @@
 WebPlatformTest/html/semantics/forms/the-input-element/password_t01: RuntimeError # co19-roll r786: Please triage this failure.
 WebPlatformTest/html/syntax/parsing/Document.getElementsByTagName-foreign_t02: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/dom/52776_t01: RuntimeError # Please triage this failure.
-LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/Range/insertNode-empty-fragment-crash_t01: RuntimeError # Please triage this failure.
@@ -784,9 +779,8 @@
 LayoutTests/fast/dom/Range/range-insertNode-separate-endContainer_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/Range/range-insertNode-splittext_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # Please triage this failure.
-LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: RuntimeError # Please triage this failure.
-LayoutTests/fast/dom/text-api-arguments_t01: RuntimeError # Please triage this failure.
+
 
 # co19-roll r801
 LayoutTests/fast/canvas/webgl/canvas-test_t01: Pass, RuntimeError # co19-roll r801: Please triage this failure.
@@ -852,9 +846,7 @@
 LayoutTests/fast/loader/onhashchange-attribute-listeners_t01: Skip # Times out. co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/scroll-position-restored-on-back_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/scroll-position-restored-on-reload-at-load-event_t01: Skip # Times out. co19-roll r801: Please triage this failure.
-LayoutTests/fast/loader/stateobjects/pushstate-updates-location_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/loader/stateobjects/replacestate-in-onunload_t01: RuntimeError # co19-roll r801: Please triage this failure.
-LayoutTests/fast/loader/stateobjects/replacestate-updates-location_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/masking/parsing-clip-path-shape_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/masking/parsing-mask-source-type_t01: RuntimeError # co19-roll r801: Please triage this failure.
 LayoutTests/fast/masking/parsing-mask_t01: RuntimeError # co19-roll r801: Please triage this failure.
@@ -942,7 +934,6 @@
 LayoutTests/fast/multicol/orphans-relayout_t01: Pass, RuntimeError
 LayoutTests/fast/multicol/zeroColumnCount_t01: RuntimeError
 LayoutTests/fast/media/media-query-serialization_t01: RuntimeError
-LayoutTests/fast/media/color-does-not-include-alpha_t01: RuntimeError
 LayoutTests/fast/media/mq-append-delete_t01: RuntimeError
 LayoutTests/fast/media/mq-color-index_t02: RuntimeError
 LayoutTests/fast/media/mq-js-media-except_t02: RuntimeError
@@ -1153,8 +1144,6 @@
 LayoutTests/fast/text/line-break-after-inline-latin1_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial-segments_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/url/trivial_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-bad-mimetype_t01: RuntimeError # co19-roll r786: Please triage this failure.
-LayoutTests/fast/xmlhttprequest/xmlhttprequest-invalid-values_t01: RuntimeError # co19-roll r786: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # Please triage this failure.
 
@@ -1328,6 +1317,10 @@
 LayoutTests/fast/css/fontfaceset-events_t01: Pass, RuntimeError # Issue 23433
 LayoutTests/fast/events/clipboard-dataTransferItemList-remove_t01: RuntimeError # Issue 22532
 LayoutTests/fast/forms/textarea-paste-newline_t01: Pass, RuntimeError # Issue 23433
+LayoutTests/fast/canvas/canvas-currentTransform_t01: RuntimeError # Feature is behind a flag in Chrome
+LayoutTests/fast/files/blob-close-revoke_t01: RuntimeError # Experimental feature not exposed anywhere yet
+LayoutTests/fast/forms/file/file-input-capture_t01: RuntimeError # Experimental feature not exposed in Chrome yet
+LayoutTests/fast/forms/input-inputmode_t01: RuntimeError # Experimental feature not exposed in Chrome yet
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $system != windows ]
 LayoutTests/fast/css/font-face-unicode-range-monospace_t01: RuntimeError # co19-roll r761: Please triage this failure.
diff --git a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart b/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
index 98555ea..0787dd3 100644
--- a/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
+++ b/tests/compiler/dart2js/analyze_dart2js_helpers_test.dart
@@ -27,7 +27,7 @@
 import 'package:compiler/src/source_file_provider.dart' show
     FormattingDiagnosticHandler;
 import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/universe.dart' show
+import 'package:compiler/src/universe/call_structure.dart' show
     CallStructure;
 import 'package:expect/expect.dart';
 
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 8c68b18..10fc5a5 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -18,9 +18,10 @@
   // Helper methods for debugging should never be called from production code:
   "lib/src/helpers/": const [" is never "],
 
-  // Node.asLiteralBool is never used.
+  // Node.asAssert, Node.asLiteralBool is never used.
   "lib/src/tree/nodes.dart": const [
-      "The method 'asLiteralBool' is never called"],
+      "The method 'asAssert' is never called.",
+      "The method 'asLiteralBool' is never called."],
 
   // Some things in dart_printer are not yet used
   "lib/src/dart_backend/backend_ast_nodes.dart": const [" is never "],
diff --git a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
index 801b75d..f6fd38b 100644
--- a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
@@ -587,9 +587,14 @@
     push(new ForIn(declaredIdentifier, exp, body));
   }
 
-  handleAssertStatement(Token assertKeyword, Token semicolonToken) {
+  handleAssertStatement(Token assertKeyword,
+                        Token commaToken, Token semicolonToken) {
+    Expression message;
+    if (commaToken != null) message = pop();
     Expression exp = pop();
-    Expression call = new CallFunction(new Identifier("assert"), [exp]);
+    var arguments = [exp];
+    if (message != null) arguments.add(message);
+    Expression call = new CallFunction(new Identifier("assert"), arguments);
     push(new ExpressionStatement(call));
   }
 
diff --git a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
index 736faf0..e0252e7 100644
--- a/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
+++ b/tests/compiler/dart2js/backend_dart/sexpr_unstringifier.dart
@@ -17,8 +17,10 @@
 import 'package:compiler/src/elements/modelx.dart'
     show ErroneousElementX, TypeVariableElementX;
 import 'package:compiler/src/tree/tree.dart' show LiteralDartString;
-import 'package:compiler/src/universe/universe.dart'
-    show Selector, SelectorKind, CallStructure;
+import 'package:compiler/src/universe/call_structure.dart'
+    show CallStructure;
+import 'package:compiler/src/universe/selector.dart'
+    show Selector, SelectorKind;
 import 'package:compiler/src/cps_ir/cps_ir_nodes.dart';
 
 /// Used whenever a node constructed by [SExpressionUnstringifier] needs a
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 114cf3c..50e458b 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -7,8 +7,9 @@
 import "package:async_helper/async_helper.dart";
 import 'package:compiler/src/types/types.dart';
 import 'package:compiler/src/inferrer/concrete_types_inferrer.dart';
-import 'package:compiler/src/universe/universe.dart' show
-    CallStructure,
+import 'package:compiler/src/universe/call_structure.dart' show
+    CallStructure;
+import 'package:compiler/src/universe/selector.dart' show
     Selector;
 
 import "compiler_helper.dart";
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 0ae992d..3b0aae1 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -20,12 +20,6 @@
 simple_inferrer_const_closure_test: Fail # Issue 16507
 simple_inferrer_const_closure2_test: Fail # Issue 16507
 simple_inferrer_global_field_closure_test: Fail # Issue 16507
-simple_inferrer_const_closure_default_test/05: Fail # Issue 24297
-simple_inferrer_const_closure_default_test/06: Fail # Issue 24297
-simple_inferrer_const_closure_default_test/09: Fail # Issue 24297
-simple_inferrer_const_closure_default_test/10: Fail # Issue 24297
-simple_inferrer_const_closure_default_test/11: Fail # Issue 24297
-simple_inferrer_const_closure_default_test/12: Fail # Issue 24297
 
 logical_expression_test: Fail # Issue 17027
 
diff --git a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart b/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
index 2dafdf2..350dcc4 100644
--- a/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
+++ b/tests/compiler/dart2js/gvn_dynamic_field_get_test.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
-import 'package:compiler/src/universe/universe.dart' show Selector;
+import 'package:compiler/src/universe/selector.dart' show Selector;
 
 const String TEST = r"""
 class A {
diff --git a/tests/compiler/dart2js/js_backend_cps_ir.dart b/tests/compiler/dart2js/js_backend_cps_ir.dart
index f1fd70a..c2b0595 100644
--- a/tests/compiler/dart2js/js_backend_cps_ir.dart
+++ b/tests/compiler/dart2js/js_backend_cps_ir.dart
@@ -79,8 +79,9 @@
             Expect.fail('Expected:\n$expected\nbut found\n$found');
           }
         }
-      } catch (e) {
+      } catch (e, st) {
         print(e);
+        print(st);
         Expect.fail('The following test failed to compile:\n'
                     '${formatTest(files)}');
       }
diff --git a/tests/compiler/dart2js/js_spec_string_test.dart b/tests/compiler/dart2js/js_spec_string_test.dart
index ca1ac9a..d86a4c7 100644
--- a/tests/compiler/dart2js/js_spec_string_test.dart
+++ b/tests/compiler/dart2js/js_spec_string_test.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'package:compiler/src/native/native.dart';
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
-import 'package:compiler/src/universe/universe.dart'
+import 'package:compiler/src/universe/side_effects.dart'
     show SideEffects;
 
 const OBJECT = 'Object';
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index b52951c..06265f4 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -74,6 +74,7 @@
   MockCompiler.internal(
       {Map<String, String> coreSource,
        bool enableTypeAssertions: false,
+       bool enableUserAssertions: false,
        bool enableMinification: false,
        bool enableConcreteTypeInference: false,
        int maxConcreteTypeSize: 5,
@@ -95,6 +96,8 @@
       : sourceFiles = new Map<String, SourceFile>(),
         testedPatchVersion = patchVersion,
         super(enableTypeAssertions: enableTypeAssertions,
+              enableUserAssertions: enableUserAssertions,
+              enableAssertMessage: true,
               enableMinification: enableMinification,
               enableConcreteTypeInference: enableConcreteTypeInference,
               maxConcreteTypeSize: maxConcreteTypeSize,
@@ -447,6 +450,7 @@
                           bool minify: false,
                           bool trustTypeAnnotations: false,
                           bool enableTypeAssertions: false,
+                          bool enableUserAssertions: false,
                           int expectedErrors,
                           int expectedWarnings,
                           api.CompilerOutputProvider outputProvider}) {
@@ -458,6 +462,7 @@
       enableMinification: minify,
       trustTypeAnnotations: trustTypeAnnotations,
       enableTypeAssertions: enableTypeAssertions,
+      enableUserAssertions: enableUserAssertions,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings,
       outputProvider: outputProvider);
diff --git a/tests/compiler/dart2js/mock_libraries.dart b/tests/compiler/dart2js/mock_libraries.dart
index 5de30cb..9a87e5f 100644
--- a/tests/compiler/dart2js/mock_libraries.dart
+++ b/tests/compiler/dart2js/mock_libraries.dart
@@ -107,7 +107,10 @@
 ''';
 
 const Map<String, String> DEFAULT_JS_HELPER_LIBRARY = const <String, String>{
+  'assertTest': 'assertTest(a) {}',
+  'assertThrow': 'assertThrow(a) {}',
   'assertHelper': 'assertHelper(a) {}',
+  'assertUnreachable': 'assertUnreachable() {}',
   'assertIsSubtype': 'assertIsSubtype(subtype, supertype, message) {}',
   'assertSubtype': 'assertSubtype(object, isField, checks, asField) {}',
   'assertSubtypeOfRuntimeType': 'assertSubtypeOfRuntimeType(object, type) {}',
@@ -368,8 +371,8 @@
       }''',
   'JSString': r'''
       class JSString extends Interceptor implements String, JSIndexable {
-        var split;
-        var length;
+        split(pattern) => [];
+        int get length => 42;
         operator[](index) {}
         toString() {}
         operator+(other) => this;
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 6077db8..10c8bca 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -12,8 +12,9 @@
 import 'package:compiler/src/elements/modelx.dart';
 import 'package:compiler/src/tree/tree.dart';
 import 'package:compiler/src/types/types.dart';
-import 'package:compiler/src/universe/universe.dart' show
-    CallStructure,
+import 'package:compiler/src/universe/call_structure.dart' show
+    CallStructure;
+import 'package:compiler/src/universe/selector.dart' show
     Selector;
 import 'package:compiler/src/world.dart';
 
diff --git a/tests/compiler/dart2js/related_types.dart b/tests/compiler/dart2js/related_types.dart
index 9843180..9a20d0b 100644
--- a/tests/compiler/dart2js/related_types.dart
+++ b/tests/compiler/dart2js/related_types.dart
@@ -13,7 +13,8 @@
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/resolution/semantic_visitor.dart';
 import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/universe.dart';
+import 'package:compiler/src/universe/call_structure.dart';
+import 'package:compiler/src/universe/selector.dart';
 import 'package:compiler/src/world.dart';
 import 'memory_compiler.dart';
 
diff --git a/tests/compiler/dart2js/semantic_visitor_test.dart b/tests/compiler/dart2js/semantic_visitor_test.dart
index 575b758..3376a67 100644
--- a/tests/compiler/dart2js/semantic_visitor_test.dart
+++ b/tests/compiler/dart2js/semantic_visitor_test.dart
@@ -19,8 +19,9 @@
 import 'package:compiler/src/resolution/semantic_visitor.dart';
 import 'package:compiler/src/resolution/tree_elements.dart';
 import 'package:compiler/src/tree/tree.dart';
-import 'package:compiler/src/universe/universe.dart' show
-    CallStructure,
+import 'package:compiler/src/universe/call_structure.dart' show
+    CallStructure;
+import 'package:compiler/src/universe/selector.dart' show
     Selector;
 import 'memory_compiler.dart';
 
@@ -672,7 +673,6 @@
   VISIT_UNRESOLVED_SUPER_GETTER_COMPOUND_INDEX_SET,
   VISIT_UNRESOLVED_SUPER_SETTER_COMPOUND_INDEX_SET,
 
-  VISIT_ASSERT,
   VISIT_LOGICAL_AND,
   VISIT_LOGICAL_OR,
   VISIT_IS,
@@ -734,7 +734,6 @@
   VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_PREFIX,
   VISIT_IF_NOT_NULL_DYNAMIC_PROPERTY_POSTFIX,
 
-  ERROR_INVALID_ASSERT,
   ERROR_UNDEFINED_UNARY_EXPRESSION,
   ERROR_UNDEFINED_BINARY_EXPRESSION,
   ERROR_INVALID_GET,
diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart b/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
index 8dc6e3d..c407766 100644
--- a/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
+++ b/tests/compiler/dart2js/semantic_visitor_test_send_data.dart
@@ -1742,19 +1742,11 @@
     // Assert
     const Test(
         '''
-        m() { assert(false); }
+        m() { assert(m()); }
         ''',
-        const Visit(VisitKind.VISIT_ASSERT, expression: 'false')),
-    const Test(
-        '''
-        m() { assert(); }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '()')),
-    const Test(
-        '''
-        m() { assert(42, true); }
-        ''',
-        const Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: '(42,true)')),
+        const Visit(VisitKind.VISIT_TOP_LEVEL_FUNCTION_INVOKE,
+                    element: 'function(m)',
+                    arguments: '()')),
   ],
   'Logical and': const [
     // Logical and
diff --git a/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart b/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart
index 3aa941e..0125b43 100644
--- a/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart
+++ b/tests/compiler/dart2js/semantic_visitor_test_send_visitor.dart
@@ -20,24 +20,6 @@
   }
 
   @override
-  visitAssert(
-      Send node,
-      Node expression,
-      arg) {
-    visits.add(new Visit(VisitKind.VISIT_ASSERT, expression: expression));
-    super.visitAssert(node, expression, arg);
-  }
-
-  @override
-  errorInvalidAssert(
-      Send node,
-      NodeList arguments,
-      arg) {
-    visits.add(new Visit(VisitKind.ERROR_INVALID_ASSERT, arguments: arguments));
-    super.errorInvalidAssert(node, arguments, arg);
-  }
-
-  @override
   errorInvalidCompound(
       Send node,
       ErroneousElement error,
diff --git a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart b/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
index e6d2e92..b5bc4e6 100644
--- a/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_const_closure_default_test.dart
@@ -71,8 +71,8 @@
     checkArgument('foo2', compiler.typesTask.functionType);   /// 02: ok
     checkArgument('foo3', compiler.typesTask.functionType);   /// 03: ok
     checkArgument('foo4', compiler.typesTask.functionType);   /// 04: ok
-    checkArgument('foo5', compiler.typesTask.functionType);   /// 05: ok
-    checkArgument('foo6', compiler.typesTask.functionType);   /// 06: ok
+    checkArgument('foo5', compiler.typesTask.dynamicType);    /// 05: ok
+    checkArgument('foo6', compiler.typesTask.dynamicType);    /// 06: ok
 
     checkArgument('defaultFn1', compiler.typesTask.uint31Type);   /// 07: ok
     checkArgument('defaultFn2', compiler.typesTask.uint31Type);   /// 08: ok
diff --git a/tests/compiler/dart2js/type_inference7_test.dart b/tests/compiler/dart2js/type_inference7_test.dart
new file mode 100644
index 0000000..64b8cbc
--- /dev/null
+++ b/tests/compiler/dart2js/type_inference7_test.dart
@@ -0,0 +1,79 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:async_helper/async_helper.dart";
+import "package:expect/expect.dart";
+import 'compiler_helper.dart';
+import 'type_mask_test_helper.dart';
+import 'dart:async';
+
+const String TEST = r"""
+foo(x, [y]) => y;
+
+main() {
+  assert(foo('Hi', true), foo(true));
+  foo(1);
+}
+""";
+
+Future runTest() async {
+  Uri uri = new Uri(scheme: 'source');
+  {
+    // Assertions enabled:
+    var compiler = compilerFor(TEST, uri, enableUserAssertions: true);
+    await compiler.runCompiler(uri);
+    var typesTask = compiler.typesTask;
+    var typesInferrer = typesTask.typesInferrer;
+    var foo = findElement(compiler, "foo");
+    // Return type is null|bool.
+    var mask = typesInferrer.getReturnTypeOfElement(foo);
+    Expect.isTrue(mask.isNullable);
+    Expect.equals(typesTask.boolType, simplify(mask.nonNullable(), compiler));
+    // First parameter is uint31|String|bool.
+    var mask1 = typesInferrer.getTypeOfElement(foo.parameters[0]);
+    Expect.isTrue(mask1.isUnion);
+    var expectedTypes = new Set.from([typesTask.uint31Type,
+                                      typesTask.stringType,
+                                      typesTask.boolType]);
+    for (var typeMask in mask1.disjointMasks) {
+      Expect.isFalse(typeMask.isNullable);
+      var simpleType = simplify(typeMask, compiler);
+      Expect.isTrue(expectedTypes.remove(simpleType), "$simpleType");
+    }
+    Expect.isTrue(expectedTypes.isEmpty);
+    // Second parameter is bool or null.
+    var mask2 = typesInferrer.getTypeOfElement(foo.parameters[1]);
+    Expect.isTrue(mask2.isNullable);
+    Expect.equals(typesTask.boolType, simplify(mask2.nonNullable(), compiler));
+  }
+
+  {
+    // Assertions disabled:
+    var compiler = compilerFor(TEST, uri, enableUserAssertions: false);
+    await compiler.runCompiler(uri);
+    var typesTask = compiler.typesTask;
+    var typesInferrer = typesTask.typesInferrer;
+    var foo = findElement(compiler, "foo");
+    // Return type is null.
+    var mask = typesInferrer.getReturnTypeOfElement(foo);
+    Expect.isTrue(mask.isNullable);
+    Expect.isTrue(mask.nonNullable().isEmpty);
+    // First parameter is uint31.
+    var mask1 = typesInferrer.getTypeOfElement(foo.parameters[0]);
+    Expect.isFalse(mask1.isNullable);
+    Expect.equals(typesTask.uint31Type, simplify(mask1, compiler));
+    // Second parameter is null.
+    var mask2 = typesInferrer.getTypeOfElement(foo.parameters[1]);
+    Expect.isTrue(mask2.isNullable);
+    Expect.isTrue(simplify(mask2.nonNullable(), compiler).isEmpty);
+  }
+}
+
+main() {
+  asyncStart();
+  runTest().then((_) {
+    // Make sure that the type is still correct when we do a second compilation.
+    return runTest();
+  }).whenComplete(asyncEnd);
+}
diff --git a/tests/compiler/dart2js_extra/assert_with_message_test.dart b/tests/compiler/dart2js_extra/assert_with_message_test.dart
new file mode 100644
index 0000000..58b7796
--- /dev/null
+++ b/tests/compiler/dart2js_extra/assert_with_message_test.dart
@@ -0,0 +1,109 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// SharedOptions=--assert-message
+
+import "package:expect/expect.dart";
+
+@AssumeDynamic() @NoInline()
+confuse(x) => x;
+
+
+testFalse(name, fault) {
+  try {
+    fault();
+  } catch (e) {
+    Expect.isTrue(e is AssertionError, '$name: is AssertionError');
+    Expect.isTrue('$e'.contains('Mumble'), '$name: <<$e>> contains "Mumble"');
+    return;
+  }
+  Expect.fail('Expected assert to throw');
+}
+
+test1() {
+  testFalse('constant false', () { assert(false, 'Mumble'); });
+}
+
+test2() {
+  testFalse('constant function', () { assert(() => false, 'Mumble'); });
+}
+
+test3() {
+  testFalse('variable false', () { assert(confuse(false), 'Mumble'); });
+}
+
+test4() {
+  testFalse('variable function',
+      () { assert(confuse(() => false), 'Mumble'); });
+}
+
+testTypeErrors() {
+  check(name, fault) {
+    try {
+      fault();
+    } catch (e) {
+      Expect.isTrue(e is TypeError,
+          'name: <<$e>> (${e.runtimeType}) is TypeError');
+      return;
+    }
+    Expect.fail('Expected assert to throw');
+  }
+
+  check('constant type error', () { assert(null, 'Mumble'); });
+  check('variable type error', () { assert(confuse(null), 'Mumble'); });
+  check('function type error', () { assert(confuse(() => null), 'Mumble'); });
+}
+
+testMessageEffect1() {
+  var v = 1;
+  // Message is not evaluated on succeeding assert.
+  assert(confuse(true), '${v = 123}');
+  Expect.equals(1, v);
+}
+
+testMessageEffect2() {
+  var v = 1;
+  try {
+    // Message is evaluated to produce AssertionError argument on failing
+    // assert.
+    assert(confuse(false), '${v = 123}');
+  } catch (e) {
+    Expect.equals(123, v);
+    Expect.isTrue('$e'.contains('123'), '<<$e>> contains "123"');
+    return;
+  }
+  Expect.fail('Expected assert to throw');
+}
+
+testMessageEffect3() {
+  var v = 1;
+  try {
+    // Message is evaluated to produce AssertionError argument on failing
+    // assert.
+    assert(confuse(() => ++v > 100), '${++v}');
+  } catch (e) {
+    Expect.equals(3, v);
+    Expect.isTrue('$e'.contains('3'), '<<$e>> contains "3"');
+    return;
+  }
+  Expect.fail('Expected assert to throw');
+}
+
+bool get checkedMode {
+  bool b = false;
+  assert((b = true));
+  return b;
+}
+
+main() {
+  if (!checkedMode) return;
+
+  test1();
+  test2();
+  test3();
+  test4();
+  testTypeErrors();
+  testMessageEffect1();
+  testMessageEffect2();
+  testMessageEffect3();
+}
diff --git a/tests/compiler/dart2js_extra/dart2js_extra.status b/tests/compiler/dart2js_extra/dart2js_extra.status
index 2edae80..c530b1e 100644
--- a/tests/compiler/dart2js_extra/dart2js_extra.status
+++ b/tests/compiler/dart2js_extra/dart2js_extra.status
@@ -69,21 +69,15 @@
 
 [ $compiler == dart2js && $cps_ir ]
 16407_test: Pass # Please triage this failure.
-22868_test: RuntimeError # Issue 23997
 23432_test: RuntimeError # Issue 23432
 async_stacktrace_test/asyncStar: Crash # (foo()async*{try {tr...  cannot handle sync*/async* functions
-async_stacktrace_test/none: RuntimeError # $async$temp1.Tracer$ is not a function
 closure_capture5_test: Crash # (i=0): For-loop variable captured in loop header
 deferred/deferred_class_test: RuntimeError # Z.loadLibrary is not a function
-deferred/deferred_constant2_test: RuntimeError # TypeError: U.loadLibrary is not a function
-deferred/deferred_constant3_test: RuntimeError # TypeError: Y.loadLibrary is not a function
+deferred/deferred_constant2_test: RuntimeError # U.loadLibrary is not a function
+deferred/deferred_constant3_test: RuntimeError # Y.loadLibrary is not a function
 deferred/deferred_constant4_test: RuntimeError # B.loadLibrary is not a function
-deferred/deferred_function_test: Crash # (lib.foo): deferred access is not implemented
-deferred/deferred_mirrors1_test: RuntimeError # TypeError: U.loadLibrary is not a function
+deferred/deferred_function_test: Crash # (lib.foo('a')): deferred access is not implemented
+deferred/deferred_mirrors1_test: RuntimeError # U.loadLibrary is not a function
 deferred/deferred_overlapping_test: RuntimeError # E.loadLibrary is not a function
-deferred_split_test: RuntimeError # TypeError: Z.loadLibrary is not a function
-lookup_map/live_entry_through_mirrors_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirror_printer_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-reflect_native_types_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
+deferred_split_test: RuntimeError # Z.loadLibrary is not a function
 switch_test/none: Crash # (switch (val){foo:ba...  continue to a labeled switch case
diff --git a/tests/compiler/dart2js_native/dart2js_native.status b/tests/compiler/dart2js_native/dart2js_native.status
index 9d325b2..c125da1 100644
--- a/tests/compiler/dart2js_native/dart2js_native.status
+++ b/tests/compiler/dart2js_native/dart2js_native.status
@@ -21,10 +21,7 @@
 compute_this_script_test: Skip # Issue 17458
 
 [ $compiler == dart2js && $cps_ir ]
-mirror_intercepted_field_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-native_exception_test: RuntimeError # J.getInterceptor(...).toString$0 is not a function
 native_method_inlining_test: RuntimeError # Please triage this failure.
-native_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 native_no_such_method_exception3_frog_test: RuntimeError # Please triage this failure.
 optimization_hints_test: RuntimeError # Please triage this failure.
 subclassing_constructor_1_test: RuntimeError # Please triage this failure.
diff --git a/tests/compiler/dart2js_native/error_safeToString_test.dart b/tests/compiler/dart2js_native/error_safeToString_test.dart
new file mode 100644
index 0000000..3322560
--- /dev/null
+++ b/tests/compiler/dart2js_native/error_safeToString_test.dart
@@ -0,0 +1,169 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import 'dart:_foreign_helper' show JS_INTERCEPTOR_CONSTANT, JS;
+import 'dart:_js_helper' show Native, Creates;
+import 'dart:_interceptors' show
+    Interceptor,
+    JavaScriptObject,
+    PlainJavaScriptObject,
+    UnknownJavaScriptObject;
+
+// Test for safe formatting of JavaScript objects by Error.safeToString.
+
+@Native('PPPP')
+class Purple {}
+
+@Native('QQQQ')
+class Q {}
+
+@Native('RRRR')
+class Rascal {
+  toString() => 'RRRRRRRR';
+}
+
+makeA() native;
+makeB() native;
+makeC() native;
+makeD() native;
+makeE() native;
+makeP() native;
+makeQ() native;
+makeR() native;
+
+void setup() native r"""
+makeA = function(){return {hello: 123};};
+
+function BB(){}
+makeB = function(){return new BB();};
+
+function CC(){}
+makeC = function(){
+  var x = new CC();
+  x.constructor = null;  // Foils constructor lookup.
+  return x;
+};
+
+function DD(){}
+makeD = function(){
+  var x = new DD();
+  x.constructor = {name: 'DDxxx'};  // Foils constructor lookup.
+  return x;
+};
+
+function EE(){}
+makeE = function(){
+  var x = new EE();
+  x.constructor = function Liar(){};  // Looks like a legitimate constructor.
+  return x;
+};
+
+function PPPP(){}
+makeP = function(){return new PPPP();};
+
+function QQQQ(){}
+makeQ = function(){return new QQQQ();};
+
+function RRRR(){}
+makeR = function(){return new RRRR();};
+
+""";
+
+
+expectTypeName(expectedName, s) {
+  var m = new RegExp(r"Instance of '(.*)'").firstMatch(s);
+  Expect.isNotNull(m);
+  var name = m.group(1);
+  Expect.isTrue(expectedName == name || name.length <= 3,
+      "Is '$expectedName' or minified: '$name'");
+}
+
+final plainJsString =
+    Error.safeToString(JS_INTERCEPTOR_CONSTANT(PlainJavaScriptObject));
+
+final unknownJsString =
+    Error.safeToString(JS_INTERCEPTOR_CONSTANT(UnknownJavaScriptObject));
+
+final interceptorString =
+    Error.safeToString(JS_INTERCEPTOR_CONSTANT(Interceptor));
+
+
+testDistinctInterceptors() {
+  // Test invariants needed for the other tests.
+
+  Expect.notEquals(plainJsString, unknownJsString);
+  Expect.notEquals(plainJsString, interceptorString);
+  Expect.notEquals(unknownJsString, interceptorString);
+
+  expectTypeName('PlainJavaScriptObject', plainJsString);
+  expectTypeName('UnknownJavaScriptObject', unknownJsString);
+  expectTypeName('Interceptor', interceptorString);
+
+  // Sometimes interceptor *objects* are used instead of the prototypes. Check
+  // these work too.
+  var plain2 = Error.safeToString(const PlainJavaScriptObject());
+  Expect.equals(plainJsString, plain2);
+
+  var unk2 = Error.safeToString(const UnknownJavaScriptObject());
+  Expect.equals(unknownJsString, unk2);
+}
+
+
+testExternal() {
+  var x = makeA();
+  Expect.equals(plainJsString, Error.safeToString(x));
+
+  x = makeB();
+  // Gets name from constructor, regardless of minification.
+  Expect.equals("Instance of 'BB'", Error.safeToString(x));
+
+  x = makeC();
+  Expect.equals(unknownJsString, Error.safeToString(x));
+
+  x = makeD();
+  Expect.equals(unknownJsString, Error.safeToString(x));
+
+  x = makeE();
+  Expect.equals("Instance of 'Liar'", Error.safeToString(x));
+}
+
+testNative() {
+  var x = makeP();
+  Expect.isTrue(x is Purple);  // This test forces Purple to be distinguished.
+  Expect.notEquals(plainJsString, Error.safeToString(x));
+  Expect.notEquals(unknownJsString, Error.safeToString(x));
+  Expect.notEquals(interceptorString, Error.safeToString(x));
+  // And not the native class constructor.
+  Expect.notEquals("Instance of 'PPPP'", Error.safeToString(x));
+  expectTypeName('Purple', Error.safeToString(x));
+
+  x = makeQ();
+  print('Q:  $x  ${Error.safeToString(x)}');
+  // We are going to get either the general interceptor or the JavaScript
+  // constructor.
+  Expect.isTrue(
+      "Instance of 'QQQQ'" == Error.safeToString(x) ||
+      interceptorString == Error.safeToString(x));
+
+  x = makeR();
+
+  // Rascal overrides 'toString'.  The toString() call causes Rascal to be
+  // distinguished.
+  x.toString();
+  Expect.notEquals(plainJsString, Error.safeToString(x));
+  Expect.notEquals(unknownJsString, Error.safeToString(x));
+  Expect.notEquals(interceptorString, Error.safeToString(x));
+  // And not the native class constructor.
+  Expect.notEquals("Instance of 'RRRR'", Error.safeToString(x));
+  expectTypeName('Rascal', Error.safeToString(x));
+}
+
+main() {
+  setup();
+
+  testDistinctInterceptors();
+  testExternal();
+  testNative();
+}
diff --git a/tests/html/fontface_loaded_test.dart b/tests/html/fontface_loaded_test.dart
index d192688..8a80f5d 100644
--- a/tests/html/fontface_loaded_test.dart
+++ b/tests/html/fontface_loaded_test.dart
@@ -8,17 +8,18 @@
 import 'dart:html';
 
 class NullTreeSanitizer implements NodeTreeSanitizer {
-    void sanitizeTree(Node node) {}
+  void sanitizeTree(Node node) {}
 }
 
 main() {
   useHtmlConfiguration();
 
-  var style = new Element.html('''
+  var style = new Element.html(
+      '''
       <style>
       @font-face {
         font-family: 'Ahem';
-        src: url(../../resources/Ahem.ttf);
+        src: url(/root_dart/tests/html/Ahem.ttf);
         font-style: italic;
         font-weight: 300;
         unicode-range: U+0-3FF;
@@ -27,20 +28,26 @@
         /* font-stretch property is not supported */
       }
       </style>
-      ''', treeSanitizer: new NullTreeSanitizer());
+      ''',
+      treeSanitizer: new NullTreeSanitizer());
   document.head.append(style);
 
-
   test('document fonts - temporary', () {
     var atLeastOneFont = false;
+    var loaded = [];
     document.fonts.forEach((FontFace fontFace, _, __) {
       atLeastOneFont = true;
       Future f1 = fontFace.loaded;
       Future f2 = fontFace.loaded;
-      expect(f1, equals(f2)); // Repeated calls should answer the same Future.
-
-      expect(fontFace.load(), throws);
+      loaded.add(fontFace.load());
+      loaded.add(f1);
+      loaded.add(f2);
     });
     expect(atLeastOneFont, isTrue);
+    return Future.wait(loaded).then(expectAsync((_) {
+      document.fonts.forEach((fontFace, _, __) {
+        expect(fontFace.status, 'loaded');
+      });
+    }));
   });
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index aba5566..835f48d 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -9,18 +9,28 @@
 js_array_test: Skip # Issue 23676, 23677
 js_typed_interop_test: Skip # Issue 23676, 23677
 
+[ $compiler == none && $runtime == dartium ]
+cross_domain_iframe_test: RuntimeError # Dartium JSInterop failure
+crypto_test/functional: RuntimeError # Dartium JSInterop failure
+custom/created_callback_test: Skip # Dartium JSInterop failure
+custom/document_register_basic_test: RuntimeError # Dartium JSInterop failure
+custom/document_register_type_extensions_test/registration: RuntimeError # Dartium JSInterop failure
+custom/element_upgrade_test: RuntimeError # Dartium JSInterop failure
+custom/js_custom_test: RuntimeError # Dartium JSInterop failure
+custom_elements_test/register: RuntimeError # Dartium JSInterop failure
+indexeddb_2_test: Skip # Dartium JSInterop failure
+js_test: RuntimeError # Dartium JSInterop failure
+native_gc_test: Skip # Dartium JSInterop failure
+speechrecognition_test/types: RuntimeError # Dartium JSInterop failure
+storage_quota_test/missingenumcheck: RuntimeError # Dartium JSInterop failure
+storage_quota_test/none: RuntimeError # Dartium JSInterop failure
+transferables_test: RuntimeError # Dartium JSInterop failure
+
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
-custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 form_data_test/functional: Skip # Issue 19726
 indexeddb_1_test/functional: Skip # Issue 19512 (timing out)
 indexeddb_4_test: Skip # Issue 19726
-mouse_event_test: Fail # Issue 20437
 worker_api_test: Fail # Issue 10223
-media_stream_test/constructors: Pass, Crash # Issue 22267
-element_animate_test/simple_timing: Fail # Not supported on Dartium
-element_animate_test/omit_timing: Fail # Not supported on Dartium
-element_animate_test/timing_dict: Fail # Not supported on Dartium
-trusted_html_tree_sanitizer_test/untrusted: Fail # We make adoptNode throw to verify it's not being called. That doesn't work on Dartium.
 resource_http_test: Fail # Issue 24203
 
 [ $compiler == none && $mode == debug && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
@@ -36,7 +46,7 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor. Issue 14835
 fontface_loaded_test: Fail # Support for promises.
-storage_quota_test: Fail # Support for promises.
+storage_quota_test: Fail # Support for promises. API also not yet available anywhere.
 
 [ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
@@ -51,25 +61,16 @@
 # postMessage in dartium always transfers the typed array buffer, never a view
 postmessage_structured_test/typed_arrays: Fail
 # Dartium seems to lose the data from the dispatchEvent.
-postmessage_structured_test/more_primitives: Fail
 async_test: Fail # Uses spawn, not implemented from a DOM isolate in Dartium
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
 indexeddb_3_test: Skip # Issue 19578.  Timeouts and RuntimeError
 fileapi_test/getFile: Pass, Fail # Issue 20488
 
-# DO NOT Suppress/Skip the below XSS security test for dart2js - any failure is a P0 bug.
-node_validator_important_if_you_suppress_make_the_bug_critical_test/dom_clobbering: Fail # Dartium is immune to DOM clobbering, so the HTML passes through the sanitizer.
-
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Issue 17666
 
-[ $compiler == none && $runtime == ContentShellOnAndroid ]
-canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass, Fail # Issue 20524
-notification_test/constructors: Skip # Times out on Android Dartium. Issue 22835
-
 element_offset_test/offset: RuntimeError # Issue 17550
 request_animation_frame_test: Skip # Times out, and also passes while taking 4.00 minutes. Issue 19127.
 fileapi_test/fileEntry: Pass, RuntimeError # Issue 20488
@@ -207,6 +208,7 @@
 css_test/functional: Fail # Issues 21710
 
 [ $runtime == ie11 ]
+node_validator_important_if_you_suppress_make_the_bug_critical_test/dom_clobbering: RuntimeError # Issue 24387
 custom/document_register_type_extensions_test/single-parameter: Fail # Issue 13193.
 canvasrenderingcontext2d_test/arc: Pass, Fail # Pixel unexpected value. Please triage this failure.
 worker_test/functional: Pass, Fail # Issues 20659.
@@ -348,7 +350,9 @@
 speechrecognition_test/supported: Fail
 websql_test/supported: Fail
 
-[ $runtime == ff ]
+[  $compiler == dart2js && $runtime == ff ]
+node_validator_important_if_you_suppress_make_the_bug_critical_test/DOM_sanitization: RuntimeError # Issue 24384
+history_test/history: Skip # Issue 22050
 xhr_test/xhr: Pass, Fail # Issue 11602
 dart_object_local_storage_test: Skip  # sessionStorage NS_ERROR_DOM_NOT_SUPPORTED_ERR
 webgl_1_test: Pass, Fail   # Issue 8219
@@ -385,9 +389,6 @@
 [ $compiler == dart2js && ($runtime == drt || $runtime == ff) ]
 request_animation_frame_test: Skip # Async test hangs.
 
-[ $compiler == dart2js && $runtime == ff ]
-history_test/history: Skip # Issue 22050
-
 [ $compiler == dart2js && $csp && ($runtime == drt || $runtime == safari || $runtime == ff || $runtime == chrome || $runtime == chromeOnAndroid) ]
 # Note: these tests are all injecting scripts by design.  This is not allowed under CSP.
 event_customevent_test: Fail       # Test cannot run under CSP restrictions.
diff --git a/tests/html/messageevent_test.dart b/tests/html/messageevent_test.dart
index 9ef3681..86348fd 100644
--- a/tests/html/messageevent_test.dart
+++ b/tests/html/messageevent_test.dart
@@ -17,7 +17,7 @@
       expect(event.origin, equals('origin'));
       // IE allows setting this but just ignores it.
       // expect(event.lastEventId, equals('lastEventId'));
-      expect(event.source, same(window));
+      expect(event.source, window);
       // TODO(antonm): accessing ports is not supported yet.
   });
 }
diff --git a/tests/html/worker_test.dart b/tests/html/worker_test.dart
index dccb8b5..a43887b 100644
--- a/tests/html/worker_test.dart
+++ b/tests/html/worker_test.dart
@@ -50,4 +50,3 @@
     });
   });
 }
-
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index d686774..84e4e3a 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -45,6 +45,7 @@
 issue_21398_parent_isolate_test: SkipByDesign # Test uses a ".dart" URI.
 issue_21398_parent_isolate1_test: SkipByDesign # Test uses a ".dart" URI.
 issue_21398_parent_isolate2_test: SkipByDesign # Test uses a ".dart" URI.
+issue_24243_parent_isolate_test: SkipByDesign # Test uses a ".dart" URI.
 function_send1_test: SkipByDesign   # Test uses a ".dart" URI.
 error_exit_at_spawnuri_test: SkipByDesign  # Test uses a ".dart" URI.
 error_at_spawnuri_test: SkipByDesign  # Test uses a ".dart" URI.
@@ -138,7 +139,7 @@
 package_root_test: SkipByDesign # Uses dart:io.
 
 [ $compiler == dart2js && $cps_ir ]
-deferred_in_isolate2_test: RuntimeError # Exception: Some tests failed.
+deferred_in_isolate2_test: RuntimeError # A.loadLibrary is not a function
 isolate_current_test: RuntimeError # Please triage this failure.
 message3_test/byteBuffer: RuntimeError # Please triage this failure.
 message3_test/fun: RuntimeError # Please triage this failure.
diff --git a/tests/isolate/issue_24243_child1_isolate.dart b/tests/isolate/issue_24243_child1_isolate.dart
new file mode 100644
index 0000000..950f123
--- /dev/null
+++ b/tests/isolate/issue_24243_child1_isolate.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var list0 = <int>[1, 2, 3];
+    var list1 = <int>[4, 5, 6];
+    var list2 = <int>[7, 8, 9];
+    var list = new List<List<int>>.from([list0, list1, list2]);
+    sendPort.send(list);
+  } catch(error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/isolate/issue_24243_child2_isolate.dart b/tests/isolate/issue_24243_child2_isolate.dart
new file mode 100644
index 0000000..0196653
--- /dev/null
+++ b/tests/isolate/issue_24243_child2_isolate.dart
@@ -0,0 +1,18 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var map0 = <int, String>{1:'one', 2:'two', 3:'three'};
+    var map1 = <int, String>{4:'four', 5:'five', 6:'six'};
+    var map2 = <int, String>{7:'seven', 8:'eight', 9:'nine'};
+    var map = new Map<int, Map<int, String>>.from({0:map0, 1:map1, 2:map2});
+    sendPort.send(map);
+  } catch(error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/isolate/issue_24243_child3_isolate.dart b/tests/isolate/issue_24243_child3_isolate.dart
new file mode 100644
index 0000000..9667a91
--- /dev/null
+++ b/tests/isolate/issue_24243_child3_isolate.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection';
+import 'dart:isolate';
+
+main(List<String> args, message) {
+  var sendPort = message;
+  try {
+    var map0 = new LinkedHashMap<int, String>();
+    map0[1] = 'one';
+    map0[2] = 'two';
+    map0[3] = 'three';
+    var map1 = new LinkedHashMap<int, String>();
+    map1[4] = 'four';
+    map1[5] = 'five';
+    map1[6] = 'size';
+    var map2 = new LinkedHashMap<int, String>();
+    map2[7] = 'seven';
+    map2[8] = 'eight';
+    map2[9] = 'nine';
+
+    var map = new Map<int, LinkedHashMap<int, String>>.from(
+        { 0:map0, 1:map1, 2:map2 });
+    sendPort.send(map);
+  } catch(error) {
+    sendPort.send("Invalid Argument(s).");
+  }
+}
diff --git a/tests/isolate/issue_24243_parent_isolate_test.dart b/tests/isolate/issue_24243_parent_isolate_test.dart
new file mode 100644
index 0000000..b4e20ca
--- /dev/null
+++ b/tests/isolate/issue_24243_parent_isolate_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Note: the following comment is used by test.dart to additionally compile the
+// other isolate's code.
+// OtherScripts=issue_24243_child1_isolate.dart
+// OtherScripts=issue_24243_child2_isolate.dart
+// OtherScripts=issue_24243_child3_isolate.dart
+// VMOptions=--checked
+
+import 'dart:collection';
+import 'dart:isolate';
+
+import "package:expect/expect.dart";
+
+main() {
+  // First spawn an isolate using spawnURI and have it
+  // send back a "literal" like list object.
+  var receive1 = new ReceivePort();
+  Isolate.spawnUri(Uri.parse('issue_24243_child1_isolate.dart'),
+                   [],
+                   receive1.sendPort).then(
+    (isolate) {
+      receive1.listen(
+        (msg) {
+          var list0 = <int>[1, 2, 3];
+          var list1 = <int>[4, 5, 6];
+          var list2 = <int>[7, 8, 9];
+          Expect.isTrue(msg is List<List<int>>);
+          Expect.listEquals(msg[0], list0);
+          Expect.listEquals(msg[1], list1);
+          Expect.listEquals(msg[2], list2);
+          Expect.throws(() => msg[0] = "throw an exception");
+          receive1.close();
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+
+  // Now spawn an isolate using spawnURI and have it
+  // send back a "literal" like map object.
+  var receive2 = new ReceivePort();
+  Isolate.spawnUri(Uri.parse('issue_24243_child2_isolate.dart'),
+                   [],
+                   receive2.sendPort).then(
+    (isolate) {
+      receive2.listen(
+        (msg) {
+          var map0 = <int, String>{1:'one', 2:'two', 3:'three'};
+          var map1 = <int, String>{4:'four', 5:'five', 6:'six'};
+          var map2 = <int, String>{7:'seven', 8:'eight', 9:'nine'};
+          Expect.isTrue(msg is Map<int, Map<int, String>>);
+          Expect.mapEquals(msg[0], map0);
+          Expect.mapEquals(msg[1], map1);
+          Expect.mapEquals(msg[2], map2);
+          Expect.throws(() => msg[0] = "throw an exception");
+          receive2.close();
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+
+  // Now spawn an isolate using spawnURI and have it
+  // send back a "literal" like LinkedHashMap object.
+  var receive3 = new ReceivePort();
+  Isolate.spawnUri(Uri.parse('issue_24243_child3_isolate.dart'),
+                   [],
+                   receive3.sendPort).then(
+    (isolate) {
+      receive3.listen(
+        (msg) {
+          var map0 = new LinkedHashMap<int, String>();
+          map0[1] = 'one';
+          map0[2] = 'two';
+          map0[3] = 'three';
+          var map1 = new LinkedHashMap<int, String>();
+          map1[4] = 'four';
+          map1[5] = 'five';
+          map1[6] = 'size';
+          var map2 = new LinkedHashMap<int, String>();
+          map2[7] = 'seven';
+          map2[8] = 'eight';
+          map2[9] = 'nine';
+          Expect.isTrue(msg is Map<int, LinkedHashMap<int, String>>);
+          Expect.mapEquals(msg[0], map0);
+          Expect.mapEquals(msg[1], map1);
+          Expect.mapEquals(msg[2], map2);
+          Expect.throws(() => msg[0] = "throw an exception");
+          receive3.close();
+        },
+        onError: (e) => print('$e')
+      );
+    }
+  );
+
+}
diff --git a/tests/language/invocation_mirror_empty_arguments_test.dart b/tests/language/invocation_mirror_empty_arguments_test.dart
new file mode 100644
index 0000000..8212536
--- /dev/null
+++ b/tests/language/invocation_mirror_empty_arguments_test.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class Getter {
+  noSuchMethod(invocation) {
+    Expect.isTrue(invocation.isGetter);
+    Expect.identical(const [], invocation.positionalArguments);
+    Expect.identical(const {}, invocation.namedArguments);
+  }
+}
+
+class Setter {
+  noSuchMethod(invocation) {
+    Expect.isTrue(invocation.isSetter);
+    Expect.identical(const {}, invocation.namedArguments);
+  }
+}
+
+class Method {
+  noSuchMethod(invocation) {
+    Expect.isTrue(invocation.isMethod);
+    Expect.identical(const [], invocation.positionalArguments);
+    Expect.identical(const {}, invocation.namedArguments);
+  }
+}
+
+class Operator {
+  noSuchMethod(invocation) {
+    Expect.isTrue(invocation.isMethod);
+    Expect.identical(const {}, invocation.namedArguments);
+  }
+}
+
+main() {
+  var g = new Getter();
+  print(g.getterThatDoesNotExist);
+  var s = new Setter();
+  print(s.setterThatDoesNotExist = 42);
+  var m = new Method();
+  print(m.methodThatDoesNotExist());
+  var o = new Operator();
+  print(o + 42); // Operator that does not exist.
+}
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index 58c8f07..49f028d 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -23,6 +23,7 @@
 async_star_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
 
 [ $compiler == dart2js ]
+invocation_mirror_empty_arguments_test: Fail # Issue 24331
 nan_identical_test: Fail # Issue 11551
 symbol_literal_test/*: Fail # Issue 21825
 constructor_duplicate_final_test/01: Fail # Issue 13363
@@ -231,57 +232,37 @@
 [ $compiler == dart2js && $cps_ir ]
 async_await_syntax_test/a03a: Crash # (a03a()async*{}): cannot handle sync*/async* functions
 async_await_syntax_test/a03b: Crash # (a03b()async*{}): cannot handle sync*/async* functions
-async_await_syntax_test/a04a: Crash # (a04a()sync*{}): cannot handle sync*/async* functions
-async_await_syntax_test/a04c: Crash # (a04c()sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/a06a: Crash # (await for(var o in st){}): await for
-async_await_syntax_test/a07a: Crash # (a07a()sync*{yield 0;}): cannot handle sync*/async* functions
-async_await_syntax_test/a08a: Crash # (a08a()sync*{yield* [] ;}): cannot handle sync*/async* functions
 async_await_syntax_test/a09a: Crash # (a09a()async*{yield 0;}): cannot handle sync*/async* functions
 async_await_syntax_test/a10a: Crash # (a10a()async*{yield* [] ;}): cannot handle sync*/async* functions
-async_await_syntax_test/a11b: Crash # (get sync sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/a11d: Crash # (get async async*{}): cannot handle sync*/async* functions
 async_await_syntax_test/b03a: Crash # (b03a()async*{}): cannot handle sync*/async* functions
-async_await_syntax_test/b04a: Crash # (b04a()sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/b06a: Crash # (await for(var o in st){}): await for
-async_await_syntax_test/b07a: Crash # (b07a()sync*{yield 0;}): cannot handle sync*/async* functions
-async_await_syntax_test/b08a: Crash # (b08a()sync*{yield* [] ;}): cannot handle sync*/async* functions
 async_await_syntax_test/b09a: Crash # (b09a()async*{yield 0;}): cannot handle sync*/async* functions
 async_await_syntax_test/b10a: Crash # (b10a()async*{yield* [] ;}): cannot handle sync*/async* functions
-async_await_syntax_test/b11b: Crash # (get sync sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/b11d: Crash # (get async async*{}): cannot handle sync*/async* functions
 async_await_syntax_test/c03a: Crash # (c03a()async*{}): cannot handle sync*/async* functions
-async_await_syntax_test/c04a: Crash # (c04a()sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/c06a: Crash # (await for(var o in st){}): await for
-async_await_syntax_test/c07a: Crash # (c07a()sync*{yield 0;}): cannot handle sync*/async* functions
-async_await_syntax_test/c08a: Crash # (c08a()sync*{yield* [] ;}): cannot handle sync*/async* functions
 async_await_syntax_test/c09a: Crash # (c09a()async*{yield 0;}): cannot handle sync*/async* functions
 async_await_syntax_test/c10a: Crash # (c10a()async*{yield* [] ;}): cannot handle sync*/async* functions
 async_await_syntax_test/d03a: Crash # (()async*{}): cannot handle sync*/async* functions
-async_await_syntax_test/d04a: Crash # (()sync*{}): cannot handle sync*/async* functions
 async_await_syntax_test/d06a: Crash # (await for(var o in st){}): await for
-async_await_syntax_test/d07a: Crash # (()sync*{yield 0;}): cannot handle sync*/async* functions
-async_await_syntax_test/d08a: Crash # (()sync*{yield* [] ;}): cannot handle sync*/async* functions
-async_await_syntax_test/d08b: Crash # (()sync*{yield* 0+1;}): cannot handle sync*/async* functions
 async_await_syntax_test/d09a: Crash # (()async*{yield 0;}): cannot handle sync*/async* functions
 async_await_syntax_test/d10a: Crash # (()async*{yield* [] ;}): cannot handle sync*/async* functions
 async_await_test/02: Crash # (switch (v){label:ca...  continue to a labeled switch case
 async_await_test/03: Crash # (switch (v){label:ca...  continue to a labeled switch case
 async_await_test/none: Crash # (switch (v){label:ca...  continue to a labeled switch case
-async_continue_label_test/await_in_init: RuntimeError # Please triage this failure.
-async_continue_label_test/await_in_update: RuntimeError # Please triage this failure.
 async_or_generator_return_type_stacktrace_test/02: Crash # (void badReturnTypeAsyncStar()async*{}): cannot handle sync*/async* functions
-async_or_generator_return_type_stacktrace_test/03: Crash # (void badReturnTypeSyncStar()sync*{}): cannot handle sync*/async* functions
 async_star_await_pauses_test: Crash # (await for(var i in ...  await for
 async_star_cancel_and_throw_in_finally_test: Crash # (foo()async*{try {in...  cannot handle sync*/async* functions
 async_star_cancel_while_paused_test: Crash # (f()async*{list.add(...  cannot handle sync*/async* functions
 async_star_regression_2238_test: Crash # (f()async*{label1:label2:yield 0;}): cannot handle sync*/async* functions
 async_star_regression_23116_test: Crash # (Stream<int> foo(Com...  cannot handle sync*/async* functions
 async_star_regression_fisk_test: Crash # (fisk()async*{res.ad...  cannot handle sync*/async* functions
-async_star_stream_take_test: Crash # (await for(var v in s.take(5))r+= v;): await for
+async_star_stream_take_test: Crash # (Stream makeStream(i...  cannot handle sync*/async* functions
 async_star_take_reyield_test: Crash # (fivePartialSums(Str...  cannot handle sync*/async* functions
 async_star_test: Crash # (f()async*{}): cannot handle sync*/async* functions
-async_switch_test/none: RuntimeError # Uncaught Error: Expect.equals(expected: <1>, actual: <null>) fails.
-async_switch_test/withDefault: RuntimeError # Uncaught Error: Expect.equals(expected: <1>, actual: <null>) fails.
+async_this_bound_test: RuntimeError # Cannot read property 'set$f' of undefined
 asyncstar_concat_test: Crash # (concat(a,b)async*{yield* a;yield* b;}): cannot handle sync*/async* functions
 asyncstar_throw_in_catch_test: Crash # (foo4(Tracer tracer)...  cannot handle sync*/async* functions
 asyncstar_yield_test: Crash # (Stream<int> foo4()a...  cannot handle sync*/async* functions
@@ -289,62 +270,62 @@
 await_for_cancel_test: Crash # (await for(var x in controller.stream){for(int j=0;j<10;j++ ){if(j==5)continue outer;}}): await for
 await_for_test: Crash # (await for(var x in infiniteStream()){i++ ;if(i>10)break;t4.record(x);}): await for
 await_for_use_local_test: Crash # (await for(var v in s){accum+= v;}): await for
-await_future_test: Timeout
+await_future_test: RuntimeError # Cannot read property '_await_future_test$_box_0' of undefined
+await_postfix_expr_test: RuntimeError # Please triage this failure.
 await_regression_test: RuntimeError # "Obelix".then$1 is not a function
+await_test: RuntimeError # Cannot read property '$add' of undefined
 cha_deopt1_test: Crash # (d.make_u()): deferred access is not implemented
 cha_deopt2_test: Crash # (d.make_u()): deferred access is not implemented
 cha_deopt3_test: Crash # (d.make_u()): deferred access is not implemented
-closure_in_constructor_test: RuntimeError # Typed lists.
+closure_in_constructor_test: RuntimeError # Please triage this failure.
 closures_initializer_test: RuntimeError # Please triage this failure.
-const_evaluation_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 constructor12_test: RuntimeError # Please triage this failure.
 crash_6725_test/01: Crash # unsupported operation on erroneous element
 cyclic_default_values_test: RuntimeError # Z.cyclic_default_values_test__foo$closure is not a function
 deferred_call_empty_before_load_test: Crash # (lib1.thefun()): deferred access is not implemented
-deferred_closurize_load_library_test: RuntimeError # TypeError: D.loadLibrary is not a function
-deferred_constant_list_test: RuntimeError # TypeError: K.loadLibrary is not a function
-deferred_constraints_constants_test/none: Crash # (lib.constantInstance): deferred access is not implemented
-deferred_constraints_constants_test/reference_after_load: Crash # (lib.constantInstance): deferred access is not implemented
-deferred_constraints_type_annotation_test/as_operation: RuntimeError # TypeError: Z.loadLibrary is not a function
-deferred_constraints_type_annotation_test/catch_check: RuntimeError # TypeError: D.loadLibrary is not a function
-deferred_constraints_type_annotation_test/is_check: RuntimeError # TypeError: L.loadLibrary is not a function
-deferred_constraints_type_annotation_test/new: RuntimeError # TypeError: R.loadLibrary is not a function
-deferred_constraints_type_annotation_test/new_before_load: RuntimeError # TypeError: K.loadLibrary is not a function
-deferred_constraints_type_annotation_test/new_generic1: RuntimeError # TypeError: R.loadLibrary is not a function
-deferred_constraints_type_annotation_test/new_generic2: RuntimeError # TypeError: X.loadLibrary is not a function
-deferred_constraints_type_annotation_test/new_generic3: RuntimeError # TypeError: K.loadLibrary is not a function
-deferred_constraints_type_annotation_test/none: RuntimeError # TypeError: D.loadLibrary is not a function
-deferred_constraints_type_annotation_test/static_method: RuntimeError # TypeError: F.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation1: RuntimeError # TypeError: K.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_generic1: RuntimeError # TypeError: T.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_generic2: RuntimeError # TypeError: Q.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_generic3: RuntimeError # TypeError: Z.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_generic4: RuntimeError # TypeError: Q.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError # TypeError: R.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_null: RuntimeError # TypeError: Z.loadLibrary is not a function
-deferred_constraints_type_annotation_test/type_annotation_top_level: RuntimeError # TypeError: U.loadLibrary is not a function
-deferred_function_type_test: RuntimeError # TypeError: N.loadLibrary is not a function
-deferred_global_test: RuntimeError # TypeError: Y.loadLibrary is not a function
+deferred_closurize_load_library_test: RuntimeError # D.loadLibrary is not a function
+deferred_constant_list_test: RuntimeError # K.loadLibrary is not a function
+deferred_constraints_constants_test/none: RuntimeError # S.loadLibrary is not a function
+deferred_constraints_constants_test/reference_after_load: RuntimeError # G.loadLibrary is not a function
+deferred_constraints_type_annotation_test/as_operation: RuntimeError # Z.loadLibrary is not a function
+deferred_constraints_type_annotation_test/catch_check: RuntimeError # D.loadLibrary is not a function
+deferred_constraints_type_annotation_test/is_check: RuntimeError # L.loadLibrary is not a function
+deferred_constraints_type_annotation_test/new: RuntimeError # R.loadLibrary is not a function
+deferred_constraints_type_annotation_test/new_before_load: RuntimeError # K.loadLibrary is not a function
+deferred_constraints_type_annotation_test/new_generic1: RuntimeError # R.loadLibrary is not a function
+deferred_constraints_type_annotation_test/new_generic2: RuntimeError # X.loadLibrary is not a function
+deferred_constraints_type_annotation_test/new_generic3: RuntimeError # K.loadLibrary is not a function
+deferred_constraints_type_annotation_test/none: RuntimeError # D.loadLibrary is not a function
+deferred_constraints_type_annotation_test/static_method: RuntimeError # F.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation1: RuntimeError # K.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_generic1: RuntimeError # T.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_generic2: RuntimeError # Q.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_generic3: RuntimeError # Z.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_generic4: RuntimeError # Q.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_non_deferred: RuntimeError # R.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_null: RuntimeError # Z.loadLibrary is not a function
+deferred_constraints_type_annotation_test/type_annotation_top_level: RuntimeError # U.loadLibrary is not a function
+deferred_function_type_test: RuntimeError # N.loadLibrary is not a function
+deferred_global_test: RuntimeError # Y.loadLibrary is not a function
 deferred_inlined_test: Crash # (lib.foo()): deferred access is not implemented
-deferred_load_constants_test/none: Crash # (foo.c): deferred access is not implemented
+deferred_load_constants_test/none: Crash # (foo.toplevel): deferred access is not implemented
 deferred_load_inval_code_test: Crash # (d.foo()): deferred access is not implemented
 deferred_load_library_wrong_args_test/none: RuntimeError # Y.loadLibrary is not a function
 deferred_mixin_test: RuntimeError # X.loadLibrary is not a function
 deferred_no_such_method_test: RuntimeError # D.loadLibrary is not a function
 deferred_not_loaded_check_test: Crash # (lib.closure(sideEffect())): deferred access is not implemented
-deferred_only_constant_test: RuntimeError # TypeError: O.loadLibrary is not a function
+deferred_only_constant_test: RuntimeError # O.loadLibrary is not a function
 deferred_optimized_test: Crash # (lib.foo()): deferred access is not implemented
 deferred_redirecting_factory_test: Crash # (lib1.loadLib2()): deferred access is not implemented
-deferred_regression_22995_test: RuntimeError # TypeError: U.loadLibrary is not a function
-deferred_shadow_load_library_test: RuntimeError # TypeError: Y.loadLibrary is not a function
-deferred_shared_and_unshared_classes_test: RuntimeError # TypeError: U.loadLibrary is not a function
-deferred_static_seperate_test: RuntimeError # TypeError: L.loadLibrary is not a function
-deferred_super_dependency_test/01: RuntimeError # Uncaught Error: NoSuchMethodError: method not found: 'loadLibrary' ($async$temp1.loadLibrary is not a function)
+deferred_regression_22995_test: RuntimeError # U.loadLibrary is not a function
+deferred_shadow_load_library_test: RuntimeError # Y.loadLibrary is not a function
+deferred_shared_and_unshared_classes_test: RuntimeError # U.loadLibrary is not a function
+deferred_static_seperate_test: RuntimeError # L.loadLibrary is not a function
+deferred_super_dependency_test/01: RuntimeError # $async$temp1.loadLibrary is not a function
 deferred_type_dependency_test/as: Crash # (lib1.fooAs("string")): deferred access is not implemented
 deferred_type_dependency_test/is: Crash # (lib1.fooIs("string")): deferred access is not implemented
 deferred_type_dependency_test/none: Crash # (lib2.getInstance()): deferred access is not implemented
 deferred_type_dependency_test/type_annotation: Crash # (lib1.fooAnnotation("string")): deferred access is not implemented
-enum_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 field3a_negative_test: Fail # Bogus result from type inference in case of invalid program.
 first_class_types_test: RuntimeError # Please triage this failure.
 for2_test: Crash # The null object does not have a getter 'field'.
@@ -354,12 +335,10 @@
 generic_instanceof_test: RuntimeError # Please triage this failure.
 generic_native_test: RuntimeError # Please triage this failure.
 infinite_switch_label_test: Crash # (switch (target){l0:...  continue to a labeled switch case
-instance_creation_in_function_annotation_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 instanceof2_test: RuntimeError # Please triage this failure.
 instanceof4_test/01: RuntimeError # Please triage this failure.
 invocation_mirror_invoke_on_test: RuntimeError # Please triage this failure.
 invocation_mirror_test: Crash # (super[37]=42): visitUnresolvedSuperIndexSet
-issue21079_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 issue_1751477_test: RuntimeError # O.loadLibrary is not a function
 list_is_test: RuntimeError # Please triage this failure.
 list_test: RuntimeError # Please triage this failure.
@@ -367,10 +346,7 @@
 many_overridden_no_such_method_test: RuntimeError # Please triage this failure.
 nested_switch_label_test: Crash # (switch (target){out...  continue to a labeled switch case
 no_such_method_test: RuntimeError # Please triage this failure.
-null_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 overridden_no_such_method_test: RuntimeError # Please triage this failure.
-redirecting_factory_reflection_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-regress_18535_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 regress_22443_test: RuntimeError # M.loadLibrary is not a function
 regress_23408_test: RuntimeError # G.loadLibrary is not a function
 regress_23500_test/01: Crash # (await for(var c in new Stream.fromIterable([] )){}): await for
@@ -387,18 +363,13 @@
 switch_label2_test: Crash # (switch (target){cas...  continue to a labeled switch case
 switch_label_test: Crash # (switch (animal){cas...  continue to a labeled switch case
 switch_try_catch_test: Crash # (switch (0){_0:case ...  continue to a labeled switch case
-sync_generator1_test/01: Crash # (dreiVier()sync*{yield* 3;}): cannot handle sync*/async* functions
-sync_generator1_test/none: Crash # (einsZwei()sync*{yie...  cannot handle sync*/async* functions
-sync_generator2_test/07: Crash # (sync()sync*{yield sync;}): cannot handle sync*/async* functions
-sync_generator2_test/08: Crash # (sync()sync*{yield sync;}): cannot handle sync*/async* functions
-sync_generator2_test/10: Crash # (sync()sync*{yield sync;}): cannot handle sync*/async* functions
-sync_generator2_test/none: Crash # (sync()sync*{yield sync;}): cannot handle sync*/async* functions
-sync_generator3_test/test1: Crash # (f()sync*{try {yield...  cannot handle sync*/async* functions
-sync_generator3_test/test2: Crash # (g()sync*{try {yield "a";throw "pow!";}finally {yield "b";}}): cannot handle sync*/async* functions
-syncstar_less_than_test: Crash # (Iterable<int> foo()...  cannot handle sync*/async* functions
-syncstar_yield_test/copyParameters: Crash # (Iterable<int> foo3(int p)sync*{int i=0;i++ ;p++ ;yield p+i;}): cannot handle sync*/async* functions
-syncstar_yield_test/none: Crash # (Iterable<int> foo3(int p)sync*{int i=0;i++ ;p++ ;yield p+i;}): cannot handle sync*/async* functions
-syncstar_yieldstar_test: Crash # (foo()sync*{yield* [1,2,3];yield null;yield* bar();}): cannot handle sync*/async* functions
+sync_generator1_test/01: Timeout # Please triage this failure.
+sync_generator1_test/none: Timeout # Please triage this failure.
+sync_generator3_test/test1: RuntimeError # Please triage this failure.
+sync_generator3_test/test2: RuntimeError # Please triage this failure.
+syncstar_yield_test/copyParameters: RuntimeError # Please triage this failure.
+syncstar_yield_test/none: RuntimeError # Please triage this failure.
+syncstar_yieldstar_test: RuntimeError # Please triage this failure.
 type_variable_closure2_test: RuntimeError # Please triage this failure.
 type_variable_field_initializer_closure_test: RuntimeError # Please triage this failure.
 type_variable_field_initializer_test: RuntimeError # Please triage this failure.
diff --git a/tests/lib/analyzer/analyze_library.status b/tests/lib/analyzer/analyze_library.status
index 5d72855..4016986 100644
--- a/tests/lib/analyzer/analyze_library.status
+++ b/tests/lib/analyzer/analyze_library.status
@@ -24,3 +24,5 @@
 lib/indexed_db/dartium/indexed_db_dartium: CompileTimeError # Issue 21647
 lib/web_audio/dartium/web_audio_dartium: CompileTimeError # Issue 21647
 lib/svg/dartium/svg_dartium: CompileTimeError # Issue 21647
+lib/_blink/dartium/_blink_dartium: CompileTimeError # Dartium JsInterop roll (js.JsObjectImpl)
+lib/js/dartium/js_dartium: CompileTimeError # Dartium JsInterop roll (js.JsObjectImpl)
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 9a65284..c35ec1d 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -336,229 +336,13 @@
 async/async_await_zones_test: Crash # (await for(var x in bar().take(100)){sum+= x;}): await for
 async/stream_empty_test: RuntimeError # $async$temp1.runTest_unreachable is not a function
 async/stream_iterator_test: Crash # (Stream createCancel...  cannot handle sync*/async* functions
-convert/json_pretty_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-convert/line_splitter_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/abstract_class_test/00: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/abstract_class_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/abstract_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/accessor_cache_overflow_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/array_tracing2_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/array_tracing_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/basic_types_in_dart_core_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/circular_factory_redirection_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/class_declarations_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/class_declarations_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/class_mirror_location_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/class_mirror_type_variables_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/closures_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/closurization_equivalence_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/constructor_kinds_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/constructor_kinds_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/constructors_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/dart2js_mirrors_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/declarations_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/deferred_mirrors_metadata_test: RuntimeError # TypeError: U.loadLibrary is not a function
-mirrors/deferred_mirrors_metatarget_test: RuntimeError # TypeError: X.loadLibrary is not a function
-mirrors/deferred_mirrors_update_test: RuntimeError # TypeError: U.loadLibrary is not a function
-mirrors/deferred_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
+convert/json_pretty_test: RuntimeError # Please triage this failure.
+convert/line_splitter_test: RuntimeError # Please triage this failure.
+mirrors/deferred_mirrors_metadata_test: RuntimeError # U.loadLibrary is not a function
+mirrors/deferred_mirrors_metatarget_test: RuntimeError # X.loadLibrary is not a function
+mirrors/deferred_mirrors_update_test: RuntimeError # U.loadLibrary is not a function
 mirrors/delegate_call_through_getter_test: RuntimeError # Please triage this failure.
-mirrors/delegate_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/delegate_library_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 mirrors/delegate_test: RuntimeError # Please triage this failure.
-mirrors/disable_tree_shaking_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/empty_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/enum_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/equality_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/fake_function_with_call_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/fake_function_without_call_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/field_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/function_type_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_by_type_parameter_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_by_type_parameter_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_by_type_parameter_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_bounded_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_class_declaration_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_f_bounded_mixin_application_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_f_bounded_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_f_bounded_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_function_typedef_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_interface_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_interface_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_list_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_local_function_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_mixin_applications_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_mixin_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_superclass_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_superclass_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generic_type_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_double_substitution_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_double_substitution_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_dynamic_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_special_types_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_substitution_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/generics_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/globalized_closures2_test/00: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/globalized_closures2_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/globalized_closures_test/00: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/globalized_closures_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/hierarchy_invariants_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/immutable_collections_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/inherit_field_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/initializing_formals_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/initializing_formals_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/instance_members_easier_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/instance_members_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/instance_members_unimplemented_interface_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/instance_members_with_override_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/instantiate_abstract_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/intercepted_cache_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/intercepted_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/intercepted_object_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/intercepted_superclass_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invocation_fuzz_test/emptyarray: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invocation_fuzz_test/false: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invocation_fuzz_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invocation_fuzz_test/smi: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invocation_fuzz_test/string: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_on_closure_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_getter_previously_accessed_test/named: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_getter_previously_accessed_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_getter_test/named: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_getter_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test/named: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_call_through_implicit_getter_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_closurization2_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_closurization_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_import_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_named_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_named_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_natives_malicious_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/invoke_throws_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/io_html_mutual_exclusion_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/is_odd_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/lazy_static_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/libraries_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_declarations_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_declarations_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_enumeration_deferred_loading_test: Crash # (other.topLevelMethod()): deferred access is not implemented
-mirrors/library_exports_hidden_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_exports_shown_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_import_deferred_loading_test: Crash # (other.topLevelMethod()): deferred access is not implemented
-mirrors/library_imports_bad_metadata_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_deferred_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_hidden_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_prefixed_show_hide_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_prefixed_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_imports_shown_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_metadata2_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/library_uri_package_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/list_constructor_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/list_constructor_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/load_library_test: Crash # (other.topLevelMethod()): deferred access is not implemented
-mirrors/local_function_is_static_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/local_isolate_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/05: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/10: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/11: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/13: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/14: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_allowed_values_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_class_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_constructed_constant_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_constructor_arguments_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_nested_constructor_call_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_location_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_name_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_properties_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_returntype_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_source_line_ending_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/method_mirror_source_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirror_in_static_init_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_nsm_mismatch_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_nsm_test/dart2js: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_nsm_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_reader_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_resolve_fields_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mirrors_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mixin_application_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mixin_members_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/mixin_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/native_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/new_instance_with_type_arguments_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/no_metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/null2_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/null_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/operator_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/parameter_is_const_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/parameter_metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/parameter_of_mixin_app_constructor_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/private_symbol_mangling_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/private_types_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/proxy_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/raw_type_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/raw_type_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/redirecting_factory_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/redirecting_factory_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/redirecting_factory_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_class_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_class_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_class_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_model_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_runtime_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflect_uninstantiated_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_classes_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_classes_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_classes_test/03: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_classes_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_function_type_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_special_types_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_test/02: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_test/03: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_typedefs_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflected_type_typevars_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/reflectively_instantiate_uninstantiated_class_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/regress_14304_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/regress_16321_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/regress_16321_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/regress_19731_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/relation_assignable_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/relation_subclass_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/relation_subtype_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/removed_api_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/repeated_private_anon_mixin_app_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/set_field_with_final_inheritance_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/set_field_with_final_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/spawn_function_root_library_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/static_members_easier_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/static_members_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/static_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/superclass2_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/superclass_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/symbol_validation_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
+mirrors/library_enumeration_deferred_loading_test: RuntimeError # L.loadLibrary is not a function
 mirrors/symbol_validation_test/none: RuntimeError # Please triage this failure.
-mirrors/syntax_error_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/synthetic_accessor_properties_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/to_string_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/top_level_accessors_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/type_argument_is_type_variable_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/type_variable_is_static_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/type_variable_owner_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/type_variable_owner_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/typearguments_mirror_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 mirrors/typedef_deferred_library_test: RuntimeError # G.loadLibrary is not a function
-mirrors/typedef_metadata_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/typedef_reflected_type_test/01: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/typedef_reflected_type_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/unnamed_library_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-mirrors/variable_is_const_test/none: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 7d7fc8f..827482f 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -198,8 +198,4 @@
 io/secure_socket_bad_data_test: RuntimeError  # An error in a secure connection just puts a READ_CLOSED on the stream, rather than signaling an error on the stream.
 
 [ $compiler == dart2js && $cps_ir ]
-io/file_error_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-io/file_read_encoded_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-io/file_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
-io/observatory_test: Crash # (static Iterable<Str...  cannot handle sync*/async* functions
 priority_queue_stress_test: RuntimeError # Cannot read property 'length' of undefined
diff --git a/tools/VERSION b/tools/VERSION
index 19d22f0..fd55717 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 13
 PATCH 0
-PRERELEASE 3
-PRERELEASE_PATCH 1
+PRERELEASE 4
+PRERELEASE_PATCH 0
diff --git a/tools/bots/cross-vm.py b/tools/bots/cross-vm.py
index 1296fe9..9fd751f 100644
--- a/tools/bots/cross-vm.py
+++ b/tools/bots/cross-vm.py
@@ -51,8 +51,7 @@
 
       with bot.BuildStep('Upload build tarball'):
         uri = "%s/%s" % (GCS_BUCKET, tarball)
-        run([GSUTIL, 'cp', tarball, uri])
-        run([GSUTIL, 'setacl', 'public-read', uri])
+        run([GSUTIL, 'cp', '-a', 'public-read', tarball, uri])
 
     elif num_run == 2:
       with bot.BuildStep('tests'):
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 3356940..decf876 100644
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -24,13 +24,6 @@
     Run([sys.executable, './tools/build.py', '--mode=release',
          '--arch=ia32,x64', 'create_sdk'])
 
-def BuildAPIDocs():
-  with bot.BuildStep('Build API docs'):
-    Run([sys.executable, './tools/build.py', '--mode=release',
-         '--arch=ia32', 'api_docs'])
-    Run([sys.executable, './tools/build.py', '--mode=release',
-         '--arch=ia32', 'dartdocgen'])
-
 def BuildDartdocAPIDocs(dirname):
   dart_sdk = os.path.join(bot_utils.DART_DIR,
                           utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
@@ -44,10 +37,12 @@
                               'packages')
   footer_file = os.path.join(bot_utils.DART_DIR,
                               'tools', 'bots', 'dartdoc_footer.html')
+  url = 'https://api.dartlang.org/stable'
   with bot.BuildStep('Build API docs by dartdoc'):
     subprocess.call([dart_exe, '--package-root=' + packages_dir, dartdoc_dart, 
                     '--sdk-docs','--output', dirname, '--dart-sdk', dart_sdk, 
-                    '--footer' , footer_file], 
+                    '--footer' , footer_file,
+                    '--rel-canonical-prefix=' + url], 
                      stdout=open(os.devnull, 'wb'))
 
 def CreateUploadVersionFile():
@@ -100,57 +95,18 @@
   CreateUploadSDKZips()
 
 def CreateUploadAPIDocs():
-  api_path = os.path.join(bot_utils.DART_DIR,
-                          utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                          'api_docs')
-  api_zip = os.path.join(bot_utils.DART_DIR,
-                         utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
-                         'dart-api-docs.zip')
   dartdoc_dir =  os.path.join(bot_utils.DART_DIR,
                               utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
                               'gen-dartdocs')
   dartdoc_zip =  os.path.join(bot_utils.DART_DIR,
                               utils.GetBuildRoot(BUILD_OS, 'release', 'ia32'),
                               'dartdocs-api.zip')
-  shutil.rmtree(api_path, ignore_errors=True)
-  FileDelete(api_zip)
-  BuildAPIDocs()
-  UploadApiDocs(api_path)
   UploadApiLatestFile()
-  CreateZip(api_path, api_zip)
-  DartArchiveUploadAPIDocs(api_zip)
   BuildDartdocAPIDocs(dartdoc_dir) 
   UploadDartdocApiDocs(dartdoc_dir)  
   CreateZip(dartdoc_dir, dartdoc_zip)  
   DartArchiveUploadDartdocAPIDocs(dartdoc_zip)
 
-def DartArchiveUploadAPIDocs(api_zip):
-  namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
-  revision = utils.GetArchiveVersion()
-  for revision in [revision, 'latest']:
-    destination = (namer.apidocs_directory(revision) + '/' +
-        namer.apidocs_zipfilename())
-    DartArchiveFile(api_zip, destination, checksum_files=False)
-
-def UploadApiDocs(dir_name):
-  apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL)
-  revision = utils.GetArchiveVersion()
-  apidocs_destination_gcsdir = apidocs_namer.docs_dirpath(revision)
-  apidocs_destination_latestfile = apidocs_namer.docs_latestpath(revision)
-
-  # Return early if the documents have already been uploaded.
-  # (This can happen if a build was forced, or a commit had no changes in the
-  # dart repository (e.g. DEPS file update).)
-  if GsutilExists(apidocs_destination_gcsdir):
-    print ("Not uploading api docs, since %s is already present."
-           % apidocs_destination_gcsdir)
-    return
-
-  # Upload everything inside the built apidocs directory.
-  gsutil = bot_utils.GSUtil()
-  gsutil.upload(dir_name, apidocs_destination_gcsdir, recursive=True,
-                public=True)
-
 def DartArchiveUploadDartdocAPIDocs(api_zip):
   namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
   revision = utils.GetArchiveVersion()
diff --git a/tools/create_sdk.py b/tools/create_sdk.py
index b4e2135..431b2a8 100755
--- a/tools/create_sdk.py
+++ b/tools/create_sdk.py
@@ -120,8 +120,8 @@
 
 
 def CopyDartScripts(home, sdk_root):
-  for executable in ['dart2js_sdk', 'dartanalyzer_sdk', 'dartfmt_sdk', 'docgen',
-                     'dartdocgen', 'pub_sdk', 'dartdoc']:
+  for executable in ['dart2js_sdk', 'dartanalyzer_sdk', 'dartfmt_sdk',
+                     'pub_sdk', 'dartdoc']:
     CopyShellScript(os.path.join(home, 'sdk', 'bin', executable),
                     os.path.join(sdk_root, 'bin'))
 
diff --git a/tools/dart2js/angular2_testing_deps/CURRENT_ANGULAR_DEPS b/tools/dart2js/angular2_testing_deps/CURRENT_ANGULAR_DEPS
index 82a82d9..2e2224a 100644
--- a/tools/dart2js/angular2_testing_deps/CURRENT_ANGULAR_DEPS
+++ b/tools/dart2js/angular2_testing_deps/CURRENT_ANGULAR_DEPS
@@ -1 +1 @@
-63e785902fbc6d5edbc1a4ed135f65d1cdf00acd
+da6def3772e22665c381306fd5f8be30a60c2058
diff --git a/tools/dartium/upload_steps.py b/tools/dartium/upload_steps.py
index 8665f84..2ab3fc8 100755
--- a/tools/dartium/upload_steps.py
+++ b/tools/dartium/upload_steps.py
@@ -192,7 +192,7 @@
 
   # Set ACL.
   if ACL is not None:
-    cmd = [GSUTIL, 'setacl', ACL, target]
+    cmd = [GSUTIL, 'acl', 'set', ACL, target]
     (status, output) = ExecuteCommand(cmd)
   return status
 
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index b79b1dc..7425710 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -1,3 +1,4 @@
+
 import gclient_utils
 import os
 
@@ -12,8 +13,8 @@
   "dartium_chromium_branch": "master",
   "dartium_chromium_commit": "62a7524d4f71c9e0858d24b0aa1bbff3a2d09bff",
   "chromium_base_revision": "297060",
-  "dartium_webkit_branch": "/blink/branches/dart/2171_3/dartium",
-  "dartium_webkit_revision": "201240",
+  "dartium_webkit_branch": "/blink/branches/dart/dartium",
+  "dartium_webkit_revision": "202538",
 
   # We use mirrors of all github repos to guarantee reproducibility and
   # consistency between what users see and what the bots see.
@@ -68,7 +69,7 @@
   "zlib_rev": "@c3d0a6190f2f8c924a05ab6cc97b8f975bddd33f",
   "web_components_rev": "@0e636b534d9b12c9e96f841e6679398e91a986ec",
 
-  "co19_rev": "@f95f109fea67127a220958794ef5200a63cb454c",
+  "co19_rev": "@fad777939a2b891c0a79b69a4d79c914049c69b0",
   "fake_async_rev": "@38614",
 })
 
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py
index 3a00dde..74de8e4 100644
--- a/tools/dom/scripts/css_code_generator.py
+++ b/tools/dom/scripts/css_code_generator.py
@@ -102,18 +102,8 @@
 
 
   class_file.write("""
-$if DART2JS
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with
     $(CLASSNAME)Base $IMPLEMENTS {
-$else
-  $if JSINTEROP
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS) class $CLASSNAME extends
-    $(CLASSNAME)Base $IMPLEMENTS {
-  $else
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with
-    $(CLASSNAME)Base $IMPLEMENTS {
-  $endif
-$endif
   factory $CLASSNAME() => new CssStyleDeclaration.css('');
 
   factory $CLASSNAME.css(String css) {
@@ -252,7 +242,7 @@
   String get %s => this._%s;
 
   /** Sets the value of "%s" */
-  void set %s(String value) {
+  set %s(String value) {
     _%s = value == null ? '' : value;
   }
   @Returns('String')
@@ -266,15 +256,7 @@
 $endif
 }
 
-$if DART2JS
 class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
-$else
-  $if JSINTEROP
-class _CssStyleDeclarationSet extends CssStyleDeclarationBase {
-  $else
-class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
-  $endif
-$endif
   final Iterable<Element> _elementIterable;
   Iterable<CssStyleDeclaration> _elementCssStyleDeclarationSetIterable;
 
@@ -309,7 +291,7 @@
     property = dashifyName(camelName)
     class_file.write("""
   /** Sets the value of "%s" */
-  void set %s(String value) {
+  set %s(String value) {
     _setAll('%s', value);
   }
     """ % (property, camelName, camelName))
@@ -371,7 +353,7 @@
     if base_css_name in annotated:
       class_lines.append(annotated[base_css_name])
     class_lines.append("""
-  void set %s(String value) {
+  set %s(String value) {
     setProperty('%s', value, '');
   }
 """ % (camel_case_name, css_name))
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 688a5f9..fe4e03e 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -167,7 +167,7 @@
 
     'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate',
 
-    'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent', 
+    'RTCIceCandidateEvent': 'RTCIceCandidateEvent,RTCPeerConnectionIceEvent',
 
     'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription',
 
@@ -514,21 +514,19 @@
       parameter_count = len(self.param_infos)
     return ', '.join(map(param_name, self.param_infos[:parameter_count]))
 
-  def wrap_unwrap_list_blink(self, return_type, type_registry):
-    """Return True if the type is a List<Node>"""
-    return return_type.startswith('List<Node>')
+  def isCallback(self, type_registry, type_id):
+    if type_id:
+      callback_type = type_registry._database._all_interfaces[type_id]
+      return callback_type.operations[0].id == 'handleEvent' if len(callback_type.operations) > 0 else False
+    else:
+      return False
 
-  def wrap_unwrap_type_blink(self, return_type, type_registry):
-    """Returns True if the type is a blink type that requires wrap_jso or unwrap_jso.
-    Notice we look for any class that starts with HtmlNNNN e.g., HtmlDocument, etc. """
-    return (type_registry.HasInterface(return_type) or not(return_type) or
-            return_type == 'Object' or return_type.startswith('Html') or
-            return_type == 'MutationObserver')
-
-  def ParametersAsListOfVariables(self, parameter_count=None, type_registry=None, dart_js_interop=False):
+  def ParametersAsListOfVariables(self, parameter_count=None, type_registry=None, dart_js_interop=False, backend = None):
     """Returns a list of the first parameter_count parameter names
     as raw variables.
     """
+    isRemoveOperation = self.name == 'removeEventListener' or self.name == 'removeListener'
+
     if parameter_count is None:
       parameter_count = len(self.param_infos)
     if not type_registry:
@@ -545,19 +543,56 @@
         #    - type is Object
         #
         # JsObject maybe stored in the Dart class.
-        if (self.wrap_unwrap_type_blink(type_id, type_registry)):
-          if dart_js_interop and type_id == 'EventListener' and (self.name == 'addEventListener' or
-                                                                 self.name == 'addListener'):
-            # Events fired need to wrap the Javascript Object passed as a parameter in event.
-            parameters.append('unwrap_jso((Event event) => %s(wrap_jso(event)))' % p.name)
+        if (wrap_unwrap_type_blink(type_id, type_registry)):
+          type_is_callback = self.isCallback(type_registry, type_id)
+          if (dart_js_interop and type_id == 'EventListener' and
+              (self.name == 'addEventListener')):
+              # Events fired need use a JsFunction not a anonymous closure to
+              # insure the event can really be removed.
+              parameters.append('wrap_event_listener(this, %s)' % p.name)
+          elif (dart_js_interop and type_id == 'EventListener' and
+              (self.name == 'removeEventListener')):
+              # Find the JsFunction that corresponds to this Dart function.
+              parameters.append('_knownListeners[this.hashCode][identityHashCode(%s)]' % p.name)
+          elif dart_js_interop and type_id == 'FontFaceSetForEachCallback':
+              # forEach is supported in the DOM for FontFaceSet as it iterates
+              # over the Javascript Object the callback parameters are also
+              # Javascript objects and must be wrapped.
+              parameters.append('unwrap_jso((fontFace, fontFaceAgain, set) => %s(wrap_jso(fontFace), wrap_jso(fontFaceAgain), wrap_jso(set)))' % p.name)
+          elif dart_js_interop and type_id == 'HeadersForEachCallback':
+              # forEach is supported in the DOM for Headers as it iterates
+              # over the Javascript Object the callback parameters are also
+              # Javascript objects and must be wrapped.
+              parameters.append('unwrap_jso((String value, String key, map) => %s(value, key, wrap_jso(map)))' % p.name)
+          elif dart_js_interop and type_is_callback and not(isRemoveOperation):
+            # Any remove operation that has a a callback doesn't need wrapping.
+            # TODO(terry): Kind of hacky but handles all the cases we care about
+            callback_type = type_registry._database._all_interfaces[type_id]
+            callback_args_decl = []
+            callback_args_call = []
+            for callback_arg in callback_type.operations[0].arguments:
+              if dart_js_interop:
+                dart_type = '' # For non-primitives we will be passing JsObject for non-primitives, so ignore types
+              else:
+                dart_type = type_registry.DartType(callback_arg.type.id) + ' '
+              callback_args_decl.append('%s%s' % (dart_type, callback_arg.id))
+              if wrap_unwrap_type_blink(callback_arg.type.id, type_registry):
+                callback_args_call.append('wrap_jso(%s)' % callback_arg.id)
+              else:
+                callback_args_call.append(callback_arg.id)
+            parameters.append('unwrap_jso((%s) => %s(%s))' %
+                              (", ".join(callback_args_decl),
+                               p.name,
+                               ", ".join(callback_args_call)))
           else:
             parameters.append('unwrap_jso(%s)' % p.name)
         else:
           if dart_js_interop:
+            conversion = backend._InputConversion(p.type_id, self.declared_name)
             passParam = p.name
-            if type_id == 'Dictionary':
+            if conversion:
               # Need to pass the IDL Dictionary from Dart Map to JavaScript object.
-              passParam = '{0} != null ? new js.JsObject.jsify({0}) : {0}'.format(p.name)
+              passParam = '{0}({1})'.format(conversion.function_name, p.name)
           else:
             passParam = p.name
           parameters.append(passParam)
@@ -1396,3 +1431,34 @@
 
     class_name = '%sIDLTypeInfo' % type_data.clazz
     return globals()[class_name](type_name, type_data)
+
+def wrap_unwrap_list_blink(return_type, type_registry):
+    """Return True if the type is a List<Node>"""
+    return return_type.startswith('List<Node>')
+
+def wrap_unwrap_type_blink(return_type, type_registry):
+    """Returns True if the type is a blink type that requires wrap_jso or
+    unwrap_jso"""
+    if return_type and return_type.startswith('Html'):
+        return_type = return_type.replace('Html', 'HTML', 1)
+    return (type_registry.HasInterface(return_type) or not(return_type) or
+            return_type == 'Object' or
+            return_type == 'Future' or
+            return_type == 'SqlDatabase' or # renamed to Database
+            return_type == 'HTMLElement' or
+            return_type == 'MutationObserver')
+
+def wrap_type_blink(return_type, type_registry):
+    """Returns True if the type is a blink type that requires wrap_jso but
+    NOT unwrap_jso"""
+    return (return_type == 'Map' or
+            return_type == 'Rectangle')
+
+def wrap_return_type_blink(return_type, type_name, type_registry):
+    """Returns True if we should wrap the returned value. This checks
+    a number of different variations, calling the more basic functions
+    above."""
+    return (wrap_unwrap_type_blink(return_type, type_registry) or
+            wrap_unwrap_type_blink(type_name, type_registry) or
+            wrap_type_blink(return_type, type_registry) or
+            wrap_unwrap_list_blink(return_type, type_registry))
diff --git a/tools/dom/scripts/go.sh b/tools/dom/scripts/go.sh
index 815c24c..946bdb9 100755
--- a/tools/dom/scripts/go.sh
+++ b/tools/dom/scripts/go.sh
@@ -34,4 +34,4 @@
 fi
 
 reset && \
-./dartdomgenerator.py --systems="$SYSTEMS" --logging=40 --update-dom-metadata
+./dartdomgenerator.py --systems="$SYSTEMS" --logging=40 --update-dom-metadata --gen-interop
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 3edf60e..e7e500f 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -14,6 +14,7 @@
 from htmlrenamer import convert_to_future_members, custom_html_constructors, \
     keep_overloaded_members, overloaded_and_renamed, private_html_members, \
     renamed_html_members, renamed_overloads, removed_html_members
+from generator import TypeOrVar
 import logging
 import monitored
 import sys
@@ -324,6 +325,7 @@
                                              info.operations[0],
                                              info.name,
                                              'call:')
+
     if not method_name:
       if info.name == 'item':
         # FIXME: item should be renamed to operator[], not removed.
@@ -526,7 +528,7 @@
   def _AddConstructor(self,
       constructor_info, factory_name, factory_constructor_name):
     # Hack to ignore the Image constructor used by JavaScript.
-    if (self._interface.id == 'HTMLImageElement'
+    if ((self._interface.id == 'HTMLImageElement' or self._interface.id == 'Blob')
       and not constructor_info.pure_dart_constructor):
       return
 
@@ -595,6 +597,7 @@
         name = emitter.Format('_create_$VERSION', VERSION=version)
         arguments = constructor_info.idl_args[signature_index][:argument_count]
         args = None
+        call_template = ''
         if self._dart_use_blink:
             type_ids = [p.type.id for p in arguments]
             base_name, rs = \
@@ -603,6 +606,12 @@
                 self.DeriveQualifiedBlinkName(self._interface.id,
                                               base_name)
             args = constructor_info.ParametersAsArgumentList(argument_count)
+
+            # Handle converting Maps to Dictionaries, etc.
+            (factory_params, converted_arguments) = self._ConvertArgumentTypes(
+                stmts_emitter, arguments, argument_count, constructor_info)
+            args = ', '.join(converted_arguments)
+            call_template = 'wrap_jso($FACTORY_NAME($FACTORY_PARAMS))'
         else:
             qualified_name = emitter.Format(
                 '$FACTORY.$NAME',
@@ -611,9 +620,8 @@
             (factory_params, converted_arguments) = self._ConvertArgumentTypes(
                 stmts_emitter, arguments, argument_count, constructor_info)
             args = ', '.join(converted_arguments)
-        call_emitter.Emit('$FACTORY_NAME($FACTORY_PARAMS)',
-            FACTORY_NAME=qualified_name,
-            FACTORY_PARAMS=args)
+            call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
+        call_emitter.Emit(call_template, FACTORY_NAME=qualified_name, FACTORY_PARAMS=args)
         self.EmitStaticFactoryOverload(constructor_info, name, arguments)
 
       def IsOptional(signature_index, argument):
@@ -699,7 +707,14 @@
     """ Declares an attribute but does not include the code to invoke it.
     """
     if read_only:
-      template = '\n  $TYPE get $NAME;\n'
+      # HACK(terry): Element is not abstract for Dartium so isContentEditable
+      # must have a body see impl_Element.darttemplate
+      if (self._interface.id == 'Element' and
+          attr_name == 'isContentEditable' and
+          self._dart_js_interop):
+        return
+      else:
+        template = '\n  $TYPE get $NAME;\n'
     else:
       template = '\n  $TYPE $NAME;\n'
 
@@ -714,9 +729,17 @@
       return_type_name - The name of the return type.
       method_name - The name of the method.
     """
+      # HACK(terry): Element is not abstract for Dartium so click
+      # must have a body see impl_Element.darttemplate
+    if (self._interface.id == 'Element' and
+        method_name == 'click' and
+        self._dart_js_interop):
+      return
+    else:
+      template = '\n  $TYPE $NAME($PARAMS);\n'
+
     self._members_emitter.Emit(
-             '\n'
-             '  $TYPE $NAME($PARAMS);\n',
+             template,
              TYPE=return_type_name,
              NAME=method_name,
              PARAMS=operation.ParametersAsDeclaration(self._DartType))
@@ -804,3 +827,49 @@
 
   def _TypeInfo(self, type_name):
     return self._type_registry.TypeInfo(type_name)
+
+  def _ConvertArgumentTypes(self, stmts_emitter, arguments, argument_count, info):
+    temp_version = [0]
+    converted_arguments = []
+    target_parameters = []
+    for position, arg in enumerate(arguments[:argument_count]):
+      conversion = self._InputConversion(arg.type.id, info.declared_name)
+      param_name = arguments[position].id
+      if conversion:
+        temp_version[0] += 1
+        temp_name = '%s_%s' % (param_name, temp_version[0])
+        temp_type = conversion.output_type
+        stmts_emitter.Emit(
+            '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n',
+            TYPE=TypeOrVar(temp_type),
+            NAME=temp_name,
+            CONVERT=conversion.function_name,
+            ARG=info.param_infos[position].name)
+        converted_arguments.append(temp_name)
+        param_type = temp_type
+        verified_type = temp_type  # verified by assignment in checked mode.
+      else:
+        converted_arguments.append(info.param_infos[position].name)
+        param_type = self._NarrowInputType(arg.type.id)
+        # Verified by argument checking on entry to the dispatcher.
+
+        verified_type = self._InputType(
+            info.param_infos[position].type_id, info)
+        # The native method does not need an argument type if we know the type.
+        # But we do need the native methods to have correct function types, so
+        # be conservative.
+        if param_type == verified_type:
+          if param_type in ['String', 'num', 'int', 'double', 'bool', 'Object']:
+            param_type = 'dynamic'
+
+      target_parameters.append(
+          '%s%s' % (TypeOrNothing(param_type), param_name))
+
+    return target_parameters, converted_arguments
+
+  def _InputType(self, type_name, info):
+    conversion = self._InputConversion(type_name, info.declared_name)
+    if conversion:
+      return conversion.input_type
+    else:
+      return self._NarrowInputType(type_name) if type_name else 'dynamic'
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index 96d3cfc..2dd6db6 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -176,6 +176,7 @@
 # constructor for dispatch purposes.
 custom_html_constructors = monitored.Set(
     'htmlrenamer.custom_html_constructors', [
+  'HTMLAudioElement',
   'HTMLOptionElement',
   'MutationObserver',
 ])
@@ -204,6 +205,7 @@
   'CustomEvent.initCustomEvent',
   'DeviceOrientationEvent.initDeviceOrientationEvent',
   'Document.createElement',
+  'Document.createElementNS',
   'Document.createEvent',
   'Document.createNodeIterator',
   'Document.createTextNode',
@@ -233,6 +235,7 @@
   'Document.webkitIsFullScreen',
   'Document.webkitVisibilityState',
 
+  'Element.animate',
   'Element.children',
   'Element.childElementCount',
   'Element.firstElementChild',
@@ -780,6 +783,8 @@
     'MouseEvent.y',
     'Navigator.registerServiceWorker',
     'Navigator.unregisterServiceWorker',
+    'Navigator.isProtocolHandlerRegistered',
+    'Navigator.unregisterProtocolHandler',
     'Node.compareDocumentPosition',
     'Node.get:DOCUMENT_POSITION_CONTAINED_BY',
     'Node.get:DOCUMENT_POSITION_CONTAINS',
@@ -821,6 +826,7 @@
     'Window.on:wheel',
     'WindowEventHandlers.on:beforeUnload',
     'WorkerGlobalScope.webkitIndexedDB',
+    'XMLHttpRequest.open',
 # TODO(jacobr): should these be removed?
     'Document.close',
     'Document.hasFocus',
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 69ee642..222d8b1 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -494,6 +494,7 @@
 
   def GenerateInterface(self):
     interface_name = self._interface_type_info.interface_name()
+
     implementation_name = self._interface_type_info.implementation_name()
     self._library_emitter.AddTypeEntry(self._library_name,
                                        self._interface.id, implementation_name)
@@ -559,15 +560,15 @@
 
     mixins = self._backend.Mixins()
 
-    # TODO(terry): Do we need a more generic solution other than handling NamedNodeMap
-    #              we can't call super on a mixin interface - yet.
-    if self._options.templates._conditions['DARTIUM'] and self._options.dart_js_interop and self._interface.id == 'NamedNodeMap':
-      mixins = None
     mixins_str = ''
     if mixins:
       mixins_str = ' with ' + ', '.join(mixins)
       if not base_class:
         base_class = 'Interceptor'
+      elif (base_class == 'NativeFieldWrapperClass2' and
+            self._options.dart_js_interop and
+            not(isinstance(self._backend, Dart2JSBackend))):
+        base_class = 'JsoNativeFieldWrapper'
 
     annotations = self._metadata.GetFormattedMetadata(
         self._library_name, self._interface, None, '')
@@ -578,12 +579,20 @@
       # XMLHttpRequestProgressEvent can't be abstract we need to instantiate
       # for JsInterop.
       if (not(isinstance(self._backend, Dart2JSBackend)) and
-        self._interface.id == 'XMLHttpRequestProgressEvent'):
-        # Only suppress abstract for XMLHttpRequestProgressEvent for Dartium.
-        # Need to be able to instantiate the class; can't be abstract.
+        (self._interface.id == 'XMLHttpRequestProgressEvent' or
+         self._interface.id == 'DOMStringMap')):
+        # Suppress abstract for XMLHttpRequestProgressEvent and DOMStringMap
+        # for Dartium.  Need to be able to instantiate the class; can't be abstract.
         class_modifiers = ''
       else:
-        class_modifiers = 'abstract '
+        # For Dartium w/ JsInterop these suppressed interfaces are needed to
+        # instanciate the internal classes when wrap_jso is called for a JS object.
+        if (self._renamer.ShouldSuppressInterface(self._interface) and
+            not(isinstance(self._backend, Dart2JSBackend)) and
+            self._options.dart_js_interop):
+          class_modifiers = ''
+        else:
+          class_modifiers = 'abstract '
 
     native_spec = ''
     if not IsPureInterface(self._interface.id):
@@ -592,7 +601,8 @@
     class_name = self._interface_type_info.implementation_name()
 
     js_interop_equivalence_op = \
-      '  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);\n'
+      '  bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || identical(this, other);\n' \
+      + '  int get hashCode => unwrap_jso(this).hashCode;\n'
     # ClientRect overrides the equivalence operator.
     if interface_name == 'ClientRect' or interface_name == 'DomRectReadOnly':
         js_interop_equivalence_op = ''
@@ -604,39 +614,42 @@
   }}
 
   factory {0}._internalWrap() {{
-    return new {0}._internal();
+    return new {0}.internal_();
   }}
 
-  {0}._internal() : super._internal();
+  {0}.internal_() : super.internal_();
 
 '''.format(class_name)
-    """
-    TODO(terry): Don't use Dart expando really don't need.
-      final Object expandoJsObject = new Object();
-      final Expando<JsObject> dartium_expando = new Expando<JsObject>("Expando_jsObject");
-    """
-    if base_class == 'NativeFieldWrapperClass2':
+    if base_class == 'NativeFieldWrapperClass2' or base_class == 'JsoNativeFieldWrapper':
         js_interop_wrapper = '''
   static {0} internalCreate{0}() {{
     return new {0}._internalWrap();
   }}
 
-  JsObject blink_jsObject = null;
+  js.JsObject blink_jsObject;
 
   factory {0}._internalWrap() {{
-    return new {0}._internal();
+    return new {0}.internal_();
   }}
 
-  {0}._internal() {{ }}
+  {0}.internal_() {{ }}
 
 {1}'''.format(class_name, js_interop_equivalence_op)
+        # Change to use the synthesized class so we can construct with a mixin
+        # classes prefixed with name of NativeFieldWrapperClass2 don't have a
+        # default constructor so classes with mixins can't be new'd.
+        if (self._options.templates._conditions['DARTIUM'] and
+            self._options.dart_js_interop and
+            (self._interface.id == 'NamedNodeMap' or
+             self._interface.id == 'CSSStyleDeclaration')):
+            base_class = 'JsoNativeFieldWrapper'
 
     implementation_members_emitter = implementation_emitter.Emit(
         self._backend.ImplementationTemplate(),
         LIBRARYNAME='dart.dom.%s' % self._library_name,
         ANNOTATIONS=annotations,
         CLASS_MODIFIERS=class_modifiers,
-        CLASSNAME=self._interface_type_info.implementation_name(),
+        CLASSNAME=class_name,
         EXTENDS=' extends %s' % base_class if base_class else '',
         IMPLEMENTS=implements_str,
         MIXINS=mixins_str,
@@ -673,7 +686,8 @@
     # Write out the JsInterop code.
     if (implementation_members_emitter and
         self._options.templates._conditions['DARTIUM'] and
-        self._options.dart_js_interop):
+        self._options.dart_js_interop and
+        not IsPureInterface(self._interface.id)):
       implementation_members_emitter.Emit(js_interop_wrapper)
 
     if isElement and self._interface.id != 'Element':
@@ -980,7 +994,7 @@
       return self._AddConvertingSetter(attr, html_name, conversion)
     self._members_emitter.Emit(
         # TODO(sra): Use metadata to provide native name.
-        '\n  void set $HTML_NAME($TYPE value) {'
+        '\n  set $HTML_NAME($TYPE value) {'
         '\n    JS("void", "#.$NAME = #", this, value);'
         '\n  }'
         '\n',
@@ -1007,10 +1021,10 @@
   def _AddConvertingSetter(self, attr, html_name, conversion):
     self._members_emitter.Emit(
         # TODO(sra): Use metadata to provide native name.
-        '\n  void set $HTML_NAME($INPUT_TYPE value) {'
+        '\n  set $HTML_NAME($INPUT_TYPE value) {'
         '\n    this._set_$HTML_NAME = $CONVERT(value);'
         '\n  }'
-        '\n  void set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {'
+        '\n  set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {'
         '\n    JS("void", "#.$NAME = #", this, value);'
         '\n  }'
         '\n',
@@ -1059,53 +1073,6 @@
         NAME=html_name,
         PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
 
-  def _ConvertArgumentTypes(
-          self, stmts_emitter, arguments, argument_count, info):
-    temp_version = [0]
-    converted_arguments = []  
-    target_parameters = []
-    for position, arg in enumerate(arguments[:argument_count]):
-      conversion = self._InputConversion(arg.type.id, info.declared_name)
-      param_name = arguments[position].id
-      if conversion:
-        temp_version[0] += 1
-        temp_name = '%s_%s' % (param_name, temp_version[0])
-        temp_type = conversion.output_type
-        stmts_emitter.Emit(
-            '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n',
-            TYPE=TypeOrVar(temp_type),
-            NAME=temp_name,
-            CONVERT=conversion.function_name,
-            ARG=info.param_infos[position].name)
-        converted_arguments.append(temp_name)
-        param_type = temp_type
-        verified_type = temp_type  # verified by assignment in checked mode.
-      else:
-        converted_arguments.append(info.param_infos[position].name)
-        param_type = self._NarrowInputType(arg.type.id)
-        # Verified by argument checking on entry to the dispatcher.
-
-        verified_type = self._InputType(
-            info.param_infos[position].type_id, info)
-        # The native method does not need an argument type if we know the type.
-        # But we do need the native methods to have correct function types, so
-        # be conservative.
-        if param_type == verified_type:
-          if param_type in ['String', 'num', 'int', 'double', 'bool', 'Object']:
-            param_type = 'dynamic'
-
-      target_parameters.append(
-          '%s%s' % (TypeOrNothing(param_type), param_name))
-
-    return target_parameters, converted_arguments
-
-  def _InputType(self, type_name, info):
-    conversion = self._InputConversion(type_name, info.declared_name)
-    if conversion:
-      return conversion.input_type
-    else:
-      return self._NarrowInputType(type_name) if type_name else 'dynamic'
-
   def _AddOperationWithConversions(self, info, html_name):
     # Assert all operations have same return type.
     assert len(set([op.type.id for op in info.operations])) == 1
@@ -1346,10 +1313,14 @@
       items = self._typeMap.items()
       items.sort()
       for (idl_name, dart_name) in items:
-        function_emitter.Emit(
-          "  '$IDL_NAME': () => $DART_NAME.internalCreate$DART_NAME,\n",
-          IDL_NAME=idl_name,
-          DART_NAME=dart_name)
+        # DOMStringMap is in the abstract list but is used as a concrete class
+        # in Dartium.
+        if not IsPureInterface(idl_name):
+          # Handle classes that are concrete (abstract can't be instantiated).
+          function_emitter.Emit(
+            "  '$IDL_NAME': () => $DART_NAME.internalCreate$DART_NAME,\n",
+            IDL_NAME=idl_name,
+            DART_NAME=dart_name)
       if self._dart_path.endswith('html_dartium.dart'):
         function_emitter.Emit("  'polymer-element': () => HtmlElement.internalCreateHtmlElement,\n")
 
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 99e511a..7177bc5 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -394,8 +394,8 @@
   def CustomJSMembers(self):
     return {}
 
-  def _InputConversion(self, type_name, info):
-    return None
+  def _InputConversion(self, idl_type, member):
+    return FindConversion(idl_type, 'set', self._interface.id, member)
 
   def GenerateCallback(self, info):
     if IsPureInterface(self._interface.id) or IsCustomType(self._interface.id):
@@ -645,7 +645,7 @@
         self._members_emitter.Emit(
             '\n  @DocsEditable()\n'
             '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
-            '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
+            'wrap_jso($TOPLEVEL_NAME($OUTPARAMETERS));\n',
             INTERFACE_NAME=self._interface_type_info.interface_name(),
             FACTORY_METHOD_NAME=factory_method_name,
             PARAMETERS=typed_formals,
@@ -914,7 +914,7 @@
     if self._interface.id == 'ImageData' and html_name == 'data':
       html_name = '_data'
     type_info = self._TypeInfo(attr.type.id)
-    return_type = self.SecureOutputType(attr.type.id, False, read_only)
+    return_type = self.SecureOutputType(attr.type.id, False, False if self._dart_use_blink else True)
     parameters = []
     dart_declaration = '%s get %s' % (return_type, html_name)
     is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
@@ -932,8 +932,7 @@
         #    - type is Object
         #
         # JsObject maybe stored in the Dart class.
-        return_wrap_jso = (isinstance(type_info, InterfaceIDLTypeInfo) or
-                           not(type_info) or attr.type.id == 'Object')
+        return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id, self._type_registry)
     wrap_unwrap_list.append(return_wrap_jso)       # wrap_jso the returned object
     wrap_unwrap_list.append(self._dart_use_blink)  # this must be unwrap_jso
 
@@ -996,7 +995,7 @@
                                           not(attr.type.id) or ptype == 'Object')
                   else 'value']
 
-    dart_declaration = 'void set %s(%s value)' % (html_name, ptype)
+    dart_declaration = 'set %s(%s value)' % (html_name, ptype)
     is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
                                      _IsCustomValue(attr, 'Setter'))
     # This seems to have been replaced with Custom=Setter (see above), but
@@ -1086,7 +1085,8 @@
       # Does nativeIndexGetter return a DartClass (JsObject) if so wrap_jso.
       wrap_jso_start = ''
       wrap_jso_end = ''
-      if isinstance(type_info, InterfaceIDLTypeInfo):
+      if (isinstance(type_info, InterfaceIDLTypeInfo) or
+          wrap_type_blink(type_info.narrow_dart_type(), self._type_registry)):
           wrap_jso_start = 'wrap_jso('
           wrap_jso_end = ')'
       blinkNativeIndexed = """
@@ -1097,7 +1097,7 @@
   }
 
   $TYPE _nativeIndexedGetter(int index) => %s$(DART_NATIVE_NAME)(unwrap_jso(this), index)%s;
- """ % (wrap_jso_start, wrap_jso_end, wrap_jso_start, wrap_jso_end)
+""" % (wrap_jso_start, wrap_jso_end, wrap_jso_start, wrap_jso_end)
       # Wrap the type to store the JsObject if Type is:
       #
       #    - known IDL type
@@ -1189,11 +1189,14 @@
     Arguments:
       info: An OperationInfo object.
     """
-    return_type = self.SecureOutputType(info.type_name, False, True)
+    return_type = self.SecureOutputType(info.type_name, False, False if dart_js_interop else True)
 
     formals = info.ParametersAsDeclaration(self._DartType)
 
-    parameters = info.ParametersAsListOfVariables(None, self._type_registry if self._dart_use_blink else None, dart_js_interop)
+    parameters = info.ParametersAsListOfVariables(None,
+                                                  self._type_registry if self._dart_use_blink else None,
+                                                  dart_js_interop,
+                                                  self)
     dart_declaration = '%s%s %s(%s)' % (
         'static ' if info.IsStatic() else '',
         return_type,
@@ -1219,11 +1222,15 @@
         #    - type is Object
         #
         # JsObject maybe stored in the Dart class.
-        return_wrap_jso = (info.wrap_unwrap_type_blink(return_type, self._type_registry) or
-                           return_type == 'Rectangle' or
-                           info.wrap_unwrap_list_blink(return_type, self._type_registry))
-    wrap_unwrap_list.append(return_wrap_jso)       # wrap_jso the returned object
-    wrap_unwrap_list.append(self._dart_use_blink)  # The 'this' parameter must be unwrap_jso
+        return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, self._type_registry)
+        return_type_info = self._type_registry.TypeInfo(info.type_name)
+        if (isinstance(return_type_info, SequenceIDLTypeInfo) and
+            not isinstance(return_type_info._item_info, PrimitiveIDLTypeInfo)):
+                return_wrap_jso = True
+    # wrap_jso the returned object
+    wrap_unwrap_list.append(return_wrap_jso)
+    # The 'this' parameter must be unwrap_jso
+    wrap_unwrap_list.append(self._dart_use_blink)
 
     if info.callback_args:
       self._AddFutureifiedOperation(info, html_name)
@@ -1252,14 +1259,15 @@
       native_suffix = 'Callback'
       actuals = info.ParametersAsListOfVariables(argument_count,
                                                  self._type_registry if self._dart_use_blink else None,
-                                                 self._dart_js_interop)
+                                                 self._dart_js_interop,
+                                                 self)
       actuals_s = ", ".join(actuals)
       formals=actuals
       return_type = self.SecureOutputType(operation.type.id)
 
       return_wrap_jso = False
       if self._dart_use_blink:
-         return_wrap_jso = self._type_registry.HasInterface(return_type)
+          return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, self._type_registry)
 
       native_suffix = 'Callback'
       is_custom = _IsCustom(operation)
@@ -1742,19 +1750,19 @@
   '''
                 if return_type == 'Rectangle':
                     jso_util_method = 'make_dart_rectangle'
-                # TODO(terry): More checks that the return is a List<Node>.
-                elif return_type.startswith('List<'):
-                    jso_util_method = 'wrap_jso_list'
-                else:
+                elif wrap_unwrap_list[0]:
                     jso_util_method = 'wrap_jso'
+
                 # Always return List<String> unwrapped.
                 if return_type != 'List<String>':
                   emit_template = emit_jso_template % jso_util_method
-            caller_emitter.Emit(emit_template,
-                                METADATA=metadata,
-                                DART_DECLARATION=dart_declaration,
-                                DART_NAME=full_dart_name,
-                                ACTUALS=actuals)
+
+            if caller_emitter:
+              caller_emitter.Emit(emit_template,
+                                  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/CssRectangle.dart b/tools/dom/src/CssRectangle.dart
index e82ddd9..440bebe 100644
--- a/tools/dom/src/CssRectangle.dart
+++ b/tools/dom/src/CssRectangle.dart
@@ -27,7 +27,7 @@
    * `height` function in jQuery and the calculated `height` CSS value,
    * converted to a num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     if (newHeight is Dimension) {
       if (newHeight.value < 0) newHeight = new Dimension.px(0);
       _element.style.height = newHeight.toString();
@@ -45,7 +45,7 @@
    * and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     if (newWidth is Dimension) {
       if (newWidth.value < 0) newWidth = new Dimension.px(0);
       _element.style.width = newWidth.toString();
@@ -80,7 +80,7 @@
    * function in jQuery and the calculated `height` CSS value, converted to a
    * num in pixels.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     _elementList.forEach((e) => e.contentEdge.height = newHeight);
   }
 
@@ -90,7 +90,7 @@
    * This is equivalent to the `width` function in jQuery and the calculated
    * `width` CSS value, converted to a dimensionless num in pixels.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     _elementList.forEach((e) => e.contentEdge.width = newWidth);
   }
 }
@@ -197,7 +197,7 @@
    *
    * Note that only the content height can actually be set via this method.
    */
-  void set height(newHeight) {
+  set height(newHeight) {
     throw new UnsupportedError("Can only set height for content rect.");
   }
 
@@ -211,7 +211,7 @@
    *
    * Note that only the content width can be set via this method.
    */
-  void set width(newWidth) {
+  set width(newWidth) {
     throw new UnsupportedError("Can only set width for content rect.");
   }
 
diff --git a/tools/dom/src/Html5NodeValidator.dart b/tools/dom/src/Html5NodeValidator.dart
index a5e0e57..c935d07 100644
--- a/tools/dom/src/Html5NodeValidator.dart
+++ b/tools/dom/src/Html5NodeValidator.dart
@@ -423,11 +423,11 @@
   }
 
   bool allowsElement(Element element) {
-    return _allowedElements.contains(element.tagName);
+    return _allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     var validator = _attributeValidators['$tagName::$attributeName'];
     if (validator == null) {
       validator = _attributeValidators['*::$attributeName'];
diff --git a/tools/dom/src/NodeValidatorBuilder.dart b/tools/dom/src/NodeValidatorBuilder.dart
index 4a41232..f884cae 100644
--- a/tools/dom/src/NodeValidatorBuilder.dart
+++ b/tools/dom/src/NodeValidatorBuilder.dart
@@ -358,11 +358,11 @@
   }
 
   bool allowsElement(Element element) {
-    return allowedElements.contains(element.tagName);
+    return allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
-    var tagName = element.tagName;
+    var tagName = element._safeTagName;
     if (allowedUriAttributes.contains('$tagName::$attributeName')) {
       return uriPolicy.allowsUri(value);
     } else if (allowedUriAttributes.contains('*::$attributeName')) {
@@ -403,10 +403,10 @@
       var isAttr = element.attributes['is'];
       if (isAttr != null) {
         return allowedElements.contains(isAttr.toUpperCase()) &&
-          allowedElements.contains(element.tagName);
+          allowedElements.contains(element._safeTagName);
       }
     }
-    return allowCustomTag && allowedElements.contains(element.tagName);
+    return allowCustomTag && allowedElements.contains(element._safeTagName);
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
@@ -462,7 +462,7 @@
     // foreignobject tag as SvgElement. We don't want foreignobject contents
     // anyway, so just remove the whole tree outright. And we can't rely
     // on IE recognizing the SvgForeignObject type, so go by tagName. Bug 23144
-    if (element is svg.SvgElement && element.tagName == 'foreignObject') {
+    if (element is svg.SvgElement && element._safeTagName == 'foreignObject') {
       return false;
     }
     if (element is svg.SvgElement) {
diff --git a/tools/dom/src/Validators.dart b/tools/dom/src/Validators.dart
index 809f8e5..11cb3d0 100644
--- a/tools/dom/src/Validators.dart
+++ b/tools/dom/src/Validators.dart
@@ -72,7 +72,7 @@
   /**
    * A sanitizer for trees that we trust. It does no validation and allows
    * any elements. It is also more efficient, since it can pass the text
-   * directly through to the underlying APIs without creating a document 
+   * directly through to the underlying APIs without creating a document
    * fragment to be sanitized.
    */
   static const trusted = const _TrustedHtmlTreeSanitizer();
@@ -87,7 +87,7 @@
 
   sanitizeTree(Node node) {}
 }
-  
+
 /**
  * Defines the policy for what types of uris are allowed for particular
  * attribute values.
@@ -141,14 +141,14 @@
 
   bool allowsElement(Element element) {
     if (!validator.allowsElement(element)) {
-      throw new ArgumentError(element.tagName);
+      throw new ArgumentError(element._safeTagName);
     }
     return true;
   }
 
   bool allowsAttribute(Element element, String attributeName, String value) {
     if (!validator.allowsAttribute(element, attributeName, value)) {
-      throw new ArgumentError('${element.tagName}[$attributeName="$value"]');
+      throw new ArgumentError('${element._safeTagName}[$attributeName="$value"]');
     }
   }
 }
@@ -213,10 +213,7 @@
     try {
       elementText = element.toString();
     } catch(e) {}
-    var elementTagName = 'element tag unavailable';
-    try {
-      elementTagName = element.tagName;
-    } catch(e) {}
+    var elementTagName = element._safeTagName;
     _sanitizeElement(element, parent, corrupted, elementText, elementTagName,
         attrs, isAttr);
   }
diff --git a/tools/dom/src/WrappedList.dart b/tools/dom/src/WrappedList.dart
index 375ce7c..fd3ca95 100644
--- a/tools/dom/src/WrappedList.dart
+++ b/tools/dom/src/WrappedList.dart
@@ -34,7 +34,7 @@
 
   void operator []=(int index, E value) { _list[index] = value; }
 
-  void set length(int newLength) { _list.length = newLength; }
+  set length(int newLength) { _list.length = newLength; }
 
   void sort([int compare(E a, E b)]) { _list.sort(compare); }
 
diff --git a/tools/dom/src/_chrome/app_runtime.dart b/tools/dom/src/_chrome/app_runtime.dart
index 31aa9cd..03658f0 100644
--- a/tools/dom/src/_chrome/app_runtime.dart
+++ b/tools/dom/src/_chrome/app_runtime.dart
@@ -32,14 +32,14 @@
   /// FileEntry for the file.
   FileEntry get entry => JS('FileEntry', '#.entry', this._jsObject);
 
-  void set entry(FileEntry entry) {
+  set entry(FileEntry entry) {
     JS('void', '#.entry = #', this._jsObject, convertArgument(entry));
   }
 
   /// The MIME type of the file.
   String get type => JS('String', '#.type', this._jsObject);
 
-  void set type(String type) {
+  set type(String type) {
     JS('void', '#.type = #', this._jsObject, type);
   }
 
@@ -67,7 +67,7 @@
   /// The id of the file handler that the app is being invoked with.
   String get id => JS('String', '#.id', this._jsObject);
 
-  void set id(String id) {
+  set id(String id) {
     JS('void', '#.id = #', this._jsObject, id);
   }
 
@@ -81,7 +81,7 @@
     return __proxy_items;
   }
 
-  void set items(List<AppRuntimeLaunchItem> items) {
+  set items(List<AppRuntimeLaunchItem> items) {
     JS('void', '#.items = #', this._jsObject, convertArgument(items));
   }
 
diff --git a/tools/dom/src/_chrome/app_window.dart b/tools/dom/src/_chrome/app_window.dart
index 6c62ab0..515061e 100644
--- a/tools/dom/src/_chrome/app_window.dart
+++ b/tools/dom/src/_chrome/app_window.dart
@@ -35,25 +35,25 @@
    */
   int get left => JS('int', '#.left', this._jsObject);
 
-  void set left(int left) {
+  set left(int left) {
     JS('void', '#.left = #', this._jsObject, left);
   }
 
   int get top => JS('int', '#.top', this._jsObject);
 
-  void set top(int top) {
+  set top(int top) {
     JS('void', '#.top = #', this._jsObject, top);
   }
 
   int get width => JS('int', '#.width', this._jsObject);
 
-  void set width(int width) {
+  set width(int width) {
     JS('void', '#.width = #', this._jsObject, width);
   }
 
   int get height => JS('int', '#.height', this._jsObject);
 
-  void set height(int height) {
+  set height(int height) {
     JS('void', '#.height = #', this._jsObject, height);
   }
 
@@ -121,7 +121,7 @@
   /// same id is later opened.
   String get id => JS('String', '#.id', this._jsObject);
 
-  void set id(String id) {
+  set id(String id) {
     JS('void', '#.id = #', this._jsObject, id);
   }
 
@@ -129,7 +129,7 @@
   /// now.)
   int get defaultWidth => JS('int', '#.defaultWidth', this._jsObject);
 
-  void set defaultWidth(int defaultWidth) {
+  set defaultWidth(int defaultWidth) {
     JS('void', '#.defaultWidth = #', this._jsObject, defaultWidth);
   }
 
@@ -137,7 +137,7 @@
   /// now.)
   int get defaultHeight => JS('int', '#.defaultHeight', this._jsObject);
 
-  void set defaultHeight(int defaultHeight) {
+  set defaultHeight(int defaultHeight) {
     JS('void', '#.defaultHeight = #', this._jsObject, defaultHeight);
   }
 
@@ -145,7 +145,7 @@
   /// this now.)
   int get defaultLeft => JS('int', '#.defaultLeft', this._jsObject);
 
-  void set defaultLeft(int defaultLeft) {
+  set defaultLeft(int defaultLeft) {
     JS('void', '#.defaultLeft = #', this._jsObject, defaultLeft);
   }
 
@@ -153,77 +153,77 @@
   /// this now.)
   int get defaultTop => JS('int', '#.defaultTop', this._jsObject);
 
-  void set defaultTop(int defaultTop) {
+  set defaultTop(int defaultTop) {
     JS('void', '#.defaultTop = #', this._jsObject, defaultTop);
   }
 
   /// Width of the window. (Deprecated; use 'bounds'.)
   int get width => JS('int', '#.width', this._jsObject);
 
-  void set width(int width) {
+  set width(int width) {
     JS('void', '#.width = #', this._jsObject, width);
   }
 
   /// Height of the window. (Deprecated; use 'bounds'.)
   int get height => JS('int', '#.height', this._jsObject);
 
-  void set height(int height) {
+  set height(int height) {
     JS('void', '#.height = #', this._jsObject, height);
   }
 
   /// X coordinate of the window. (Deprecated; use 'bounds'.)
   int get left => JS('int', '#.left', this._jsObject);
 
-  void set left(int left) {
+  set left(int left) {
     JS('void', '#.left = #', this._jsObject, left);
   }
 
   /// Y coordinate of the window. (Deprecated; use 'bounds'.)
   int get top => JS('int', '#.top', this._jsObject);
 
-  void set top(int top) {
+  set top(int top) {
     JS('void', '#.top = #', this._jsObject, top);
   }
 
   /// Minimum width for the lifetime of the window.
   int get minWidth => JS('int', '#.minWidth', this._jsObject);
 
-  void set minWidth(int minWidth) {
+  set minWidth(int minWidth) {
     JS('void', '#.minWidth = #', this._jsObject, minWidth);
   }
 
   /// Minimum height for the lifetime of the window.
   int get minHeight => JS('int', '#.minHeight', this._jsObject);
 
-  void set minHeight(int minHeight) {
+  set minHeight(int minHeight) {
     JS('void', '#.minHeight = #', this._jsObject, minHeight);
   }
 
   /// Maximum width for the lifetime of the window.
   int get maxWidth => JS('int', '#.maxWidth', this._jsObject);
 
-  void set maxWidth(int maxWidth) {
+  set maxWidth(int maxWidth) {
     JS('void', '#.maxWidth = #', this._jsObject, maxWidth);
   }
 
   /// Maximum height for the lifetime of the window.
   int get maxHeight => JS('int', '#.maxHeight', this._jsObject);
 
-  void set maxHeight(int maxHeight) {
+  set maxHeight(int maxHeight) {
     JS('void', '#.maxHeight = #', this._jsObject, maxHeight);
   }
 
   /// Type of window to create.
   String get type => JS('String', '#.type', this._jsObject);
 
-  void set type(String type) {
+  set type(String type) {
     JS('void', '#.type = #', this._jsObject, type);
   }
 
   /// Frame type: 'none' or 'chrome' (defaults to 'chrome').
   String get frame => JS('String', '#.frame', this._jsObject);
 
-  void set frame(String frame) {
+  set frame(String frame) {
     JS('void', '#.frame = #', this._jsObject, frame);
   }
 
@@ -232,7 +232,7 @@
   /// before, the remembered bounds of the window will be used instead.
   AppWindowBounds get bounds => new AppWindowBounds._proxy(JS('', '#.bounds', this._jsObject));
 
-  void set bounds(AppWindowBounds bounds) {
+  set bounds(AppWindowBounds bounds) {
     JS('void', '#.bounds = #', this._jsObject, convertArgument(bounds));
   }
 
@@ -240,7 +240,7 @@
   /// experimental API permission.
   bool get transparentBackground => JS('bool', '#.transparentBackground', this._jsObject);
 
-  void set transparentBackground(bool transparentBackground) {
+  set transparentBackground(bool transparentBackground) {
     JS('void', '#.transparentBackground = #', this._jsObject, transparentBackground);
   }
 
@@ -248,7 +248,7 @@
   /// fullscreen, maximized, or minimized. Defaults to 'normal'.
   String get state => JS('String', '#.state', this._jsObject);
 
-  void set state(String state) {
+  set state(String state) {
     JS('void', '#.state = #', this._jsObject, state);
   }
 
@@ -256,14 +256,14 @@
   /// window to show it once it has been created. Defaults to false.
   bool get hidden => JS('bool', '#.hidden', this._jsObject);
 
-  void set hidden(bool hidden) {
+  set hidden(bool hidden) {
     JS('void', '#.hidden = #', this._jsObject, hidden);
   }
 
   /// If true, the window will be resizable by the user. Defaults to true.
   bool get resizable => JS('bool', '#.resizable', this._jsObject);
 
-  void set resizable(bool resizable) {
+  set resizable(bool resizable) {
     JS('void', '#.resizable = #', this._jsObject, resizable);
   }
 
@@ -274,7 +274,7 @@
   /// property to false.
   bool get singleton => JS('bool', '#.singleton', this._jsObject);
 
-  void set singleton(bool singleton) {
+  set singleton(bool singleton) {
     JS('void', '#.singleton = #', this._jsObject, singleton);
   }
 
diff --git a/tools/dom/src/_chrome/file_system.dart b/tools/dom/src/_chrome/file_system.dart
index b3d532a..83212c5 100644
--- a/tools/dom/src/_chrome/file_system.dart
+++ b/tools/dom/src/_chrome/file_system.dart
@@ -37,7 +37,7 @@
   /// *.htm").
   String get description => JS('String', '#.description', this._jsObject);
 
-  void set description(String description) {
+  set description(String description) {
     JS('void', '#.description = #', this._jsObject, description);
   }
 
@@ -45,14 +45,14 @@
   /// extensions must contain at least one valid element.
   List<String> get mimeTypes => JS('List<String>', '#.mimeTypes', this._jsObject);
 
-  void set mimeTypes(List<String> mimeTypes) {
+  set mimeTypes(List<String> mimeTypes) {
     JS('void', '#.mimeTypes = #', this._jsObject, mimeTypes);
   }
 
   /// Extensions to accept, e.g. "jpg", "gif", "crx".
   List<String> get extensions => JS('List<String>', '#.extensions', this._jsObject);
 
-  void set extensions(List<String> extensions) {
+  set extensions(List<String> extensions) {
     JS('void', '#.extensions = #', this._jsObject, extensions);
   }
 
@@ -84,7 +84,7 @@
   /// Type of the prompt to show. The default is 'openFile'.
   String get type => JS('String', '#.type', this._jsObject);
 
-  void set type(String type) {
+  set type(String type) {
     JS('void', '#.type = #', this._jsObject, type);
   }
 
@@ -92,7 +92,7 @@
   /// name to read or write. This is optional.
   String get suggestedName => JS('String', '#.suggestedName', this._jsObject);
 
-  void set suggestedName(String suggestedName) {
+  set suggestedName(String suggestedName) {
     JS('void', '#.suggestedName = #', this._jsObject, suggestedName);
   }
 
@@ -108,7 +108,7 @@
     return __proxy_accepts;
   }
 
-  void set accepts(List<FilesystemAcceptOption> accepts) {
+  set accepts(List<FilesystemAcceptOption> accepts) {
     JS('void', '#.accepts = #', this._jsObject, convertArgument(accepts));
   }
 
@@ -117,7 +117,7 @@
   /// contains no valid entries, this will always be reset to true.
   bool get acceptsAllTypes => JS('bool', '#.acceptsAllTypes', this._jsObject);
 
-  void set acceptsAllTypes(bool acceptsAllTypes) {
+  set acceptsAllTypes(bool acceptsAllTypes) {
     JS('void', '#.acceptsAllTypes = #', this._jsObject, acceptsAllTypes);
   }
 
diff --git a/tools/dom/src/_chrome/utils.dart b/tools/dom/src/_chrome/utils.dart
index b88019c..6770113 100644
--- a/tools/dom/src/_chrome/utils.dart
+++ b/tools/dom/src/_chrome/utils.dart
@@ -117,27 +117,27 @@
    */
   String get id => JS('String', '#.id', this._jsObject);
 
-  void set id(String id) {
+  set id(String id) {
     JS('void', '#.id = #', this._jsObject, id);
   }
 
   // TODO(sashab): Wrap these generic Lists somehow.
   List get conditions => JS('List', '#.conditions', this._jsObject);
 
-  void set conditions(List conditions) {
+  set conditions(List conditions) {
     JS('void', '#.conditions = #', this._jsObject, convertArgument(conditions));
   }
 
   // TODO(sashab): Wrap these generic Lists somehow.
   List get actions => JS('List', '#.actions', this._jsObject);
 
-  void set actions(List actions) {
+  set actions(List actions) {
     JS('void', '#.actions = #', this._jsObject, convertArgument(actions));
   }
 
   int get priority => JS('int', '#.priority', this._jsObject);
 
-  void set priority(int priority) {
+  set priority(int priority) {
     JS('void', '#.priority = #', this._jsObject, priority);
   }
 
diff --git a/tools/dom/src/dart2js_DOMImplementation.dart b/tools/dom/src/dart2js_DOMImplementation.dart
index dd82ad8..24e6a6c 100644
--- a/tools/dom/src/dart2js_DOMImplementation.dart
+++ b/tools/dom/src/dart2js_DOMImplementation.dart
@@ -83,7 +83,7 @@
   // properly.  Its fields and methods can only be accessed via JavaScript.
   var _location;
 
-  void set href(String val) => _setHref(_location, val);
+  set href(String val) => _setHref(_location, val);
   static void _setHref(location, val) {
     JS('void', '#.href = #', location, val);
   }
diff --git a/tools/dom/src/dartium_KeyEvent.dart b/tools/dom/src/dartium_KeyEvent.dart
index 2d133d3..b93feeb 100644
--- a/tools/dom/src/dartium_KeyEvent.dart
+++ b/tools/dom/src/dartium_KeyEvent.dart
@@ -29,6 +29,13 @@
 
 @Experimental()
 class KeyEvent extends _WrappedEvent implements KeyboardEvent {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   /** The parent KeyboardEvent that this KeyEvent is wrapping and "fixing". */
   KeyboardEvent _parent;
 
diff --git a/tools/dom/src/dartium_WrappedEvent.dart b/tools/dom/src/dartium_WrappedEvent.dart
index 2f7b8b8..9fa56fd 100644
--- a/tools/dom/src/dartium_WrappedEvent.dart
+++ b/tools/dom/src/dartium_WrappedEvent.dart
@@ -8,6 +8,13 @@
  * Helper class to implement custom events which wrap DOM events.
  */
 class _WrappedEvent implements Event {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   final Event wrapped;
 
   /** The CSS selector involved with event delegation. */
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 34c032b..9f74d3e 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -187,9 +187,7 @@
     return element;
   }
 
-  // TODO(terry): Enable below for Dartium w/ interop and remove other static window().
-  // static window() => wrap_jso(_blink.Blink_Utils.window()['window']);
-  static window() => _blink.Blink_Utils.window();
+  static window() => wrap_jso(js.context['window']);
 
   static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   static void spawnDomHelper(Function f, int replyTo) =>
@@ -806,15 +804,19 @@
   static Element createElement(Document document, String tagName) =>
     wrap_jso(_blink.Blink_Utils.createElement(unwrap_jso(document), tagName));
 
-  static void initializeCustomElement(HtmlElement element) =>
-    _blink.Blink_Utils.initializeCustomElement(unwrap_jso(element));
-
   static Element changeElementWrapper(HtmlElement element, Type type) =>
     _blink.Blink_Utils.changeElementWrapper(unwrap_jso(element), type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
     WindowBase {
+  /** Needed because KeyboardEvent is implements.
+   *  TODO(terry): Consider making blink_jsObject private (add underscore) for
+   *               all blink_jsObject.  Then needed private wrap/unwrap_jso
+   *               functions that delegate to a public wrap/unwrap_jso.
+   */
+  js.JsObject blink_jsObject;
+
   _DOMWindowCrossFrame.internal();
 
   // Fields.
@@ -873,7 +875,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
+  set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -1109,10 +1111,6 @@
   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/templates/html/dart2js/html_dart2js.darttemplate b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
index e12a06c..952f556 100644
--- a/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/html_dart2js.darttemplate
@@ -34,7 +34,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:_internal' hide Symbol;
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:isolate';
@@ -52,7 +52,7 @@
 import 'dart:web_sql';
 import 'dart:_js_helper' show
     convertDartClosureToJS, Creates, JavaScriptIndexingBehavior,
-    JSName, Native, Null, Returns, Inline, ForceInline,
+    JSName, Native, Returns, ForceInline,
     findDispatchTagForInterceptorClass, setNativeSubclassDispatchRecord,
     makeLeafDispatchRecord;
 import 'dart:_interceptors' show
diff --git a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
index 43a18e5..128f945 100644
--- a/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/indexed_db_dart2js.darttemplate
@@ -85,7 +85,7 @@
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, Returns, JSName, Native, Null;
+import 'dart:_js_helper' show Creates, Returns, JSName, Native;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 
diff --git a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
index 7fc18ae..f36b929 100644
--- a/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/svg_dart2js.darttemplate
@@ -14,7 +14,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_js_helper' show Creates, Returns, JSName, Native;
diff --git a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
index 5aef22c..2959405 100644
--- a/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_audio_dart2js.darttemplate
@@ -9,7 +9,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_native_typed_data';
diff --git a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
index 107c1f6..c6d31c0 100644
--- a/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_gl_dart2js.darttemplate
@@ -8,12 +8,12 @@
 library dart.dom.web_gl;
 
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_native_typed_data';
 import 'dart:typed_data';
-import 'dart:_js_helper' show Creates, JSName, Native, Null, Returns, convertDartClosureToJS;
+import 'dart:_js_helper' show Creates, JSName, Native, Returns, convertDartClosureToJS;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show Interceptor, JSExtendableArray;
 
diff --git a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
index 4555e4d..2de24a0 100644
--- a/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
+++ b/tools/dom/templates/html/dart2js/web_sql_dart2js.darttemplate
@@ -16,7 +16,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:_js_helper' show convertDartClosureToJS, Creates, JSName, Native;
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index c6a200f..b15dab2 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -33,7 +33,7 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide Symbol, deprecated;
+import 'dart:_internal' hide Symbol;
 import 'dart:html_common';
 import 'dart:indexed_db';
 import 'dart:indexed_db' show indexed_dbBlinkMap;
@@ -250,7 +250,6 @@
   return null;
 }
 
-
 $if JSINTEROP
 // FIXME: Can we make this private?
 final htmlBlinkFunctionMap = {
@@ -303,42 +302,42 @@
   return null;
 }
 
-Type _getHtmlFunction(String key) {
+Function _getHtmlFunction(String key) {
   if (htmlBlinkFunctionMap.containsKey(key)) {
     return htmlBlinkFunctionMap[key]();
   }
   return null;
 }
 
-Type _getWebGlFunction(String key) {
+Function _getWebGlFunction(String key) {
   if (web_glBlinkFunctionMap.containsKey(key)) {
     return web_glBlinkFunctionMap[key]();
   }
   return null;
 }
 
-Type _getIndexDbFunction(String key) {
+Function _getIndexDbFunction(String key) {
   if (indexed_dbBlinkFunctionMap.containsKey(key)) {
     return indexed_dbBlinkFunctionMap[key]();
   }
   return null;
 }
 
-Type _getWebAudioFunction(String key) {
+Function _getWebAudioFunction(String key) {
   if (web_audioBlinkFunctionMap.containsKey(key)) {
     return web_audioBlinkFunctionMap[key]();
   }
   return null;
 }
 
-Type _getWebSqlFunction(String key) {
+Function _getWebSqlFunction(String key) {
   if (web_sqlBlinkFunctionMap.containsKey(key)) {
     return web_sqlBlinkFunctionMap[key]();
   }
   return null;
 }
 
-Type _getSvgFunction(String key) {
+Function _getSvgFunction(String key) {
   if (svgBlinkFunctionMap.containsKey(key)) {
     return svgBlinkFunctionMap[key]();
   }
@@ -352,8 +351,17 @@
  **********                                                          **********
  ******************************************************************************/
 
-Rectangle make_dart_rectangle(r) => new Rectangle(r['top'], r['left'], r['width'], r['height']);
+Rectangle make_dart_rectangle(r) =>
+    r == null ? null : new Rectangle(r['left'], r['top'], r['width'], r['height']);
 
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
+// Flag to disable JS interop asserts.  Setting to false will speed up the
+// wrap_jso calls.
+bool __interop_checks = true;
 
 /** Expando for JsObject, used by every Dart class associated with a Javascript
  *  class (e.g., DOM, WebAudio, etc.).
@@ -362,47 +370,108 @@
 /**
  * Return the JsObject associated with a Dart class [dartClass_instance].
  */
-js.JsObject unwrap_jso(dartClass_instance) {
+unwrap_jso(dartClass_instance) {
   try {
-      if (dartClass_instance != null)
-          return dartClass_instance is! Function ? dartClass_instance.blink_jsObject : dartClass_instance;
-      else
-          return null;
-//      return dartClass_instance.dartium_expando[dartClass_instance.expandoJsObject];
+    if (dartClass_instance != null)
+      return dartClass_instance is NativeFieldWrapperClass2 ?
+          dartClass_instance.blink_jsObject : dartClass_instance;
+    else
+      return null;
   } catch(NoSuchMethodException) {
-      // No blink_jsObject then return the dartClass_instance is probably an
-      // array that was already converted to a Dart class e.g., Uint8ClampedList.
-      return dartClass_instance;
+    // No blink_jsObject then return the dartClass_instance is probably an
+    // array that was already converted to a Dart class e.g., Uint8ClampedList.
+    return dartClass_instance;
   }
 }
 
 /**
  * Create Dart class that maps to the JS Type, add the JsObject as an expando
- * on the Dart class and return the created Dart class. 
+ * on the Dart class and return the created Dart class.
  */
 wrap_jso(jsObject) {
-try {
-//  debug_or_assert("jsObject != null", jsObject != null);
-  if (jsObject is! js.JsObject) {
+  try {
+    if (jsObject is! js.JsObject) {
       // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
       return jsObject;
+    }
+    // Try the most general type conversions on it.
+    // TODO(alanknight): We may be able to do better. This maintains identity,
+    // which is useful, but expensive. And if we nest something that only
+    // this conversion handles, how does that work? e.g. a list of maps of elements.
+    var converted = convertNativeToDart_SerializedScriptValue(jsObject);
+    if (!identical(converted, jsObject)) {
+      return converted;
+    }
+    var constructor = jsObject['constructor'];
+    if (__interop_checks) {
+      debug_or_assert("constructor != null", constructor != null);
+    }
+    var jsTypeName = constructor['name'];
+    if (__interop_checks) {
+      debug_or_assert("constructor != null && jsTypeName.length > 0", constructor != null && jsTypeName.length > 0);
+    }
+
+    var dartClass_instance;
+    if (jsObject.hasProperty('dart_class')) {
+      // Got a dart_class (it's a custom element) use it it's already set up.
+      dartClass_instance = jsObject['dart_class'];
+    } else {
+      var func = getHtmlCreateFunction(jsTypeName);
+      if (func != null) {
+        dartClass_instance = func();
+        dartClass_instance.blink_jsObject = jsObject;
+      }
+    }
+    return dartClass_instance;
+  } catch(e, stacktrace){
+    if (__interop_checks) {
+      if (e is DebugAssertException)
+        window.console.log("${e.message}\n ${stacktrace}");
+      else
+        window.console.log("${stacktrace}");
+    }
   }
-  var constructor = jsObject['constructor'];
-  debug_or_assert("constructor != null", constructor != null);
-  var jsTypeName = constructor['name'];
-  debug_or_assert("constructor != null && jsTypeName.length > 0", constructor != null && jsTypeName.length > 0);
-  var func = getHtmlCreateFunction(jsTypeName);
-  debug_or_assert("func != null name = ${jsTypeName}", func != null);
-  var dartClass_instance = func();
-  dartClass_instance.blink_jsObject = jsObject;
-//  dartClass_instance.dartium_expando[dartClass_instance.expandoJsObject] = jsObject;
-  return dartClass_instance;
-} catch(e, stacktrace){
-  if (e is DebugAssertException)
-    window.console.log("${e.message}\n ${stacktrace}");
-  else
-    window.console.log("${stacktrace}");
+
+  return null;
 }
+
+/**
+ * Create Dart class that maps to the JS Type that is the JS type being
+ * extended using JS interop createCallback (we need the base type of the
+ * custom element) not the Dart created constructor.
+ */
+wrap_jso_custom_element(jsObject) {
+  try {
+    if (jsObject is! js.JsObject) {
+      // JS Interop converted the object to a Dart class e.g., Uint8ClampedList.
+      return jsObject;
+    }
+
+    // Find out what object we're extending.
+    var objectName = jsObject.toString();
+    // Expect to see something like '[object HTMLElement]'.
+    if (!objectName.startsWith('[object ')) {
+      return jsObject;
+    }
+
+    var extendsClass = objectName.substring(8, objectName.length - 1);
+    var func = getHtmlCreateFunction(extendsClass);
+    if (__interop_checks)
+      debug_or_assert("func != null name = ${extendsClass}", func != null);
+    var dartClass_instance = func();
+    dartClass_instance.blink_jsObject = jsObject;
+    return dartClass_instance;
+  } catch(e, stacktrace){
+    if (__interop_checks) {
+      if (e is DebugAssertException)
+        window.console.log("${e.message}\n ${stacktrace}");
+      else
+        window.console.log("${stacktrace}");
+    }
+
+    // Problem?
+    return null;
+  }
 }
 
 class DebugAssertException implements Exception {
@@ -416,20 +485,67 @@
   }
 }
 
-// Wrap JsObject node list to return a List<node>.
-List<Node> wrap_jso_list(jso_nodes) {
-  List<Node> nodes = new List<Node>();
-  var collectionLen = jso_nodes['length'];
-  for (var i = 0; i < collectionLen; i++) {
-    nodes.add(wrap_jso(jso_nodes.callMethod('item', [i])));
-  }
-  var frozen_nodes = new _FrozenElementList._wrap(nodes);
-  frozen_nodes.dartClass_instance = jso_nodes;
-  return frozen_nodes;
+// TODO(terry): Manage JS interop JsFunctions for each listener used for add/
+//              removeEventListener.  These JsFunctions will leak look at
+//              fixing with weak-refs in C++.  The key are the hashcodes of the
+//              user's this (this is needed for futures) and listener function.
+Map<int, Map<int, js.JsFunction>> _knownListeners = {};
+
+js.JsFunction wrap_event_listener(theObject, Function listener) {
+  var thisHashCode = theObject.hashCode;
+  var listenerHashCode = identityHashCode(listener);
+
+  _knownListeners.putIfAbsent(thisHashCode, () => new Map<int, js.JsFunction>());
+  _knownListeners[thisHashCode].putIfAbsent(listenerHashCode, () =>
+    new js.JsFunction.withThis((theObject, event) => listener(wrap_jso(event))));
+
+  return _knownListeners[thisHashCode][listenerHashCode];
 }
+
+Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
+  var result = new Map();
+  var keys = js.context['Object'].callMethod('keys', [jsObject]);
+  for (var key in keys) {
+    result[key] = wrap_jso(jsObject[key]);
+  }
+  return result;
+}
+
+// Converts a flat Dart map into a JavaScript object with properties this is
+// is the Dartium only version it uses dart:js.
+// TODO(alanknight): This could probably be unified with the dart2js conversions
+// code in html_common and be more general.
+convertDartToNative_Dictionary(Map dict) {
+  if (dict == null) return null;
+  var jsObject = new js.JsObject(js.context['Object']);
+  dict.forEach((String key, value) {
+    if (value is List) {
+      var jsArray = new js.JsArray();
+      value.forEach((elem) {
+        jsArray.add(elem is Map ? convertDartToNative_Dictionary(elem): elem);
+      });
+      jsObject[key] = jsArray;
+    } else {
+      jsObject[key] = value;
+    }
+  });
+  return jsObject;
+}
+
+// Converts a Dart list into a JsArray. For the Dartium version only.
+convertDartToNative_List(List input) => new js.JsArray()..addAll(input);
+
+// Conversion function place holder (currently not used in dart2js or dartium).
+List convertDartToNative_StringArray(List<String> input) => input;
+
 $else
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
 unwrap_jso(dartClass_instance) => dartClass_instance;
 wrap_jso(jsObject) => jsObject;
-wrap_jso_list(jso_nodes) => jso_nodes;
 make_dart_rectangle(r) => r;
+convertDartToNative_Dictionary(Map dict) => dict;
+List convertDartToNative_StringArray(List<String> input) => input;
+convertDartToNative_List(List input) => input;
+
 $endif
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 62dd7e9..9804405 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -69,7 +69,7 @@
  * and where both the keys and the values are strings.
  *
  * * [dart:web_sql]&mdash;a database that can be queried with SQL.
- * 
+ *
  * For a tutorial about using the indexed_db library with Dart,
  * check out
  * [Use IndexedDB](http://www.dartlang.org/docs/tutorials/indexeddb/).
@@ -84,6 +84,7 @@
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 
 $!GENERATED_DART_FILES
 
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index 6dff8b6..07de26b 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -13,14 +13,20 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 
 part '$AUXILIARY_DIR/shared_SVGFactoryProviders.dart';
 
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
+
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
 final svgBlinkMap = {
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index c79c9d4..15204d6 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -8,12 +8,13 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index 5f12a23..56eee6e 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -8,12 +8,13 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:typed_data';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
 
 part '$AUXILIARY_DIR/WebGLConstants.dart';
 
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 9823042..7c2ffbd 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -1,3 +1,4 @@
+
 // DO NOT EDIT - unless you are editing documentation as per:
 // https://code.google.com/p/dart/wiki/ContributingHTMLDocumentation
 // Auto-generated dart:audio library.
@@ -16,11 +17,17 @@
 
 import 'dart:async';
 import 'dart:collection';
-import 'dart:_internal' hide deprecated;
+import 'dart:_internal';
 import 'dart:html';
 import 'dart:html_common';
 import 'dart:nativewrappers';
 import 'dart:_blink' as _blink;
+import 'dart:js' as js;
+
+// Need a default constructor for constructing classes with mixins that are
+// also extending NativeFieldWrapperClass2.  Defining JsoNativeFieldWrapper
+// extending NativeFieldWrapperClass2 creates a default constructor.
+class JsoNativeFieldWrapper extends NativeFieldWrapperClass2 {}
 
 $!GENERATED_DART_FILES
 // FIXME: Can we make this private?
diff --git a/tools/dom/templates/html/impl/impl_Blob.darttemplate b/tools/dom/templates/html/impl/impl_Blob.darttemplate
index 3542811..0b12452 100644
--- a/tools/dom/templates/html/impl/impl_Blob.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Blob.darttemplate
@@ -25,5 +25,22 @@
 
   static _create_bag() => JS('var', '{}');
   static _bag_set(bag, key, value) { JS('void', '#[#] = #', bag, key, value); }
+$else
+  $if JSINTEROP
+  factory Blob(List blobParts, [String type, String endings]) {
+    // TODO: any coercions on the elements of blobParts, e.g. coerce a typed
+    // array to ArrayBuffer if it is a total view.
+
+    var parts = convertDartToNative_List(blobParts.map(unwrap_jso).toList());
+    if (type == null && endings == null) {
+      return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_1_(parts));
+    }
+    var bag = {};
+    if (type != null) bag['type'] = type;
+    if (endings != null) bag['endings'] = endings;
+    return wrap_jso(_blink.BlinkBlob.instance.constructorCallback_2_(parts,
+        convertDartToNative_Dictionary(bag)));
+  }
+  $endif
 $endif
 }
diff --git a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
index 12caf8c..7cb4628 100644
--- a/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CSSStyleDeclaration.darttemplate
@@ -11,18 +11,8 @@
 
 part of $LIBRARYNAME;
 
-$if DART2JS
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with
     $(CLASSNAME)Base $IMPLEMENTS {
-$else
-  $if JSINTEROP
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS) class $CLASSNAME extends
-    $(CLASSNAME)Base $IMPLEMENTS {
-  $else
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with
-    $(CLASSNAME)Base $IMPLEMENTS {
-  $endif
-$endif
   factory $CLASSNAME() => new CssStyleDeclaration.css('');
 
   factory $CLASSNAME.css(String css) {
@@ -157,7 +147,7 @@
   String get background => this._background;
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     _background = value == null ? '' : value;
   }
   @Returns('String')
@@ -168,7 +158,7 @@
   String get backgroundAttachment => this._backgroundAttachment;
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     _backgroundAttachment = value == null ? '' : value;
   }
   @Returns('String')
@@ -179,7 +169,7 @@
   String get backgroundColor => this._backgroundColor;
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     _backgroundColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -190,7 +180,7 @@
   String get backgroundImage => this._backgroundImage;
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     _backgroundImage = value == null ? '' : value;
   }
   @Returns('String')
@@ -201,7 +191,7 @@
   String get backgroundPosition => this._backgroundPosition;
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     _backgroundPosition = value == null ? '' : value;
   }
   @Returns('String')
@@ -212,7 +202,7 @@
   String get backgroundRepeat => this._backgroundRepeat;
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     _backgroundRepeat = value == null ? '' : value;
   }
   @Returns('String')
@@ -223,7 +213,7 @@
   String get border => this._border;
 
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     _border = value == null ? '' : value;
   }
   @Returns('String')
@@ -234,7 +224,7 @@
   String get borderBottom => this._borderBottom;
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     _borderBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -245,7 +235,7 @@
   String get borderBottomColor => this._borderBottomColor;
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     _borderBottomColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -256,7 +246,7 @@
   String get borderBottomStyle => this._borderBottomStyle;
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     _borderBottomStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -267,7 +257,7 @@
   String get borderBottomWidth => this._borderBottomWidth;
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     _borderBottomWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -278,7 +268,7 @@
   String get borderCollapse => this._borderCollapse;
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     _borderCollapse = value == null ? '' : value;
   }
   @Returns('String')
@@ -289,7 +279,7 @@
   String get borderColor => this._borderColor;
 
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     _borderColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -300,7 +290,7 @@
   String get borderLeft => this._borderLeft;
 
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     _borderLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -311,7 +301,7 @@
   String get borderLeftColor => this._borderLeftColor;
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     _borderLeftColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -322,7 +312,7 @@
   String get borderLeftStyle => this._borderLeftStyle;
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     _borderLeftStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -333,7 +323,7 @@
   String get borderLeftWidth => this._borderLeftWidth;
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     _borderLeftWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -344,7 +334,7 @@
   String get borderRight => this._borderRight;
 
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     _borderRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -355,7 +345,7 @@
   String get borderRightColor => this._borderRightColor;
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     _borderRightColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -366,7 +356,7 @@
   String get borderRightStyle => this._borderRightStyle;
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     _borderRightStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -377,7 +367,7 @@
   String get borderRightWidth => this._borderRightWidth;
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     _borderRightWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -388,7 +378,7 @@
   String get borderSpacing => this._borderSpacing;
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     _borderSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -399,7 +389,7 @@
   String get borderStyle => this._borderStyle;
 
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     _borderStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -410,7 +400,7 @@
   String get borderTop => this._borderTop;
 
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     _borderTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -421,7 +411,7 @@
   String get borderTopColor => this._borderTopColor;
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     _borderTopColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -432,7 +422,7 @@
   String get borderTopStyle => this._borderTopStyle;
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     _borderTopStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -443,7 +433,7 @@
   String get borderTopWidth => this._borderTopWidth;
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     _borderTopWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -454,7 +444,7 @@
   String get borderWidth => this._borderWidth;
 
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     _borderWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -465,7 +455,7 @@
   String get bottom => this._bottom;
 
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     _bottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -476,7 +466,7 @@
   String get captionSide => this._captionSide;
 
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     _captionSide = value == null ? '' : value;
   }
   @Returns('String')
@@ -487,7 +477,7 @@
   String get clear => this._clear;
 
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     _clear = value == null ? '' : value;
   }
   @Returns('String')
@@ -498,7 +488,7 @@
   String get clip => this._clip;
 
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     _clip = value == null ? '' : value;
   }
   @Returns('String')
@@ -509,7 +499,7 @@
   String get color => this._color;
 
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     _color = value == null ? '' : value;
   }
   @Returns('String')
@@ -520,7 +510,7 @@
   String get content => this._content;
 
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     _content = value == null ? '' : value;
   }
   @Returns('String')
@@ -531,7 +521,7 @@
   String get cursor => this._cursor;
 
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     _cursor = value == null ? '' : value;
   }
   @Returns('String')
@@ -542,7 +532,7 @@
   String get direction => this._direction;
 
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     _direction = value == null ? '' : value;
   }
   @Returns('String')
@@ -553,7 +543,7 @@
   String get display => this._display;
 
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     _display = value == null ? '' : value;
   }
   @Returns('String')
@@ -564,7 +554,7 @@
   String get emptyCells => this._emptyCells;
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     _emptyCells = value == null ? '' : value;
   }
   @Returns('String')
@@ -575,7 +565,7 @@
   String get font => this._font;
 
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     _font = value == null ? '' : value;
   }
   @Returns('String')
@@ -586,7 +576,7 @@
   String get fontFamily => this._fontFamily;
 
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     _fontFamily = value == null ? '' : value;
   }
   @Returns('String')
@@ -597,7 +587,7 @@
   String get fontSize => this._fontSize;
 
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     _fontSize = value == null ? '' : value;
   }
   @Returns('String')
@@ -608,7 +598,7 @@
   String get fontStyle => this._fontStyle;
 
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     _fontStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -619,7 +609,7 @@
   String get fontVariant => this._fontVariant;
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     _fontVariant = value == null ? '' : value;
   }
   @Returns('String')
@@ -630,7 +620,7 @@
   String get fontWeight => this._fontWeight;
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     _fontWeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -641,7 +631,7 @@
   String get height => this._height;
 
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     _height = value == null ? '' : value;
   }
   @Returns('String')
@@ -652,7 +642,7 @@
   String get left => this._left;
 
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     _left = value == null ? '' : value;
   }
   @Returns('String')
@@ -663,7 +653,7 @@
   String get letterSpacing => this._letterSpacing;
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     _letterSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -674,7 +664,7 @@
   String get lineHeight => this._lineHeight;
 
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     _lineHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -685,7 +675,7 @@
   String get listStyle => this._listStyle;
 
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     _listStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -696,7 +686,7 @@
   String get listStyleImage => this._listStyleImage;
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     _listStyleImage = value == null ? '' : value;
   }
   @Returns('String')
@@ -707,7 +697,7 @@
   String get listStylePosition => this._listStylePosition;
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     _listStylePosition = value == null ? '' : value;
   }
   @Returns('String')
@@ -718,7 +708,7 @@
   String get listStyleType => this._listStyleType;
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     _listStyleType = value == null ? '' : value;
   }
   @Returns('String')
@@ -729,7 +719,7 @@
   String get margin => this._margin;
 
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     _margin = value == null ? '' : value;
   }
   @Returns('String')
@@ -740,7 +730,7 @@
   String get marginBottom => this._marginBottom;
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     _marginBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -751,7 +741,7 @@
   String get marginLeft => this._marginLeft;
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     _marginLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -762,7 +752,7 @@
   String get marginRight => this._marginRight;
 
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     _marginRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -773,7 +763,7 @@
   String get marginTop => this._marginTop;
 
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     _marginTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -784,7 +774,7 @@
   String get maxHeight => this._maxHeight;
 
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     _maxHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -795,7 +785,7 @@
   String get maxWidth => this._maxWidth;
 
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     _maxWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -806,7 +796,7 @@
   String get minHeight => this._minHeight;
 
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     _minHeight = value == null ? '' : value;
   }
   @Returns('String')
@@ -817,7 +807,7 @@
   String get minWidth => this._minWidth;
 
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     _minWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -828,7 +818,7 @@
   String get outline => this._outline;
 
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     _outline = value == null ? '' : value;
   }
   @Returns('String')
@@ -839,7 +829,7 @@
   String get outlineColor => this._outlineColor;
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     _outlineColor = value == null ? '' : value;
   }
   @Returns('String')
@@ -850,7 +840,7 @@
   String get outlineStyle => this._outlineStyle;
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     _outlineStyle = value == null ? '' : value;
   }
   @Returns('String')
@@ -861,7 +851,7 @@
   String get outlineWidth => this._outlineWidth;
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     _outlineWidth = value == null ? '' : value;
   }
   @Returns('String')
@@ -872,7 +862,7 @@
   String get overflow => this._overflow;
 
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     _overflow = value == null ? '' : value;
   }
   @Returns('String')
@@ -883,7 +873,7 @@
   String get padding => this._padding;
 
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     _padding = value == null ? '' : value;
   }
   @Returns('String')
@@ -894,7 +884,7 @@
   String get paddingBottom => this._paddingBottom;
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     _paddingBottom = value == null ? '' : value;
   }
   @Returns('String')
@@ -905,7 +895,7 @@
   String get paddingLeft => this._paddingLeft;
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     _paddingLeft = value == null ? '' : value;
   }
   @Returns('String')
@@ -916,7 +906,7 @@
   String get paddingRight => this._paddingRight;
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     _paddingRight = value == null ? '' : value;
   }
   @Returns('String')
@@ -927,7 +917,7 @@
   String get paddingTop => this._paddingTop;
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     _paddingTop = value == null ? '' : value;
   }
   @Returns('String')
@@ -938,7 +928,7 @@
   String get pageBreakAfter => this._pageBreakAfter;
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     _pageBreakAfter = value == null ? '' : value;
   }
   @Returns('String')
@@ -949,7 +939,7 @@
   String get pageBreakBefore => this._pageBreakBefore;
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     _pageBreakBefore = value == null ? '' : value;
   }
   @Returns('String')
@@ -960,7 +950,7 @@
   String get pageBreakInside => this._pageBreakInside;
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     _pageBreakInside = value == null ? '' : value;
   }
   @Returns('String')
@@ -971,7 +961,7 @@
   String get position => this._position;
 
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     _position = value == null ? '' : value;
   }
   @Returns('String')
@@ -982,7 +972,7 @@
   String get quotes => this._quotes;
 
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     _quotes = value == null ? '' : value;
   }
   @Returns('String')
@@ -993,7 +983,7 @@
   String get right => this._right;
 
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     _right = value == null ? '' : value;
   }
   @Returns('String')
@@ -1004,7 +994,7 @@
   String get tableLayout => this._tableLayout;
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     _tableLayout = value == null ? '' : value;
   }
   @Returns('String')
@@ -1015,7 +1005,7 @@
   String get textAlign => this._textAlign;
 
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     _textAlign = value == null ? '' : value;
   }
   @Returns('String')
@@ -1026,7 +1016,7 @@
   String get textDecoration => this._textDecoration;
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     _textDecoration = value == null ? '' : value;
   }
   @Returns('String')
@@ -1037,7 +1027,7 @@
   String get textIndent => this._textIndent;
 
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     _textIndent = value == null ? '' : value;
   }
   @Returns('String')
@@ -1048,7 +1038,7 @@
   String get textTransform => this._textTransform;
 
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     _textTransform = value == null ? '' : value;
   }
   @Returns('String')
@@ -1059,7 +1049,7 @@
   String get top => this._top;
 
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     _top = value == null ? '' : value;
   }
   @Returns('String')
@@ -1070,7 +1060,7 @@
   String get unicodeBidi => this._unicodeBidi;
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     _unicodeBidi = value == null ? '' : value;
   }
   @Returns('String')
@@ -1081,7 +1071,7 @@
   String get verticalAlign => this._verticalAlign;
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     _verticalAlign = value == null ? '' : value;
   }
   @Returns('String')
@@ -1092,7 +1082,7 @@
   String get visibility => this._visibility;
 
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     _visibility = value == null ? '' : value;
   }
   @Returns('String')
@@ -1103,7 +1093,7 @@
   String get whiteSpace => this._whiteSpace;
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     _whiteSpace = value == null ? '' : value;
   }
   @Returns('String')
@@ -1114,7 +1104,7 @@
   String get width => this._width;
 
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     _width = value == null ? '' : value;
   }
   @Returns('String')
@@ -1125,7 +1115,7 @@
   String get wordSpacing => this._wordSpacing;
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     _wordSpacing = value == null ? '' : value;
   }
   @Returns('String')
@@ -1136,7 +1126,7 @@
   String get zIndex => this._zIndex;
 
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     _zIndex = value == null ? '' : value;
   }
   @Returns('String')
@@ -1146,15 +1136,7 @@
 $endif
 }
 
-$if DART2JS
 class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
-$else
-  $if JSINTEROP
-class _CssStyleDeclarationSet extends CssStyleDeclarationBase {
-  $else
-class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
-  $endif
-$endif
   final Iterable<Element> _elementIterable;
   Iterable<CssStyleDeclaration> _elementCssStyleDeclarationSetIterable;
 
@@ -1182,452 +1164,452 @@
   }
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     _setAll('background', value);
   }
     
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     _setAll('backgroundAttachment', value);
   }
     
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     _setAll('backgroundColor', value);
   }
     
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     _setAll('backgroundImage', value);
   }
     
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     _setAll('backgroundPosition', value);
   }
     
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     _setAll('backgroundRepeat', value);
   }
     
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     _setAll('border', value);
   }
     
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     _setAll('borderBottom', value);
   }
     
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     _setAll('borderBottomColor', value);
   }
     
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     _setAll('borderBottomStyle', value);
   }
     
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     _setAll('borderBottomWidth', value);
   }
     
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     _setAll('borderCollapse', value);
   }
     
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     _setAll('borderColor', value);
   }
     
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     _setAll('borderLeft', value);
   }
     
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     _setAll('borderLeftColor', value);
   }
     
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     _setAll('borderLeftStyle', value);
   }
     
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     _setAll('borderLeftWidth', value);
   }
     
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     _setAll('borderRight', value);
   }
     
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     _setAll('borderRightColor', value);
   }
     
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     _setAll('borderRightStyle', value);
   }
     
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     _setAll('borderRightWidth', value);
   }
     
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     _setAll('borderSpacing', value);
   }
     
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     _setAll('borderStyle', value);
   }
     
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     _setAll('borderTop', value);
   }
     
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     _setAll('borderTopColor', value);
   }
     
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     _setAll('borderTopStyle', value);
   }
     
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     _setAll('borderTopWidth', value);
   }
     
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     _setAll('borderWidth', value);
   }
     
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     _setAll('bottom', value);
   }
     
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     _setAll('captionSide', value);
   }
     
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     _setAll('clear', value);
   }
     
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     _setAll('clip', value);
   }
     
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     _setAll('color', value);
   }
     
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     _setAll('content', value);
   }
     
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     _setAll('cursor', value);
   }
     
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     _setAll('direction', value);
   }
     
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     _setAll('display', value);
   }
     
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     _setAll('emptyCells', value);
   }
     
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     _setAll('font', value);
   }
     
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     _setAll('fontFamily', value);
   }
     
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     _setAll('fontSize', value);
   }
     
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     _setAll('fontStyle', value);
   }
     
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     _setAll('fontVariant', value);
   }
     
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     _setAll('fontWeight', value);
   }
     
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     _setAll('height', value);
   }
     
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     _setAll('left', value);
   }
     
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     _setAll('letterSpacing', value);
   }
     
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     _setAll('lineHeight', value);
   }
     
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     _setAll('listStyle', value);
   }
     
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     _setAll('listStyleImage', value);
   }
     
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     _setAll('listStylePosition', value);
   }
     
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     _setAll('listStyleType', value);
   }
     
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     _setAll('margin', value);
   }
     
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     _setAll('marginBottom', value);
   }
     
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     _setAll('marginLeft', value);
   }
     
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     _setAll('marginRight', value);
   }
     
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     _setAll('marginTop', value);
   }
     
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     _setAll('maxHeight', value);
   }
     
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     _setAll('maxWidth', value);
   }
     
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     _setAll('minHeight', value);
   }
     
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     _setAll('minWidth', value);
   }
     
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     _setAll('outline', value);
   }
     
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     _setAll('outlineColor', value);
   }
     
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     _setAll('outlineStyle', value);
   }
     
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     _setAll('outlineWidth', value);
   }
     
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     _setAll('overflow', value);
   }
     
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     _setAll('padding', value);
   }
     
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     _setAll('paddingBottom', value);
   }
     
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     _setAll('paddingLeft', value);
   }
     
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     _setAll('paddingRight', value);
   }
     
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     _setAll('paddingTop', value);
   }
     
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     _setAll('pageBreakAfter', value);
   }
     
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     _setAll('pageBreakBefore', value);
   }
     
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     _setAll('pageBreakInside', value);
   }
     
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     _setAll('position', value);
   }
     
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     _setAll('quotes', value);
   }
     
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     _setAll('right', value);
   }
     
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     _setAll('tableLayout', value);
   }
     
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     _setAll('textAlign', value);
   }
     
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     _setAll('textDecoration', value);
   }
     
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     _setAll('textIndent', value);
   }
     
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     _setAll('textTransform', value);
   }
     
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     _setAll('top', value);
   }
     
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     _setAll('unicodeBidi', value);
   }
     
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     _setAll('verticalAlign', value);
   }
     
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     _setAll('visibility', value);
   }
     
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     _setAll('whiteSpace', value);
   }
     
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     _setAll('width', value);
   }
     
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     _setAll('wordSpacing', value);
   }
     
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     _setAll('zIndex', value);
   }
     
@@ -1663,7 +1645,7 @@
     getPropertyValue('align-content');
 
   /** Sets the value of "align-content" */
-  void set alignContent(String value) {
+  set alignContent(String value) {
     setProperty('align-content', value, '');
   }
 
@@ -1672,7 +1654,7 @@
     getPropertyValue('align-items');
 
   /** Sets the value of "align-items" */
-  void set alignItems(String value) {
+  set alignItems(String value) {
     setProperty('align-items', value, '');
   }
 
@@ -1681,7 +1663,7 @@
     getPropertyValue('align-self');
 
   /** Sets the value of "align-self" */
-  void set alignSelf(String value) {
+  set alignSelf(String value) {
     setProperty('align-self', value, '');
   }
 
@@ -1690,7 +1672,7 @@
     getPropertyValue('animation');
 
   /** Sets the value of "animation" */
-  void set animation(String value) {
+  set animation(String value) {
     setProperty('animation', value, '');
   }
 
@@ -1699,7 +1681,7 @@
     getPropertyValue('animation-delay');
 
   /** Sets the value of "animation-delay" */
-  void set animationDelay(String value) {
+  set animationDelay(String value) {
     setProperty('animation-delay', value, '');
   }
 
@@ -1708,7 +1690,7 @@
     getPropertyValue('animation-direction');
 
   /** Sets the value of "animation-direction" */
-  void set animationDirection(String value) {
+  set animationDirection(String value) {
     setProperty('animation-direction', value, '');
   }
 
@@ -1717,7 +1699,7 @@
     getPropertyValue('animation-duration');
 
   /** Sets the value of "animation-duration" */
-  void set animationDuration(String value) {
+  set animationDuration(String value) {
     setProperty('animation-duration', value, '');
   }
 
@@ -1726,7 +1708,7 @@
     getPropertyValue('animation-fill-mode');
 
   /** Sets the value of "animation-fill-mode" */
-  void set animationFillMode(String value) {
+  set animationFillMode(String value) {
     setProperty('animation-fill-mode', value, '');
   }
 
@@ -1735,7 +1717,7 @@
     getPropertyValue('animation-iteration-count');
 
   /** Sets the value of "animation-iteration-count" */
-  void set animationIterationCount(String value) {
+  set animationIterationCount(String value) {
     setProperty('animation-iteration-count', value, '');
   }
 
@@ -1744,7 +1726,7 @@
     getPropertyValue('animation-name');
 
   /** Sets the value of "animation-name" */
-  void set animationName(String value) {
+  set animationName(String value) {
     setProperty('animation-name', value, '');
   }
 
@@ -1753,7 +1735,7 @@
     getPropertyValue('animation-play-state');
 
   /** Sets the value of "animation-play-state" */
-  void set animationPlayState(String value) {
+  set animationPlayState(String value) {
     setProperty('animation-play-state', value, '');
   }
 
@@ -1762,7 +1744,7 @@
     getPropertyValue('animation-timing-function');
 
   /** Sets the value of "animation-timing-function" */
-  void set animationTimingFunction(String value) {
+  set animationTimingFunction(String value) {
     setProperty('animation-timing-function', value, '');
   }
 
@@ -1771,7 +1753,7 @@
     getPropertyValue('app-region');
 
   /** Sets the value of "app-region" */
-  void set appRegion(String value) {
+  set appRegion(String value) {
     setProperty('app-region', value, '');
   }
 
@@ -1780,7 +1762,7 @@
     getPropertyValue('appearance');
 
   /** Sets the value of "appearance" */
-  void set appearance(String value) {
+  set appearance(String value) {
     setProperty('appearance', value, '');
   }
 
@@ -1789,7 +1771,7 @@
     getPropertyValue('aspect-ratio');
 
   /** Sets the value of "aspect-ratio" */
-  void set aspectRatio(String value) {
+  set aspectRatio(String value) {
     setProperty('aspect-ratio', value, '');
   }
 
@@ -1798,7 +1780,7 @@
     getPropertyValue('backface-visibility');
 
   /** Sets the value of "backface-visibility" */
-  void set backfaceVisibility(String value) {
+  set backfaceVisibility(String value) {
     setProperty('backface-visibility', value, '');
   }
 
@@ -1807,7 +1789,7 @@
     getPropertyValue('background');
 
   /** Sets the value of "background" */
-  void set background(String value) {
+  set background(String value) {
     setProperty('background', value, '');
   }
 
@@ -1816,7 +1798,7 @@
     getPropertyValue('background-attachment');
 
   /** Sets the value of "background-attachment" */
-  void set backgroundAttachment(String value) {
+  set backgroundAttachment(String value) {
     setProperty('background-attachment', value, '');
   }
 
@@ -1825,7 +1807,7 @@
     getPropertyValue('background-blend-mode');
 
   /** Sets the value of "background-blend-mode" */
-  void set backgroundBlendMode(String value) {
+  set backgroundBlendMode(String value) {
     setProperty('background-blend-mode', value, '');
   }
 
@@ -1834,7 +1816,7 @@
     getPropertyValue('background-clip');
 
   /** Sets the value of "background-clip" */
-  void set backgroundClip(String value) {
+  set backgroundClip(String value) {
     setProperty('background-clip', value, '');
   }
 
@@ -1843,7 +1825,7 @@
     getPropertyValue('background-color');
 
   /** Sets the value of "background-color" */
-  void set backgroundColor(String value) {
+  set backgroundColor(String value) {
     setProperty('background-color', value, '');
   }
 
@@ -1852,7 +1834,7 @@
     getPropertyValue('background-composite');
 
   /** Sets the value of "background-composite" */
-  void set backgroundComposite(String value) {
+  set backgroundComposite(String value) {
     setProperty('background-composite', value, '');
   }
 
@@ -1861,7 +1843,7 @@
     getPropertyValue('background-image');
 
   /** Sets the value of "background-image" */
-  void set backgroundImage(String value) {
+  set backgroundImage(String value) {
     setProperty('background-image', value, '');
   }
 
@@ -1870,7 +1852,7 @@
     getPropertyValue('background-origin');
 
   /** Sets the value of "background-origin" */
-  void set backgroundOrigin(String value) {
+  set backgroundOrigin(String value) {
     setProperty('background-origin', value, '');
   }
 
@@ -1879,7 +1861,7 @@
     getPropertyValue('background-position');
 
   /** Sets the value of "background-position" */
-  void set backgroundPosition(String value) {
+  set backgroundPosition(String value) {
     setProperty('background-position', value, '');
   }
 
@@ -1888,7 +1870,7 @@
     getPropertyValue('background-position-x');
 
   /** Sets the value of "background-position-x" */
-  void set backgroundPositionX(String value) {
+  set backgroundPositionX(String value) {
     setProperty('background-position-x', value, '');
   }
 
@@ -1897,7 +1879,7 @@
     getPropertyValue('background-position-y');
 
   /** Sets the value of "background-position-y" */
-  void set backgroundPositionY(String value) {
+  set backgroundPositionY(String value) {
     setProperty('background-position-y', value, '');
   }
 
@@ -1906,7 +1888,7 @@
     getPropertyValue('background-repeat');
 
   /** Sets the value of "background-repeat" */
-  void set backgroundRepeat(String value) {
+  set backgroundRepeat(String value) {
     setProperty('background-repeat', value, '');
   }
 
@@ -1915,7 +1897,7 @@
     getPropertyValue('background-repeat-x');
 
   /** Sets the value of "background-repeat-x" */
-  void set backgroundRepeatX(String value) {
+  set backgroundRepeatX(String value) {
     setProperty('background-repeat-x', value, '');
   }
 
@@ -1924,7 +1906,7 @@
     getPropertyValue('background-repeat-y');
 
   /** Sets the value of "background-repeat-y" */
-  void set backgroundRepeatY(String value) {
+  set backgroundRepeatY(String value) {
     setProperty('background-repeat-y', value, '');
   }
 
@@ -1933,7 +1915,7 @@
     getPropertyValue('background-size');
 
   /** Sets the value of "background-size" */
-  void set backgroundSize(String value) {
+  set backgroundSize(String value) {
     setProperty('background-size', value, '');
   }
 
@@ -1942,7 +1924,7 @@
     getPropertyValue('border');
 
   /** Sets the value of "border" */
-  void set border(String value) {
+  set border(String value) {
     setProperty('border', value, '');
   }
 
@@ -1951,7 +1933,7 @@
     getPropertyValue('border-after');
 
   /** Sets the value of "border-after" */
-  void set borderAfter(String value) {
+  set borderAfter(String value) {
     setProperty('border-after', value, '');
   }
 
@@ -1960,7 +1942,7 @@
     getPropertyValue('border-after-color');
 
   /** Sets the value of "border-after-color" */
-  void set borderAfterColor(String value) {
+  set borderAfterColor(String value) {
     setProperty('border-after-color', value, '');
   }
 
@@ -1969,7 +1951,7 @@
     getPropertyValue('border-after-style');
 
   /** Sets the value of "border-after-style" */
-  void set borderAfterStyle(String value) {
+  set borderAfterStyle(String value) {
     setProperty('border-after-style', value, '');
   }
 
@@ -1978,7 +1960,7 @@
     getPropertyValue('border-after-width');
 
   /** Sets the value of "border-after-width" */
-  void set borderAfterWidth(String value) {
+  set borderAfterWidth(String value) {
     setProperty('border-after-width', value, '');
   }
 
@@ -1987,7 +1969,7 @@
     getPropertyValue('border-before');
 
   /** Sets the value of "border-before" */
-  void set borderBefore(String value) {
+  set borderBefore(String value) {
     setProperty('border-before', value, '');
   }
 
@@ -1996,7 +1978,7 @@
     getPropertyValue('border-before-color');
 
   /** Sets the value of "border-before-color" */
-  void set borderBeforeColor(String value) {
+  set borderBeforeColor(String value) {
     setProperty('border-before-color', value, '');
   }
 
@@ -2005,7 +1987,7 @@
     getPropertyValue('border-before-style');
 
   /** Sets the value of "border-before-style" */
-  void set borderBeforeStyle(String value) {
+  set borderBeforeStyle(String value) {
     setProperty('border-before-style', value, '');
   }
 
@@ -2014,7 +1996,7 @@
     getPropertyValue('border-before-width');
 
   /** Sets the value of "border-before-width" */
-  void set borderBeforeWidth(String value) {
+  set borderBeforeWidth(String value) {
     setProperty('border-before-width', value, '');
   }
 
@@ -2023,7 +2005,7 @@
     getPropertyValue('border-bottom');
 
   /** Sets the value of "border-bottom" */
-  void set borderBottom(String value) {
+  set borderBottom(String value) {
     setProperty('border-bottom', value, '');
   }
 
@@ -2032,7 +2014,7 @@
     getPropertyValue('border-bottom-color');
 
   /** Sets the value of "border-bottom-color" */
-  void set borderBottomColor(String value) {
+  set borderBottomColor(String value) {
     setProperty('border-bottom-color', value, '');
   }
 
@@ -2041,7 +2023,7 @@
     getPropertyValue('border-bottom-left-radius');
 
   /** Sets the value of "border-bottom-left-radius" */
-  void set borderBottomLeftRadius(String value) {
+  set borderBottomLeftRadius(String value) {
     setProperty('border-bottom-left-radius', value, '');
   }
 
@@ -2050,7 +2032,7 @@
     getPropertyValue('border-bottom-right-radius');
 
   /** Sets the value of "border-bottom-right-radius" */
-  void set borderBottomRightRadius(String value) {
+  set borderBottomRightRadius(String value) {
     setProperty('border-bottom-right-radius', value, '');
   }
 
@@ -2059,7 +2041,7 @@
     getPropertyValue('border-bottom-style');
 
   /** Sets the value of "border-bottom-style" */
-  void set borderBottomStyle(String value) {
+  set borderBottomStyle(String value) {
     setProperty('border-bottom-style', value, '');
   }
 
@@ -2068,7 +2050,7 @@
     getPropertyValue('border-bottom-width');
 
   /** Sets the value of "border-bottom-width" */
-  void set borderBottomWidth(String value) {
+  set borderBottomWidth(String value) {
     setProperty('border-bottom-width', value, '');
   }
 
@@ -2077,7 +2059,7 @@
     getPropertyValue('border-collapse');
 
   /** Sets the value of "border-collapse" */
-  void set borderCollapse(String value) {
+  set borderCollapse(String value) {
     setProperty('border-collapse', value, '');
   }
 
@@ -2086,7 +2068,7 @@
     getPropertyValue('border-color');
 
   /** Sets the value of "border-color" */
-  void set borderColor(String value) {
+  set borderColor(String value) {
     setProperty('border-color', value, '');
   }
 
@@ -2095,7 +2077,7 @@
     getPropertyValue('border-end');
 
   /** Sets the value of "border-end" */
-  void set borderEnd(String value) {
+  set borderEnd(String value) {
     setProperty('border-end', value, '');
   }
 
@@ -2104,7 +2086,7 @@
     getPropertyValue('border-end-color');
 
   /** Sets the value of "border-end-color" */
-  void set borderEndColor(String value) {
+  set borderEndColor(String value) {
     setProperty('border-end-color', value, '');
   }
 
@@ -2113,7 +2095,7 @@
     getPropertyValue('border-end-style');
 
   /** Sets the value of "border-end-style" */
-  void set borderEndStyle(String value) {
+  set borderEndStyle(String value) {
     setProperty('border-end-style', value, '');
   }
 
@@ -2122,7 +2104,7 @@
     getPropertyValue('border-end-width');
 
   /** Sets the value of "border-end-width" */
-  void set borderEndWidth(String value) {
+  set borderEndWidth(String value) {
     setProperty('border-end-width', value, '');
   }
 
@@ -2131,7 +2113,7 @@
     getPropertyValue('border-fit');
 
   /** Sets the value of "border-fit" */
-  void set borderFit(String value) {
+  set borderFit(String value) {
     setProperty('border-fit', value, '');
   }
 
@@ -2140,7 +2122,7 @@
     getPropertyValue('border-horizontal-spacing');
 
   /** Sets the value of "border-horizontal-spacing" */
-  void set borderHorizontalSpacing(String value) {
+  set borderHorizontalSpacing(String value) {
     setProperty('border-horizontal-spacing', value, '');
   }
 
@@ -2149,7 +2131,7 @@
     getPropertyValue('border-image');
 
   /** Sets the value of "border-image" */
-  void set borderImage(String value) {
+  set borderImage(String value) {
     setProperty('border-image', value, '');
   }
 
@@ -2158,7 +2140,7 @@
     getPropertyValue('border-image-outset');
 
   /** Sets the value of "border-image-outset" */
-  void set borderImageOutset(String value) {
+  set borderImageOutset(String value) {
     setProperty('border-image-outset', value, '');
   }
 
@@ -2167,7 +2149,7 @@
     getPropertyValue('border-image-repeat');
 
   /** Sets the value of "border-image-repeat" */
-  void set borderImageRepeat(String value) {
+  set borderImageRepeat(String value) {
     setProperty('border-image-repeat', value, '');
   }
 
@@ -2176,7 +2158,7 @@
     getPropertyValue('border-image-slice');
 
   /** Sets the value of "border-image-slice" */
-  void set borderImageSlice(String value) {
+  set borderImageSlice(String value) {
     setProperty('border-image-slice', value, '');
   }
 
@@ -2185,7 +2167,7 @@
     getPropertyValue('border-image-source');
 
   /** Sets the value of "border-image-source" */
-  void set borderImageSource(String value) {
+  set borderImageSource(String value) {
     setProperty('border-image-source', value, '');
   }
 
@@ -2194,7 +2176,7 @@
     getPropertyValue('border-image-width');
 
   /** Sets the value of "border-image-width" */
-  void set borderImageWidth(String value) {
+  set borderImageWidth(String value) {
     setProperty('border-image-width', value, '');
   }
 
@@ -2203,7 +2185,7 @@
     getPropertyValue('border-left');
 
   /** Sets the value of "border-left" */
-  void set borderLeft(String value) {
+  set borderLeft(String value) {
     setProperty('border-left', value, '');
   }
 
@@ -2212,7 +2194,7 @@
     getPropertyValue('border-left-color');
 
   /** Sets the value of "border-left-color" */
-  void set borderLeftColor(String value) {
+  set borderLeftColor(String value) {
     setProperty('border-left-color', value, '');
   }
 
@@ -2221,7 +2203,7 @@
     getPropertyValue('border-left-style');
 
   /** Sets the value of "border-left-style" */
-  void set borderLeftStyle(String value) {
+  set borderLeftStyle(String value) {
     setProperty('border-left-style', value, '');
   }
 
@@ -2230,7 +2212,7 @@
     getPropertyValue('border-left-width');
 
   /** Sets the value of "border-left-width" */
-  void set borderLeftWidth(String value) {
+  set borderLeftWidth(String value) {
     setProperty('border-left-width', value, '');
   }
 
@@ -2239,7 +2221,7 @@
     getPropertyValue('border-radius');
 
   /** Sets the value of "border-radius" */
-  void set borderRadius(String value) {
+  set borderRadius(String value) {
     setProperty('border-radius', value, '');
   }
 
@@ -2248,7 +2230,7 @@
     getPropertyValue('border-right');
 
   /** Sets the value of "border-right" */
-  void set borderRight(String value) {
+  set borderRight(String value) {
     setProperty('border-right', value, '');
   }
 
@@ -2257,7 +2239,7 @@
     getPropertyValue('border-right-color');
 
   /** Sets the value of "border-right-color" */
-  void set borderRightColor(String value) {
+  set borderRightColor(String value) {
     setProperty('border-right-color', value, '');
   }
 
@@ -2266,7 +2248,7 @@
     getPropertyValue('border-right-style');
 
   /** Sets the value of "border-right-style" */
-  void set borderRightStyle(String value) {
+  set borderRightStyle(String value) {
     setProperty('border-right-style', value, '');
   }
 
@@ -2275,7 +2257,7 @@
     getPropertyValue('border-right-width');
 
   /** Sets the value of "border-right-width" */
-  void set borderRightWidth(String value) {
+  set borderRightWidth(String value) {
     setProperty('border-right-width', value, '');
   }
 
@@ -2284,7 +2266,7 @@
     getPropertyValue('border-spacing');
 
   /** Sets the value of "border-spacing" */
-  void set borderSpacing(String value) {
+  set borderSpacing(String value) {
     setProperty('border-spacing', value, '');
   }
 
@@ -2293,7 +2275,7 @@
     getPropertyValue('border-start');
 
   /** Sets the value of "border-start" */
-  void set borderStart(String value) {
+  set borderStart(String value) {
     setProperty('border-start', value, '');
   }
 
@@ -2302,7 +2284,7 @@
     getPropertyValue('border-start-color');
 
   /** Sets the value of "border-start-color" */
-  void set borderStartColor(String value) {
+  set borderStartColor(String value) {
     setProperty('border-start-color', value, '');
   }
 
@@ -2311,7 +2293,7 @@
     getPropertyValue('border-start-style');
 
   /** Sets the value of "border-start-style" */
-  void set borderStartStyle(String value) {
+  set borderStartStyle(String value) {
     setProperty('border-start-style', value, '');
   }
 
@@ -2320,7 +2302,7 @@
     getPropertyValue('border-start-width');
 
   /** Sets the value of "border-start-width" */
-  void set borderStartWidth(String value) {
+  set borderStartWidth(String value) {
     setProperty('border-start-width', value, '');
   }
 
@@ -2329,7 +2311,7 @@
     getPropertyValue('border-style');
 
   /** Sets the value of "border-style" */
-  void set borderStyle(String value) {
+  set borderStyle(String value) {
     setProperty('border-style', value, '');
   }
 
@@ -2338,7 +2320,7 @@
     getPropertyValue('border-top');
 
   /** Sets the value of "border-top" */
-  void set borderTop(String value) {
+  set borderTop(String value) {
     setProperty('border-top', value, '');
   }
 
@@ -2347,7 +2329,7 @@
     getPropertyValue('border-top-color');
 
   /** Sets the value of "border-top-color" */
-  void set borderTopColor(String value) {
+  set borderTopColor(String value) {
     setProperty('border-top-color', value, '');
   }
 
@@ -2356,7 +2338,7 @@
     getPropertyValue('border-top-left-radius');
 
   /** Sets the value of "border-top-left-radius" */
-  void set borderTopLeftRadius(String value) {
+  set borderTopLeftRadius(String value) {
     setProperty('border-top-left-radius', value, '');
   }
 
@@ -2365,7 +2347,7 @@
     getPropertyValue('border-top-right-radius');
 
   /** Sets the value of "border-top-right-radius" */
-  void set borderTopRightRadius(String value) {
+  set borderTopRightRadius(String value) {
     setProperty('border-top-right-radius', value, '');
   }
 
@@ -2374,7 +2356,7 @@
     getPropertyValue('border-top-style');
 
   /** Sets the value of "border-top-style" */
-  void set borderTopStyle(String value) {
+  set borderTopStyle(String value) {
     setProperty('border-top-style', value, '');
   }
 
@@ -2383,7 +2365,7 @@
     getPropertyValue('border-top-width');
 
   /** Sets the value of "border-top-width" */
-  void set borderTopWidth(String value) {
+  set borderTopWidth(String value) {
     setProperty('border-top-width', value, '');
   }
 
@@ -2392,7 +2374,7 @@
     getPropertyValue('border-vertical-spacing');
 
   /** Sets the value of "border-vertical-spacing" */
-  void set borderVerticalSpacing(String value) {
+  set borderVerticalSpacing(String value) {
     setProperty('border-vertical-spacing', value, '');
   }
 
@@ -2401,7 +2383,7 @@
     getPropertyValue('border-width');
 
   /** Sets the value of "border-width" */
-  void set borderWidth(String value) {
+  set borderWidth(String value) {
     setProperty('border-width', value, '');
   }
 
@@ -2410,7 +2392,7 @@
     getPropertyValue('bottom');
 
   /** Sets the value of "bottom" */
-  void set bottom(String value) {
+  set bottom(String value) {
     setProperty('bottom', value, '');
   }
 
@@ -2419,7 +2401,7 @@
     getPropertyValue('box-align');
 
   /** Sets the value of "box-align" */
-  void set boxAlign(String value) {
+  set boxAlign(String value) {
     setProperty('box-align', value, '');
   }
 
@@ -2428,7 +2410,7 @@
     getPropertyValue('box-decoration-break');
 
   /** Sets the value of "box-decoration-break" */
-  void set boxDecorationBreak(String value) {
+  set boxDecorationBreak(String value) {
     setProperty('box-decoration-break', value, '');
   }
 
@@ -2437,7 +2419,7 @@
     getPropertyValue('box-direction');
 
   /** Sets the value of "box-direction" */
-  void set boxDirection(String value) {
+  set boxDirection(String value) {
     setProperty('box-direction', value, '');
   }
 
@@ -2446,7 +2428,7 @@
     getPropertyValue('box-flex');
 
   /** Sets the value of "box-flex" */
-  void set boxFlex(String value) {
+  set boxFlex(String value) {
     setProperty('box-flex', value, '');
   }
 
@@ -2455,7 +2437,7 @@
     getPropertyValue('box-flex-group');
 
   /** Sets the value of "box-flex-group" */
-  void set boxFlexGroup(String value) {
+  set boxFlexGroup(String value) {
     setProperty('box-flex-group', value, '');
   }
 
@@ -2464,7 +2446,7 @@
     getPropertyValue('box-lines');
 
   /** Sets the value of "box-lines" */
-  void set boxLines(String value) {
+  set boxLines(String value) {
     setProperty('box-lines', value, '');
   }
 
@@ -2473,7 +2455,7 @@
     getPropertyValue('box-ordinal-group');
 
   /** Sets the value of "box-ordinal-group" */
-  void set boxOrdinalGroup(String value) {
+  set boxOrdinalGroup(String value) {
     setProperty('box-ordinal-group', value, '');
   }
 
@@ -2482,7 +2464,7 @@
     getPropertyValue('box-orient');
 
   /** Sets the value of "box-orient" */
-  void set boxOrient(String value) {
+  set boxOrient(String value) {
     setProperty('box-orient', value, '');
   }
 
@@ -2491,7 +2473,7 @@
     getPropertyValue('box-pack');
 
   /** Sets the value of "box-pack" */
-  void set boxPack(String value) {
+  set boxPack(String value) {
     setProperty('box-pack', value, '');
   }
 
@@ -2500,7 +2482,7 @@
     getPropertyValue('box-reflect');
 
   /** Sets the value of "box-reflect" */
-  void set boxReflect(String value) {
+  set boxReflect(String value) {
     setProperty('box-reflect', value, '');
   }
 
@@ -2509,7 +2491,7 @@
     getPropertyValue('box-shadow');
 
   /** Sets the value of "box-shadow" */
-  void set boxShadow(String value) {
+  set boxShadow(String value) {
     setProperty('box-shadow', value, '');
   }
 
@@ -2518,7 +2500,7 @@
     getPropertyValue('box-sizing');
 
   /** Sets the value of "box-sizing" */
-  void set boxSizing(String value) {
+  set boxSizing(String value) {
     setProperty('box-sizing', value, '');
   }
 
@@ -2527,7 +2509,7 @@
     getPropertyValue('caption-side');
 
   /** Sets the value of "caption-side" */
-  void set captionSide(String value) {
+  set captionSide(String value) {
     setProperty('caption-side', value, '');
   }
 
@@ -2536,7 +2518,7 @@
     getPropertyValue('clear');
 
   /** Sets the value of "clear" */
-  void set clear(String value) {
+  set clear(String value) {
     setProperty('clear', value, '');
   }
 
@@ -2545,7 +2527,7 @@
     getPropertyValue('clip');
 
   /** Sets the value of "clip" */
-  void set clip(String value) {
+  set clip(String value) {
     setProperty('clip', value, '');
   }
 
@@ -2554,7 +2536,7 @@
     getPropertyValue('clip-path');
 
   /** Sets the value of "clip-path" */
-  void set clipPath(String value) {
+  set clipPath(String value) {
     setProperty('clip-path', value, '');
   }
 
@@ -2563,7 +2545,7 @@
     getPropertyValue('color');
 
   /** Sets the value of "color" */
-  void set color(String value) {
+  set color(String value) {
     setProperty('color', value, '');
   }
 
@@ -2572,7 +2554,7 @@
     getPropertyValue('column-break-after');
 
   /** Sets the value of "column-break-after" */
-  void set columnBreakAfter(String value) {
+  set columnBreakAfter(String value) {
     setProperty('column-break-after', value, '');
   }
 
@@ -2581,7 +2563,7 @@
     getPropertyValue('column-break-before');
 
   /** Sets the value of "column-break-before" */
-  void set columnBreakBefore(String value) {
+  set columnBreakBefore(String value) {
     setProperty('column-break-before', value, '');
   }
 
@@ -2590,7 +2572,7 @@
     getPropertyValue('column-break-inside');
 
   /** Sets the value of "column-break-inside" */
-  void set columnBreakInside(String value) {
+  set columnBreakInside(String value) {
     setProperty('column-break-inside', value, '');
   }
 
@@ -2599,7 +2581,7 @@
     getPropertyValue('column-count');
 
   /** Sets the value of "column-count" */
-  void set columnCount(String value) {
+  set columnCount(String value) {
     setProperty('column-count', value, '');
   }
 
@@ -2608,7 +2590,7 @@
     getPropertyValue('column-fill');
 
   /** Sets the value of "column-fill" */
-  void set columnFill(String value) {
+  set columnFill(String value) {
     setProperty('column-fill', value, '');
   }
 
@@ -2617,7 +2599,7 @@
     getPropertyValue('column-gap');
 
   /** Sets the value of "column-gap" */
-  void set columnGap(String value) {
+  set columnGap(String value) {
     setProperty('column-gap', value, '');
   }
 
@@ -2626,7 +2608,7 @@
     getPropertyValue('column-rule');
 
   /** Sets the value of "column-rule" */
-  void set columnRule(String value) {
+  set columnRule(String value) {
     setProperty('column-rule', value, '');
   }
 
@@ -2635,7 +2617,7 @@
     getPropertyValue('column-rule-color');
 
   /** Sets the value of "column-rule-color" */
-  void set columnRuleColor(String value) {
+  set columnRuleColor(String value) {
     setProperty('column-rule-color', value, '');
   }
 
@@ -2644,7 +2626,7 @@
     getPropertyValue('column-rule-style');
 
   /** Sets the value of "column-rule-style" */
-  void set columnRuleStyle(String value) {
+  set columnRuleStyle(String value) {
     setProperty('column-rule-style', value, '');
   }
 
@@ -2653,7 +2635,7 @@
     getPropertyValue('column-rule-width');
 
   /** Sets the value of "column-rule-width" */
-  void set columnRuleWidth(String value) {
+  set columnRuleWidth(String value) {
     setProperty('column-rule-width', value, '');
   }
 
@@ -2662,7 +2644,7 @@
     getPropertyValue('column-span');
 
   /** Sets the value of "column-span" */
-  void set columnSpan(String value) {
+  set columnSpan(String value) {
     setProperty('column-span', value, '');
   }
 
@@ -2671,7 +2653,7 @@
     getPropertyValue('column-width');
 
   /** Sets the value of "column-width" */
-  void set columnWidth(String value) {
+  set columnWidth(String value) {
     setProperty('column-width', value, '');
   }
 
@@ -2680,7 +2662,7 @@
     getPropertyValue('columns');
 
   /** Sets the value of "columns" */
-  void set columns(String value) {
+  set columns(String value) {
     setProperty('columns', value, '');
   }
 
@@ -2689,7 +2671,7 @@
     getPropertyValue('content');
 
   /** Sets the value of "content" */
-  void set content(String value) {
+  set content(String value) {
     setProperty('content', value, '');
   }
 
@@ -2698,7 +2680,7 @@
     getPropertyValue('counter-increment');
 
   /** Sets the value of "counter-increment" */
-  void set counterIncrement(String value) {
+  set counterIncrement(String value) {
     setProperty('counter-increment', value, '');
   }
 
@@ -2707,7 +2689,7 @@
     getPropertyValue('counter-reset');
 
   /** Sets the value of "counter-reset" */
-  void set counterReset(String value) {
+  set counterReset(String value) {
     setProperty('counter-reset', value, '');
   }
 
@@ -2716,7 +2698,7 @@
     getPropertyValue('cursor');
 
   /** Sets the value of "cursor" */
-  void set cursor(String value) {
+  set cursor(String value) {
     setProperty('cursor', value, '');
   }
 
@@ -2725,7 +2707,7 @@
     getPropertyValue('direction');
 
   /** Sets the value of "direction" */
-  void set direction(String value) {
+  set direction(String value) {
     setProperty('direction', value, '');
   }
 
@@ -2734,7 +2716,7 @@
     getPropertyValue('display');
 
   /** Sets the value of "display" */
-  void set display(String value) {
+  set display(String value) {
     setProperty('display', value, '');
   }
 
@@ -2743,7 +2725,7 @@
     getPropertyValue('empty-cells');
 
   /** Sets the value of "empty-cells" */
-  void set emptyCells(String value) {
+  set emptyCells(String value) {
     setProperty('empty-cells', value, '');
   }
 
@@ -2752,7 +2734,7 @@
     getPropertyValue('filter');
 
   /** Sets the value of "filter" */
-  void set filter(String value) {
+  set filter(String value) {
     setProperty('filter', value, '');
   }
 
@@ -2761,7 +2743,7 @@
     getPropertyValue('flex');
 
   /** Sets the value of "flex" */
-  void set flex(String value) {
+  set flex(String value) {
     setProperty('flex', value, '');
   }
 
@@ -2770,7 +2752,7 @@
     getPropertyValue('flex-basis');
 
   /** Sets the value of "flex-basis" */
-  void set flexBasis(String value) {
+  set flexBasis(String value) {
     setProperty('flex-basis', value, '');
   }
 
@@ -2779,7 +2761,7 @@
     getPropertyValue('flex-direction');
 
   /** Sets the value of "flex-direction" */
-  void set flexDirection(String value) {
+  set flexDirection(String value) {
     setProperty('flex-direction', value, '');
   }
 
@@ -2788,7 +2770,7 @@
     getPropertyValue('flex-flow');
 
   /** Sets the value of "flex-flow" */
-  void set flexFlow(String value) {
+  set flexFlow(String value) {
     setProperty('flex-flow', value, '');
   }
 
@@ -2797,7 +2779,7 @@
     getPropertyValue('flex-grow');
 
   /** Sets the value of "flex-grow" */
-  void set flexGrow(String value) {
+  set flexGrow(String value) {
     setProperty('flex-grow', value, '');
   }
 
@@ -2806,7 +2788,7 @@
     getPropertyValue('flex-shrink');
 
   /** Sets the value of "flex-shrink" */
-  void set flexShrink(String value) {
+  set flexShrink(String value) {
     setProperty('flex-shrink', value, '');
   }
 
@@ -2815,7 +2797,7 @@
     getPropertyValue('flex-wrap');
 
   /** Sets the value of "flex-wrap" */
-  void set flexWrap(String value) {
+  set flexWrap(String value) {
     setProperty('flex-wrap', value, '');
   }
 
@@ -2824,7 +2806,7 @@
     getPropertyValue('float');
 
   /** Sets the value of "float" */
-  void set float(String value) {
+  set float(String value) {
     setProperty('float', value, '');
   }
 
@@ -2833,7 +2815,7 @@
     getPropertyValue('font');
 
   /** Sets the value of "font" */
-  void set font(String value) {
+  set font(String value) {
     setProperty('font', value, '');
   }
 
@@ -2842,7 +2824,7 @@
     getPropertyValue('font-family');
 
   /** Sets the value of "font-family" */
-  void set fontFamily(String value) {
+  set fontFamily(String value) {
     setProperty('font-family', value, '');
   }
 
@@ -2851,7 +2833,7 @@
     getPropertyValue('font-feature-settings');
 
   /** Sets the value of "font-feature-settings" */
-  void set fontFeatureSettings(String value) {
+  set fontFeatureSettings(String value) {
     setProperty('font-feature-settings', value, '');
   }
 
@@ -2860,7 +2842,7 @@
     getPropertyValue('font-kerning');
 
   /** Sets the value of "font-kerning" */
-  void set fontKerning(String value) {
+  set fontKerning(String value) {
     setProperty('font-kerning', value, '');
   }
 
@@ -2869,7 +2851,7 @@
     getPropertyValue('font-size');
 
   /** Sets the value of "font-size" */
-  void set fontSize(String value) {
+  set fontSize(String value) {
     setProperty('font-size', value, '');
   }
 
@@ -2878,7 +2860,7 @@
     getPropertyValue('font-size-delta');
 
   /** Sets the value of "font-size-delta" */
-  void set fontSizeDelta(String value) {
+  set fontSizeDelta(String value) {
     setProperty('font-size-delta', value, '');
   }
 
@@ -2887,7 +2869,7 @@
     getPropertyValue('font-smoothing');
 
   /** Sets the value of "font-smoothing" */
-  void set fontSmoothing(String value) {
+  set fontSmoothing(String value) {
     setProperty('font-smoothing', value, '');
   }
 
@@ -2896,7 +2878,7 @@
     getPropertyValue('font-stretch');
 
   /** Sets the value of "font-stretch" */
-  void set fontStretch(String value) {
+  set fontStretch(String value) {
     setProperty('font-stretch', value, '');
   }
 
@@ -2905,7 +2887,7 @@
     getPropertyValue('font-style');
 
   /** Sets the value of "font-style" */
-  void set fontStyle(String value) {
+  set fontStyle(String value) {
     setProperty('font-style', value, '');
   }
 
@@ -2914,7 +2896,7 @@
     getPropertyValue('font-variant');
 
   /** Sets the value of "font-variant" */
-  void set fontVariant(String value) {
+  set fontVariant(String value) {
     setProperty('font-variant', value, '');
   }
 
@@ -2923,7 +2905,7 @@
     getPropertyValue('font-variant-ligatures');
 
   /** Sets the value of "font-variant-ligatures" */
-  void set fontVariantLigatures(String value) {
+  set fontVariantLigatures(String value) {
     setProperty('font-variant-ligatures', value, '');
   }
 
@@ -2932,7 +2914,7 @@
     getPropertyValue('font-weight');
 
   /** Sets the value of "font-weight" */
-  void set fontWeight(String value) {
+  set fontWeight(String value) {
     setProperty('font-weight', value, '');
   }
 
@@ -2941,7 +2923,7 @@
     getPropertyValue('grid');
 
   /** Sets the value of "grid" */
-  void set grid(String value) {
+  set grid(String value) {
     setProperty('grid', value, '');
   }
 
@@ -2950,7 +2932,7 @@
     getPropertyValue('grid-area');
 
   /** Sets the value of "grid-area" */
-  void set gridArea(String value) {
+  set gridArea(String value) {
     setProperty('grid-area', value, '');
   }
 
@@ -2959,7 +2941,7 @@
     getPropertyValue('grid-auto-columns');
 
   /** Sets the value of "grid-auto-columns" */
-  void set gridAutoColumns(String value) {
+  set gridAutoColumns(String value) {
     setProperty('grid-auto-columns', value, '');
   }
 
@@ -2968,7 +2950,7 @@
     getPropertyValue('grid-auto-flow');
 
   /** Sets the value of "grid-auto-flow" */
-  void set gridAutoFlow(String value) {
+  set gridAutoFlow(String value) {
     setProperty('grid-auto-flow', value, '');
   }
 
@@ -2977,7 +2959,7 @@
     getPropertyValue('grid-auto-rows');
 
   /** Sets the value of "grid-auto-rows" */
-  void set gridAutoRows(String value) {
+  set gridAutoRows(String value) {
     setProperty('grid-auto-rows', value, '');
   }
 
@@ -2986,7 +2968,7 @@
     getPropertyValue('grid-column');
 
   /** Sets the value of "grid-column" */
-  void set gridColumn(String value) {
+  set gridColumn(String value) {
     setProperty('grid-column', value, '');
   }
 
@@ -2995,7 +2977,7 @@
     getPropertyValue('grid-column-end');
 
   /** Sets the value of "grid-column-end" */
-  void set gridColumnEnd(String value) {
+  set gridColumnEnd(String value) {
     setProperty('grid-column-end', value, '');
   }
 
@@ -3004,7 +2986,7 @@
     getPropertyValue('grid-column-start');
 
   /** Sets the value of "grid-column-start" */
-  void set gridColumnStart(String value) {
+  set gridColumnStart(String value) {
     setProperty('grid-column-start', value, '');
   }
 
@@ -3013,7 +2995,7 @@
     getPropertyValue('grid-row');
 
   /** Sets the value of "grid-row" */
-  void set gridRow(String value) {
+  set gridRow(String value) {
     setProperty('grid-row', value, '');
   }
 
@@ -3022,7 +3004,7 @@
     getPropertyValue('grid-row-end');
 
   /** Sets the value of "grid-row-end" */
-  void set gridRowEnd(String value) {
+  set gridRowEnd(String value) {
     setProperty('grid-row-end', value, '');
   }
 
@@ -3031,7 +3013,7 @@
     getPropertyValue('grid-row-start');
 
   /** Sets the value of "grid-row-start" */
-  void set gridRowStart(String value) {
+  set gridRowStart(String value) {
     setProperty('grid-row-start', value, '');
   }
 
@@ -3040,7 +3022,7 @@
     getPropertyValue('grid-template');
 
   /** Sets the value of "grid-template" */
-  void set gridTemplate(String value) {
+  set gridTemplate(String value) {
     setProperty('grid-template', value, '');
   }
 
@@ -3049,7 +3031,7 @@
     getPropertyValue('grid-template-areas');
 
   /** Sets the value of "grid-template-areas" */
-  void set gridTemplateAreas(String value) {
+  set gridTemplateAreas(String value) {
     setProperty('grid-template-areas', value, '');
   }
 
@@ -3058,7 +3040,7 @@
     getPropertyValue('grid-template-columns');
 
   /** Sets the value of "grid-template-columns" */
-  void set gridTemplateColumns(String value) {
+  set gridTemplateColumns(String value) {
     setProperty('grid-template-columns', value, '');
   }
 
@@ -3067,7 +3049,7 @@
     getPropertyValue('grid-template-rows');
 
   /** Sets the value of "grid-template-rows" */
-  void set gridTemplateRows(String value) {
+  set gridTemplateRows(String value) {
     setProperty('grid-template-rows', value, '');
   }
 
@@ -3076,7 +3058,7 @@
     getPropertyValue('height');
 
   /** Sets the value of "height" */
-  void set height(String value) {
+  set height(String value) {
     setProperty('height', value, '');
   }
 
@@ -3085,7 +3067,7 @@
     getPropertyValue('highlight');
 
   /** Sets the value of "highlight" */
-  void set highlight(String value) {
+  set highlight(String value) {
     setProperty('highlight', value, '');
   }
 
@@ -3094,7 +3076,7 @@
     getPropertyValue('hyphenate-character');
 
   /** Sets the value of "hyphenate-character" */
-  void set hyphenateCharacter(String value) {
+  set hyphenateCharacter(String value) {
     setProperty('hyphenate-character', value, '');
   }
 
@@ -3103,7 +3085,7 @@
     getPropertyValue('image-rendering');
 
   /** Sets the value of "image-rendering" */
-  void set imageRendering(String value) {
+  set imageRendering(String value) {
     setProperty('image-rendering', value, '');
   }
 
@@ -3112,7 +3094,7 @@
     getPropertyValue('isolation');
 
   /** Sets the value of "isolation" */
-  void set isolation(String value) {
+  set isolation(String value) {
     setProperty('isolation', value, '');
   }
 
@@ -3121,7 +3103,7 @@
     getPropertyValue('justify-content');
 
   /** Sets the value of "justify-content" */
-  void set justifyContent(String value) {
+  set justifyContent(String value) {
     setProperty('justify-content', value, '');
   }
 
@@ -3130,7 +3112,7 @@
     getPropertyValue('justify-self');
 
   /** Sets the value of "justify-self" */
-  void set justifySelf(String value) {
+  set justifySelf(String value) {
     setProperty('justify-self', value, '');
   }
 
@@ -3139,7 +3121,7 @@
     getPropertyValue('left');
 
   /** Sets the value of "left" */
-  void set left(String value) {
+  set left(String value) {
     setProperty('left', value, '');
   }
 
@@ -3148,7 +3130,7 @@
     getPropertyValue('letter-spacing');
 
   /** Sets the value of "letter-spacing" */
-  void set letterSpacing(String value) {
+  set letterSpacing(String value) {
     setProperty('letter-spacing', value, '');
   }
 
@@ -3157,7 +3139,7 @@
     getPropertyValue('line-box-contain');
 
   /** Sets the value of "line-box-contain" */
-  void set lineBoxContain(String value) {
+  set lineBoxContain(String value) {
     setProperty('line-box-contain', value, '');
   }
 
@@ -3166,7 +3148,7 @@
     getPropertyValue('line-break');
 
   /** Sets the value of "line-break" */
-  void set lineBreak(String value) {
+  set lineBreak(String value) {
     setProperty('line-break', value, '');
   }
 
@@ -3175,7 +3157,7 @@
     getPropertyValue('line-clamp');
 
   /** Sets the value of "line-clamp" */
-  void set lineClamp(String value) {
+  set lineClamp(String value) {
     setProperty('line-clamp', value, '');
   }
 
@@ -3184,7 +3166,7 @@
     getPropertyValue('line-height');
 
   /** Sets the value of "line-height" */
-  void set lineHeight(String value) {
+  set lineHeight(String value) {
     setProperty('line-height', value, '');
   }
 
@@ -3193,7 +3175,7 @@
     getPropertyValue('list-style');
 
   /** Sets the value of "list-style" */
-  void set listStyle(String value) {
+  set listStyle(String value) {
     setProperty('list-style', value, '');
   }
 
@@ -3202,7 +3184,7 @@
     getPropertyValue('list-style-image');
 
   /** Sets the value of "list-style-image" */
-  void set listStyleImage(String value) {
+  set listStyleImage(String value) {
     setProperty('list-style-image', value, '');
   }
 
@@ -3211,7 +3193,7 @@
     getPropertyValue('list-style-position');
 
   /** Sets the value of "list-style-position" */
-  void set listStylePosition(String value) {
+  set listStylePosition(String value) {
     setProperty('list-style-position', value, '');
   }
 
@@ -3220,7 +3202,7 @@
     getPropertyValue('list-style-type');
 
   /** Sets the value of "list-style-type" */
-  void set listStyleType(String value) {
+  set listStyleType(String value) {
     setProperty('list-style-type', value, '');
   }
 
@@ -3229,7 +3211,7 @@
     getPropertyValue('locale');
 
   /** Sets the value of "locale" */
-  void set locale(String value) {
+  set locale(String value) {
     setProperty('locale', value, '');
   }
 
@@ -3238,7 +3220,7 @@
     getPropertyValue('logical-height');
 
   /** Sets the value of "logical-height" */
-  void set logicalHeight(String value) {
+  set logicalHeight(String value) {
     setProperty('logical-height', value, '');
   }
 
@@ -3247,7 +3229,7 @@
     getPropertyValue('logical-width');
 
   /** Sets the value of "logical-width" */
-  void set logicalWidth(String value) {
+  set logicalWidth(String value) {
     setProperty('logical-width', value, '');
   }
 
@@ -3256,7 +3238,7 @@
     getPropertyValue('margin');
 
   /** Sets the value of "margin" */
-  void set margin(String value) {
+  set margin(String value) {
     setProperty('margin', value, '');
   }
 
@@ -3265,7 +3247,7 @@
     getPropertyValue('margin-after');
 
   /** Sets the value of "margin-after" */
-  void set marginAfter(String value) {
+  set marginAfter(String value) {
     setProperty('margin-after', value, '');
   }
 
@@ -3274,7 +3256,7 @@
     getPropertyValue('margin-after-collapse');
 
   /** Sets the value of "margin-after-collapse" */
-  void set marginAfterCollapse(String value) {
+  set marginAfterCollapse(String value) {
     setProperty('margin-after-collapse', value, '');
   }
 
@@ -3283,7 +3265,7 @@
     getPropertyValue('margin-before');
 
   /** Sets the value of "margin-before" */
-  void set marginBefore(String value) {
+  set marginBefore(String value) {
     setProperty('margin-before', value, '');
   }
 
@@ -3292,7 +3274,7 @@
     getPropertyValue('margin-before-collapse');
 
   /** Sets the value of "margin-before-collapse" */
-  void set marginBeforeCollapse(String value) {
+  set marginBeforeCollapse(String value) {
     setProperty('margin-before-collapse', value, '');
   }
 
@@ -3301,7 +3283,7 @@
     getPropertyValue('margin-bottom');
 
   /** Sets the value of "margin-bottom" */
-  void set marginBottom(String value) {
+  set marginBottom(String value) {
     setProperty('margin-bottom', value, '');
   }
 
@@ -3310,7 +3292,7 @@
     getPropertyValue('margin-bottom-collapse');
 
   /** Sets the value of "margin-bottom-collapse" */
-  void set marginBottomCollapse(String value) {
+  set marginBottomCollapse(String value) {
     setProperty('margin-bottom-collapse', value, '');
   }
 
@@ -3319,7 +3301,7 @@
     getPropertyValue('margin-collapse');
 
   /** Sets the value of "margin-collapse" */
-  void set marginCollapse(String value) {
+  set marginCollapse(String value) {
     setProperty('margin-collapse', value, '');
   }
 
@@ -3328,7 +3310,7 @@
     getPropertyValue('margin-end');
 
   /** Sets the value of "margin-end" */
-  void set marginEnd(String value) {
+  set marginEnd(String value) {
     setProperty('margin-end', value, '');
   }
 
@@ -3337,7 +3319,7 @@
     getPropertyValue('margin-left');
 
   /** Sets the value of "margin-left" */
-  void set marginLeft(String value) {
+  set marginLeft(String value) {
     setProperty('margin-left', value, '');
   }
 
@@ -3346,7 +3328,7 @@
     getPropertyValue('margin-right');
 
   /** Sets the value of "margin-right" */
-  void set marginRight(String value) {
+  set marginRight(String value) {
     setProperty('margin-right', value, '');
   }
 
@@ -3355,7 +3337,7 @@
     getPropertyValue('margin-start');
 
   /** Sets the value of "margin-start" */
-  void set marginStart(String value) {
+  set marginStart(String value) {
     setProperty('margin-start', value, '');
   }
 
@@ -3364,7 +3346,7 @@
     getPropertyValue('margin-top');
 
   /** Sets the value of "margin-top" */
-  void set marginTop(String value) {
+  set marginTop(String value) {
     setProperty('margin-top', value, '');
   }
 
@@ -3373,7 +3355,7 @@
     getPropertyValue('margin-top-collapse');
 
   /** Sets the value of "margin-top-collapse" */
-  void set marginTopCollapse(String value) {
+  set marginTopCollapse(String value) {
     setProperty('margin-top-collapse', value, '');
   }
 
@@ -3382,7 +3364,7 @@
     getPropertyValue('mask');
 
   /** Sets the value of "mask" */
-  void set mask(String value) {
+  set mask(String value) {
     setProperty('mask', value, '');
   }
 
@@ -3391,7 +3373,7 @@
     getPropertyValue('mask-box-image');
 
   /** Sets the value of "mask-box-image" */
-  void set maskBoxImage(String value) {
+  set maskBoxImage(String value) {
     setProperty('mask-box-image', value, '');
   }
 
@@ -3400,7 +3382,7 @@
     getPropertyValue('mask-box-image-outset');
 
   /** Sets the value of "mask-box-image-outset" */
-  void set maskBoxImageOutset(String value) {
+  set maskBoxImageOutset(String value) {
     setProperty('mask-box-image-outset', value, '');
   }
 
@@ -3409,7 +3391,7 @@
     getPropertyValue('mask-box-image-repeat');
 
   /** Sets the value of "mask-box-image-repeat" */
-  void set maskBoxImageRepeat(String value) {
+  set maskBoxImageRepeat(String value) {
     setProperty('mask-box-image-repeat', value, '');
   }
 
@@ -3418,7 +3400,7 @@
     getPropertyValue('mask-box-image-slice');
 
   /** Sets the value of "mask-box-image-slice" */
-  void set maskBoxImageSlice(String value) {
+  set maskBoxImageSlice(String value) {
     setProperty('mask-box-image-slice', value, '');
   }
 
@@ -3427,7 +3409,7 @@
     getPropertyValue('mask-box-image-source');
 
   /** Sets the value of "mask-box-image-source" */
-  void set maskBoxImageSource(String value) {
+  set maskBoxImageSource(String value) {
     setProperty('mask-box-image-source', value, '');
   }
 
@@ -3436,7 +3418,7 @@
     getPropertyValue('mask-box-image-width');
 
   /** Sets the value of "mask-box-image-width" */
-  void set maskBoxImageWidth(String value) {
+  set maskBoxImageWidth(String value) {
     setProperty('mask-box-image-width', value, '');
   }
 
@@ -3445,7 +3427,7 @@
     getPropertyValue('mask-clip');
 
   /** Sets the value of "mask-clip" */
-  void set maskClip(String value) {
+  set maskClip(String value) {
     setProperty('mask-clip', value, '');
   }
 
@@ -3454,7 +3436,7 @@
     getPropertyValue('mask-composite');
 
   /** Sets the value of "mask-composite" */
-  void set maskComposite(String value) {
+  set maskComposite(String value) {
     setProperty('mask-composite', value, '');
   }
 
@@ -3463,7 +3445,7 @@
     getPropertyValue('mask-image');
 
   /** Sets the value of "mask-image" */
-  void set maskImage(String value) {
+  set maskImage(String value) {
     setProperty('mask-image', value, '');
   }
 
@@ -3472,7 +3454,7 @@
     getPropertyValue('mask-origin');
 
   /** Sets the value of "mask-origin" */
-  void set maskOrigin(String value) {
+  set maskOrigin(String value) {
     setProperty('mask-origin', value, '');
   }
 
@@ -3481,7 +3463,7 @@
     getPropertyValue('mask-position');
 
   /** Sets the value of "mask-position" */
-  void set maskPosition(String value) {
+  set maskPosition(String value) {
     setProperty('mask-position', value, '');
   }
 
@@ -3490,7 +3472,7 @@
     getPropertyValue('mask-position-x');
 
   /** Sets the value of "mask-position-x" */
-  void set maskPositionX(String value) {
+  set maskPositionX(String value) {
     setProperty('mask-position-x', value, '');
   }
 
@@ -3499,7 +3481,7 @@
     getPropertyValue('mask-position-y');
 
   /** Sets the value of "mask-position-y" */
-  void set maskPositionY(String value) {
+  set maskPositionY(String value) {
     setProperty('mask-position-y', value, '');
   }
 
@@ -3508,7 +3490,7 @@
     getPropertyValue('mask-repeat');
 
   /** Sets the value of "mask-repeat" */
-  void set maskRepeat(String value) {
+  set maskRepeat(String value) {
     setProperty('mask-repeat', value, '');
   }
 
@@ -3517,7 +3499,7 @@
     getPropertyValue('mask-repeat-x');
 
   /** Sets the value of "mask-repeat-x" */
-  void set maskRepeatX(String value) {
+  set maskRepeatX(String value) {
     setProperty('mask-repeat-x', value, '');
   }
 
@@ -3526,7 +3508,7 @@
     getPropertyValue('mask-repeat-y');
 
   /** Sets the value of "mask-repeat-y" */
-  void set maskRepeatY(String value) {
+  set maskRepeatY(String value) {
     setProperty('mask-repeat-y', value, '');
   }
 
@@ -3535,7 +3517,7 @@
     getPropertyValue('mask-size');
 
   /** Sets the value of "mask-size" */
-  void set maskSize(String value) {
+  set maskSize(String value) {
     setProperty('mask-size', value, '');
   }
 
@@ -3544,7 +3526,7 @@
     getPropertyValue('mask-source-type');
 
   /** Sets the value of "mask-source-type" */
-  void set maskSourceType(String value) {
+  set maskSourceType(String value) {
     setProperty('mask-source-type', value, '');
   }
 
@@ -3553,7 +3535,7 @@
     getPropertyValue('max-height');
 
   /** Sets the value of "max-height" */
-  void set maxHeight(String value) {
+  set maxHeight(String value) {
     setProperty('max-height', value, '');
   }
 
@@ -3562,7 +3544,7 @@
     getPropertyValue('max-logical-height');
 
   /** Sets the value of "max-logical-height" */
-  void set maxLogicalHeight(String value) {
+  set maxLogicalHeight(String value) {
     setProperty('max-logical-height', value, '');
   }
 
@@ -3571,7 +3553,7 @@
     getPropertyValue('max-logical-width');
 
   /** Sets the value of "max-logical-width" */
-  void set maxLogicalWidth(String value) {
+  set maxLogicalWidth(String value) {
     setProperty('max-logical-width', value, '');
   }
 
@@ -3580,7 +3562,7 @@
     getPropertyValue('max-width');
 
   /** Sets the value of "max-width" */
-  void set maxWidth(String value) {
+  set maxWidth(String value) {
     setProperty('max-width', value, '');
   }
 
@@ -3589,7 +3571,7 @@
     getPropertyValue('max-zoom');
 
   /** Sets the value of "max-zoom" */
-  void set maxZoom(String value) {
+  set maxZoom(String value) {
     setProperty('max-zoom', value, '');
   }
 
@@ -3598,7 +3580,7 @@
     getPropertyValue('min-height');
 
   /** Sets the value of "min-height" */
-  void set minHeight(String value) {
+  set minHeight(String value) {
     setProperty('min-height', value, '');
   }
 
@@ -3607,7 +3589,7 @@
     getPropertyValue('min-logical-height');
 
   /** Sets the value of "min-logical-height" */
-  void set minLogicalHeight(String value) {
+  set minLogicalHeight(String value) {
     setProperty('min-logical-height', value, '');
   }
 
@@ -3616,7 +3598,7 @@
     getPropertyValue('min-logical-width');
 
   /** Sets the value of "min-logical-width" */
-  void set minLogicalWidth(String value) {
+  set minLogicalWidth(String value) {
     setProperty('min-logical-width', value, '');
   }
 
@@ -3625,7 +3607,7 @@
     getPropertyValue('min-width');
 
   /** Sets the value of "min-width" */
-  void set minWidth(String value) {
+  set minWidth(String value) {
     setProperty('min-width', value, '');
   }
 
@@ -3634,7 +3616,7 @@
     getPropertyValue('min-zoom');
 
   /** Sets the value of "min-zoom" */
-  void set minZoom(String value) {
+  set minZoom(String value) {
     setProperty('min-zoom', value, '');
   }
 
@@ -3643,7 +3625,7 @@
     getPropertyValue('mix-blend-mode');
 
   /** Sets the value of "mix-blend-mode" */
-  void set mixBlendMode(String value) {
+  set mixBlendMode(String value) {
     setProperty('mix-blend-mode', value, '');
   }
 
@@ -3652,7 +3634,7 @@
     getPropertyValue('object-fit');
 
   /** Sets the value of "object-fit" */
-  void set objectFit(String value) {
+  set objectFit(String value) {
     setProperty('object-fit', value, '');
   }
 
@@ -3661,7 +3643,7 @@
     getPropertyValue('object-position');
 
   /** Sets the value of "object-position" */
-  void set objectPosition(String value) {
+  set objectPosition(String value) {
     setProperty('object-position', value, '');
   }
 
@@ -3670,7 +3652,7 @@
     getPropertyValue('opacity');
 
   /** Sets the value of "opacity" */
-  void set opacity(String value) {
+  set opacity(String value) {
     setProperty('opacity', value, '');
   }
 
@@ -3679,7 +3661,7 @@
     getPropertyValue('order');
 
   /** Sets the value of "order" */
-  void set order(String value) {
+  set order(String value) {
     setProperty('order', value, '');
   }
 
@@ -3688,7 +3670,7 @@
     getPropertyValue('orientation');
 
   /** Sets the value of "orientation" */
-  void set orientation(String value) {
+  set orientation(String value) {
     setProperty('orientation', value, '');
   }
 
@@ -3697,7 +3679,7 @@
     getPropertyValue('orphans');
 
   /** Sets the value of "orphans" */
-  void set orphans(String value) {
+  set orphans(String value) {
     setProperty('orphans', value, '');
   }
 
@@ -3706,7 +3688,7 @@
     getPropertyValue('outline');
 
   /** Sets the value of "outline" */
-  void set outline(String value) {
+  set outline(String value) {
     setProperty('outline', value, '');
   }
 
@@ -3715,7 +3697,7 @@
     getPropertyValue('outline-color');
 
   /** Sets the value of "outline-color" */
-  void set outlineColor(String value) {
+  set outlineColor(String value) {
     setProperty('outline-color', value, '');
   }
 
@@ -3724,7 +3706,7 @@
     getPropertyValue('outline-offset');
 
   /** Sets the value of "outline-offset" */
-  void set outlineOffset(String value) {
+  set outlineOffset(String value) {
     setProperty('outline-offset', value, '');
   }
 
@@ -3733,7 +3715,7 @@
     getPropertyValue('outline-style');
 
   /** Sets the value of "outline-style" */
-  void set outlineStyle(String value) {
+  set outlineStyle(String value) {
     setProperty('outline-style', value, '');
   }
 
@@ -3742,7 +3724,7 @@
     getPropertyValue('outline-width');
 
   /** Sets the value of "outline-width" */
-  void set outlineWidth(String value) {
+  set outlineWidth(String value) {
     setProperty('outline-width', value, '');
   }
 
@@ -3751,7 +3733,7 @@
     getPropertyValue('overflow');
 
   /** Sets the value of "overflow" */
-  void set overflow(String value) {
+  set overflow(String value) {
     setProperty('overflow', value, '');
   }
 
@@ -3760,7 +3742,7 @@
     getPropertyValue('overflow-wrap');
 
   /** Sets the value of "overflow-wrap" */
-  void set overflowWrap(String value) {
+  set overflowWrap(String value) {
     setProperty('overflow-wrap', value, '');
   }
 
@@ -3769,7 +3751,7 @@
     getPropertyValue('overflow-x');
 
   /** Sets the value of "overflow-x" */
-  void set overflowX(String value) {
+  set overflowX(String value) {
     setProperty('overflow-x', value, '');
   }
 
@@ -3778,7 +3760,7 @@
     getPropertyValue('overflow-y');
 
   /** Sets the value of "overflow-y" */
-  void set overflowY(String value) {
+  set overflowY(String value) {
     setProperty('overflow-y', value, '');
   }
 
@@ -3787,7 +3769,7 @@
     getPropertyValue('padding');
 
   /** Sets the value of "padding" */
-  void set padding(String value) {
+  set padding(String value) {
     setProperty('padding', value, '');
   }
 
@@ -3796,7 +3778,7 @@
     getPropertyValue('padding-after');
 
   /** Sets the value of "padding-after" */
-  void set paddingAfter(String value) {
+  set paddingAfter(String value) {
     setProperty('padding-after', value, '');
   }
 
@@ -3805,7 +3787,7 @@
     getPropertyValue('padding-before');
 
   /** Sets the value of "padding-before" */
-  void set paddingBefore(String value) {
+  set paddingBefore(String value) {
     setProperty('padding-before', value, '');
   }
 
@@ -3814,7 +3796,7 @@
     getPropertyValue('padding-bottom');
 
   /** Sets the value of "padding-bottom" */
-  void set paddingBottom(String value) {
+  set paddingBottom(String value) {
     setProperty('padding-bottom', value, '');
   }
 
@@ -3823,7 +3805,7 @@
     getPropertyValue('padding-end');
 
   /** Sets the value of "padding-end" */
-  void set paddingEnd(String value) {
+  set paddingEnd(String value) {
     setProperty('padding-end', value, '');
   }
 
@@ -3832,7 +3814,7 @@
     getPropertyValue('padding-left');
 
   /** Sets the value of "padding-left" */
-  void set paddingLeft(String value) {
+  set paddingLeft(String value) {
     setProperty('padding-left', value, '');
   }
 
@@ -3841,7 +3823,7 @@
     getPropertyValue('padding-right');
 
   /** Sets the value of "padding-right" */
-  void set paddingRight(String value) {
+  set paddingRight(String value) {
     setProperty('padding-right', value, '');
   }
 
@@ -3850,7 +3832,7 @@
     getPropertyValue('padding-start');
 
   /** Sets the value of "padding-start" */
-  void set paddingStart(String value) {
+  set paddingStart(String value) {
     setProperty('padding-start', value, '');
   }
 
@@ -3859,7 +3841,7 @@
     getPropertyValue('padding-top');
 
   /** Sets the value of "padding-top" */
-  void set paddingTop(String value) {
+  set paddingTop(String value) {
     setProperty('padding-top', value, '');
   }
 
@@ -3868,7 +3850,7 @@
     getPropertyValue('page');
 
   /** Sets the value of "page" */
-  void set page(String value) {
+  set page(String value) {
     setProperty('page', value, '');
   }
 
@@ -3877,7 +3859,7 @@
     getPropertyValue('page-break-after');
 
   /** Sets the value of "page-break-after" */
-  void set pageBreakAfter(String value) {
+  set pageBreakAfter(String value) {
     setProperty('page-break-after', value, '');
   }
 
@@ -3886,7 +3868,7 @@
     getPropertyValue('page-break-before');
 
   /** Sets the value of "page-break-before" */
-  void set pageBreakBefore(String value) {
+  set pageBreakBefore(String value) {
     setProperty('page-break-before', value, '');
   }
 
@@ -3895,7 +3877,7 @@
     getPropertyValue('page-break-inside');
 
   /** Sets the value of "page-break-inside" */
-  void set pageBreakInside(String value) {
+  set pageBreakInside(String value) {
     setProperty('page-break-inside', value, '');
   }
 
@@ -3904,7 +3886,7 @@
     getPropertyValue('perspective');
 
   /** Sets the value of "perspective" */
-  void set perspective(String value) {
+  set perspective(String value) {
     setProperty('perspective', value, '');
   }
 
@@ -3913,7 +3895,7 @@
     getPropertyValue('perspective-origin');
 
   /** Sets the value of "perspective-origin" */
-  void set perspectiveOrigin(String value) {
+  set perspectiveOrigin(String value) {
     setProperty('perspective-origin', value, '');
   }
 
@@ -3922,7 +3904,7 @@
     getPropertyValue('perspective-origin-x');
 
   /** Sets the value of "perspective-origin-x" */
-  void set perspectiveOriginX(String value) {
+  set perspectiveOriginX(String value) {
     setProperty('perspective-origin-x', value, '');
   }
 
@@ -3931,7 +3913,7 @@
     getPropertyValue('perspective-origin-y');
 
   /** Sets the value of "perspective-origin-y" */
-  void set perspectiveOriginY(String value) {
+  set perspectiveOriginY(String value) {
     setProperty('perspective-origin-y', value, '');
   }
 
@@ -3940,7 +3922,7 @@
     getPropertyValue('pointer-events');
 
   /** Sets the value of "pointer-events" */
-  void set pointerEvents(String value) {
+  set pointerEvents(String value) {
     setProperty('pointer-events', value, '');
   }
 
@@ -3949,7 +3931,7 @@
     getPropertyValue('position');
 
   /** Sets the value of "position" */
-  void set position(String value) {
+  set position(String value) {
     setProperty('position', value, '');
   }
 
@@ -3958,7 +3940,7 @@
     getPropertyValue('print-color-adjust');
 
   /** Sets the value of "print-color-adjust" */
-  void set printColorAdjust(String value) {
+  set printColorAdjust(String value) {
     setProperty('print-color-adjust', value, '');
   }
 
@@ -3967,7 +3949,7 @@
     getPropertyValue('quotes');
 
   /** Sets the value of "quotes" */
-  void set quotes(String value) {
+  set quotes(String value) {
     setProperty('quotes', value, '');
   }
 
@@ -3976,7 +3958,7 @@
     getPropertyValue('resize');
 
   /** Sets the value of "resize" */
-  void set resize(String value) {
+  set resize(String value) {
     setProperty('resize', value, '');
   }
 
@@ -3985,7 +3967,7 @@
     getPropertyValue('right');
 
   /** Sets the value of "right" */
-  void set right(String value) {
+  set right(String value) {
     setProperty('right', value, '');
   }
 
@@ -3994,7 +3976,7 @@
     getPropertyValue('rtl-ordering');
 
   /** Sets the value of "rtl-ordering" */
-  void set rtlOrdering(String value) {
+  set rtlOrdering(String value) {
     setProperty('rtl-ordering', value, '');
   }
 
@@ -4003,7 +3985,7 @@
     getPropertyValue('ruby-position');
 
   /** Sets the value of "ruby-position" */
-  void set rubyPosition(String value) {
+  set rubyPosition(String value) {
     setProperty('ruby-position', value, '');
   }
 
@@ -4012,7 +3994,7 @@
     getPropertyValue('scroll-behavior');
 
   /** Sets the value of "scroll-behavior" */
-  void set scrollBehavior(String value) {
+  set scrollBehavior(String value) {
     setProperty('scroll-behavior', value, '');
   }
 
@@ -4021,7 +4003,7 @@
     getPropertyValue('shape-image-threshold');
 
   /** Sets the value of "shape-image-threshold" */
-  void set shapeImageThreshold(String value) {
+  set shapeImageThreshold(String value) {
     setProperty('shape-image-threshold', value, '');
   }
 
@@ -4030,7 +4012,7 @@
     getPropertyValue('shape-margin');
 
   /** Sets the value of "shape-margin" */
-  void set shapeMargin(String value) {
+  set shapeMargin(String value) {
     setProperty('shape-margin', value, '');
   }
 
@@ -4039,7 +4021,7 @@
     getPropertyValue('shape-outside');
 
   /** Sets the value of "shape-outside" */
-  void set shapeOutside(String value) {
+  set shapeOutside(String value) {
     setProperty('shape-outside', value, '');
   }
 
@@ -4048,7 +4030,7 @@
     getPropertyValue('size');
 
   /** Sets the value of "size" */
-  void set size(String value) {
+  set size(String value) {
     setProperty('size', value, '');
   }
 
@@ -4057,7 +4039,7 @@
     getPropertyValue('speak');
 
   /** Sets the value of "speak" */
-  void set speak(String value) {
+  set speak(String value) {
     setProperty('speak', value, '');
   }
 
@@ -4066,7 +4048,7 @@
     getPropertyValue('src');
 
   /** Sets the value of "src" */
-  void set src(String value) {
+  set src(String value) {
     setProperty('src', value, '');
   }
 
@@ -4075,7 +4057,7 @@
     getPropertyValue('tab-size');
 
   /** Sets the value of "tab-size" */
-  void set tabSize(String value) {
+  set tabSize(String value) {
     setProperty('tab-size', value, '');
   }
 
@@ -4084,7 +4066,7 @@
     getPropertyValue('table-layout');
 
   /** Sets the value of "table-layout" */
-  void set tableLayout(String value) {
+  set tableLayout(String value) {
     setProperty('table-layout', value, '');
   }
 
@@ -4093,7 +4075,7 @@
     getPropertyValue('tap-highlight-color');
 
   /** Sets the value of "tap-highlight-color" */
-  void set tapHighlightColor(String value) {
+  set tapHighlightColor(String value) {
     setProperty('tap-highlight-color', value, '');
   }
 
@@ -4102,7 +4084,7 @@
     getPropertyValue('text-align');
 
   /** Sets the value of "text-align" */
-  void set textAlign(String value) {
+  set textAlign(String value) {
     setProperty('text-align', value, '');
   }
 
@@ -4111,7 +4093,7 @@
     getPropertyValue('text-align-last');
 
   /** Sets the value of "text-align-last" */
-  void set textAlignLast(String value) {
+  set textAlignLast(String value) {
     setProperty('text-align-last', value, '');
   }
 
@@ -4120,7 +4102,7 @@
     getPropertyValue('text-combine');
 
   /** Sets the value of "text-combine" */
-  void set textCombine(String value) {
+  set textCombine(String value) {
     setProperty('text-combine', value, '');
   }
 
@@ -4129,7 +4111,7 @@
     getPropertyValue('text-decoration');
 
   /** Sets the value of "text-decoration" */
-  void set textDecoration(String value) {
+  set textDecoration(String value) {
     setProperty('text-decoration', value, '');
   }
 
@@ -4138,7 +4120,7 @@
     getPropertyValue('text-decoration-color');
 
   /** Sets the value of "text-decoration-color" */
-  void set textDecorationColor(String value) {
+  set textDecorationColor(String value) {
     setProperty('text-decoration-color', value, '');
   }
 
@@ -4147,7 +4129,7 @@
     getPropertyValue('text-decoration-line');
 
   /** Sets the value of "text-decoration-line" */
-  void set textDecorationLine(String value) {
+  set textDecorationLine(String value) {
     setProperty('text-decoration-line', value, '');
   }
 
@@ -4156,7 +4138,7 @@
     getPropertyValue('text-decoration-style');
 
   /** Sets the value of "text-decoration-style" */
-  void set textDecorationStyle(String value) {
+  set textDecorationStyle(String value) {
     setProperty('text-decoration-style', value, '');
   }
 
@@ -4165,7 +4147,7 @@
     getPropertyValue('text-decorations-in-effect');
 
   /** Sets the value of "text-decorations-in-effect" */
-  void set textDecorationsInEffect(String value) {
+  set textDecorationsInEffect(String value) {
     setProperty('text-decorations-in-effect', value, '');
   }
 
@@ -4174,7 +4156,7 @@
     getPropertyValue('text-emphasis');
 
   /** Sets the value of "text-emphasis" */
-  void set textEmphasis(String value) {
+  set textEmphasis(String value) {
     setProperty('text-emphasis', value, '');
   }
 
@@ -4183,7 +4165,7 @@
     getPropertyValue('text-emphasis-color');
 
   /** Sets the value of "text-emphasis-color" */
-  void set textEmphasisColor(String value) {
+  set textEmphasisColor(String value) {
     setProperty('text-emphasis-color', value, '');
   }
 
@@ -4192,7 +4174,7 @@
     getPropertyValue('text-emphasis-position');
 
   /** Sets the value of "text-emphasis-position" */
-  void set textEmphasisPosition(String value) {
+  set textEmphasisPosition(String value) {
     setProperty('text-emphasis-position', value, '');
   }
 
@@ -4201,7 +4183,7 @@
     getPropertyValue('text-emphasis-style');
 
   /** Sets the value of "text-emphasis-style" */
-  void set textEmphasisStyle(String value) {
+  set textEmphasisStyle(String value) {
     setProperty('text-emphasis-style', value, '');
   }
 
@@ -4210,7 +4192,7 @@
     getPropertyValue('text-fill-color');
 
   /** Sets the value of "text-fill-color" */
-  void set textFillColor(String value) {
+  set textFillColor(String value) {
     setProperty('text-fill-color', value, '');
   }
 
@@ -4219,7 +4201,7 @@
     getPropertyValue('text-indent');
 
   /** Sets the value of "text-indent" */
-  void set textIndent(String value) {
+  set textIndent(String value) {
     setProperty('text-indent', value, '');
   }
 
@@ -4228,7 +4210,7 @@
     getPropertyValue('text-justify');
 
   /** Sets the value of "text-justify" */
-  void set textJustify(String value) {
+  set textJustify(String value) {
     setProperty('text-justify', value, '');
   }
 
@@ -4237,7 +4219,7 @@
     getPropertyValue('text-line-through-color');
 
   /** Sets the value of "text-line-through-color" */
-  void set textLineThroughColor(String value) {
+  set textLineThroughColor(String value) {
     setProperty('text-line-through-color', value, '');
   }
 
@@ -4246,7 +4228,7 @@
     getPropertyValue('text-line-through-mode');
 
   /** Sets the value of "text-line-through-mode" */
-  void set textLineThroughMode(String value) {
+  set textLineThroughMode(String value) {
     setProperty('text-line-through-mode', value, '');
   }
 
@@ -4255,7 +4237,7 @@
     getPropertyValue('text-line-through-style');
 
   /** Sets the value of "text-line-through-style" */
-  void set textLineThroughStyle(String value) {
+  set textLineThroughStyle(String value) {
     setProperty('text-line-through-style', value, '');
   }
 
@@ -4264,7 +4246,7 @@
     getPropertyValue('text-line-through-width');
 
   /** Sets the value of "text-line-through-width" */
-  void set textLineThroughWidth(String value) {
+  set textLineThroughWidth(String value) {
     setProperty('text-line-through-width', value, '');
   }
 
@@ -4273,7 +4255,7 @@
     getPropertyValue('text-orientation');
 
   /** Sets the value of "text-orientation" */
-  void set textOrientation(String value) {
+  set textOrientation(String value) {
     setProperty('text-orientation', value, '');
   }
 
@@ -4282,7 +4264,7 @@
     getPropertyValue('text-overflow');
 
   /** Sets the value of "text-overflow" */
-  void set textOverflow(String value) {
+  set textOverflow(String value) {
     setProperty('text-overflow', value, '');
   }
 
@@ -4291,7 +4273,7 @@
     getPropertyValue('text-overline-color');
 
   /** Sets the value of "text-overline-color" */
-  void set textOverlineColor(String value) {
+  set textOverlineColor(String value) {
     setProperty('text-overline-color', value, '');
   }
 
@@ -4300,7 +4282,7 @@
     getPropertyValue('text-overline-mode');
 
   /** Sets the value of "text-overline-mode" */
-  void set textOverlineMode(String value) {
+  set textOverlineMode(String value) {
     setProperty('text-overline-mode', value, '');
   }
 
@@ -4309,7 +4291,7 @@
     getPropertyValue('text-overline-style');
 
   /** Sets the value of "text-overline-style" */
-  void set textOverlineStyle(String value) {
+  set textOverlineStyle(String value) {
     setProperty('text-overline-style', value, '');
   }
 
@@ -4318,7 +4300,7 @@
     getPropertyValue('text-overline-width');
 
   /** Sets the value of "text-overline-width" */
-  void set textOverlineWidth(String value) {
+  set textOverlineWidth(String value) {
     setProperty('text-overline-width', value, '');
   }
 
@@ -4327,7 +4309,7 @@
     getPropertyValue('text-rendering');
 
   /** Sets the value of "text-rendering" */
-  void set textRendering(String value) {
+  set textRendering(String value) {
     setProperty('text-rendering', value, '');
   }
 
@@ -4336,7 +4318,7 @@
     getPropertyValue('text-security');
 
   /** Sets the value of "text-security" */
-  void set textSecurity(String value) {
+  set textSecurity(String value) {
     setProperty('text-security', value, '');
   }
 
@@ -4345,7 +4327,7 @@
     getPropertyValue('text-shadow');
 
   /** Sets the value of "text-shadow" */
-  void set textShadow(String value) {
+  set textShadow(String value) {
     setProperty('text-shadow', value, '');
   }
 
@@ -4354,7 +4336,7 @@
     getPropertyValue('text-stroke');
 
   /** Sets the value of "text-stroke" */
-  void set textStroke(String value) {
+  set textStroke(String value) {
     setProperty('text-stroke', value, '');
   }
 
@@ -4363,7 +4345,7 @@
     getPropertyValue('text-stroke-color');
 
   /** Sets the value of "text-stroke-color" */
-  void set textStrokeColor(String value) {
+  set textStrokeColor(String value) {
     setProperty('text-stroke-color', value, '');
   }
 
@@ -4372,7 +4354,7 @@
     getPropertyValue('text-stroke-width');
 
   /** Sets the value of "text-stroke-width" */
-  void set textStrokeWidth(String value) {
+  set textStrokeWidth(String value) {
     setProperty('text-stroke-width', value, '');
   }
 
@@ -4381,7 +4363,7 @@
     getPropertyValue('text-transform');
 
   /** Sets the value of "text-transform" */
-  void set textTransform(String value) {
+  set textTransform(String value) {
     setProperty('text-transform', value, '');
   }
 
@@ -4390,7 +4372,7 @@
     getPropertyValue('text-underline-color');
 
   /** Sets the value of "text-underline-color" */
-  void set textUnderlineColor(String value) {
+  set textUnderlineColor(String value) {
     setProperty('text-underline-color', value, '');
   }
 
@@ -4399,7 +4381,7 @@
     getPropertyValue('text-underline-mode');
 
   /** Sets the value of "text-underline-mode" */
-  void set textUnderlineMode(String value) {
+  set textUnderlineMode(String value) {
     setProperty('text-underline-mode', value, '');
   }
 
@@ -4408,7 +4390,7 @@
     getPropertyValue('text-underline-position');
 
   /** Sets the value of "text-underline-position" */
-  void set textUnderlinePosition(String value) {
+  set textUnderlinePosition(String value) {
     setProperty('text-underline-position', value, '');
   }
 
@@ -4417,7 +4399,7 @@
     getPropertyValue('text-underline-style');
 
   /** Sets the value of "text-underline-style" */
-  void set textUnderlineStyle(String value) {
+  set textUnderlineStyle(String value) {
     setProperty('text-underline-style', value, '');
   }
 
@@ -4426,7 +4408,7 @@
     getPropertyValue('text-underline-width');
 
   /** Sets the value of "text-underline-width" */
-  void set textUnderlineWidth(String value) {
+  set textUnderlineWidth(String value) {
     setProperty('text-underline-width', value, '');
   }
 
@@ -4435,7 +4417,7 @@
     getPropertyValue('top');
 
   /** Sets the value of "top" */
-  void set top(String value) {
+  set top(String value) {
     setProperty('top', value, '');
   }
 
@@ -4444,7 +4426,7 @@
     getPropertyValue('touch-action');
 
   /** Sets the value of "touch-action" */
-  void set touchAction(String value) {
+  set touchAction(String value) {
     setProperty('touch-action', value, '');
   }
 
@@ -4453,7 +4435,7 @@
     getPropertyValue('touch-action-delay');
 
   /** Sets the value of "touch-action-delay" */
-  void set touchActionDelay(String value) {
+  set touchActionDelay(String value) {
     setProperty('touch-action-delay', value, '');
   }
 
@@ -4462,7 +4444,7 @@
     getPropertyValue('transform');
 
   /** Sets the value of "transform" */
-  void set transform(String value) {
+  set transform(String value) {
     setProperty('transform', value, '');
   }
 
@@ -4471,7 +4453,7 @@
     getPropertyValue('transform-origin');
 
   /** Sets the value of "transform-origin" */
-  void set transformOrigin(String value) {
+  set transformOrigin(String value) {
     setProperty('transform-origin', value, '');
   }
 
@@ -4480,7 +4462,7 @@
     getPropertyValue('transform-origin-x');
 
   /** Sets the value of "transform-origin-x" */
-  void set transformOriginX(String value) {
+  set transformOriginX(String value) {
     setProperty('transform-origin-x', value, '');
   }
 
@@ -4489,7 +4471,7 @@
     getPropertyValue('transform-origin-y');
 
   /** Sets the value of "transform-origin-y" */
-  void set transformOriginY(String value) {
+  set transformOriginY(String value) {
     setProperty('transform-origin-y', value, '');
   }
 
@@ -4498,7 +4480,7 @@
     getPropertyValue('transform-origin-z');
 
   /** Sets the value of "transform-origin-z" */
-  void set transformOriginZ(String value) {
+  set transformOriginZ(String value) {
     setProperty('transform-origin-z', value, '');
   }
 
@@ -4507,7 +4489,7 @@
     getPropertyValue('transform-style');
 
   /** Sets the value of "transform-style" */
-  void set transformStyle(String value) {
+  set transformStyle(String value) {
     setProperty('transform-style', value, '');
   }
 
@@ -4522,7 +4504,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void set transition(String value) {
+  set transition(String value) {
     setProperty('transition', value, '');
   }
 
@@ -4531,7 +4513,7 @@
     getPropertyValue('transition-delay');
 
   /** Sets the value of "transition-delay" */
-  void set transitionDelay(String value) {
+  set transitionDelay(String value) {
     setProperty('transition-delay', value, '');
   }
 
@@ -4540,7 +4522,7 @@
     getPropertyValue('transition-duration');
 
   /** Sets the value of "transition-duration" */
-  void set transitionDuration(String value) {
+  set transitionDuration(String value) {
     setProperty('transition-duration', value, '');
   }
 
@@ -4549,7 +4531,7 @@
     getPropertyValue('transition-property');
 
   /** Sets the value of "transition-property" */
-  void set transitionProperty(String value) {
+  set transitionProperty(String value) {
     setProperty('transition-property', value, '');
   }
 
@@ -4558,7 +4540,7 @@
     getPropertyValue('transition-timing-function');
 
   /** Sets the value of "transition-timing-function" */
-  void set transitionTimingFunction(String value) {
+  set transitionTimingFunction(String value) {
     setProperty('transition-timing-function', value, '');
   }
 
@@ -4567,7 +4549,7 @@
     getPropertyValue('unicode-bidi');
 
   /** Sets the value of "unicode-bidi" */
-  void set unicodeBidi(String value) {
+  set unicodeBidi(String value) {
     setProperty('unicode-bidi', value, '');
   }
 
@@ -4576,7 +4558,7 @@
     getPropertyValue('unicode-range');
 
   /** Sets the value of "unicode-range" */
-  void set unicodeRange(String value) {
+  set unicodeRange(String value) {
     setProperty('unicode-range', value, '');
   }
 
@@ -4585,7 +4567,7 @@
     getPropertyValue('user-drag');
 
   /** Sets the value of "user-drag" */
-  void set userDrag(String value) {
+  set userDrag(String value) {
     setProperty('user-drag', value, '');
   }
 
@@ -4594,7 +4576,7 @@
     getPropertyValue('user-modify');
 
   /** Sets the value of "user-modify" */
-  void set userModify(String value) {
+  set userModify(String value) {
     setProperty('user-modify', value, '');
   }
 
@@ -4603,7 +4585,7 @@
     getPropertyValue('user-select');
 
   /** Sets the value of "user-select" */
-  void set userSelect(String value) {
+  set userSelect(String value) {
     setProperty('user-select', value, '');
   }
 
@@ -4612,7 +4594,7 @@
     getPropertyValue('user-zoom');
 
   /** Sets the value of "user-zoom" */
-  void set userZoom(String value) {
+  set userZoom(String value) {
     setProperty('user-zoom', value, '');
   }
 
@@ -4621,7 +4603,7 @@
     getPropertyValue('vertical-align');
 
   /** Sets the value of "vertical-align" */
-  void set verticalAlign(String value) {
+  set verticalAlign(String value) {
     setProperty('vertical-align', value, '');
   }
 
@@ -4630,7 +4612,7 @@
     getPropertyValue('visibility');
 
   /** Sets the value of "visibility" */
-  void set visibility(String value) {
+  set visibility(String value) {
     setProperty('visibility', value, '');
   }
 
@@ -4639,7 +4621,7 @@
     getPropertyValue('white-space');
 
   /** Sets the value of "white-space" */
-  void set whiteSpace(String value) {
+  set whiteSpace(String value) {
     setProperty('white-space', value, '');
   }
 
@@ -4648,7 +4630,7 @@
     getPropertyValue('widows');
 
   /** Sets the value of "widows" */
-  void set widows(String value) {
+  set widows(String value) {
     setProperty('widows', value, '');
   }
 
@@ -4657,7 +4639,7 @@
     getPropertyValue('width');
 
   /** Sets the value of "width" */
-  void set width(String value) {
+  set width(String value) {
     setProperty('width', value, '');
   }
 
@@ -4666,7 +4648,7 @@
     getPropertyValue('will-change');
 
   /** Sets the value of "will-change" */
-  void set willChange(String value) {
+  set willChange(String value) {
     setProperty('will-change', value, '');
   }
 
@@ -4675,7 +4657,7 @@
     getPropertyValue('word-break');
 
   /** Sets the value of "word-break" */
-  void set wordBreak(String value) {
+  set wordBreak(String value) {
     setProperty('word-break', value, '');
   }
 
@@ -4684,7 +4666,7 @@
     getPropertyValue('word-spacing');
 
   /** Sets the value of "word-spacing" */
-  void set wordSpacing(String value) {
+  set wordSpacing(String value) {
     setProperty('word-spacing', value, '');
   }
 
@@ -4693,7 +4675,7 @@
     getPropertyValue('word-wrap');
 
   /** Sets the value of "word-wrap" */
-  void set wordWrap(String value) {
+  set wordWrap(String value) {
     setProperty('word-wrap', value, '');
   }
 
@@ -4702,7 +4684,7 @@
     getPropertyValue('wrap-flow');
 
   /** Sets the value of "wrap-flow" */
-  void set wrapFlow(String value) {
+  set wrapFlow(String value) {
     setProperty('wrap-flow', value, '');
   }
 
@@ -4711,7 +4693,7 @@
     getPropertyValue('wrap-through');
 
   /** Sets the value of "wrap-through" */
-  void set wrapThrough(String value) {
+  set wrapThrough(String value) {
     setProperty('wrap-through', value, '');
   }
 
@@ -4720,7 +4702,7 @@
     getPropertyValue('writing-mode');
 
   /** Sets the value of "writing-mode" */
-  void set writingMode(String value) {
+  set writingMode(String value) {
     setProperty('writing-mode', value, '');
   }
 
@@ -4729,7 +4711,7 @@
     getPropertyValue('z-index');
 
   /** Sets the value of "z-index" */
-  void set zIndex(String value) {
+  set zIndex(String value) {
     setProperty('z-index', value, '');
   }
 
@@ -4738,7 +4720,7 @@
     getPropertyValue('zoom');
 
   /** Sets the value of "zoom" */
-  void set zoom(String value) {
+  set zoom(String value) {
     setProperty('zoom', value, '');
   }
 }
diff --git a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
index 41b238e..bd70659e 100644
--- a/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
+++ b/tools/dom/templates/html/impl/impl_CanvasRenderingContext2D.darttemplate
@@ -280,7 +280,7 @@
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   // TODO(14316): Firefox has this functionality with mozDashOffset, but it
   // needs to be polyfilled.
-  void set lineDashOffset(num value) {
+  set lineDashOffset(num value) {
     JS('void',
        'typeof #.lineDashOffset != "undefined" ? #.lineDashOffset = # : '
        '#.webkitLineDashOffset = #', this, this, value, this, value);
diff --git a/tools/dom/templates/html/impl/impl_DOMException.darttemplate b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
index be8c36c..809b2e5 100644
--- a/tools/dom/templates/html/impl/impl_DOMException.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DOMException.darttemplate
@@ -40,7 +40,51 @@
     return errorName;
   }
 $endif
+$if JSINTEROP
+  String _name;
+  String _message;
+
+  // To suppress missing implicit constructor warnings.
+  factory DomException._() { throw new UnsupportedError("Not supported"); }
+
+  static DomException internalCreateDomException() {
+    return new DomException._internalWrap();
+  }
+
+  js.JsObject blink_jsObject;
+
+  factory DomException._internalWrap() {
+    return new DomException.internal_();
+  }
+
+  DomException.internal_() { }
+
+  DomException.jsInterop(String m) {
+    var name_index = m.indexOf(': ');
+    if (name_index < 0) {
+      _name = "";
+      _message = m;
+    } else {
+      _name = m.substring(0, name_index);
+      _message = m.substring(name_index + 1).trim();
+    }
+  }
+
+  @DomName('DOMException.message')
+  @DocsEditable()
+  String get message => _message;
+
+  @DomName('DOMException.name')
+  @DocsEditable()
+  String get name => _name;
+
+  @DomName('DOMException.toString')
+  @DocsEditable()
+  String toString() => "${_name}: $_message";
+
+$else
 $!MEMBERS
+$endif
 $if DART2JS
   @DomName('DOMException.toString')
   @DocsEditable()
diff --git a/tools/dom/templates/html/impl/impl_Document.darttemplate b/tools/dom/templates/html/impl/impl_Document.darttemplate
index a9b19cf..fb6d6b18 100644
--- a/tools/dom/templates/html/impl/impl_Document.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Document.darttemplate
@@ -26,11 +26,7 @@
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
   ElementList<Element> querySelectorAll(String selectors) {
-$if JSINTEROP
-    return _querySelectorAll(selectors);
-$else
     return new _FrozenElementList._wrap(_querySelectorAll(selectors));
-$endif
   }
 
   /**
@@ -68,18 +64,72 @@
   @DomName('Document.createElement')
   Element createElement(String tagName, [String typeExtension]) {
 $if DART2JS
-    return _createElement(tagName, typeExtension);
+    if (typeExtension == null) {
+      return _createElement_2(tagName);
+    } else {
+      return _createElement(tagName, typeExtension);
+    }
 $else
-  $if JSINTEROP
-    return _createElement(tagName, typeExtension);
-  $else
-    if (typeExtension != null) {  
-      return _createElement(tagName, typeExtension);  
-    } else {  
-      // Fast-path for Dartium when typeExtension is not needed.  
-      return _Utils.createElement(this, tagName); 
-    } 
-  $endif
+    var newElement = (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElement_Callback_1_(unwrap_jso(this), tagName) :
+      _blink.BlinkDocument.instance.createElement_Callback_2_(unwrap_jso(this), tagName, typeExtension);
+
+    var wrapped;
+
+    if (newElement['dart_class'] != null) {
+      wrapped = newElement['dart_class'];         // Here's our Dart class.
+      wrapped.blink_jsObject = newElement;
+    } else {
+      wrapped = wrap_jso(newElement);
+      if (wrapped == null) {
+        wrapped = wrap_jso_custom_element(newElement);
+      }
+    }
+
+    return wrapped;
+$endif
+  }
+
+$if DART2JS
+  // The two-argument version of this is automatically generated, but we need to
+  // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
+  @DomName('Document.createElement')
+  _createElement_2(String tagName) => JS('', '#.createElement(#)', this, tagName);
+
+  // The three-argument version of this is automatically generated, but we need to
+  // omit the typeExtension if it's null on Firefox or we get an is="null" attribute.
+  @DomName('Document.createElementNS')
+  _createElementNS_2(String namespaceURI, String qualifiedName) =>
+      JS('', '#.createElementNS(#, #)', this, namespaceURI, qualifiedName);
+
+$endif
+  @DomName('Document.createElementNS')
+  @DocsEditable()
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) {
+$if DART2JS
+    if (typeExtension == null) {
+      return _createElementNS_2(namespaceURI, qualifiedName);
+    } else {
+      return _createElementNS(namespaceURI, qualifiedName, typeExtension);
+    }
+$else
+    var newElement = (typeExtension == null) ?
+      _blink.BlinkDocument.instance.createElementNS_Callback_2_(unwrap_jso(this), namespaceURI, qualifiedName) :
+      _blink.BlinkDocument.instance.createElementNS_Callback_3_(unwrap_jso(this), namespaceURI, qualifiedName, typeExtension);
+
+    var wrapped;
+
+    if (newElement['dart_class'] != null) {
+      wrapped = newElement['dart_class'];         // Here's our Dart class.
+      wrapped.blink_jsObject = newElement;
+    } else {
+      wrapped = wrap_jso(newElement);
+      if (wrapped == null) {
+        wrapped = wrap_jso_custom_element(newElement);
+      }
+    }
+
+    return wrapped;
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index 122b6f9..dd4d70b 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -38,7 +38,7 @@
     return _docChildren;
   }
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -58,12 +58,7 @@
    * [CSS selector specification](http://www.w3.org/TR/css3-selectors/).
    */
   ElementList<Element> querySelectorAll(String selectors) =>
-$if JSINTEROP
-    _querySelectorAll(selectors);
-$else
     new _FrozenElementList._wrap(_querySelectorAll(selectors));
-$endif
-
 
   String get innerHtml {
     final e = new Element.tag("div");
@@ -71,7 +66,7 @@
     return e.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
diff --git a/tools/dom/templates/html/impl/impl_DocumentType.darttemplate b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
new file mode 100644
index 0000000..88e7e6e
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_DocumentType.darttemplate
@@ -0,0 +1,16 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override this methods for Dartium _DocumentType can't be abstract.
+  Element get nextElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.nextElementSibling_Getter_(unwrap_jso(this)));
+  Element get previousElementSibling => wrap_jso(_blink.BlinkDocumentType.instance.previousElementSibling_Getter_(unwrap_jso(this)));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 6f5ae1b..180a0b9 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -33,7 +33,7 @@
     _element._replaceChild(value, _childElements[index]);
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     // TODO(jacobr): remove children when length is reduced.
     throw new UnsupportedError('Cannot resize element lists');
   }
@@ -97,7 +97,12 @@
   bool remove(Object object) {
     if (object is Element) {
       Element element = object;
+$if JSINTEROP
+      // We aren't preserving identity of nodes in JSINTEROP mode
+      if (element.parentNode == _element) {
+$else
       if (identical(element.parentNode, _element)) {
+$endif
         _element._removeChild(element);
         return true;
       }
@@ -281,7 +286,7 @@
     throw new UnsupportedError('Cannot modify list');
   }
 
-  void set length(int newLength) {
+  set length(int newLength) {
     throw new UnsupportedError('Cannot modify list');
   }
 
@@ -304,7 +309,7 @@
   CssStyleDeclarationBase get style =>
       new _CssStyleDeclarationSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): This might be faster for Sets:
     //
     //     new _MultiElementCssClassSet(this).writeClasses(value)
@@ -328,7 +333,7 @@
 }
 
 @DocsEditable()
-$(ANNOTATIONS)$(NATIVESPEC)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$(ANNOTATIONS)$(NATIVESPEC)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
   /**
    * Creates an HTML element from a valid fragment of HTML.
@@ -375,11 +380,7 @@
    *     }
    *     document.registerElement('x-custom', CustomElement);
    */
-  Element.created() : super._created() {
-    // Validate that this is a custom element & perform any additional
-    // initialization.
-    _initializeCustomElement(this);
-  }
+  Element.created() : super._created();
 
   /**
    * Creates the HTML element specified by the tag name.
@@ -560,7 +561,7 @@
    */
   Map<String, String> get attributes => new _ElementAttributeMap(this);
 
-  void set attributes(Map<String, String> value) {
+  set attributes(Map<String, String> value) {
     Map<String, String> attributes = this.attributes;
     attributes.clear();
     for (String key in value.keys) {
@@ -580,17 +581,9 @@
    *       element.style.background = 'red'; // Turns every child of body red.
    *     }
    */
-$if DART2JS
   List<Element> get children => new _ChildrenElementList._wrap(this);
-$else
-  $if JSINTEROP
-  List<Element> get children => new FilteredElementList(this);
-  $else
-  List<Element> get children => new _ChildrenElementList._wrap(this);
-  $endif
-$endif
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     // Copy list first since we don't want liveness during iteration.
     List copy = new List.from(value);
     var children = this.children;
@@ -611,11 +604,7 @@
    */
   @DomName('Element.querySelectorAll')
   ElementList<Element> querySelectorAll(String selectors) =>
-$if JSINTEROP
-    _querySelectorAll(selectors);
-$else
     new _FrozenElementList._wrap(_querySelectorAll(selectors));
-$endif
 
   /**
    * Alias for [querySelector]. Note this function is deprecated because its
@@ -648,7 +637,7 @@
    */
   CssClassSet get classes => new _ElementCssClassSet(this);
 
-  void set classes(Iterable<String> value) {
+  set classes(Iterable<String> value) {
     // TODO(sra): Do this without reading the classes in clear() and addAll(),
     // or writing the classes in clear().
     CssClassSet classSet = classes;
@@ -682,7 +671,7 @@
   Map<String, String> get dataset =>
     new _DataAttributeMap(attributes);
 
-  void set dataset(Map<String, String> value) {
+  set dataset(Map<String, String> value) {
     final data = this.dataset;
     data.clear();
     for (String key in value.keys) {
@@ -801,7 +790,6 @@
   @deprecated
   void leftView() {}
 
-$if DART2JS
   /**
    * Creates a new AnimationEffect object whose target element is the object
    * on which the method is called, and calls the play() method of the
@@ -816,18 +804,15 @@
    *     var animation = elem.animate([
    *       {"transform": "translate(100px, -100%)"},
    *       {"transform" : "translate(400px, 500px)"}
-   *     ], 1500);  
+   *     ], 1500);
    *
    * The [frames] parameter is an Iterable<Map>, where the
    * map entries specify CSS animation effects. The
    * [timing] paramter can be a double, representing the number of milliseconds
    * for the transition, or a Map with fields corresponding to those
    * of the [Timing] object.
-   *
-   * This is not yet supported in Dartium.
   **/
-// TODO(alanknight): Correct above comment once it works in Dartium.
-  @Experimental
+  @Experimental()
   @SupportedBrowser(SupportedBrowser.CHROME, '36')
   AnimationPlayer animate(Iterable<Map<String, dynamic>> frames, [timing]) {
     if (frames is! Iterable || !(frames.every((x) => x is Map))) {
@@ -836,7 +821,12 @@
     }
     var convertedFrames = frames;
     if (convertedFrames is Iterable) {
+$if DART2JS
       convertedFrames = frames.map(convertDartToNative_Dictionary).toList();
+$else
+      convertedFrames = convertDartToNative_List(
+          frames.map(convertDartToNative_Dictionary).toList());
+$endif
     }
     var convertedTiming = timing;
     if (convertedTiming is Map) {
@@ -847,6 +837,7 @@
       : _animate(convertedFrames, convertedTiming);
   }
 
+$if DART2JS
   @DomName('Element.animate')
   @JSName('animate')
   @Experimental() // untriaged
@@ -880,7 +871,7 @@
   // members of the component are used. The actual type is a subtype of Element.
   get xtag => _xtag != null ? _xtag : this;
 
-  void set xtag(Element value) {
+  set xtag(Element value) {
     _xtag = value;
   }
 
@@ -1006,7 +997,7 @@
 
   @JSName('insertAdjacentText')
   void _insertAdjacentText(String where, String text) native;
-  
+
 $else
 $endif
 
@@ -1269,8 +1260,13 @@
     // offsetParent, "tops out" at BODY. But people could conceivably pass in
     // the document.documentElement and I want it to return an absolute offset,
     // so we have the special case checking for HTML.
-    bool foundAsParent = identical(current, parent) || parent.tagName == 'HTML';
-    if (current == null || identical(current, parent)) {
+$if JSINTEROP
+    bool sameAsParent = current == parent;
+$else
+    bool sameAsParent = identical(current, parent);
+$endif
+    bool foundAsParent = sameAsParent || parent.tagName == 'HTML';
+    if (current == null || sameAsParent) {
       if (foundAsParent) return new Point(0, 0);
       throw new ArgumentError("Specified element is not a transitive offset "
           "parent of this element.");
@@ -1328,11 +1324,11 @@
     if (_parseDocument == null) {
       _parseDocument = document.implementation.createHtmlDocument('');
       _parseRange = _parseDocument.createRange();
-	
+
       // Workaround for Safari bug. Was also previously Chrome bug 229142
-      // - URIs are not resolved in new doc.	
-      var base = _parseDocument.createElement('base');	
-      base.href = document.baseUri;	
+      // - URIs are not resolved in new doc.
+      var base = _parseDocument.createElement('base');
+      base.href = document.baseUri;
       _parseDocument.head.append(base);
     }
     var contextElement;
@@ -1390,7 +1386,7 @@
    * This uses the default sanitization behavior to sanitize the HTML fragment,
    * use [setInnerHtml] to override the default behavior.
    */
-  void set innerHtml(String html) {
+  set innerHtml(String html) {
     this.setInnerHtml(html);
   }
 
@@ -1432,7 +1428,7 @@
    * used when an explicit accessor is not available.
    */
   ElementEvents get on => new ElementEvents(this);
-  
+
   /**
    * Verify if any of the attributes that we use in the sanitizer look unexpected,
    * possibly indicating DOM clobbering attacks.
@@ -1461,10 +1457,44 @@
           })(#)''', element);
   }
 $else
-  // Dartium isn't affected by these attacks, because it goes directly to the C++ API.
-  static bool _hasCorruptedAttributes(Element element) => false;
+
+  static var _namedNodeMap = js.context["NamedNodeMap"];
+  static var _htmlCollection = js.context["HTMLCollection"];
+  static var _nodeList = js.context["NodeList"];
+
+  static bool _hasCorruptedAttributes(Element element) {
+    var attributes = unwrap_jso(element)["attributes"];
+    if (!attributes.instanceof(_namedNodeMap)) {
+      return true;
+    }
+    var childNodes = unwrap_jso(element.childNodes);
+    var length = childNodes["length"];
+    var lastChild = unwrap_jso(element.lastChild);
+    if (null != lastChild &&
+        lastChild != childNodes[length - 1]) {
+      return true;
+    }
+    var children = unwrap_jso(element._children);
+    if (null != children) { // On Safari, children can apparently be null.
+      if (!children.instanceof(_htmlCollection) ||
+          children.instanceof(_nodeList)) {
+	return true;
+      }
+    }
+    return false;
+  }
 $endif
 
+  String get _safeTagName {
+    String result = 'element tag unavailable';
+    try {
+      if (tagName is String) {
+        result = tagName;
+      }
+    } catch (e) {}
+    return result;
+  }
+
 $if DART2JS
   @DomName('Element.offsetHeight')
   @DocsEditable()
@@ -1508,7 +1538,7 @@
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) {
+  set scrollLeft(int value) {
     JS("void", "#.scrollLeft = #", this, value.round());
   }
 
@@ -1518,7 +1548,7 @@
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) {
+  set scrollTop(int value) {
     JS("void", "#.scrollTop = #", this, value.round());
   }
 
@@ -1528,6 +1558,10 @@
 
 $else
   $if JSINTEROP
+  // Need to explicitly delegate because Element is no longer abstract for Dartium.
+  bool get isContentEditable => _blink.BlinkHTMLElement.instance.isContentEditable_Getter_(unwrap_jso(this));
+  void click() => _blink.BlinkHTMLElement.instance.click_Callback_0_(unwrap_jso(this));
+
   @DomName('Element.offsetHeight')
   @DocsEditable()
   int get offsetHeight => _blink.BlinkElement.instance.offsetHeight_Getter_(unwrap_jso(this)).round();
@@ -1570,7 +1604,7 @@
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
+  set scrollLeft(int value) => _blink.BlinkElement.instance.scrollLeft_Setter_(unwrap_jso(this), value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
@@ -1578,7 +1612,7 @@
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
+  set scrollTop(int value) => _blink.BlinkElement.instance.scrollTop_Setter_(unwrap_jso(this), value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
@@ -1626,7 +1660,7 @@
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round());
+  set scrollLeft(int value) => _blink.BlinkElement.scrollLeft_Setter(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
@@ -1634,7 +1668,7 @@
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round());
+  set scrollTop(int value) => _blink.BlinkElement.scrollTop_Setter(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
diff --git a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
index 8cb282e..61092fd 100644
--- a/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
+++ b/tools/dom/templates/html/impl/impl_EventTarget.darttemplate
@@ -92,6 +92,12 @@
  */
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
 
+$if DARTIUM
+  // Default constructor to allow other classes e.g. GlobalEventHandlers to be
+  // constructed using _internalWrap when mapping Blink object to Dart class.
+  EventTarget();
+
+$endif
   // Custom element created callback.
   EventTarget._created();
 
diff --git a/tools/dom/templates/html/impl/impl_FileReader.darttemplate b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
index 0864441..ba5278f 100644
--- a/tools/dom/templates/html/impl/impl_FileReader.darttemplate
+++ b/tools/dom/templates/html/impl/impl_FileReader.darttemplate
@@ -13,7 +13,7 @@
 $if DART2JS
     var res = JS('Null|String|NativeByteBuffer', '#.result', this);
 $else
-    var res = _blink.BlinkFileReader.result_Getter(unwrap_jso(this));
+    var res = _blink.BlinkFileReader.instance.result_Getter_(unwrap_jso(this));
 $endif
     if (res is ByteBuffer) {
       return new Uint8List.view(res);
diff --git a/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
new file mode 100644
index 0000000..838a8be
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_HTMLAudioElement.darttemplate
@@ -0,0 +1,20 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if JSINTEROP
+  factory AudioElement([String src]) {
+    if (src == null)
+      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_0_());
+    else
+      return wrap_jso(_blink.BlinkHTMLAudioElement.instance.constructorCallback_1_(src));
+  }
+$else
+  factory AudioElement([String src]) => new AudioElement._(src);
+$endif
+}
diff --git a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
index 3d9e6af..bf8f0ff 100644
--- a/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
+++ b/tools/dom/templates/html/impl/impl_HTMLDocument.darttemplate
@@ -17,7 +17,7 @@
   BodyElement get body => _body;
 
   @DomName('Document.body')
-  void set body(BodyElement value) {
+  set body(BodyElement value) {
     _body = value;
   }
 $endif
@@ -90,7 +90,7 @@
 
   @DomName('Document.selectedStylesheetSet')
   String get selectedStylesheetSet => _selectedStylesheetSet;
-  void set selectedStylesheetSet(String value) {
+  set selectedStylesheetSet(String value) {
     _selectedStylesheetSet = value;
   }
 
@@ -101,7 +101,7 @@
   String get title => _title;
 
   @DomName('Document.title')
-  void set title(String value) {
+  set title(String value) {
     _title = value;
   }
 
@@ -187,6 +187,41 @@
 $else
   String get visibilityState => _webkitVisibilityState;
 $endif
+$if DARTIUM
+
+  /**
+   * Internal routine to find the DOM JS class name being extended for custom
+   * elements.
+   */
+  String _getJSClassName(ClassMirror classMirror) {
+    var jsClassName = null;
+    var isElement = false;
+
+    while (classMirror.superclass != null) {
+      var fullName = classMirror.superclass.qualifiedName;
+      isElement = isElement || (fullName == #dart.dom.html.Element);
+
+      var domLibrary = MirrorSystem.getName(fullName).startsWith('dart.dom.');
+      if (jsClassName == null && domLibrary) {
+        // Lookup JS class name (if not found).
+        var metadatas = classMirror.metadata;
+        for (var metadata in metadatas) {
+          var metaDataMirror = metadata.reflectee;
+          var metaType = reflectClass(metaDataMirror.runtimeType);
+          if (MirrorSystem.getName(metaType.simpleName) == 'DomName' &&
+              metaDataMirror.name.startsWith('HTML')) {
+            jsClassName = metadata.reflectee.name;
+          }
+        }
+      }
+
+      classMirror = classMirror.superclass;
+    }
+
+    // If we're an element then everything is okay.
+    return isElement ? jsClassName : null;
+  }
+$endif
 
   @Experimental()
   /**
@@ -236,7 +271,73 @@
     _registerCustomElement(JS('', 'window'), this, tag, customElementClass,
         extendsTag);
 $else
-    _Utils.register(this, tag, customElementClass, extendsTag);
+    // TODO(terry): Need to handle the extendsTag.
+
+    // Figure out which DOM class is being extended from the user's Dart class.
+    var classMirror = reflectClass(customElementClass);
+    var jsClassName = _getJSClassName(classMirror);
+    if (jsClassName == null) {
+      // Only components derived from HTML* can be extended.
+      throw new DomException.jsInterop("HierarchyRequestError: Only HTML elements can be customized.");
+    }
+
+    // Start the hookup the JS way create an <x-foo> element that extends the
+    // <x-base> custom element. Inherit its prototype and signal what tag is
+    // inherited:
+    //
+    //     var myProto = Object.create(HTMLElement.prototype);
+    //     var myElement = document.registerElement('x-foo', {prototype: myProto});
+    var baseElement = js.context[jsClassName];
+    if (baseElement == null) {
+      // Couldn't find the HTML element so use a generic one.
+      baseElement = js.context['HTMLElement'];
+    }
+    var elemProto = js.context['Object'].callMethod("create", [baseElement['prototype']]);
+
+    // TODO(terry): Hack to stop recursion re-creating custom element when the
+    //              created() constructor of the custom element does e.g.,
+    //
+    //                  MyElement.created() : super.created() {
+    //                    this.innerHtml = "<b>I'm an x-foo-with-markup!</b>";
+    //                  }
+    //
+    //              sanitizing causes custom element to created recursively
+    //              until stack overflow.
+    //
+    //              See https://github.com/dart-lang/sdk/issues/23666
+    int creating = 0;
+    elemProto['createdCallback'] = new js.JsFunction.withThis(($this) {
+      if (_getJSClassName(reflectClass(customElementClass).superclass) != null && creating < 2) {
+        creating++;
+
+        var dartClass = _blink.Blink_Utils.constructElement(customElementClass, $this);
+
+        // Need to remember the Dart class that was created for this custom so
+        // return it and setup the blink_jsObject to the $this that we'll be working
+        // with as we talk to blink. 
+        $this['dart_class'] = dartClass;
+
+        creating--;
+      }
+    });
+    elemProto['attributeChangedCallback'] = new js.JsFunction.withThis(($this, attrName, oldVal, newVal) {
+      if ($this["dart_class"] != null && $this['dart_class'].attributeChanged != null) {
+        $this['dart_class'].attributeChanged(attrName, oldVal, newVal);
+      }
+    });
+    elemProto['attachedCallback'] = new js.JsFunction.withThis(($this) {
+      if ($this["dart_class"] != null && $this['dart_class'].attached != null) {
+        $this['dart_class'].attached();
+      }
+    });
+    elemProto['detachedCallback'] = new js.JsFunction.withThis(($this) {
+      if ($this["dart_class"] != null && $this['dart_class'].detached != null) {
+        $this['dart_class'].detached();
+      }
+    });
+    // document.registerElement('x-foo', {prototype: elemProto, extends: extendsTag});
+    var jsMap = new js.JsObject.jsify({'prototype': elemProto, 'extends': extendsTag});
+    js.context['document'].callMethod('registerElement', [tag, jsMap]);
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate b/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate
new file mode 100644
index 0000000..88b5bcb
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_HTMLFrameSetElement.darttemplate
@@ -0,0 +1,21 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _HTMLFrameSetElement can't be abstract.
+  Stream<Event> get onHashChange => hashChangeEvent.forTarget(this);
+  Stream<MessageEvent> get onMessage => messageEvent.forTarget(this);
+  Stream<Event> get onOffline => offlineEvent.forTarget(this);
+  Stream<Event> get onOnline => onlineEvent.forTarget(this);
+  Stream<PopStateEvent> get onPopState => popStateEvent.forTarget(this);
+  Stream<StorageEvent> get onStorage => storageEvent.forTarget(this);
+  Stream<Event> get onUnload => unloadEvent.forTarget(this);
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
index d45e98a..079ca0f 100644
--- a/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
+++ b/tools/dom/templates/html/impl/impl_MutationObserver.darttemplate
@@ -21,14 +21,8 @@
 $if DARTIUM
   @DocsEditable()
   $if JSINTEROP
-  static MutationObserver _create(callback) => wrap_jso(_blink.BlinkMutationObserver.instance.constructorCallback_1_((List<MutationRecord> mutations, MutationObserver observer) {
-      var wrapped_mutations = [];
-      for (var mutation in mutations) {
-        // Wrap the Javascript object for each MutationRecord.
-        wrapped_mutations.add(wrap_jso(mutation));
-      }
-      // Wrap the MutationObserver too.
-      callback(wrapped_mutations, wrap_jso(observer));
+  static MutationObserver _create(callback) => wrap_jso(_blink.BlinkMutationObserver.instance.constructorCallback_1_((mutations, observer) {
+    callback(mutations, wrap_jso(observer));
   }));
   $else
   static MutationObserver _create(callback) => _blink.BlinkMutationObserver.instance.constructorCallback_1_(callback);
diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate
index 47382cf..38fdab1 100644
--- a/tools/dom/templates/html/impl/impl_Node.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Node.darttemplate
@@ -114,7 +114,12 @@
   bool remove(Object object) {
     if (object is! Node) return false;
     Node node = object;
+$if JSINTEROP
+    // We aren't preserving identity of nodes in JSINTEROP mode
+    if (_this != node.parentNode) return false;
+$else
     if (!identical(_this, node.parentNode)) return false;
+$endif
     _this._removeChild(node);
     return true;
   }
@@ -178,7 +183,7 @@
   // a local copy of childNodes is more efficient.
   int get length => _this.childNodes.length;
 
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError(
         "Cannot set length on immutable List.");
   }
@@ -201,7 +206,7 @@
     return new _ChildNodeListLazy(this);
   }
 
-  void set nodes(Iterable<Node> value) {
+  set nodes(Iterable<Node> value) {
     // Copy list first since we don't want liveness during iteration.
     // TODO(jacobr): there is a better way to do this.
     List copy = new List.from(value);
@@ -277,9 +282,7 @@
     return value == null ? super.toString() : value;
   }
 
-$if JSINTEROP
-  List<Node> _childNodes;
-
+$if DARTIUM
   /**
    * A list of this node's children.
    *
@@ -291,33 +294,8 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes {
-    if (_childNodes == null) {
-       List<Node> nodes = new List<Node>();
-       var jsCollection = _blink.BlinkNode.instance.childNodes_Getter_(unwrap_jso(this));
-       var collectionLen = jsCollection['length'];
-       for (var i = 0; i < collectionLen; i++) {
-         nodes.add(wrap_jso(jsCollection.callMethod('item', [i])));
-       }
-      _childNodes = nodes;
-    }
-    return _childNodes;
-  }
+  List<Node> get childNodes => wrap_jso(_blink.BlinkNode.instance.childNodes_Getter_(unwrap_jso(this)));
 $else
-  $if DARTIUM
-  /**
-   * A list of this node's children.
-   *
-   * ## Other resources
-   *
-   * * [Node.childNodes]
-   * (https://developer.mozilla.org/en-US/docs/Web/API/Node.childNodes)
-   * from MDN.
-   */
-  @DomName('Node.childNodes')
-  @DocsEditable()
-  List<Node> get childNodes => _blink.BlinkNode.instance.childNodes_Getter_(this);
-  $else
   /**
    * A list of this node's children.
    *
@@ -333,7 +311,6 @@
   @Creates('NodeList')
   final List<Node> childNodes;
 
-  $endif
 $endif
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
new file mode 100644
index 0000000..1aa46f4
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SVGCursorElement.darttemplate
@@ -0,0 +1,19 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _SVGCursorElement can't be abstract.
+  StringList get requiredExtensions => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredExtensions_Getter_(unwrap_jso(this)));
+  StringList get requiredFeatures => wrap_jso(_blink.BlinkSVGCursorElement.instance.requiredFeatures_Getter_(unwrap_jso(this)));
+  StringList get systemLanguage => wrap_jso(_blink.BlinkSVGCursorElement.instance.systemLanguage_Getter_(unwrap_jso(this)));
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGCursorElement.instance.href_Getter_(unwrap_jso(this)));
+  bool hasExtension(String extension) => _blink.BlinkSVGCursorElement.instance.hasExtension_Callback_1_(unwrap_jso(this), extension);
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
index 2eaafe6..b41f7ec 100644
--- a/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
+++ b/tools/dom/templates/html/impl/impl_SVGElement.darttemplate
@@ -58,7 +58,7 @@
 
   List<Element> get children => new FilteredElementList(this);
 
-  void set children(List<Element> value) {
+  set children(List<Element> value) {
     final children = this.children;
     children.clear();
     children.addAll(value);
@@ -78,7 +78,7 @@
     return container.innerHtml;
   }
 
-  void set innerHtml(String value) {
+  set innerHtml(String value) {
     this.setInnerHtml(value);
   }
 
@@ -143,5 +143,21 @@
     var e = new $CLASSNAME.tag(tag);
     return e is $CLASSNAME && !(e is UnknownElement);
   }
+
+$if JSINTEROP
+  set _svgClassName(AnimatedString value) =>
+      _blink.BlinkSVGElement.instance.className_Setter_(unwrap_jso(this), unwrap_jso(value));
+
+  String get className => _svgClassName.baseVal;
+
+  // Unbelievable hack. We can't create an SvgAnimatedString, but we can get
+  // the existing one and change its baseVal. Then we call the blink setter directly
+  // TODO(alanknight): Handle suppressing the SVGAnimated<*> better
+  set className(String s) {
+    var oldClass = _svgClassName;
+    oldClass.baseVal = s;
+    _svgClassName = oldClass;
+  }
+$endif
 $!MEMBERS
 }
diff --git a/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
new file mode 100644
index 0000000..96363a8
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SVGFEDropShadowElement.darttemplate
@@ -0,0 +1,19 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _SVGFEDropShadowElement can't be abstract.
+  AnimatedLength get height => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.height_Getter_(unwrap_jso(this)));
+  AnimatedString get result => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.result_Getter_(unwrap_jso(this)));
+  AnimatedLength get width => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.width_Getter_(unwrap_jso(this)));
+  AnimatedLength get x => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.x_Getter_(unwrap_jso(this)));
+  AnimatedLength get y => wrap_jso(_blink.BlinkSVGFEDropShadowElement.instance.y_Getter_(unwrap_jso(this)));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
new file mode 100644
index 0000000..4c88084
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SVGGlyphRefElement.darttemplate
@@ -0,0 +1,15 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _SVGGlyphRefElement can't be abstract.
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGGlyphRefElement.instance.href_Getter_(unwrap_jso(this)));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
new file mode 100644
index 0000000..59e012e
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_SVGMPathElement.darttemplate
@@ -0,0 +1,15 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _SVGMPathElement can't be abstract.
+  AnimatedString get href => wrap_jso(_blink.BlinkSVGMPathElement.instance.href_Getter_(unwrap_jso(this)));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_ServiceWorker.darttemplate b/tools/dom/templates/html/impl/impl_ServiceWorker.darttemplate
new file mode 100644
index 0000000..6cb64ab
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_ServiceWorker.darttemplate
@@ -0,0 +1,15 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _ServiceWorker can't be abstract.
+  Stream<ErrorEvent> get onError => errorEvent.forTarget(this);
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
index 57a44bb..e08cb4d 100644
--- a/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
+++ b/tools/dom/templates/html/impl/impl_ShadowRoot.darttemplate
@@ -35,7 +35,7 @@
   }
 
   @deprecated
-  void set resetStyleInheritance(bool value) {
+  set resetStyleInheritance(bool value) {
     _shadowRootDeprecationReport();
   }
 
@@ -47,7 +47,7 @@
   }
 
   @deprecated
-  void set applyAuthorStyles(bool value) {
+  set applyAuthorStyles(bool value) {
     _shadowRootDeprecationReport();
   }
 }
diff --git a/tools/dom/templates/html/impl/impl_Touch.darttemplate b/tools/dom/templates/html/impl/impl_Touch.darttemplate
index fbab125..bab04a5 100644
--- a/tools/dom/templates/html/impl/impl_Touch.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Touch.darttemplate
@@ -20,14 +20,14 @@
   int get __radiusX => JS('num', '#.radiusX', this).round();
   int get __radiusY => JS('num', '#.radiusY', this).round();
 $else
-  int get __clientX => _blink.BlinkTouch.clientX_Getter(unwrap_jso(this)).round();
-  int get __clientY => _blink.BlinkTouch.clientY_Getter(unwrap_jso(this)).round();
-  int get __screenX => _blink.BlinkTouch.screenX_Getter(unwrap_jso(this)).round();
-  int get __screenY => _blink.BlinkTouch.screenY_Getter(unwrap_jso(this)).round();
-  int get __pageX => _blink.BlinkTouch.pageX_Getter(unwrap_jso(this)).round();
-  int get __pageY => _blink.BlinkTouch.pageY_Getter(unwrap_jso(this)).round();
-  int get __radiusX => _blink.BlinkTouch.radiusX_Getter(unwrap_jso(this)).round();
-  int get __radiusY => _blink.BlinkTouch.radiusY_Getter(unwrap_jso(this)).round();
+  int get __clientX => _blink.BlinkTouch.instance.clientX_Getter_(unwrap_jso(this)).round();
+  int get __clientY => _blink.BlinkTouch.instance.clientY_Getter_(unwrap_jso(this)).round();
+  int get __screenX => _blink.BlinkTouch.instance.screenX_Getter_(unwrap_jso(this)).round();
+  int get __screenY => _blink.BlinkTouch.instance.screenY_Getter_(unwrap_jso(this)).round();
+  int get __pageX => _blink.BlinkTouch.instance.pageX_Getter_(unwrap_jso(this)).round();
+  int get __pageY => _blink.BlinkTouch.instance.pageY_Getter_(unwrap_jso(this)).round();
+  int get __radiusX => _blink.BlinkTouch.instance.radiusX_Getter_(unwrap_jso(this)).round();
+  int get __radiusY => _blink.BlinkTouch.instance.radiusY_Getter_(unwrap_jso(this)).round();
 $endif
 
   @DomName('Touch.clientX')
diff --git a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
index 8a5e383..d4f5d3f 100644
--- a/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_WheelEvent.darttemplate
@@ -39,12 +39,12 @@
     if (view == null) {
       view = window;
     }
-    
+
     return JS('WheelEvent', 'new WheelEvent(#, #)',
         type, convertDartToNative_Dictionary(options));
 
 $else
-    return _blink.BlinkWheelEvent.constructorCallback_2(type, options);
+    return wrap_jso(_blink.BlinkWheelEvent.instance.constructorCallback_2_(type, convertDartToNative_Dictionary(options)));
 $endif
   }
 
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index b119a08..36dfc9a 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -85,13 +85,13 @@
    * Sets the window's location, which causes the browser to navigate to the new
    * location. [value] may be a Location object or a String.
    */
-  void set location(value) {
+  set location(value) {
     _location = value;
   }
 
   // Native getter and setter to access raw Location object.
   dynamic get _location => JS('Location|Null', '#.location', this);
-  void set _location(value) {
+  set _location(value) {
     JS('void', '#.location = #', this, value);
   }
 
@@ -320,7 +320,7 @@
 
   String get returnValue => _returnValue;
 
-  void set returnValue(String value) {
+  set returnValue(String value) {
     _returnValue = value;
     // FF and IE use the value as the return value, Chrome will return this from
     // the event callback function.
diff --git a/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
new file mode 100644
index 0000000..73623a9
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_WorkerLocation.darttemplate
@@ -0,0 +1,23 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _WorkerLocation can't be abstract.
+  String get hash => _blink.BlinkWorkerLocation.instance.hash_Getter_(unwrap_jso(this));
+  String get host => _blink.BlinkWorkerLocation.instance.host_Getter_(unwrap_jso(this));
+  String get hostname => _blink.BlinkWorkerLocation.instance.hostname_Getter_(unwrap_jso(this));
+  String get href => _blink.BlinkWorkerLocation.instance.href_Getter_(unwrap_jso(this));
+  String get origin => _blink.BlinkWorkerLocation.instance.origin_Getter_(unwrap_jso(this));
+  String get pathname => _blink.BlinkWorkerLocation.instance.pathname_Getter_(unwrap_jso(this));
+  String get port => _blink.BlinkWorkerLocation.instance.port_Getter_(unwrap_jso(this));
+  String get protocol => _blink.BlinkWorkerLocation.instance.protocol_Getter_(unwrap_jso(this));
+  String get search => _blink.BlinkWorkerLocation.instance.search_Getter_(unwrap_jso(this));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
new file mode 100644
index 0000000..137390c
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_WorkerNavigator.darttemplate
@@ -0,0 +1,23 @@
+// 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 $LIBRARYNAME;
+
+@DocsEditable()
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+$if DARTIUM
+  // Override these methods for Dartium _WorkerNavigator can't be abstract.
+  String get appCodeName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
+  String get appName => _blink.BlinkWorkerNavigator.instance.appCodeName_Getter_(unwrap_jso(this));
+  String get appVersion => _blink.BlinkWorkerNavigator.instance.appVersion_Getter_(unwrap_jso(this));
+  bool get dartEnabled => _blink.BlinkWorkerNavigator.instance.dartEnabled_Getter_(unwrap_jso(this));
+  String get platform => _blink.BlinkWorkerNavigator.instance.platform_Getter_(unwrap_jso(this));
+  String get product => _blink.BlinkWorkerNavigator.instance.product_Getter_(unwrap_jso(this));
+  String get userAgent => _blink.BlinkWorkerNavigator.instance.userAgent_Getter_(unwrap_jso(this));
+  int get hardwareConcurrency => _blink.BlinkWorkerNavigator.instance.hardwareConcurrency_Getter_(unwrap_jso(this));
+  bool get onLine => _blink.BlinkWorkerNavigator.instance.onLine_Getter_(unwrap_jso(this));
+$endif
+}
+
diff --git a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
index d7fffe9..7ee15d1 100644
--- a/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
+++ b/tools/dom/templates/html/impl/impl_XMLHttpRequest.darttemplate
@@ -384,5 +384,34 @@
     return headers;
   }
 
+  /**
+   * Specify the desired `url`, and `method` to use in making the request.
+   *
+   * By default the request is done asyncronously, with no user or password
+   * authentication information. If `async` is false, the request will be send
+   * synchronously.
+   *
+   * Calling `open` again on a currently active request is equivalent to
+   * calling `abort`.
+   *
+   * Note: Most simple HTTP requests can be accomplished using the [getString],
+   * [request], [requestCrossOrigin], or [postFormData] methods. Use of this
+   * `open` method is intended only for more complext HTTP requests where
+   * finer-grained control is needed.
+   */
+  @DomName('XMLHttpRequest.open')
+  @DocsEditable()
+$if JSINTEROP
+  void open(String method, String url, {bool async, String user, String password}) {
+    if (async == null && user == null && password == null) {
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_2_(unwrap_jso(this), method, url);
+    } else {
+      _blink.BlinkXMLHttpRequest.instance.open_Callback_5_(unwrap_jso(this), method, url, async, user, password);
+    }
+  }
+$else
+  void open(String method, String url, {bool async, String user, String password}) native;
+$endif
+
 $!MEMBERS
 }
diff --git a/tools/dom/templates/immutable_list_mixin.darttemplate b/tools/dom/templates/immutable_list_mixin.darttemplate
index 78a846f..b9820dc 100644
--- a/tools/dom/templates/immutable_list_mixin.darttemplate
+++ b/tools/dom/templates/immutable_list_mixin.darttemplate
@@ -7,7 +7,7 @@
 $endif
 
 $if DEFINE_LENGTH_SETTER
-  void set length(int value) {
+  set length(int value) {
     throw new UnsupportedError("Cannot resize immutable List.");
   }
 $endif
diff --git a/tools/gyp/find_mac_gcc_version.py b/tools/gyp/find_mac_gcc_version.py
index 40670ec..79e9af3e 100755
--- a/tools/gyp/find_mac_gcc_version.py
+++ b/tools/gyp/find_mac_gcc_version.py
@@ -25,7 +25,7 @@
       return '4.2'
     elif major == 4 and minor < 5:
       return 'com.apple.compilers.llvmgcc42'
-    elif (major == 4 and minor >= 5) or major == 5 or major == 6:
+    elif (major == 4 and minor >= 5) or major >= 5:
       # XCode seems to select the specific clang version automatically
       return 'com.apple.compilers.llvm.clang.1_0'
     else:
diff --git a/tools/observatory_tool.py b/tools/observatory_tool.py
index 90c2aa27..062ad1c 100755
--- a/tools/observatory_tool.py
+++ b/tools/observatory_tool.py
@@ -139,7 +139,9 @@
                       options.pub_executable,
                       options.pub_snapshot,
                       options.package_root,
-                      ['build', '--output', args[0]],
+                      ['build',
+                       '-DOBS_VER=' + utils.GetVersion(),
+                       '--output', args[0]],
                       options.silent)
   elif (cmd == 'deploy'):
     Deploy('build', 'deployed')
diff --git a/tools/signing_script.py b/tools/signing_script.py
deleted file mode 100755
index 5eefe1b..0000000
--- a/tools/signing_script.py
+++ /dev/null
@@ -1,286 +0,0 @@
-#!/usr/bin/env python
-#
-# 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 imp
-import optparse
-import os
-import subprocess
-import sys
-
-DART_DIR = os.path.dirname(os.path.dirname(__file__))
-GSUTIL = os.path.join(DART_DIR, 'third_party', 'gsutil', 'gsutil')
-BOT_UTILS = os.path.join(DART_DIR, 'tools', 'bots', 'bot_utils.py')
-BASENAME_PATTERN = 'darteditor-%(system)s-%(bits)s'
-FILENAME_PATTERN = BASENAME_PATTERN + '.zip'
-
-DRY_RUN = False
-
-bot_utils = imp.load_source('bot_utils', BOT_UTILS)
-
-class ChangedWorkingDirectory(object):
-  def __init__(self, working_directory):
-    self._working_directory = working_directory
-
-  def __enter__(self):
-    self._old_cwd = os.getcwd()
-    print "Enter directory = ", self._working_directory
-    if not DRY_RUN:
-      os.chdir(self._working_directory)
-
-  def __exit__(self, *_):
-    print "Enter directory = ", self._old_cwd
-    os.chdir(self._old_cwd)
-
-def GetOptionsParser():
-  parser = optparse.OptionParser("usage: %prog [options]")
-  parser.add_option("--scratch-dir",
-                    help="Scratch directory to use.")
-  parser.add_option("--revision", type="int",
-                    help="Revision we want to sign.")
-  parser.add_option("--channel", type="string",
-                    default=None,
-                    help="Channel we want to sign.")
-  parser.add_option("--dry-run", action="store_true", dest="dry_run",
-                    default=False,
-                    help="Do a dry run and do not execute any commands.")
-  parser.add_option("--prepare", action="store_true", dest="prepare",
-                    default=False,
-                    help="Prepare the .exe/.zip files to sign.")
-  parser.add_option("--deploy", action="store_true", dest="deploy",
-                    default=False,
-                    help="Pack the signed .exe/.zip files and deploy.")
-  return parser
-
-def die(msg, withOptions=True):
-  print msg
-  if withOptions:
-    GetOptionsParser().print_usage()
-  sys.exit(1)
-
-def run(command):
-  """We use run() instead of builtin python methods, because not all
-  functionality can easily be done by python and we can support --dry-run"""
-
-  print "Running: ", command
-  if not DRY_RUN:
-    process = subprocess.Popen(command,
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.PIPE)
-    (stdout, stderr) = process.communicate()
-    if process.returncode != 0:
-      print "DEBUG: failed to run command '%s'" % command
-      print "DEBUG: stdout = ", stdout
-      print "DEBUG: stderr = ", stderr
-      print "DEBUG: returncode = ", process.returncode
-      raise OSError(process.returncode)
-
-def clean_directory(directory):
-  if os.path.exists(directory):
-    run(['rm', '-r', directory])
-  run(['mkdir', '-p', directory])
-
-def rm_tree(directory):
-  if os.path.exists(directory):
-    run(['rm', '-r', directory])
-
-def copy_tree(from_dir, to_dir):
-  if os.path.exists(to_dir):
-    run(['rm', '-r', to_dir])
-  run(['cp', '-Rp', from_dir, to_dir])
-
-def copy_file(from_file, to_file):
-  if os.path.exists(to_file):
-    run(['rm', to_file])
-  run(['cp', '-p', from_file, to_file])
-
-def copy_and_zip(from_dir, to_dir):
-  rm_tree(to_dir)
-  copy_tree(from_dir, to_dir)
-
-  dirname = os.path.basename(to_dir)
-  with ChangedWorkingDirectory(os.path.dirname(to_dir)):
-    run(['zip', '-r9', dirname + '.zip', dirname])
-
-def unzip_and_copy(extracted_zipfiledir, to_dir):
-  rm_tree(extracted_zipfiledir)
-  run(['unzip', extracted_zipfiledir + '.zip', '-d',
-       os.path.dirname(extracted_zipfiledir)])
-  rm_tree(to_dir)
-  copy_tree(extracted_zipfiledir, to_dir)
-
-def download_from_new_location(channel, config, destination):
-  namer = bot_utils.GCSNamer(channel,
-                             bot_utils.ReleaseType.RAW)
-  bucket = namer.editor_zipfilepath(config['revision'], config['system'],
-                                    config['bits'])
-  run([GSUTIL, 'cp', bucket, destination])
-
-def download_msi_installer_from_new_location(channel, config, destination):
-  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
-  bucket = namer.editor_installer_filepath(
-      config['revision'], config['system'], config['bits'], 'msi')
-  run([GSUTIL, 'cp', bucket, destination])
-
-def upload_to_new_location(channel, config, source_zip):
-  namer = bot_utils.GCSNamer(channel,
-                             bot_utils.ReleaseType.SIGNED)
-  zipfilename = namer.editor_zipfilename(config['system'], config['bits'])
-  bucket = namer.editor_zipfilepath(config['revision'], config['system'],
-                                    config['bits'])
-
-  if not DRY_RUN:
-    bot_utils.CreateMD5ChecksumFile(source_zip, mangled_filename=zipfilename)
-    bot_utils.CreateSha256ChecksumFile(source_zip,
-                                       mangled_filename=zipfilename)
-  md5_zip_file = source_zip + '.md5sum'
-  sha256_zip_file = source_zip + '.sha256sum'
-
-  run([GSUTIL, 'cp', source_zip, bucket])
-  run([GSUTIL, 'cp', md5_zip_file, bucket + '.md5sum'])
-  run([GSUTIL, 'cp', sha256_zip_file, bucket + '.sha256sum'])
-  run([GSUTIL, 'setacl', 'public-read', bucket])
-  run([GSUTIL, 'setacl', 'public-read', bucket + '.md5sum'])
-  run([GSUTIL, 'setacl', 'public-read', bucket + '.sha256sum'])
-
-def upload_msi_installer_to_new_location(channel, config, signed_msi):
-  namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.SIGNED)
-  bucket = namer.editor_installer_filepath(
-      config['revision'], config['system'], config['bits'], 'msi')
-  run([GSUTIL, 'cp', '-a', 'public-read', signed_msi, bucket])
-
-def main():
-  if sys.platform != 'linux2':
-    print "This script was only tested on linux. Please run it on linux!"
-    sys.exit(1)
-
-  parser = GetOptionsParser()
-  (options, args) = parser.parse_args()
-
-  if not options.scratch_dir:
-    die("No scratch directory given.")
-  if not options.revision:
-    die("No revision given.")
-  if not options.prepare and not options.deploy:
-    die("No prepare/deploy parameter given.")
-  if options.prepare and options.deploy:
-    die("Can't have prepare and deploy parameters at the same time.")
-  if len(args) > 0:
-    die("Invalid additional arguments: %s." % args)
-
-  if not options.channel:
-    die("You need to specify a channel with --channel.")
-
-  global DRY_RUN
-  DRY_RUN = options.dry_run
-
-  downloads_dir = os.path.join(options.scratch_dir, 'downloads')
-  presign_dir = os.path.join(options.scratch_dir, 'presign')
-  postsign_dir = os.path.join(options.scratch_dir, 'postsign')
-  uploads_dir = os.path.join(options.scratch_dir, 'uploads')
-
-  if options.prepare:
-    # Clean all directories
-    clean_directory(downloads_dir)
-    clean_directory(presign_dir)
-    clean_directory(postsign_dir)
-    clean_directory(uploads_dir)
-  elif options.deploy:
-    clean_directory(uploads_dir)
-
-  # These are the locations where we can find the *.app folders and *.exe files
-  # and the names we use inside the scratch directory.
-  locations = {
-    'macos' : {
-      'editor' : os.path.join('dart', 'DartEditor.app'),
-      'chrome' : os.path.join('dart', 'chromium', 'Chromium.app'),
-
-      'editor_scratch' : 'DartEditor%(bits)s.app',
-      'chrome_scratch' : 'Chromium%(bits)s.app',
-
-      'zip' : True,
-    },
-    'win32' : {
-      'editor' : os.path.join('dart', 'DartEditor.exe'),
-      'chrome' : os.path.join('dart', 'chromium', 'chrome.exe'),
-
-      'msi_scratch' : 'darteditor-installer-windows-%(bits)s.msi',
-      'editor_scratch' : 'DartEditor%(bits)s.exe',
-      'chrome_scratch' : 'chromium%(bits)s.exe',
-
-      'zip' : False,
-    },
-  }
-
-  # Desitination of zip files we download
-  for system in ('macos', 'win32'):
-    for bits in ('32', '64'):
-      config = {
-        'revision' : options.revision,
-        'system' : system,
-        'bits' : bits,
-      }
-
-      destination = os.path.join(downloads_dir, FILENAME_PATTERN % config)
-      destination_dir = os.path.join(downloads_dir, BASENAME_PATTERN % config)
-
-      deploy = os.path.join(uploads_dir, FILENAME_PATTERN % config)
-      deploy_dir = os.path.join(uploads_dir, BASENAME_PATTERN % config)
-
-      if options.prepare:
-        # Download *.zip files from GCS buckets
-        download_from_new_location(options.channel, config, destination)
-
-        run(['unzip', destination, '-d', destination_dir])
-
-        for name in ['editor', 'chrome']:
-          from_path = os.path.join(destination_dir, locations[system][name])
-          to_path = os.path.join(
-              presign_dir, locations[system]['%s_scratch' % name] % config)
-
-          if locations[system]['zip']:
-            # We copy a .app directory directory and zip it
-            copy_and_zip(from_path, to_path)
-          else:
-            # We copy an .exe file
-            copy_file(from_path, to_path)
-
-        # Download .*msi installer from GCS to presign directory
-        if system == 'win32':
-          presign_msi = os.path.join(
-              presign_dir, locations[system]['msi_scratch'] % config)
-          download_msi_installer_from_new_location(
-              options.channel, config, presign_msi)
-      elif options.deploy:
-        copy_tree(destination_dir, deploy_dir)
-
-        for name in ['editor', 'chrome']:
-          from_path = os.path.join(
-              postsign_dir, locations[system]['%s_scratch' % name] % config)
-          to_path = os.path.join(deploy_dir, locations[system][name])
-
-          if locations[system]['zip']:
-            # We unzip a zip file and copy the resulting signed .app directory
-            unzip_and_copy(from_path, to_path)
-          else:
-            # We copy the signed .exe file
-            copy_file(from_path, to_path)
-
-        deploy_zip_file = os.path.abspath(deploy)
-        with ChangedWorkingDirectory(deploy_dir):
-          run(['zip', '-r9', deploy_zip_file, 'dart'])
-
-        # Upload *.zip/*.zip.md5sum and set 'public-read' ACL
-        upload_to_new_location(options.channel, config, deploy_zip_file)
-
-        # Upload *.msi installer and set 'public-read ACL
-        if system == 'win32':
-          postsign_msi = os.path.join(
-              postsign_dir, locations[system]['msi_scratch'] % config)
-          upload_msi_installer_to_new_location(
-              options.channel, config, postsign_msi)
-
-if __name__ == '__main__':
-  main()
diff --git a/tools/utils.py b/tools/utils.py
index 4b7fae5..7b203aa 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -75,14 +75,18 @@
 
 # Try to guess the number of cpus on this machine.
 def GuessCpus():
+  if os.getenv("DART_NUMBER_OF_CORES") is not None:
+    return int(os.getenv("DART_NUMBER_OF_CORES"))
   if os.path.exists("/proc/cpuinfo"):
     return int(commands.getoutput("grep -E '^processor' /proc/cpuinfo | wc -l"))
   if os.path.exists("/usr/bin/hostinfo"):
-    return int(commands.getoutput('/usr/bin/hostinfo | grep "processors are logically available." | awk "{ print \$1 }"'))
+    return int(commands.getoutput('/usr/bin/hostinfo |'
+        ' grep "processors are logically available." |'
+        ' awk "{ print \$1 }"'))
   win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
   if win_cpu_count:
     return int(win_cpu_count)
-  return int(os.getenv("DART_NUMBER_OF_CORES", 2))
+  return 2
 
 def GetWindowsRegistryKeyName(name):
   import win32process
@@ -236,6 +240,7 @@
 ARCH_GUESS = GuessArchitecture()
 BASE_DIR = os.path.abspath(os.path.join(os.curdir, '..'))
 DART_DIR = os.path.abspath(os.path.join(__file__, '..', '..'))
+VERSION_FILE = os.path.join(DART_DIR, 'tools', 'VERSION')
 
 def GetBuildbotGSUtilPath():
   gsutil = '/b/build/scripts/slave/gsutil'
@@ -337,13 +342,12 @@
       return match.group(1)
     return None
 
-  version_file = os.path.join(DART_DIR, 'tools', 'VERSION')
   try:
-    fd = open(version_file)
+    fd = open(VERSION_FILE)
     content = fd.read()
     fd.close()
   except:
-    print "Warning: Couldn't read VERSION file (%s)" % version_file
+    print "Warning: Couldn't read VERSION file (%s)" % VERSION_FILE
     return None
 
   channel = match_against('^CHANNEL ([A-Za-z0-9]+)$', content)
@@ -357,7 +361,7 @@
     return Version(
         channel, major, minor, patch, prerelease, prerelease_patch)
   else:
-    print "Warning: VERSION file (%s) has wrong format" % version_file
+    print "Warning: VERSION file (%s) has wrong format" % VERSION_FILE
     return None
 
 
diff --git a/utils/compiler/compiler.gyp b/utils/compiler/compiler.gyp
index 37d2074..f57ad90 100644
--- a/utils/compiler/compiler.gyp
+++ b/utils/compiler/compiler.gyp
@@ -36,7 +36,6 @@
             'create_snapshot.dart',
             '--output_dir=<(SHARED_INTERMEDIATE_DIR)',
             '--dart2js_main=pkg/compiler/lib/src/dart2js.dart',
-            '--docgen_main=pkg/docgen/bin/docgen.dart',
             '--package_root=<(PRODUCT_DIR)/packages/',
           ],
         },
diff --git a/utils/compiler/create_snapshot.dart b/utils/compiler/create_snapshot.dart
index 0123792..1a27431 100644
--- a/utils/compiler/create_snapshot.dart
+++ b/utils/compiler/create_snapshot.dart
@@ -18,12 +18,10 @@
 
 Future<String> getSnapshotGenerationFile(var args, var rootPath) {
   var dart2js = rootPath.resolve(args["dart2js_main"]);
-  var docgen = rootPath.resolve(args["docgen_main"]);
   return getVersion(rootPath).then((version) {
     var snapshotGenerationText =
 """
 import '${dart2js.toFilePath(windows: false)}' as dart2jsMain;
-import '${docgen.toFilePath(windows: false)}' as docgenMain;
 import 'dart:io';
 
 void main(List<String> arguments) {
@@ -32,8 +30,6 @@
   if (tool == "dart2js") {
     dart2jsMain.BUILD_ID = "$version";
     dart2jsMain.main(arguments.skip(1).toList());
-  } else if (tool == "docgen") {
-    docgenMain.main(arguments.skip(1).toList());
   }
 }
 
@@ -84,12 +80,11 @@
  * Takes the following arguments:
  * --output_dir=val     The full path to the output_dir.
  * --dart2js_main=val   The path to the dart2js main script relative to root.
- * --docgen_main=val    The path to the docgen main script relative to root.
  * --package-root=val   The package-root used to find packages for the snapshot.
  */
 void main(List<String> arguments) {
   var validArguments = ["--output_dir", "--dart2js_main",
-                        "--docgen_main", "--package_root"];
+                        "--package_root"];
   var args = {};
   for (var argument in arguments) {
     var argumentSplit = argument.split("=");
@@ -100,7 +95,6 @@
     args[argumentSplit[0].substring(2)] = argumentSplit[1];
   }
   if (!args.containsKey("dart2js_main")) throw "Please specify dart2js_main";
-  if (!args.containsKey("docgen_main")) throw "Please specify docgen_main";
   if (!args.containsKey("output_dir")) throw "Please specify output_dir";
   if (!args.containsKey("package_root")) throw "Please specify package_root";
 
