diff --git a/pkg/custom_element/lib/custom_element.dart b/pkg/custom_element/lib/custom_element.dart
index 5057eb1..43366bc 100644
--- a/pkg/custom_element/lib/custom_element.dart
+++ b/pkg/custom_element/lib/custom_element.dart
@@ -249,8 +249,6 @@
     host.createFragment(html,
         validator: validator, treeSanitizer: treeSanitizer);
 
-  InputMethodContext get inputMethodContext => host.inputMethodContext;
-
   bool get isContentEditable => host.isContentEditable;
 
   String get lang => host.lang;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 729b216..187a24b 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -111,7 +111,7 @@
 
 @DocsEditable()
 @DomName('AbstractWorker')
-class AbstractWorker extends Interceptor implements EventTarget native "AbstractWorker" {
+abstract class AbstractWorker extends Interceptor implements EventTarget native "AbstractWorker" {
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
@@ -266,6 +266,12 @@
   @DocsEditable()
   String href;
 
+  @DomName('HTMLAnchorElement.origin')
+  @DocsEditable()
+  // WebKit only
+  @Experimental() // non-standard
+  final String origin;
+
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
@@ -7843,16 +7849,19 @@
         validator: validator, treeSanitizer: treeSanitizer);
   }
 
+  HtmlCollection get _children => throw new UnimplementedError(
+      'Use _docChildren instead');
+
   // Native field is used only by Dart code so does not lead to instantiation
   // of native classes
   @Creates('Null')
-  List<Element> _children;
+  List<Element> _docChildren;
 
   List<Element> get children {
-    if (_children == null) {
-      _children = new FilteredElementList(this);
+    if (_docChildren == null) {
+      _docChildren = new FilteredElementList(this);
     }
-    return _children;
+    return _docChildren;
   }
 
   void set children(List<Element> value) {
@@ -7985,21 +7994,6 @@
 
 
 @DocsEditable()
-@DomName('DocumentType')
-// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
-@deprecated // stable
-class DocumentType extends Node implements ChildNode native "DocumentType" {
-  // To suppress missing implicit constructor warnings.
-  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.
-
-
-@DocsEditable()
 @DomName('DOMError')
 class DomError extends Interceptor native "DOMError" {
   // To suppress missing implicit constructor warnings.
@@ -8086,11 +8080,11 @@
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native;
+  Document createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) native;
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native;
 
   @JSName('createHTMLDocument')
   @DomName('DOMImplementation.createHTMLDocument')
@@ -10901,19 +10895,6 @@
   @DocsEditable()
   bool hidden;
 
-  /**
-   * The current state of IME composition.
-   *
-   * ## Other resources
-   *
-   * * [Input method editor specification]
-   * (http://www.w3.org/TR/ime-api/) from W3C.
-   */
-  @DomName('Element.inputMethodContext')
-  @DocsEditable()
-  @Experimental() // untriaged
-  final InputMethodContext inputMethodContext;
-
   @DomName('Element.isContentEditable')
   @DocsEditable()
   final bool isContentEditable;
@@ -14512,10 +14493,6 @@
 class HtmlFormControlsCollection extends HtmlCollection native "HTMLFormControlsCollection" {
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
-
-  @DomName('HTMLFormControlsCollection.__getter__')
-  @DocsEditable()
-  Node __getter__(int index) native;
 }
 // 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
@@ -29177,6 +29154,15 @@
   String getEventType(EventTarget target) {
     return _eventType;
   }
+
+  ElementStream<BeforeUnloadEvent> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  ElementStream<BeforeUnloadEvent> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
+  }
 }
 // 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
@@ -29206,11 +29192,6 @@
   // To suppress missing implicit constructor warnings.
   factory WindowEventHandlers._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WindowEventHandlers.beforeunloadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('WindowEventHandlers.hashchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -29251,11 +29232,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  @DomName('WindowEventHandlers.onbeforeunload')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('WindowEventHandlers.onhashchange')
   @DocsEditable()
   @Experimental() // untriaged
@@ -30334,6 +30310,21 @@
 
 
 @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 native "DocumentType" {
+  // To suppress missing implicit constructor warnings.
+  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.
+
+
+@DocsEditable()
 @DomName('WebKitPoint')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -32656,6 +32647,9 @@
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
+
+  String get _eventType =>
+      throw new UnsupportedError('Access type through getEventType method.');
 }
 // DO NOT EDIT- this file is generated from running tool/generator.sh.
 
@@ -34890,6 +34884,10 @@
  */
 class _WrappedEvent implements Event {
   final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
   _WrappedEvent(this.wrapped);
 
   bool get bubbles => wrapped.bubbles;
@@ -34927,6 +34925,43 @@
   void stopPropagation() {
     wrapped.stopPropagation();
   }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+
+  dynamic get _get_currentTarget => wrapped._get_currentTarget;
+
+  dynamic get _get_target => wrapped._get_target;
 }
 // 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
@@ -35318,6 +35353,17 @@
       return new _DOMWindowCrossFrame(w);
     }
   }
+
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  Events get on => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void addEventListener(String type, EventListener listener, [bool useCapture])
+      => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  bool dispatchEvent(Event event) => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) => throw new UnimplementedError();
 }
 
 class _LocationCrossFrame implements LocationBase {
@@ -35580,6 +35626,17 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
+  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
+  @Experimental() // untriaged
+  bool getModifierState(String keyArgument) => throw new UnimplementedError();
+  @Experimental() // untriaged
+  int get location => throw new UnimplementedError();
+  @Experimental() // untriaged
+  bool get repeat => throw new UnimplementedError();
+  dynamic get _get_view => throw new UnimplementedError();
 }
 // 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
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index dd2ad02..60c8271 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -101,7 +101,7 @@
 
 @DocsEditable()
 @DomName('AbstractWorker')
-class AbstractWorker extends NativeFieldWrapperClass2 implements EventTarget {
+abstract class AbstractWorker extends NativeFieldWrapperClass2 implements EventTarget {
   // To suppress missing implicit constructor warnings.
   factory AbstractWorker._() { throw new UnsupportedError("Not supported"); }
 
@@ -304,6 +304,12 @@
   @DocsEditable()
   void set href(String value) native "HTMLAnchorElement_href_Setter";
 
+  @DomName('HTMLAnchorElement.origin')
+  @DocsEditable()
+  // WebKit only
+  @Experimental() // non-standard
+  String get origin native "HTMLAnchorElement_origin_Getter";
+
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
@@ -8291,13 +8297,16 @@
         validator: validator, treeSanitizer: treeSanitizer);
   }
 
-  List<Element> _children;
+  HtmlCollection get _children => throw new UnimplementedError(
+      'Use _docChildren instead');
+
+  List<Element> _docChildren;
 
   List<Element> get children {
-    if (_children == null) {
-      _children = new FilteredElementList(this);
+    if (_docChildren == null) {
+      _docChildren = new FilteredElementList(this);
     }
-    return _children;
+    return _docChildren;
   }
 
   void set children(List<Element> value) {
@@ -8424,22 +8433,6 @@
 
 
 @DocsEditable()
-@DomName('DocumentType')
-// http://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-412266927
-@deprecated // stable
-class DocumentType extends Node implements ChildNode {
-  // To suppress missing implicit constructor warnings.
-  factory DocumentType._() { 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.
-
-// WARNING: Do not edit - generated code.
-
-
-@DocsEditable()
 @DomName('DOMError')
 class DomError extends NativeFieldWrapperClass2 {
   // To suppress missing implicit constructor warnings.
@@ -8522,11 +8515,11 @@
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  Document createDocument(String namespaceURI, String qualifiedName, DocumentType doctype) native "DOMImplementation_createDocument_Callback";
+  Document createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) native "DOMImplementation_createDocument_Callback";
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) native "DOMImplementation_createDocumentType_Callback";
 
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
@@ -11186,8 +11179,6 @@
 
   bool hidden;
 
-  InputMethodContext get inputMethodContext;
-
   bool get isContentEditable;
 
   String lang;
@@ -15596,10 +15587,6 @@
   // To suppress missing implicit constructor warnings.
   factory HtmlFormControlsCollection._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('HTMLFormControlsCollection.__getter__')
-  @DocsEditable()
-  Node __getter__(int index) native "HTMLFormControlsCollection___getter___Callback";
-
   @DomName('HTMLFormControlsCollection.namedItem')
   @DocsEditable()
   Node namedItem(String name) native "HTMLFormControlsCollection_namedItem_Callback";
@@ -31603,6 +31590,15 @@
   String getEventType(EventTarget target) {
     return _eventType;
   }
+
+  ElementStream<BeforeUnloadEvent> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  ElementStream<BeforeUnloadEvent> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
+  }
 }
 // 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
@@ -31641,11 +31637,6 @@
   // To suppress missing implicit constructor warnings.
   factory WindowEventHandlers._() { throw new UnsupportedError("Not supported"); }
 
-  @DomName('WindowEventHandlers.beforeunloadEvent')
-  @DocsEditable()
-  @Experimental() // untriaged
-  static const EventStreamProvider<Event> beforeUnloadEvent = const EventStreamProvider<Event>('beforeunload');
-
   @DomName('WindowEventHandlers.hashchangeEvent')
   @DocsEditable()
   @Experimental() // untriaged
@@ -31686,11 +31677,6 @@
   @Experimental() // untriaged
   static const EventStreamProvider<Event> unloadEvent = const EventStreamProvider<Event>('unload');
 
-  @DomName('WindowEventHandlers.onbeforeunload')
-  @DocsEditable()
-  @Experimental() // untriaged
-  Stream<Event> get onBeforeUnload => beforeUnloadEvent.forTarget(this);
-
   @DomName('WindowEventHandlers.onhashchange')
   @DocsEditable()
   @Experimental() // untriaged
@@ -32865,6 +32851,22 @@
 
 
 @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 {
+  // To suppress missing implicit constructor warnings.
+  factory _DocumentType._() { 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.
+
+// WARNING: Do not edit - generated code.
+
+
+@DocsEditable()
 @DomName('WebKitPoint')
 @SupportedBrowser(SupportedBrowser.CHROME)
 @SupportedBrowser(SupportedBrowser.SAFARI)
@@ -33920,6 +33922,10 @@
  */
 class _WrappedEvent implements Event {
   final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
   _WrappedEvent(this.wrapped);
 
   bool get bubbles => wrapped.bubbles;
@@ -33957,6 +33963,43 @@
   void stopPropagation() {
     wrapped.stopPropagation();
   }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+
+  dynamic get _get_currentTarget => wrapped._get_currentTarget;
+
+  dynamic get _get_target => wrapped._get_target;
 }
 // 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
@@ -35363,6 +35406,9 @@
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
+
+  String get _eventType =>
+      throw new UnsupportedError('Access type through getEventType method.');
 }
 // DO NOT EDIT- this file is generated from running tool/generator.sh.
 
@@ -38088,6 +38134,17 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
+  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
+  @Experimental() // untriaged
+  bool getModifierState(String keyArgument) => throw new UnimplementedError();
+  @Experimental() // untriaged
+  int get location => throw new UnimplementedError();
+  @Experimental() // untriaged
+  bool get repeat => throw new UnimplementedError();
+  dynamic get _get_view => throw new UnimplementedError();
 }
 // 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
@@ -38585,7 +38642,7 @@
     // TODO(vsm): Move these checks into native code.
     ClassMirror cls = reflectClass(type);
     if (_isBuiltinType(cls)) {
-      throw new UnsupportedError("Invalid custom element from ${cls.owner.uri}.");
+      throw new UnsupportedError("Invalid custom element from ${(cls.owner as LibraryMirror).uri}.");
     }
     var className = MirrorSystem.getName(cls.simpleName);
     var createdConstructor = cls.declarations[new Symbol('$className.created')];
diff --git a/sdk/lib/html/html_common/lists.dart b/sdk/lib/html/html_common/lists.dart
index 5c230a9..f33d64a 100644
--- a/sdk/lib/html/html_common/lists.dart
+++ b/sdk/lib/html/html_common/lists.dart
@@ -70,6 +70,6 @@
 /**
  * For accessing underlying node lists, for dart:js interop.
  */
-class NodeListWrapper {
+abstract class NodeListWrapper {
   List<Node> get rawList;
 }
diff --git a/tests/compiler/dart2js/analyze_api_test.dart b/tests/compiler/dart2js/analyze_api_test.dart
index 2e860d5..de48a2e 100644
--- a/tests/compiler/dart2js/analyze_api_test.dart
+++ b/tests/compiler/dart2js/analyze_api_test.dart
@@ -20,14 +20,6 @@
 // TODO(johnniwinther): Support canonical URIs as keys and message kinds as
 // values.
 const Map<String, List<String>> WHITE_LIST = const {
-  'html_dart2js.dart': const [
-      "doesn't implement", // Issue 16105.
-      "is not assignable to the type 'HtmlCollection'", // Issue 16105.
-      "is not a subtype of the overridden method type", // Issue 16105.
-  ],
-  'html_common/lists.dart': const [
-      "has no implementation" // Issue 16105.
-  ],
 };
 
 void main() {
diff --git a/tools/VERSION b/tools/VERSION
index 7b73e2c..0ff063f 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 2
 PATCH 0
 PRERELEASE 5
-PRERELEASE_PATCH 6
+PRERELEASE_PATCH 7
diff --git a/tools/dom/dom.json b/tools/dom/dom.json
index e9576fa..69e9804 100644
--- a/tools/dom/dom.json
+++ b/tools/dom/dom.json
@@ -2098,11 +2098,17 @@
         "support_level": "deprecated"
       },
       "name": {},
+      "nextElementSibling": {
+        "support_level": "untriaged"
+      },
       "notations": {
         "comment": "http://dom.spec.whatwg.org/#dom-documenttype-notations",
         "dart_action": "suppress",
         "support_level": "deprecated"
       },
+      "previousElementSibling": {
+        "support_level": "untriaged"
+      },
       "publicId": {},
       "remove": {
         "support_level": "nonstandard"
@@ -2241,6 +2247,8 @@
         "support_level": "nonstandard"
       },
       "inputMethodContext": {
+        "comment": "http://www.w3.org/TR/ime-api/#the-inputmethodcontext-property Per the spec is only on HTMLElement.",
+        "dart_action": "suppress",
         "support_level": "untriaged"
       },
       "insertAdjacentElement": {
@@ -3380,7 +3388,6 @@
       },
       "origin": {
         "comment": "WebKit only",
-        "dart_action": "suppress",
         "support_level": "nonstandard"
       },
       "password": {
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index be8372a..b450d61 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -78,6 +78,7 @@
   'DataView', # Typed arrays
   'DirectoryEntrySync', # Workers
   'DirectoryReaderSync', # Workers
+  'DocumentType',
   'EntrySync', # Workers
   'FileEntrySync', # Workers
   'FileReaderSync', # Workers
@@ -627,6 +628,7 @@
     'HTMLDirectoryElement.*',
     'HTMLDivElement.align',
     'HTMLFontElement.*',
+    'HTMLFormControlsCollection.__getter__',
     'HTMLFormElement.get:elements',
     'HTMLFrameElement.*',
     'HTMLFrameSetElement.*',
@@ -753,6 +755,7 @@
     'SVGElementInstance.on:wheel',
     'WheelEvent.wheelDelta',
     'Window.on:wheel',
+    'WindowEventHandlers.on:beforeUnload',
     'WorkerGlobalScope.webkitIndexedDB',
 # TODO(jacobr): should these be removed?
     'Document.close',
diff --git a/tools/dom/src/EventStreamProvider.dart b/tools/dom/src/EventStreamProvider.dart
index 85b4d78..ea66285 100644
--- a/tools/dom/src/EventStreamProvider.dart
+++ b/tools/dom/src/EventStreamProvider.dart
@@ -428,4 +428,7 @@
   String getEventType(EventTarget target) {
     return _eventTypeGetter(target);
   }
+
+  String get _eventType =>
+      throw new UnsupportedError('Access type through getEventType method.');
 }
diff --git a/tools/dom/src/WrappedEvent.dart b/tools/dom/src/WrappedEvent.dart
index af64fae..4f30af9 100644
--- a/tools/dom/src/WrappedEvent.dart
+++ b/tools/dom/src/WrappedEvent.dart
@@ -9,6 +9,10 @@
  */
 class _WrappedEvent implements Event {
   final Event wrapped;
+
+  /** The CSS selector involved with event delegation. */
+  String _selector;
+
   _WrappedEvent(this.wrapped);
 
   bool get bubbles => wrapped.bubbles;
@@ -46,4 +50,41 @@
   void stopPropagation() {
     wrapped.stopPropagation();
   }
+
+  /**
+   * A pointer to the element whose CSS selector matched within which an event
+   * was fired. If this Event was not associated with any Event delegation,
+   * accessing this value will throw an [UnsupportedError].
+   */
+  Element get matchingTarget {
+    if (_selector == null) {
+      throw new UnsupportedError('Cannot call matchingTarget if this Event did'
+          ' not arise as a result of event delegation.');
+    }
+    var currentTarget = this.currentTarget;
+    var target = this.target;
+    var matchedTarget;
+    do {
+      if (target.matches(_selector)) return target;
+      target = target.parent;
+    } while (target != null && target != currentTarget.parent);
+    throw new StateError('No selector matched for populating matchedTarget.');
+  }
+
+  /**
+   * This event's path, taking into account shadow DOM.
+   *
+   * ## Other resources
+   *
+   * * [Shadow DOM extensions to Event]
+   * (http://w3c.github.io/webcomponents/spec/shadow/#extensions-to-event) from
+   * W3C.
+   */
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
+  @Experimental()
+  List<Node> get path => wrapped.path;
+
+  dynamic get _get_currentTarget => wrapped._get_currentTarget;
+
+  dynamic get _get_target => wrapped._get_target;
 }
diff --git a/tools/dom/src/dart2js_DOMImplementation.dart b/tools/dom/src/dart2js_DOMImplementation.dart
index 051df51..78a54b3 100644
--- a/tools/dom/src/dart2js_DOMImplementation.dart
+++ b/tools/dom/src/dart2js_DOMImplementation.dart
@@ -49,6 +49,17 @@
       return new _DOMWindowCrossFrame(w);
     }
   }
+
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  Events get on => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void addEventListener(String type, EventListener listener, [bool useCapture])
+      => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  bool dispatchEvent(Event event) => throw new UnimplementedError();
+  // TODO(efortuna): Remove this method. dartbug.com/16814
+  void removeEventListener(String type, EventListener listener,
+      [bool useCapture]) => throw new UnimplementedError();
 }
 
 class _LocationCrossFrame implements LocationBase {
diff --git a/tools/dom/src/dart2js_KeyEvent.dart b/tools/dom/src/dart2js_KeyEvent.dart
index 8c7b5fd..f3be576 100644
--- a/tools/dom/src/dart2js_KeyEvent.dart
+++ b/tools/dom/src/dart2js_KeyEvent.dart
@@ -210,4 +210,15 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
+  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
+  @Experimental() // untriaged
+  bool getModifierState(String keyArgument) => throw new UnimplementedError();
+  @Experimental() // untriaged
+  int get location => throw new UnimplementedError();
+  @Experimental() // untriaged
+  bool get repeat => throw new UnimplementedError();
+  dynamic get _get_view => throw new UnimplementedError();
 }
diff --git a/tools/dom/src/dartium_KeyEvent.dart b/tools/dom/src/dartium_KeyEvent.dart
index 830da2f..d3716b3 100644
--- a/tools/dom/src/dartium_KeyEvent.dart
+++ b/tools/dom/src/dartium_KeyEvent.dart
@@ -129,4 +129,15 @@
     throw new UnsupportedError(
         "Cannot initialize a KeyboardEvent from a KeyEvent.");
   }
+  int get _layerX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _layerY => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageX => throw new UnsupportedError('Not applicable to KeyEvent');
+  int get _pageY => throw new UnsupportedError('Not applicable to KeyEvent');
+  @Experimental() // untriaged
+  bool getModifierState(String keyArgument) => throw new UnimplementedError();
+  @Experimental() // untriaged
+  int get location => throw new UnimplementedError();
+  @Experimental() // untriaged
+  bool get repeat => throw new UnimplementedError();
+  dynamic get _get_view => throw new UnimplementedError();
 }
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index d7a3fe6..d84e396 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -406,7 +406,7 @@
     // TODO(vsm): Move these checks into native code.
     ClassMirror cls = reflectClass(type);
     if (_isBuiltinType(cls)) {
-      throw new UnsupportedError("Invalid custom element from ${cls.owner.uri}.");
+      throw new UnsupportedError("Invalid custom element from ${(cls.owner as LibraryMirror).uri}.");
     }
     var className = MirrorSystem.getName(cls.simpleName);
     var createdConstructor = cls.declarations[new Symbol('$className.created')];
diff --git a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
index 2349ce5..e23390d 100644
--- a/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
+++ b/tools/dom/templates/html/impl/impl_AbstractWorker.darttemplate
@@ -5,5 +5,5 @@
 part of $LIBRARYNAME;
 
 @DocsEditable()
-$(ANNOTATIONS)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$MIXINS implements EventTarget$NATIVESPEC {
+$(ANNOTATIONS)$(CLASS_MODIFIERS)abstract class $CLASSNAME$EXTENDS$MIXINS implements EventTarget$NATIVESPEC {
 $!MEMBERS}
diff --git a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
index e57d98f..86db4ea 100644
--- a/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
+++ b/tools/dom/templates/html/impl/impl_DocumentFragment.darttemplate
@@ -21,18 +21,21 @@
         validator: validator, treeSanitizer: treeSanitizer);
   }
 
+  HtmlCollection get _children => throw new UnimplementedError(
+      'Use _docChildren instead');
+
 $if DART2JS
   // Native field is used only by Dart code so does not lead to instantiation
   // of native classes
   @Creates('Null')
 $endif
-  List<Element> _children;
+  List<Element> _docChildren;
 
   List<Element> get children {
-    if (_children == null) {
-      _children = new FilteredElementList(this);
+    if (_docChildren == null) {
+      _docChildren = new FilteredElementList(this);
     }
-    return _children;
+    return _docChildren;
   }
 
   void set children(List<Element> value) {
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index b84bb5f..cdf44bf 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -394,4 +394,13 @@
   String getEventType(EventTarget target) {
     return _eventType;
   }
+
+  ElementStream<BeforeUnloadEvent> forElement(Element e, {bool useCapture: false}) {
+    return new _ElementEventStreamImpl(e, _eventType, useCapture);
+  }
+
+  ElementStream<BeforeUnloadEvent> _forElementList(ElementList e,
+      {bool useCapture: false}) {
+    return new _ElementListEventStreamImpl(e, _eventType, useCapture);
+  }
 }
