Remove explicit support for IE 8/9/10

IE8/9 have already unofficially been removed, with some typedarray work
done around longs/doubles and java.util.Random switching to use
Date.now(), this commit makes it official and includes IE10 as well.

This patch doesn't attempt to expunge all possible cases that might have
been written with those browsers in mind, but just the places which only
apply for those browsers - some more general checks or more flexible
has been left in place. Likewise, some unnecessary base classes or
rebind rules are left in place, in case downstream projects are still
using them.

Change-Id: I370f0f369c5501cd73597d6fb2542b5ed369235b
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
index 86e08c7..6755d87 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
@@ -86,11 +86,9 @@
     return val;
   } else {
     // TODO(dankurka): trigger this error in the ui
-    // IE8 only has console defined if its dev tools have been opened before
-    if ($wnd.console && $wnd.console.log) {
-      $wnd.console.log("provider for " + propName
-          + " returned unexpected value: '" + val + "'");
-    }
+    $wnd.console.log("provider for " + propName
+        + " returned unexpected value: '" + val + "'");
+
     throw "can't compute binding property value for " + propName;
   }
 };
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/stub.nocache.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/stub.nocache.js
index 4f90b6b..5476f04 100755
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/stub.nocache.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/stub.nocache.js
@@ -18,8 +18,6 @@
  * This startup script is used when we run superdevmode from an app server.
  */
 (function($wnd, $doc){
-  // document.head does not exist in IE8
-  var $head = $doc.head || $doc.getElementsByTagName('head')[0];
   // Compute some codeserver urls so as the user does not need bookmarklets
   var hostName = $wnd.location.hostname;
   var serverUrl = 'http://' + hostName + ':__SUPERDEV_PORT__';
@@ -51,7 +49,7 @@
   }
 
   var injectScriptTag = function(){
-    $head.insertBefore(devModeScript, $head.firstElementChild || $head.children[0]);
+    $doc.head.insertBefore(devModeScript, $doc.head.firstElementChild || $doc.head.children[0]);
   };
 
   if (/loaded|complete/.test($doc.readyState)) {
diff --git a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java
index 8e6c5f8..bfeef2a 100644
--- a/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java
+++ b/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java
@@ -174,22 +174,6 @@
    */
   public static native void bootstrap() /*-{
     @Runtime::prototypesByTypeId = {};
-
-    // Do polyfills for all methods expected in a modern browser.
-
-    // Required by IE8
-    if (!Array.isArray) {
-      Array.isArray = function (vArg) {
-        return Object.prototype.toString.call(vArg) === "[object Array]";
-      };
-    }
-
-    // Required by IE8
-    if (!Date.now) {
-      Date.now = function now() {
-        return new Date().getTime();
-      };
-    }
   }-*/;
 
   /**
diff --git a/tools/api-checker/config/gwt29_210userapi.conf b/tools/api-checker/config/gwt29_210userapi.conf
index 6924d64..c49ee4e 100644
--- a/tools/api-checker/config/gwt29_210userapi.conf
+++ b/tools/api-checker/config/gwt29_210userapi.conf
@@ -155,3 +155,9 @@
 java.io.PrintStream::close() OVERRIDABLE_METHOD_EXCEPTION_TYPE_CHANGE existing method had more exceptions: [Ljava/io/IOException;]
 java.io.PrintStream::write(I) OVERRIDABLE_METHOD_EXCEPTION_TYPE_CHANGE existing method had more exceptions: [Ljava/io/IOException;]
 java.io.PrintStream::write([BII) OVERRIDABLE_METHOD_EXCEPTION_TYPE_CHANGE existing method had more exceptions: [Ljava/io/IOException;]
+
+# Removed IE8/9/10 specific classes
+com.google.gwt.dom.client.StyleInjector.StyleInjectorImplIE MISSING
+com.google.gwt.layout.client.LayoutImplIE8 MISSING
+com.google.gwt.typedarrays.client.NativeImplEmulClamped MISSING
+com.google.gwt.user.client.ui.TreeItem.TreeItemImplIE8ToIE10 MISSING
diff --git a/user/src/com/google/gwt/canvas/Canvas.gwt.xml b/user/src/com/google/gwt/canvas/Canvas.gwt.xml
index e783639..b713d6f 100644
--- a/user/src/com/google/gwt/canvas/Canvas.gwt.xml
+++ b/user/src/com/google/gwt/canvas/Canvas.gwt.xml
@@ -22,17 +22,6 @@
   <!-- Give default support value of maybe -->
   <set-property name="canvasElementSupport" value="maybe" />
 
-  <!-- Give default support value of no to unsupported browsers -->
-  <set-property name="canvasElementSupport" value="no">
-    <all>
-      <when-property-is name="user.agent" value="ie8"/>
-      <!-- removes IE9 fallback to IE8 -->
-      <none>
-        <when-property-is name="user.agent" value="ie9"/>
-      </none>
-    </all>
-  </set-property>
-
   <replace-with class="com.google.gwt.canvas.client.Canvas.CanvasElementSupportDetectedMaybe">
     <when-type-is class="com.google.gwt.canvas.client.Canvas.CanvasElementSupportDetector" />
     <when-property-is name="canvasElementSupport" value="maybe" />
diff --git a/user/src/com/google/gwt/core/client/JsDate.java b/user/src/com/google/gwt/core/client/JsDate.java
index 425e2d9..fa9366b 100644
--- a/user/src/com/google/gwt/core/client/JsDate.java
+++ b/user/src/com/google/gwt/core/client/JsDate.java
@@ -93,14 +93,7 @@
    * the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.
    */
   public static native double now() /*-{
-      // IE8 does not have Date.now
-      // when removing IE8 support we change this to Date.now()
-      if (Date.now) {
-          // Date.now vs Date.getTime() performance comparison:
-          // http://jsperf.com/date-now-vs-new-date/8
-          return Date.now();
-      }
-      return (new Date()).getTime();
+      return Date.now();
   }-*/;
 
   /**
diff --git a/user/src/com/google/gwt/core/client/ScriptInjector.java b/user/src/com/google/gwt/core/client/ScriptInjector.java
index 5c93590..f4319f5 100644
--- a/user/src/com/google/gwt/core/client/ScriptInjector.java
+++ b/user/src/com/google/gwt/core/client/ScriptInjector.java
@@ -288,8 +288,7 @@
   }-*/;
 
   private static native void nativeAttachToHead(JavaScriptObject doc, JavaScriptObject scriptElement) /*-{
-    // IE8 does not have document.head
-    (doc.head || doc.getElementsByTagName("head")[0]).appendChild(scriptElement);
+    doc.head.appendChild(scriptElement);
   }-*/;
 
   private static native JavaScriptObject nativeDefaultWindow() /*-{
diff --git a/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java b/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
index a077195..4413e99 100644
--- a/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
+++ b/user/src/com/google/gwt/core/client/impl/CrossSiteLoadingStrategy.java
@@ -79,8 +79,7 @@
   }-*/;
 
   private static native void installScriptTag(JavaScriptObject script) /*-{
-    // IE8 does not have document.head
-    (document.head || document.getElementsByTagName("head")[0]).appendChild(script);
+    document.head.appendChild(script);
   }-*/;
 
   private static native JavaScriptObject removeTagAndCallErrorHandler(
@@ -93,8 +92,7 @@
        }
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearOnSuccess(*)(fragment);
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearCallbacks(*)(tag);
-       // IE8 does not have document.head
-       (document.head || document.getElementsByTagName("head")[0]).removeChild(tag);
+       document.head.removeChild(tag);
        function callLoadTerminated() {
          loadFinishedHandler.@com.google.gwt.core.client.impl.AsyncFragmentLoader.LoadTerminatedHandler::loadTerminated(*)(exception);
        }
@@ -107,8 +105,7 @@
      return function(code) {
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearOnSuccess(*)(fragment);
        @com.google.gwt.core.client.impl.CrossSiteLoadingStrategy::clearCallbacks(*)(tag);
-       // IE8 does not have document.head
-       (document.head || document.getElementsByTagName("head")[0]).removeChild(tag);
+       document.head.removeChild(tag);
        __gwtModuleFunction.installCode(code);
      }
    }-*/;
diff --git a/user/src/com/google/gwt/core/client/impl/Impl.java b/user/src/com/google/gwt/core/client/impl/Impl.java
index af2769d..879a3eb 100644
--- a/user/src/com/google/gwt/core/client/impl/Impl.java
+++ b/user/src/com/google/gwt/core/client/impl/Impl.java
@@ -192,16 +192,6 @@
   @GwtScriptOnly
   public static native void registerWindowOnError(boolean reportAlways) /*-{
     function errorHandler(msg, url, line, column, error) {
-      // IE8, IE9, IE10, safari 9, do not have an error passed
-      if (!error) {
-        error = msg + " (" + url + ":" + line
-        // IE8 and IE9 do not have the column number
-        if (column) {
-          error += ":" + column
-        }
-        error += ")";
-      }
-
       var throwable = @java.lang.Throwable::of(*)(error);
       @Impl::reportWindowOnError(*)(throwable);
     };
diff --git a/user/src/com/google/gwt/dom/DOM.gwt.xml b/user/src/com/google/gwt/dom/DOM.gwt.xml
index f34e0d4..558034b 100644
--- a/user/src/com/google/gwt/dom/DOM.gwt.xml
+++ b/user/src/com/google/gwt/dom/DOM.gwt.xml
@@ -30,29 +30,8 @@
     <when-property-is name="user.agent" value="safari"/>
   </replace-with>
 
-  <replace-with class="com.google.gwt.dom.client.DOMImplIE9">
-    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
-
-  <replace-with class="com.google.gwt.dom.client.DOMImplIE8">
-    <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
-
   <replace-with class="com.google.gwt.dom.client.DOMImplMozilla">
     <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
     <when-property-is name="user.agent" value="gecko1_8"/>
   </replace-with>
-
-  <replace-with class="com.google.gwt.dom.client.StyleInjector.StyleInjectorImplIE">
-    <when-type-is class="com.google.gwt.dom.client.StyleInjector.StyleInjectorImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE8.java b/user/src/com/google/gwt/dom/client/DOMImplIE8.java
deleted file mode 100644
index 1772c44..0000000
--- a/user/src/com/google/gwt/dom/client/DOMImplIE8.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dom.client;
-
-class DOMImplIE8 extends DOMImplTrident {
-
-  private static boolean isIE8;
-  private static boolean isIE8Detected;
-
-  /**
-   * Check if the browser is IE8 or IE9.
-   * 
-   * @return <code>true</code> if the browser is IE8, <code>false</code> if IE9
-   *         or any other browser
-   */
-  static boolean isIE8() {
-    if (!isIE8Detected) {
-      isIE8 = isIE8Impl();
-      isIE8Detected = true;
-    }
-    return isIE8;
-  }
-
-  // Stolen and modified from UserAgentPropertyGenerator
-  private static native boolean isIE8Impl() /*-{
-    var ua = navigator.userAgent.toLowerCase();
-    if (ua.indexOf("msie") != -1 && $doc.documentMode == 8) {
-      return true;
-    }
-    return false;
-  }-*/;
-
-  @Override
-  public void cssClearOpacity(Style style) {
-    if (isIE8()) {
-      cssClearOpacityImpl(style);
-    } else {
-      super.cssClearOpacity(style);
-    }
-  }
-
-  @Override
-  public void cssSetOpacity(Style style, double value) {
-    if (isIE8()) {
-      cssSetOpacityImpl(style, value);
-    } else {
-      super.cssSetOpacity(style, value);
-    }
-  }
-
-  @Override
-  public int getAbsoluteLeft(Element elem) {
-    Document doc = elem.getOwnerDocument();
-    return getBoundingClientRectLeft(elem) + doc.getScrollLeft();
-  }
-
-  @Override
-  public int getAbsoluteTop(Element elem) {
-    Document doc = elem.getOwnerDocument();
-    return getBoundingClientRectTop(elem) + doc.getScrollTop();
-  }
-
-  @Override
-  public int getScrollLeft(Element elem) {
-    if (isRTL(elem)) {
-      // IE8 returns increasingly *positive* values as you scroll left in RTL.
-      return -super.getScrollLeft(elem);
-    }
-    return super.getScrollLeft(elem);
-  }
-
-  @Override
-  public void setScrollLeft(Element elem, int left) {
-    if (isRTL(elem)) {
-      // IE8 returns increasingly *positive* values as you scroll left in RTL.
-      left = -left;
-    }
-    super.setScrollLeft(elem, left);
-  }
-
-  private native void cssClearOpacityImpl(Style style) /*-{
-    style.filter = '';
-  }-*/;
-
-  private native void cssSetOpacityImpl(Style style, double value) /*-{
-    style.filter = 'alpha(opacity=' + (value * 100) + ')';
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/dom/client/DOMImplIE9.java b/user/src/com/google/gwt/dom/client/DOMImplIE9.java
deleted file mode 100644
index 12e1564..0000000
--- a/user/src/com/google/gwt/dom/client/DOMImplIE9.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dom.client;
-
-/**
- * IE9 based implementation of {@link com.google.gwt.dom.client.DOMImplStandardBase}.
- */
-class DOMImplIE9 extends DOMImplStandardBase {
-
-  @Override
-  public int getAbsoluteLeft(Element elem) {
-    double left = getBoundingClientRectLeft(elem) + getDocumentScrollLeftImpl();
-    if (isRTL(elem)) { // in RTL, account for the scroll bar shift if present
-      left += getParentOffsetDelta(elem);
-    }
-    return toInt32(left);
-  }
-
-  @Override
-  public int getAbsoluteTop(Element elem) {
-    return toInt32(getBoundingClientRectTop(elem) + getDocumentScrollTopImpl());
-  }
-
-  /**
-   * Coerce numeric values a string. In IE, some values can be stored as numeric
-   * types.
-   */
-  @Override
-  public native String getNumericStyleProperty(Style style, String name) /*-{
-    return typeof(style[name]) == "number" ? "" + style[name] : style[name];
-  }-*/;
-
-  @Override
-  public int getScrollLeft(Document doc) {
-    return toInt32(getDocumentScrollLeftImpl());
-  }
-
-  @Override
-  public int getScrollLeft(Element elem) {
-    int left = toInt32(getScrollLeftImpl(elem));
-    if (isRTL(elem)) {
-      left = -left;
-    }
-    return left;
-  }
-
-  @Override
-  public int getScrollTop(Document doc) {
-    return toInt32(getDocumentScrollTopImpl());
-  }
-
-  @Override
-  public native int getTabIndex(Element elem) /*-{ 
-    return elem.tabIndex < 65535 ? elem.tabIndex : -(elem.tabIndex % 65535) - 1;
-  }-*/;
-
-  @Override
-  public boolean isOrHasChild(Node parent, Node child) {
-    // IE9 still behaves like IE8 for this method
-    return DOMImplTrident.isOrHasChildImpl(parent, child);
-  }
-
-  @Override
-  public native void selectRemoveOption(SelectElement select, int index) /*-{
-    try {
-      // IE9 throws if elem at index is an optgroup
-      select.remove(index);
-    } catch(e) {
-      select.removeChild(select.childNodes[index]);
-    }
-  }-*/;
-
-  @Override
-  public void setScrollLeft(Element elem, int left) {
-    if (isRTL(elem)) {
-      left = -left;
-    }
-    setScrollLeftImpl(elem, left);
-  }
-
-  private native double getBoundingClientRectLeft(Element elem) /*-{
-    // getBoundingClientRect() throws a JS exception if the elem is not attached
-    // to the document, so we wrap it in a try/catch block
-    try {
-      return elem.getBoundingClientRect().left;
-    } catch (e) {
-      // if not attached return 0
-      return 0;
-    }
-  }-*/;
-
-  private native double getBoundingClientRectTop(Element elem) /*-{
-    // getBoundingClientRect() throws a JS exception if the elem is not attached
-    // to the document, so we wrap it in a try/catch block
-    try {
-      return elem.getBoundingClientRect().top;
-    } catch (e) {
-      // if not attached return 0
-      return 0;
-    }
-  }-*/;
-
-  private native double getDocumentScrollLeftImpl() /*-{
-    return $wnd.pageXOffset;
-  }-*/;
-
-  private native double getDocumentScrollTopImpl() /*-{
-    return $wnd.pageYOffset;
-  }-*/;
-
-  private native double getParentOffsetDelta(Element elem) /*-{
-    var offsetParent = elem.offsetParent;
-    if (offsetParent) {
-      return offsetParent.offsetWidth - offsetParent.clientWidth;
-    }
-    return 0;
-  }-*/;
-
-  private native double getScrollLeftImpl(Element elem) /*-{
-    return elem.scrollLeft || 0;
-  }-*/; 
-
-  private native void setScrollLeftImpl(Element elem, int left) /*-{
-    elem.scrollLeft = left;
-  }-*/; 
-}
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandard.java b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
index ca0b7f0..70908e5 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplStandard.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandard.java
@@ -19,7 +19,10 @@
  * Base implementation of {@link com.google.gwt.user.client.impl.DOMImpl} shared
  * by those browsers that come a bit closer to supporting a common standard (ie,
  * not IE).
+ *
+ * <p>Deprecated, may be flattened into DOMImpl, as this is the only direct subclass.</p>
  */
+@Deprecated
 abstract class DOMImplStandard extends DOMImpl {
 
   @Override
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
index 7e9f530..115cca8 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
@@ -19,7 +19,10 @@
 
 /**
  * StandardBase implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
+ *
+ * <p>Deprecated, may be flattened into DOMImplWebkit, its only subclass.</p>
  */
+@Deprecated
 class DOMImplStandardBase extends DOMImplStandard {
 
   private static class ClientRect extends JavaScriptObject {
diff --git a/user/src/com/google/gwt/dom/client/DOMImplTrident.java b/user/src/com/google/gwt/dom/client/DOMImplTrident.java
deleted file mode 100644
index a467d1d..0000000
--- a/user/src/com/google/gwt/dom/client/DOMImplTrident.java
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.dom.client;
-
-import com.google.gwt.safehtml.shared.annotations.SuppressIsSafeHtmlCastCheck;
-
-abstract class DOMImplTrident extends DOMImpl {
-
-  /**
-   * This field *must* be filled in from JSNI code before dispatching an event
-   * on IE. It should be set to the 'this' context of the handler that receives
-   * the event, then restored to its initial value when the dispatcher is done.
-   * See
-   * {@link com.google.gwt.user.client.impl.DOMImplTrident#initEventSystem()}
-   * for an example of how this should be done.
-   */
-  private static EventTarget currentEventTarget;
-
-  static native boolean isOrHasChildImpl(Node parent, Node child) /*-{
-    // Element.contains() doesn't work with non-Element nodes on IE, so we have
-    // to deal explicitly with non-Element nodes here.
-
-    // Only Element (1) and Document (9) can contain other nodes.
-    if ((parent.nodeType != 1) && (parent.nodeType != 9)) {
-      return parent == child;
-    }
-
-    // If the child is not an Element, check its parent instead.
-    if (child.nodeType != 1) {
-      child = child.parentNode;
-      if (!child) {
-        return false;
-      }
-    }
-
-    if (parent.nodeType == 9) {
-      // In IE8 and IE9 (at least), document.contains does not exist, so use body.contains instead
-      return (parent === child) || (parent.body && parent.body.contains(child));
-    } else {
-      // An extra equality check is required due to the fact that
-      // elem.contains(elem) is false if elem is not attached to the DOM.
-      return (parent === child) || parent.contains(child);
-    }
-  }-*/;
-
-  @Override
-  public native ButtonElement createButtonElement(Document doc, String type) /*-{
-    return doc.createElement("<BUTTON type='" + type + "'></BUTTON>");
-  }-*/;
-
-  @Override
-  @SuppressIsSafeHtmlCastCheck
-  public Element createElement(Document doc, String tagName) {
-    if (tagName.contains(":")) {
-      // Special implementation for tag names with namespace-prefixes. The only
-      // way to get IE to reliably create namespace-prefixed elements is
-      // through innerHTML.
-      Element container = ensureContainer(doc);
-      container.setInnerHTML("<" + tagName + "/>");
-
-      // Remove the element before returning it, so that there's no chance of
-      // it getting clobbered later.
-      Element elem = container.getFirstChildElement();
-      container.removeChild(elem);
-      return elem;
-    }
-
-    // No prefix. Just use the default implementation (don't use super impl
-    // here in case it changes at some point in the future).
-    return createElementInternal(doc, tagName);
-  }
-
-  @Override
-  public native NativeEvent createHtmlEvent(Document doc, String type,
-      boolean canBubble, boolean cancelable) /*-{
-    // NOTE: IE doesn't support changing bubbling and canceling behavior (this
-    // is documented publicly in Document.createHtmlEvent()).
-    var evt = doc.createEventObject();
-    evt.type = type;
-    return evt;
-  }-*/;
-
-  @Override
-  public native InputElement createInputRadioElement(Document doc, String name) /*-{
-    return doc.createElement("<INPUT type='RADIO' name='" + name + "'>");
-  }-*/;
-
-  @Override
-  public native NativeEvent createKeyCodeEvent(Document doc, String type,
-      boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey,
-      int keyCode) /*-{
-    var evt = doc.createEventObject();
-    evt.type = type;
-    evt.ctrlKey = ctrlKey;
-    evt.altKey = altKey;
-    evt.shiftKey = shiftKey;
-    evt.metaKey = metaKey;
-    evt.keyCode = keyCode;
-    return evt;
-  }-*/;
-
-  @Override
-  @Deprecated
-  public native NativeEvent createKeyEvent(Document doc, String type,
-      boolean canBubble, boolean cancelable, boolean ctrlKey, boolean altKey,
-      boolean shiftKey, boolean metaKey, int keyCode, int charCode) /*-{
-    // NOTE: IE doesn't support changing bubbling and canceling behavior (this
-    // is documented publicly in Document.createKeyEvent()).
-    var evt = this.@com.google.gwt.dom.client.DOMImplTrident::createKeyCodeEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZI)(doc, type, ctrlKey, altKey, shiftKey, metaKey, charCode);
-    evt.charCode = charCode;
-    return evt;
-  }-*/;
-
-  @Override
-  public NativeEvent createKeyPressEvent(Document doc, boolean ctrlKey,
-      boolean altKey, boolean shiftKey, boolean metaKey, int charCode) {
-    // NOTE: in IE, keyCode is used in both keydown/keyup and keypress, so we
-    // delegate to createKeyCodeEvent instead of duplicating code.
-    return createKeyCodeEvent(doc, "keypress", ctrlKey, altKey, shiftKey,
-        metaKey, charCode);
-  }
-
-  @Override
-  public native NativeEvent createMouseEvent(Document doc, String type,
-      boolean canBubble, boolean cancelable, int detail, int screenX,
-      int screenY, int clientX, int clientY, boolean ctrlKey, boolean altKey,
-      boolean shiftKey, boolean metaKey, int button, Element relatedTarget) /*-{
-    // NOTE: IE doesn't support changing bubbling and canceling behavior (this
-    // is documented publicly in Document.createMouseEvent()).
-    var evt = doc.createEventObject();
-    evt.type = type;
-    evt.detail = detail;
-    evt.screenX = screenX;
-    evt.screenY = screenY;
-    evt.clientX = clientX;
-    evt.clientY = clientY;
-    evt.ctrlKey = ctrlKey;
-    evt.altKey = altKey;
-    evt.shiftKey = shiftKey;
-    evt.metaKey = metaKey;
-    evt.button = button;
-
-    // It would make sense to set evt.[fromElement | toElement] here, because
-    // that's what IE uses. However, setting these properties has no effect for
-    // some reason. So instead we set releatedTarget, and explicitly check for
-    // its existence in eventGetFromElement() and eventGetToElement().
-    evt.relatedTarget = relatedTarget;
-
-    return evt;
-  }-*/;
-
-  @Override
-  public String cssFloatPropertyName() {
-    return "styleFloat";
-  }
-
-  @Override
-  public native void dispatchEvent(Element target, NativeEvent evt) /*-{
-    target.fireEvent("on" + evt.type, evt);
-  }-*/;
-
-  @Override
-  public native int eventGetCharCode(NativeEvent evt) /*-{
-    return evt.keyCode || 0;
-  }-*/;
-
-  @Override
-  public EventTarget eventGetCurrentTarget(NativeEvent event) {
-    return currentEventTarget;
-  }
-
-  @Override
-  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
-    return Math.round(-evt.wheelDelta / 40) || 0;
-  }-*/;
-
-  @Override
-  public native EventTarget eventGetRelatedTarget(NativeEvent evt) /*-{
-    // Prefer 'relatedTarget' if it's set (see createMouseEvent(), which
-    // explicitly sets relatedTarget when synthesizing mouse events).
-    return evt.relatedTarget ||
-           (evt.type == "mouseout" ? evt.toElement:evt.fromElement);
-  }-*/;
-
-  @Override
-  public native EventTarget eventGetTarget(NativeEvent evt) /*-{
-    return evt.srcElement;
-  }-*/;
-
-  @Override
-  public native void eventPreventDefault(NativeEvent evt) /*-{
-    evt.returnValue = false;
-  }-*/;
-
-  @Override
-  public native void eventStopPropagation(NativeEvent evt) /*-{
-    evt.cancelBubble = true;
-  }-*/;
-
-  @Override
-  public native String eventToString(NativeEvent evt) /*-{
-    if (evt.toString) return evt.toString();
-    return "[event" + evt.type + "]";
-  }-*/;
-
-  /**
-   * IE returns a numeric type for some attributes that are really properties,
-   * such as offsetWidth. We need to coerce these to strings to prevent a
-   * runtime JS exception.
-   */
-  @Override
-  public native String getAttribute(Element elem, String name) /*-{
-    var attr = elem.getAttribute(name);
-    return attr == null ? '' : attr + '';
-  }-*/;
-
-  @Override
-  public int getBodyOffsetLeft(Document doc) {
-    return getClientLeft(doc.getViewportElement());
-  }
-
-  @Override
-  public int getBodyOffsetTop(Document doc) {
-    return getClientTop(doc.getViewportElement());
-  }
-
-  @Override
-  public native String getInnerText(Element elem) /*-{
-    return elem.innerText;
-  }-*/;
-
-  /**
-   * Coerce numeric values a string. In IE, some values can be stored as numeric
-   * types.
-   */
-  @Override
-  public native String getNumericStyleProperty(Style style, String name) /*-{
-    return typeof(style[name]) == "number" ? "" + style[name] : style[name];
-  }-*/;
-
-  @Override
-  public String getTagName(Element elem) {
-    String tagName = getTagNameInternal(elem);
-    String scopeName = getScopeNameInternal(elem);
-
-    if ((scopeName == null) || "html".equalsIgnoreCase(scopeName)) {
-      return tagName;
-    }
-
-    return scopeName + ":" + tagName;
-  }
-
-  @Override
-  public native boolean hasAttribute(Element elem, String name) /*-{
-    var node = elem.getAttributeNode(name);
-    return !!(node && node.specified);
-  }-*/;
-
-  @Override
-  public boolean isOrHasChild(Node parent, Node child) {
-    return isOrHasChildImpl(parent, child);
-  }
-
-  @Override
-  public native void selectAdd(SelectElement select, OptionElement option,
-      OptionElement before) /*-{
-    // IE only accepts indices for the second argument.
-    if (before) {
-      select.add(option, before.index);
-    } else {
-      select.add(option);
-    }
-  }-*/;
-
-  @Override
-  public native void setInnerText(Element elem, String text) /*-{
-    elem.innerText = text || '';
-  }-*/;
-
-  protected native int getBoundingClientRectLeft(Element elem) /*-{
-    // getBoundingClientRect() throws a JS exception if the elem is not attached
-    // to the document, so we wrap it in a try/catch block
-    try {
-      return elem.getBoundingClientRect().left;
-    } catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  protected native int getBoundingClientRectTop(Element elem) /*-{
-    // getBoundingClientRect() throws a JS exception if the elem is not attached
-    // to the document, so we wrap it in a try/catch block
-    try {
-      return elem.getBoundingClientRect().top;
-    } catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  protected native boolean isRTL(Element elem) /*-{
-    return elem.currentStyle.direction == 'rtl';
-  }-*/;
-
-  private native Element createElementInternal(Document doc, String tagName) /*-{
-    return doc.createElement(tagName);
-  }-*/;
-
-  // IE needs a container div *for each document* for use by createElement().
-  private native Element ensureContainer(Document doc) /*-{
-    if (!doc.__gwt_container) {
-      doc.__gwt_container = doc.createElement('div');
-    }
-    return doc.__gwt_container;
-  }-*/;
-
-  /**
-   * clientLeft is non-standard and not implemented on all browsers.
-   */
-  private native int getClientLeft(Element elem) /*-{
-    return elem.clientLeft;
-  }-*/;
-
-  /**
-   * clientTop is non-standard and not implemented on all browsers.
-   */
-  private native int getClientTop(Element elem) /*-{
-    return elem.clientTop;
-  }-*/;
-
-  private native String getScopeNameInternal(Element elem) /*-{
-    return elem.scopeName;
-  }-*/;
-
-  private native String getTagNameInternal(Element elem) /*-{
-    return elem.tagName;
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/dom/client/Document.java b/user/src/com/google/gwt/dom/client/Document.java
index 6eb119c..e72c823 100644
--- a/user/src/com/google/gwt/dom/client/Document.java
+++ b/user/src/com/google/gwt/dom/client/Document.java
@@ -1391,9 +1391,7 @@
    * @return the document's head
    */
   public final native HeadElement getHead() /*-{
-    // IE8 does not have document.head
-    // when removing IE8 support we remove the second statement
-    return this.head || this.getElementsByTagName('head')[0];
+    return this.head;
   }-*/;
 
   /**
diff --git a/user/src/com/google/gwt/dom/client/StyleInjector.java b/user/src/com/google/gwt/dom/client/StyleInjector.java
index 5f7a68e..bfef842 100644
--- a/user/src/com/google/gwt/dom/client/StyleInjector.java
+++ b/user/src/com/google/gwt/dom/client/StyleInjector.java
@@ -42,7 +42,11 @@
   /**
    * The DOM-compatible way of adding stylesheets. This implementation requires
    * the host HTML page to have a head element defined.
+   *
+   * <p>Deprecated, as this is the only implementation, this may be removed in
+   * a future release.</p>
    */
+  @Deprecated
   public static class StyleInjectorImpl {
     private static final StyleInjectorImpl IMPL = GWT.create(StyleInjectorImpl.class);
 
@@ -86,124 +90,6 @@
     }
   }
 
-  /**
-   * IE doesn't allow manipulation of a style element through DOM methods. There
-   * is also a hard-coded limit on the number of times that createStyleSheet can
-   * be called before IE8-9 starts throwing exceptions.
-   */
-  public static class StyleInjectorImplIE extends StyleInjectorImpl {
-
-    /**
-     * The maximum number of style tags that can be handled by IE.
-     */
-    private static final int MAX_STYLE_SHEETS = 31;
-    
-    /**
-     * A cache of the lengths of the current style sheets.  A value of 0
-     * indicates that the length has not yet been retrieved.
-     */
-    private static int[] styleSheetLengths = new int[MAX_STYLE_SHEETS];
-
-    private static native int getDocumentStyleCount() /*-{
-      return $doc.styleSheets.length;
-    }-*/;
-
-    private static native StyleElement getDocumentStyleSheet(int index) /*-{
-      return $doc.styleSheets[index];
-    }-*/;
-
-    private static native int getDocumentStyleSheetLength(int index) /*-{
-      return $doc.styleSheets[index].cssText.length;
-    }-*/;
-
-    public native void appendContents(StyleElement style, String contents) /*-{
-      style.cssText += contents;
-    }-*/;
-
-    @Override
-    public StyleElement injectStyleSheet(String contents) {
-      int numStyles = getDocumentStyleCount(); 
-      if (numStyles < MAX_STYLE_SHEETS) {
-        // Just create a new style element and add it to the list
-        return createNewStyleSheet(contents);
-      } else {
-        /*
-         * Find shortest style element to minimize re-parse time in the general
-         * case.
-         * 
-         * We cache the lengths of the style sheets in order to avoid expensive
-         * calls to retrieve their actual contents. Note that if another module
-         * or script makes changes to the style sheets that we are unaware of,
-         * the worst that will happen is that we will choose a style sheet to
-         * append to that is not actually of minimum size.
-         *
-         * We also play safe by counting only the MAX_STYLE_SHEETS first style
-         * sheets, just in case the limits are raised somehow (e.g. if this
-         * implementation is used in IE10 which removes --or significantly
-         * raises-- the limits.)
-         */
-        int shortestLen = Integer.MAX_VALUE;
-        int shortestIdx = -1;
-        for (int i = 0; i < MAX_STYLE_SHEETS; i++) {
-          int len = styleSheetLengths[i];
-          if (len == 0) {
-            // Cache the length
-            len = styleSheetLengths[i] = getDocumentStyleSheetLength(i);
-          }
-          if (len <= shortestLen) {
-            shortestLen = len;
-            shortestIdx = i;
-          }
-        }
-        styleSheetLengths[shortestIdx] += contents.length();
-        return appendToStyleSheet(shortestIdx, contents, true); 
-      }
-    }
-
-    @Override
-    public StyleElement injectStyleSheetAtEnd(String contents) {
-      int documentStyleCount = getDocumentStyleCount();
-      if (documentStyleCount == 0) {
-        return createNewStyleSheet(contents);
-      }
-    
-      return appendToStyleSheet(documentStyleCount - 1, contents, true);
-    }
-
-    @Override
-    public StyleElement injectStyleSheetAtStart(String contents) {
-      if (getDocumentStyleCount() == 0) {
-        return createNewStyleSheet(contents);
-      }
-    
-      return appendToStyleSheet(0, contents, false); // prepend
-    }
-
-    public native void prependContents(StyleElement style, String contents) /*-{
-      style.cssText = contents + style.cssText;
-    }-*/;
-
-    private StyleElement appendToStyleSheet(int idx, String contents, boolean append) {
-      StyleElement style = getDocumentStyleSheet(idx);
-      if (append) {
-        appendContents(style, contents);
-      } else {
-        prependContents(style, contents);
-      }
-      return style;
-    }
-
-    private native StyleElement createElement() /*-{
-      return $doc.createStyleSheet();
-    }-*/;
-
-    private StyleElement createNewStyleSheet(String contents) {
-      StyleElement style = createElement();
-      style.setCssText(contents);
-      return style;
-    }
-  }
-
   private static final JsArrayString toInject = JavaScriptObject.createArray().cast();
   private static final JsArrayString toInjectAtEnd = JavaScriptObject.createArray().cast();
   private static final JsArrayString toInjectAtStart = JavaScriptObject.createArray().cast();
diff --git a/user/src/com/google/gwt/event/dom/DragEvent.gwt.xml b/user/src/com/google/gwt/event/dom/DragEvent.gwt.xml
index 782aed4..0d087b5 100644
--- a/user/src/com/google/gwt/event/dom/DragEvent.gwt.xml
+++ b/user/src/com/google/gwt/event/dom/DragEvent.gwt.xml
@@ -22,11 +22,6 @@
   -->
   <set-property name="dragEventSupport" value="maybe" />
 
-  <!-- Older browsers do not support drag events. -->
-  <set-property name="dragEventSupport" value="no">
-    <when-property-is name="user.agent" value="ie8" />
-  </set-property>
-
   <replace-with class="com.google.gwt.event.dom.client.DragDropEventBase.DragSupportDetectorNo">
     <when-type-is class="com.google.gwt.event.dom.client.DragDropEventBase.DragSupportDetector" />
     <when-property-is name="dragEventSupport" value="no" />
diff --git a/user/src/com/google/gwt/event/dom/TouchEvent.gwt.xml b/user/src/com/google/gwt/event/dom/TouchEvent.gwt.xml
index 8c57b63..a4abd31 100644
--- a/user/src/com/google/gwt/event/dom/TouchEvent.gwt.xml
+++ b/user/src/com/google/gwt/event/dom/TouchEvent.gwt.xml
@@ -22,15 +22,6 @@
   -->
   <set-property name="touchEventSupport" value="maybe" />
 
-  <!-- Older browsers do not support touch events. -->
-  <set-property name="touchEventSupport" value="no">
-    <any>
-      <when-property-is name="user.agent" value="ie8" />
-      <when-property-is name="user.agent" value="ie9" />
-      <when-property-is name="user.agent" value="ie10" />
-    </any>
-  </set-property>
-
   <replace-with class="com.google.gwt.event.dom.client.TouchEvent.TouchSupportDetectorNo">
     <when-type-is class="com.google.gwt.event.dom.client.TouchEvent.TouchSupportDetector" />
     <when-property-is name="touchEventSupport" value="no" />
diff --git a/user/src/com/google/gwt/geolocation/Geolocation.gwt.xml b/user/src/com/google/gwt/geolocation/Geolocation.gwt.xml
index d2dd6e7..f34855f 100644
--- a/user/src/com/google/gwt/geolocation/Geolocation.gwt.xml
+++ b/user/src/com/google/gwt/geolocation/Geolocation.gwt.xml
@@ -17,15 +17,4 @@
   <inherits name="com.google.gwt.useragent.UserAgent" />
   <source path="client" />
   <public path="public" />
-
-  <replace-with class="com.google.gwt.geolocation.client.Geolocation.GeolocationSupportDetectorNo">
-    <when-type-is class="com.google.gwt.geolocation.client.Geolocation.GeolocationSupportDetector" />
-    <all>
-      <when-property-is name="user.agent" value="ie8"/>
-      <!-- removes IE9 fallback to IE8 -->
-      <none>
-        <when-property-is name="user.agent" value="ie9"/>
-      </none>
-    </all>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/geolocation/client/Geolocation.java b/user/src/com/google/gwt/geolocation/client/Geolocation.java
index 3dfe2f0..ff60f2e 100644
--- a/user/src/com/google/gwt/geolocation/client/Geolocation.java
+++ b/user/src/com/google/gwt/geolocation/client/Geolocation.java
@@ -79,17 +79,6 @@
   }
 
   /**
-   * Detector for browsers that do not support Geolocation.
-   */
-  @SuppressWarnings("unused")
-  private static class GeolocationSupportDetectorNo extends GeolocationSupportDetector {
-    @Override
-    public boolean isSupported() {
-      return false;
-    }
-  }
-
-  /**
    * Additional options for receiving the user's location.
    */
   public static class PositionOptions {
diff --git a/user/src/com/google/gwt/http/HTTP.gwt.xml b/user/src/com/google/gwt/http/HTTP.gwt.xml
index 5afcaea..e789a36 100644
--- a/user/src/com/google/gwt/http/HTTP.gwt.xml
+++ b/user/src/com/google/gwt/http/HTTP.gwt.xml
@@ -25,11 +25,4 @@
   <source path="client" />
   <public path="public" />
 
-  <replace-with class="com.google.gwt.http.client.Request.RequestImplIE8And9">
-    <when-type-is class="com.google.gwt.http.client.Request.RequestImpl" />
-    <any>
-      <when-property-is name="user.agent" value="ie8" />
-      <when-property-is name="user.agent" value="ie9" />
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/http/client/Request.java b/user/src/com/google/gwt/http/client/Request.java
index 97c578b..cdc1fa4 100644
--- a/user/src/com/google/gwt/http/client/Request.java
+++ b/user/src/com/google/gwt/http/client/Request.java
@@ -35,7 +35,10 @@
   /**
    * Native implementation associated with {@link Request}. User classes should not use this class
    * directly.
+   *
+   * <p>Deprecated, as the only implementation this may be removed in a future release.</p>
    */
+  @Deprecated
   static class RequestImpl {
 
     /**
@@ -49,32 +52,6 @@
     }
   }
 
-  /**
-   * Special {@link RequestImpl} for IE8, IE9 to work around some IE specialities.
-   */
-  static class RequestImplIE8And9 extends RequestImpl {
-
-    @Override
-    Response createResponse(XMLHttpRequest xmlHttpRequest) {
-      return new ResponseImpl(xmlHttpRequest) {
-
-        @Override
-        public int getStatusCode() {
-          /*
-           * http://code.google.com/p/google-web-toolkit/issues/detail?id=5031
-           *
-           * The XMLHTTPRequest object in IE will return a status code of 1223 and drop some
-           * response headers if the server returns a HTTP/204.
-           *
-           * This issue is fixed in IE10.
-           */
-          int statusCode = super.getStatusCode();
-          return (statusCode == 1223) ? SC_NO_CONTENT : statusCode;
-        }
-      };
-    }
-  }
-
   /*
    * Although Request is a client-side class, it's a transitive dependency of
    * some GWT servlet code.  Because GWT.create() isn't safe to call on the
diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index dd4a3d0..733e544 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -526,8 +526,8 @@
 
         @Override
         public String getPurpose() {
-          return "Specify the user agents to reduce the number of permutations for remote browser tests;"
-              + " e.g. ie8,safari,gecko1_8";
+          return "Specify the user agents to reduce the number of permutations for remote browser"
+              + " tests; e.g. safari,gecko1_8";
         }
 
         @Override
diff --git a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
index 5b0c61e..133c848 100644
--- a/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
+++ b/user/src/com/google/gwt/junit/RunStyleHtmlUnit.java
@@ -288,7 +288,6 @@
     addBrowser(BrowserVersion.EDGE, "safari");
     addBrowser(BrowserVersion.FIREFOX_38, "gecko1_8");
     addBrowser(BrowserVersion.CHROME, "safari");
-    addBrowser(BrowserVersion.INTERNET_EXPLORER_8, "ie8");
     addBrowser(BrowserVersion.INTERNET_EXPLORER_11, "gecko1_8");
   }
 
diff --git a/user/src/com/google/gwt/layout/Layout.gwt.xml b/user/src/com/google/gwt/layout/Layout.gwt.xml
index 85e5c8e..eaff57e 100644
--- a/user/src/com/google/gwt/layout/Layout.gwt.xml
+++ b/user/src/com/google/gwt/layout/Layout.gwt.xml
@@ -20,16 +20,4 @@
   <inherits name="com.google.gwt.aria.Aria"/>
 
   <source path="client" />
-
-  <replace-with class="com.google.gwt.layout.client.LayoutImplIE8">
-    <when-type-is class="com.google.gwt.layout.client.LayoutImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <!-- IE9 is only bound explicitly to the IE8 impl because leaving -->
-      <!-- it unbound leads to a warning when compiling. If attempting  -->
-      <!-- to let IE9 use a non-IE8 impl, explicitly bind it to avoid   -->
-      <!-- this warning                                                 -->
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/layout/client/LayoutImpl.java b/user/src/com/google/gwt/layout/client/LayoutImpl.java
index 1118a38..cdef144 100644
--- a/user/src/com/google/gwt/layout/client/LayoutImpl.java
+++ b/user/src/com/google/gwt/layout/client/LayoutImpl.java
@@ -38,7 +38,11 @@
  * 
  * Note: This implementation class has state, so {@link Layout} must create a
  * new instance for each layout-parent.
+ *
+ * <p>Deprecated, as this is the only implementation, it may be removed in a future
+ * release.</p>
  */
+@Deprecated
 class LayoutImpl {
 
   private static DivElement fixedRuler;
diff --git a/user/src/com/google/gwt/layout/client/LayoutImplIE8.java b/user/src/com/google/gwt/layout/client/LayoutImplIE8.java
deleted file mode 100644
index 9b2a879..0000000
--- a/user/src/com/google/gwt/layout/client/LayoutImplIE8.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.layout.client;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Node;
-import com.google.gwt.dom.client.NodeList;
-import com.google.gwt.dom.client.Style;
-import com.google.gwt.dom.client.Style.Display;
-import com.google.gwt.dom.client.Style.Unit;
-import com.google.gwt.layout.client.Layout.Layer;
-
-/**
- * This implementation is used on IE8. Unlike {@code LayoutImpl}, it converts
- * all values to pixels before setting them. This is necessary because this
- * browser incorrectly calculates the relative sizes and positions of CSS
- * properties specified in certain units (e.g., when the value of an 'em' is
- * non-integral in pixels).
- */
-public class LayoutImplIE8 extends LayoutImpl {
-
-  private static native Layer getLayer(Element container) /*-{
-    return container.__layer;
-  }-*/;
-
-  private static native void setLayer(Element container, Layer layer) /*-{
-    // Potential leak: This is cleaned up in detach().
-    container.__layer = layer;
-  }-*/;
-
-  @Override
-  public void layout(Layer layer) {
-    Style style = layer.container.getStyle();
-    setLayer(layer.container, layer);
-
-    // Whenever the visibility of a layer changes, we need to ensure that
-    // layout() is run again for it. This is because the translation of units
-    // to pixel values will be incorrect for invisible elements, and thus must
-    // be fixed when they become visible.
-    if (layer.visible) {
-      String oldDisplay = style.getDisplay();
-      style.clearDisplay();
-
-      // We control the layer element, so assume that any non-zero display
-      // property means it was set to 'none'.
-      if (oldDisplay.length() > 0) {
-        updateVisibility(layer.container);
-      }
-    } else {
-      style.setDisplay(Display.NONE);
-    }
-
-    if (layer.setLeft) {
-      setValue(layer, "left", layer.left, layer.leftUnit, false, false);
-    } else {
-      style.clearLeft();
-    }
-    if (layer.setRight) {
-      setValue(layer, "right", layer.right, layer.rightUnit, false, false);
-    } else {
-      style.clearRight();
-    }
-    if (layer.setTop) {
-      setValue(layer, "top", layer.top, layer.topUnit, true, false);
-    } else {
-      style.clearTop();
-    }
-    if (layer.setBottom) {
-      setValue(layer, "bottom", layer.bottom, layer.bottomUnit, true, false);
-    } else {
-      style.clearBottom();
-    }
-    if (layer.setWidth) {
-      setValue(layer, "width", layer.width, layer.widthUnit, false, true);
-    } else {
-      style.clearWidth();
-    }
-    if (layer.setHeight) {
-      setValue(layer, "height", layer.height, layer.heightUnit, true, true);
-    } else {
-      style.clearHeight();
-    }
-
-    style = layer.child.getStyle();
-    switch (layer.hPos) {
-      case BEGIN:
-        style.setLeft(0, Unit.PX);
-        style.clearRight();
-        break;
-      case END:
-        style.clearLeft();
-        style.setRight(0, Unit.PX);
-        break;
-      case STRETCH:
-        style.setLeft(0, Unit.PX);
-        style.setRight(0, Unit.PX);
-        break;
-    }
-
-    switch (layer.vPos) {
-      case BEGIN:
-        style.setTop(0, Unit.PX);
-        style.clearBottom();
-        break;
-      case END:
-        style.clearTop();
-        style.setBottom(0, Unit.PX);
-        break;
-      case STRETCH:
-        style.setTop(0, Unit.PX);
-        style.setBottom(0, Unit.PX);
-        break;
-    }
-  }
-
-  @Override
-  public void onDetach(Element parent) {
-    removeLayerRefs(parent);
-  }
-
-  private native void removeLayerRefs(Element parent) /*-{
-    for (var i = 0; i < parent.childNodes.length; ++i) {
-      var container = parent.childNodes[i];
-      if (container.__layer) {
-        container.__layer = null;
-      }
-    }
-  }-*/;
-
-  private void setValue(Layer layer, String prop, double value, Unit unit,
-      boolean vertical, boolean noNegative) {
-    switch (unit) {
-      case PX:
-      case PCT:
-        // Leave PX and PCT alone. PX doesn't need to be translated, and PCT
-        // can't be.
-        break;
-
-      default:
-        value = value * getUnitSizeInPixels(layer.container, unit, vertical);
-        value = (int) (value + 0.5); // Round to the nearest pixel.
-        unit = Unit.PX;
-        break;
-    }
-
-    if (noNegative) {
-      if (value < 0) {
-        value = 0;
-      }
-    }
-
-    layer.getContainerElement().getStyle().setProperty(prop, value, unit);
-  }
-
-  private void updateVisibility(Element container) {
-    // If this element has an associated layer, re-run layout for it.
-    Layer layer = getLayer(container);
-    if (layer != null) {
-      layout(layer);
-    }
-
-    // Walk all children, looking for elements with a '__layer' property. If one
-    // exists, call layout() for that element. This is not cheap, but it's the
-    // only way to correctly ensure that layout units get translated correctly.
-    NodeList<Node> nodes = container.getChildNodes();
-    for (int i = 0; i < nodes.getLength(); ++i) {
-      Node node = nodes.getItem(i);
-      if (node.getNodeType() == Node.ELEMENT_NODE) {
-        updateVisibility(node.<Element>cast());
-      }
-    }
-  }
-}
diff --git a/user/src/com/google/gwt/media/Media.gwt.xml b/user/src/com/google/gwt/media/Media.gwt.xml
index 567d874..907823d 100644
--- a/user/src/com/google/gwt/media/Media.gwt.xml
+++ b/user/src/com/google/gwt/media/Media.gwt.xml
@@ -25,14 +25,6 @@
   <set-property name="videoElementSupport" value="maybe" />
   <set-property name="audioElementSupport" value="maybe" />
 
-  <set-property name="videoElementSupport" value="no">
-    <when-property-is name="user.agent" value="ie8" />
-  </set-property>
-  
-  <set-property name="audioElementSupport" value="no">
-    <when-property-is name="user.agent" value="ie8" />
-  </set-property>
-
   <replace-with class="com.google.gwt.media.client.Video.VideoElementSupportDetectedMaybe">
     <when-type-is class="com.google.gwt.media.client.Video.VideoElementSupportDetector" />
     <when-property-is name="videoElementSupport" value="maybe" />
diff --git a/user/src/com/google/gwt/safecss/SafeCss.gwt.xml b/user/src/com/google/gwt/safecss/SafeCss.gwt.xml
index 72ecde6..a85f51c 100644
--- a/user/src/com/google/gwt/safecss/SafeCss.gwt.xml
+++ b/user/src/com/google/gwt/safecss/SafeCss.gwt.xml
@@ -21,17 +21,6 @@
   <inherits name="com.google.gwt.dom.DOM" />
   <inherits name="com.google.gwt.useragent.UserAgent"/>
 
-  <replace-with class="com.google.gwt.safecss.shared.SafeStylesUtils.ImplIE8">
-    <when-type-is class="com.google.gwt.safecss.shared.SafeStylesUtils.Impl" />
-    <when-property-is name="user.agent" value="ie8" />
-  </replace-with>
-
-  <!-- Override IE9 fallback. -->
-  <replace-with class="com.google.gwt.safecss.shared.SafeStylesUtils.Impl">
-    <when-type-is class="com.google.gwt.safecss.shared.SafeStylesUtils.Impl" />
-    <when-property-is name="user.agent" value="ie9" />
-  </replace-with>
-
   <source path="shared"/>
   <super-source path="super"/>
 </module>
diff --git a/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java b/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
index aee3906..fad7a09 100644
--- a/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
+++ b/user/src/com/google/gwt/safecss/shared/SafeStylesUtils.java
@@ -46,45 +46,17 @@
 
   /**
    * Standard implementation of this class.
+   *
+   * <p>Deprecated, as this is the only implementation, this may be removed in
+   * a future release.</p>
    */
+  @Deprecated
   static class Impl {
     public SafeStyles forOpacity(double value) {
       return new SafeStylesString("opacity: " + value + ";");
     }
   }
 
-  /**
-   * Server implementation of this class.
-   * 
-   * <p>
-   * The server doesn't necessarily know the user agent of the client, so we
-   * combine the results of all other implementations.
-   * </p>
-   */
-  static class ImplServer extends Impl {
-
-    private ImplIE8 implIE = new ImplIE8();
-
-    @Override
-    public SafeStyles forOpacity(double value) {
-      SafeStylesBuilder sb = new SafeStylesBuilder();
-      sb.append(super.forOpacity(value));
-      sb.append(implIE.forOpacity(value));
-      return sb.toSafeStyles();
-    }
-  }
-
-  /**
-   * IE8 implementation of this class.
-   */
-  static class ImplIE8 extends Impl {
-    @Override
-    public SafeStyles forOpacity(double value) {
-      // IE8 uses an alpha filter instead of opacity.
-      return new SafeStylesString("filter: alpha(opacity=" + (value * 100) + ");");
-    }
-  }
-
   private static Impl impl;
 
   /**
@@ -686,7 +658,7 @@
       if (GWT.isClient()) {
         impl = GWT.create(Impl.class);
       } else {
-        impl = new ImplServer();
+        impl = new Impl();
       }
     }
     return impl;
diff --git a/user/src/com/google/gwt/storage/Storage.gwt.xml b/user/src/com/google/gwt/storage/Storage.gwt.xml
index 8387e66..fee9c02 100644
--- a/user/src/com/google/gwt/storage/Storage.gwt.xml
+++ b/user/src/com/google/gwt/storage/Storage.gwt.xml
@@ -22,15 +22,8 @@
     <when-type-is class="com.google.gwt.storage.client.StorageImpl" />
     <any>
       <when-property-is name="user.agent" value="safari" />
-      <when-property-is name="user.agent" value="ie9" />
-      <when-property-is name="user.agent" value="ie10" />
       <when-property-is name="user.agent" value="gecko1_8" />
     </any>
   </replace-with>
-
-  <replace-with class="com.google.gwt.storage.client.StorageImplIE8">
-    <when-type-is class="com.google.gwt.storage.client.StorageImpl" />
-    <when-property-is name="user.agent" value="ie8" />
-  </replace-with>
 </module>
 
diff --git a/user/src/com/google/gwt/storage/client/StorageImplIE8.java b/user/src/com/google/gwt/storage/client/StorageImplIE8.java
deleted file mode 100644
index a8205e5..0000000
--- a/user/src/com/google/gwt/storage/client/StorageImplIE8.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.storage.client;
-
-/**
- * IE8-specific implementation of the Web Storage.
- *
- * @see <a
- *      href="http://msdn.microsoft.com/en-us/library/cc197062(VS.85).aspx">MSDN
- *      - Introduction to DOM Storage</a>
- */
-class StorageImplIE8 extends StorageImplNonNativeEvents {
-  /*
-   * IE8 will throw "Class doesn't support Automation" error when comparing
-   * $wnd["localStorage"] === $wnd["localStorage"]. In this impl method, we
-   * work around it by using an attribute on the StorageEvent.
-   */
-  @Override
-  protected native Storage getStorageFromEvent(StorageEvent event) /*-{
-    if (event.storage == "localStorage") {
-      return @com.google.gwt.storage.client.Storage::getLocalStorageIfSupported()();
-    } else {
-      return @com.google.gwt.storage.client.Storage::getSessionStorageIfSupported()();
-    }
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/typedarrays/TypedArrays.gwt.xml b/user/src/com/google/gwt/typedarrays/TypedArrays.gwt.xml
index 524db75..c5bd695 100644
--- a/user/src/com/google/gwt/typedarrays/TypedArrays.gwt.xml
+++ b/user/src/com/google/gwt/typedarrays/TypedArrays.gwt.xml
@@ -22,27 +22,6 @@
   <super-source path="super" />
   <public path="public" />
 
-  <!-- IE8, IE9 do not support typed arrays -->
-  <replace-with class="com.google.gwt.typedarrays.client.NoSupportImpl">
-    <when-type-is class="com.google.gwt.typedarrays.client.NativeImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
-
-  <!-- Older versions of WebKit, IE10 support DataView but not Uint8ClampedArray -->
-  <!-- TODO: Safari 5.1 does not support Float64Array -->
-  <replace-with class="com.google.gwt.typedarrays.client.NativeImplEmulClamped">
-    <when-type-is class="com.google.gwt.typedarrays.client.NativeImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="safari"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
-
-  <!-- IE11 and Firefox support typed arrays -->
-  <!-- TODO: Chrome 27+, Safari 5.1+, Android 4.0+ have full support -->
   <replace-with class="com.google.gwt.typedarrays.client.NativeImplFull">
     <when-type-is class="com.google.gwt.typedarrays.client.NativeImpl"/>
   </replace-with>
diff --git a/user/src/com/google/gwt/typedarrays/client/NativeImplEmulClamped.java b/user/src/com/google/gwt/typedarrays/client/NativeImplEmulClamped.java
deleted file mode 100644
index a4d0957..0000000
--- a/user/src/com/google/gwt/typedarrays/client/NativeImplEmulClamped.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 2012 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.typedarrays.client;
-
-/**
- * An implementation class used for browsers which provide native
- * implementations of {@link com.google.gwt.typedarrays.shared.DataView} but not
- * {@link com.google.gwt.typedarrays.shared.Uint8ClampedArray}.
- * <p>
- * Older versions of WebKit and IE10 are such browsers.
- */
-public class NativeImplEmulClamped extends NativeImpl {
-  // TODO: can we override runtimeSupportCheck to return true?
-
-  @Override
-  protected boolean checkDataViewSupport() {
-    return true;
-  }
-}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/user/DOM.gwt.xml b/user/src/com/google/gwt/user/DOM.gwt.xml
index 7abccfe..f611e69 100644
--- a/user/src/com/google/gwt/user/DOM.gwt.xml
+++ b/user/src/com/google/gwt/user/DOM.gwt.xml
@@ -21,8 +21,6 @@
   <inherits name="com.google.gwt.dom.DOM"/>
   <inherits name="com.google.gwt.event.Event"/>
   <inherits name="com.google.gwt.user.History"/>
-  <!-- Following needed for WindowImplIE -->
-  <inherits name="com.google.gwt.resources.Resources"/>
   <inherits name="com.google.gwt.useragent.UserAgent"/>
 
   <source path="client">
@@ -46,19 +44,6 @@
     <when-property-is name="user.agent" value="safari"/>
   </replace-with>
 
-  <replace-with class="com.google.gwt.user.client.impl.DOMImplIE9">
-    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
-
-  <replace-with class="com.google.gwt.user.client.impl.DOMImplIE8">
-    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
-
   <replace-with class="com.google.gwt.user.client.impl.DOMImplMozilla">
     <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
     <when-property-is name="user.agent" value="gecko1_8"/>
diff --git a/user/src/com/google/gwt/user/Focus.gwt.xml b/user/src/com/google/gwt/user/Focus.gwt.xml
index 9475db7..1626230 100644
--- a/user/src/com/google/gwt/user/Focus.gwt.xml
+++ b/user/src/com/google/gwt/user/Focus.gwt.xml
@@ -32,17 +32,4 @@
     <when-type-is class="com.google.gwt.user.client.ui.impl.FocusImpl"/>
     <when-property-is name="user.agent" value="safari"/>
   </replace-with>
-
-  <!-- IE's implementation traps exceptions on invalid setFocus() -->
-  <replace-with class="com.google.gwt.user.client.ui.impl.FocusImplIE6">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.FocusImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <!-- IE9 is only bound explicitly to the IE8 impl because leaving -->
-      <!-- it unbound leads to a warning when compiling. If attempting  -->
-      <!-- to let IE9 use a non-IE8 impl, explicitly bind it to avoid   -->
-      <!-- this warning                                                 -->
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/Form.gwt.xml b/user/src/com/google/gwt/user/Form.gwt.xml
index 34ad475..89d1ecf 100644
--- a/user/src/com/google/gwt/user/Form.gwt.xml
+++ b/user/src/com/google/gwt/user/Form.gwt.xml
@@ -12,21 +12,9 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<!-- Deferred binding rules for browser selection.                          -->
 <!--                                                                        -->
 <!-- This module is typically inherited via com.google.gwt.user.User.        -->
 <!--                                                                        -->
 <module>
   <inherits name="com.google.gwt.core.Core"/>
-  <inherits name="com.google.gwt.user.UserAgent"/>
-
-  <!-- Fall through to this rule for everything but IE -->
-  <replace-with class="com.google.gwt.user.client.ui.impl.FormPanelImpl">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.FormPanelImpl"/>
-  </replace-with>
-
-  <replace-with class="com.google.gwt.user.client.ui.impl.FormPanelImplIE8">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.FormPanelImpl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/HTMLTable.gwt.xml b/user/src/com/google/gwt/user/HTMLTable.gwt.xml
index 4d0776f..50b90a5 100644
--- a/user/src/com/google/gwt/user/HTMLTable.gwt.xml
+++ b/user/src/com/google/gwt/user/HTMLTable.gwt.xml
@@ -24,13 +24,4 @@
   <replace-with class="com.google.gwt.user.client.ui.HTMLTable.HTMLTableStandardImpl">
     <when-type-is class="com.google.gwt.user.client.ui.HTMLTable.HTMLTableImpl"/>
   </replace-with>
-
-  <!-- Implementation for IE -->
-  <replace-with class="com.google.gwt.user.client.ui.HTMLTable.HTMLTableIEImpl">
-    <when-type-is class="com.google.gwt.user.client.ui.HTMLTable.HTMLTableImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/History.gwt.xml b/user/src/com/google/gwt/user/History.gwt.xml
index a9e72a5..b127eec 100644
--- a/user/src/com/google/gwt/user/History.gwt.xml
+++ b/user/src/com/google/gwt/user/History.gwt.xml
@@ -32,16 +32,4 @@
     <when-type-is class="com.google.gwt.user.client.History.HistoryTokenEncoder" />
     <when-property-is name="history.noDoubleEncoding" value="true" />
   </replace-with>
-
-  <!-- IE8 does not work with the standard implementation -->
-  <replace-with class="com.google.gwt.user.client.History.HistoryImplIE8">
-    <when-type-is class="com.google.gwt.user.client.History.HistoryImpl" />
-    <all>
-      <!-- prevent fallback for IE9 -->
-      <none>
-        <when-property-is name="user.agent" value="ie9" />
-      </none>
-      <when-property-is name="user.agent" value="ie8" />
-    </all>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/Hyperlink.gwt.xml b/user/src/com/google/gwt/user/Hyperlink.gwt.xml
index 5d4882a..867a9a4 100644
--- a/user/src/com/google/gwt/user/Hyperlink.gwt.xml
+++ b/user/src/com/google/gwt/user/Hyperlink.gwt.xml
@@ -6,12 +6,4 @@
     <when-type-is class="com.google.gwt.user.client.ui.impl.HyperlinkImpl"/>
     <when-property-is name="user.agent" value="safari"/>
   </replace-with>
-
-  <replace-with class="com.google.gwt.user.client.ui.impl.HyperlinkImplIE">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.HyperlinkImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9" />
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/ResizeLayoutPanel.gwt.xml b/user/src/com/google/gwt/user/ResizeLayoutPanel.gwt.xml
index fecde5d..db93c94 100644
--- a/user/src/com/google/gwt/user/ResizeLayoutPanel.gwt.xml
+++ b/user/src/com/google/gwt/user/ResizeLayoutPanel.gwt.xml
@@ -24,13 +24,4 @@
   <replace-with class="com.google.gwt.user.client.ui.ResizeLayoutPanel.ImplStandard">
     <when-type-is class="com.google.gwt.user.client.ui.ResizeLayoutPanel.Impl"/>
   </replace-with>
-
-  <!-- IE supports onresize. -->
-  <replace-with class="com.google.gwt.user.client.ui.ResizeLayoutPanel.ImplTrident">
-    <when-type-is class="com.google.gwt.user.client.ui.ResizeLayoutPanel.Impl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/RichText.gwt.xml b/user/src/com/google/gwt/user/RichText.gwt.xml
index 9699baf..264f5ab 100644
--- a/user/src/com/google/gwt/user/RichText.gwt.xml
+++ b/user/src/com/google/gwt/user/RichText.gwt.xml
@@ -18,18 +18,6 @@
   <inherits name="com.google.gwt.core.Core" />
   <inherits name="com.google.gwt.user.UserAgent" />
 
-  <!-- IE-specific implementation -->
-  <replace-with
-    class="com.google.gwt.user.client.ui.impl.RichTextAreaImplIE8toIE10">
-    <when-type-is
-      class="com.google.gwt.user.client.ui.impl.RichTextAreaImpl" />
-    <any>
-      <when-property-is name="user.agent" value="ie8" />
-      <when-property-is name="user.agent" value="ie9" />
-      <when-property-is name="user.agent" value="ie10" />
-    </any>
-  </replace-with>
-
   <!-- Mozilla-specific implementation -->
   <replace-with
     class="com.google.gwt.user.client.ui.impl.RichTextAreaImplMozilla">
diff --git a/user/src/com/google/gwt/user/Scroll.gwt.xml b/user/src/com/google/gwt/user/Scroll.gwt.xml
index 81d10bb..55d9678 100644
--- a/user/src/com/google/gwt/user/Scroll.gwt.xml
+++ b/user/src/com/google/gwt/user/Scroll.gwt.xml
@@ -14,13 +14,4 @@
   the License.
 -->
 <module>
-
-  <!-- IE doesn't fire a scroll event when the DOM is resized. -->
-  <replace-with class="com.google.gwt.user.client.ui.ScrollImpl.ScrollImplTrident">
-    <when-type-is class="com.google.gwt.user.client.ui.ScrollImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/SplitPanel.gwt.xml b/user/src/com/google/gwt/user/SplitPanel.gwt.xml
index 6dc6e03..9a3945e 100644
--- a/user/src/com/google/gwt/user/SplitPanel.gwt.xml
+++ b/user/src/com/google/gwt/user/SplitPanel.gwt.xml
@@ -19,22 +19,8 @@
     <when-type-is class="com.google.gwt.user.client.ui.HorizontalSplitPanel.Impl"/>
   </replace-with>
 
-  <replace-with class="com.google.gwt.user.client.ui.HorizontalSplitPanel.ImplIE8">
-    <when-type-is class="com.google.gwt.user.client.ui.HorizontalSplitPanel.Impl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
-
   <replace-with class="com.google.gwt.user.client.ui.HorizontalSplitPanel.ImplSafari">
     <when-type-is class="com.google.gwt.user.client.ui.HorizontalSplitPanel.Impl"/>
     <when-property-is name="user.agent" value="safari"/>
   </replace-with>
-
-  <replace-with class="com.google.gwt.user.client.ui.VerticalSplitPanel.Impl">
-    <when-type-is class="com.google.gwt.user.client.ui.VerticalSplitPanel.Impl"/>
-  </replace-with>
-
-  <replace-with class="com.google.gwt.user.client.ui.VerticalSplitPanel.ImplIE8">
-    <when-type-is class="com.google.gwt.user.client.ui.VerticalSplitPanel.Impl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/TextBox.gwt.xml b/user/src/com/google/gwt/user/TextBox.gwt.xml
index 3fefcf8..e312aea 100644
--- a/user/src/com/google/gwt/user/TextBox.gwt.xml
+++ b/user/src/com/google/gwt/user/TextBox.gwt.xml
@@ -12,22 +12,9 @@
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
 
-<!-- Deferred binding rules for browser selection.                          -->
 <!--                                                                        -->
 <!-- This module is typically inherited via com.google.gwt.user.User        -->
 <!--                                                                        -->
 <module>
   <inherits name="com.google.gwt.core.Core"/>
-  <inherits name="com.google.gwt.user.UserAgent"/>
-
-  <!-- Fall through to this rule is the browser isn't IE -->
-  <replace-with class="com.google.gwt.user.client.ui.impl.TextBoxImpl">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.TextBoxImpl"/>
-  </replace-with>
-
-  <!-- IE has a completely different TextBox implementation -->
-  <replace-with class="com.google.gwt.user.client.ui.impl.TextBoxImplIE8">
-    <when-type-is class="com.google.gwt.user.client.ui.impl.TextBoxImpl"/>
-    <when-property-is name="user.agent" value="ie8"/>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/Tree.gwt.xml b/user/src/com/google/gwt/user/Tree.gwt.xml
index a36c93e..d62b635 100644
--- a/user/src/com/google/gwt/user/Tree.gwt.xml
+++ b/user/src/com/google/gwt/user/Tree.gwt.xml
@@ -11,19 +11,6 @@
 <!-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or        -->
 <!-- implied. License for the specific language governing permissions and   -->
 <!-- limitations under the License.                                         -->
-
-<!-- Deferred binding rules for Tree.                                       -->
 <module>
   <inherits name="com.google.gwt.core.Core"/>
-  <inherits name="com.google.gwt.user.UserAgent"/>
-
-  <!-- IE-specific implementation -->
-  <replace-with class="com.google.gwt.user.client.ui.TreeItem.TreeItemImplIE8ToIE10">
-    <when-type-is class="com.google.gwt.user.client.ui.TreeItem.TreeItemImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/Window.gwt.xml b/user/src/com/google/gwt/user/Window.gwt.xml
index dbdc505..079990c 100644
--- a/user/src/com/google/gwt/user/Window.gwt.xml
+++ b/user/src/com/google/gwt/user/Window.gwt.xml
@@ -24,12 +24,4 @@
     <when-type-is class="com.google.gwt.user.client.impl.WindowImpl"/>
     <when-property-is name="user.agent" value="gecko1_8"/>
   </replace-with>
-   <replace-with class="com.google.gwt.user.client.impl.WindowImplIE">
-      <when-type-is class="com.google.gwt.user.client.impl.WindowImpl"/>
-      <any>
-        <when-property-is name="user.agent" value="ie8"/>
-        <when-property-is name="user.agent" value="ie9"/>
-        <when-property-is name="user.agent" value="ie10"/>
-      </any>
-   </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
index 326f7d2..79fdd63 100644
--- a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
+++ b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
@@ -30,21 +30,11 @@
     </any>
   </replace-with>
 
-  <!-- IE-specific CellBasedWidgetImpl implementation. -->
-  <replace-with class="com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident">
-    <when-type-is class="com.google.gwt.user.cellview.client.CellBasedWidgetImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-    </any>
-  </replace-with>
-
   <!-- StandardBase CellBasedWidgetImpl implementation. -->
   <replace-with class="com.google.gwt.user.cellview.client.CellBasedWidgetImplStandardBase">
     <when-type-is class="com.google.gwt.user.cellview.client.CellBasedWidgetImpl"/>
     <any>
       <when-property-is name="user.agent" value="safari"/>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
     </any>
   </replace-with>
 
@@ -55,14 +45,4 @@
       <when-property-is name="user.agent" value="gecko1_8"/>
     </any>
   </replace-with>
-
-  <!-- IE-specific CellTable implementation. -->
-  <replace-with class="com.google.gwt.user.cellview.client.AbstractCellTable.ImplTrident">
-    <when-type-is class="com.google.gwt.user.cellview.client.AbstractCellTable.Impl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-      <when-property-is name="user.agent" value="ie10"/>
-    </any>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImpl.java b/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImpl.java
index 8332e17..f1dcca2 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImpl.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImpl.java
@@ -28,7 +28,11 @@
 
 /**
  * Implementation used by various cell based widgets.
+ *
+ * <p>Deprecated, may be flattened into its subclass CellBasedWidgetImplStandard
+ * in a future release.</p>
  */
+@Deprecated
 abstract class CellBasedWidgetImpl {
 
   /**
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java b/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java
deleted file mode 100644
index 18248c8..0000000
--- a/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright 2010 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.cellview.client;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.core.client.Scheduler;
-import com.google.gwt.core.client.Scheduler.ScheduledCommand;
-import com.google.gwt.dom.client.BrowserEvents;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.EventTarget;
-import com.google.gwt.dom.client.InputElement;
-import com.google.gwt.safehtml.shared.SafeHtml;
-import com.google.gwt.safehtml.shared.SafeHtmlUtils;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Event;
-import com.google.gwt.user.client.EventListener;
-import com.google.gwt.user.client.ui.Widget;
-
-import java.util.HashSet;
-import java.util.Locale;
-import java.util.Set;
-
-/**
- * IE specified Impl used by cell based widgets.
- */
-class CellBasedWidgetImplTrident extends CellBasedWidgetImpl {
-
-  /**
-   * The method used to dispatch non-bubbling events.
-   */
-  private static JavaScriptObject dispatchFocusEvent;
-
-  /**
-   * The currently focused input element, select box, or text area.
-   */
-  private static Element focusedInput;
-
-  /**
-   * If true, only synthesize change events when the focused input is blurred.
-   */
-  private static boolean focusedInputChangesOnBlurOnly;
-
-  /**
-   * The last value of the focused input element.
-   */
-  private static Object focusedInputValue;
-
-  /**
-   * The set of input types that can receive change events.
-   */
-  private static Set<String> inputTypes;
-
-  /**
-   * Dispatch an event to the cell, ensuring that the widget will catch it.
-   *
-   * @param widget the widget that will handle the event
-   * @param target the cell element
-   * @param eventBits the event bits to sink
-   * @param event the event to fire, or null not to fire an event
-   */
-  private static void dispatchCellEvent(Widget widget, Element target,
-      int eventBits, Event event) {
-    // Make sure that the target is still a child of the widget. We defer the
-    // firing of some events, so its possible that the DOM structure has
-    // changed before we fire the event.
-    if (!widget.getElement().isOrHasChild(target)) {
-      return;
-    }
-
-    // Temporary listen for events from the cell. The event listener will be
-    // removed in onBrowserEvent().
-    DOM.setEventListener(target, widget);
-    DOM.sinkEvents(target, eventBits | DOM.getEventsSunk(target));
-
-    // Dispatch the event to the cell.
-    if (event != null) {
-      target.dispatchEvent(event);
-    }
-  }
-
-  /**
-   * Get the value of an element that has a value or checked state.
-   *
-   * @param elem the input element
-   * @return the value of the input
-   */
-  private static Object getInputValue(Element elem) {
-    if (isCheckbox(elem)) {
-      return InputElement.as(elem).isChecked();
-    }
-    return getInputValueImpl(elem);
-  }
-
-  /**
-   * Get the value of an element that has a value, such as an input element,
-   * textarea, or select box.
-   *
-   * @param elem the input element
-   * @return the value of the input
-   */
-  private static native String getInputValueImpl(Element elem) /*-{
-    return elem.value;
-  }-*/;
-
-  /**
-   * Used by {@link #initFocusEventSystem()} and {@link #initLoadEvents(String)}
-   * to handle non bubbling events .
-   *
-   * @param event
-   */
-  @SuppressWarnings("unused")
-  private static void handleNonBubblingEvent(Event event) {
-    // Get the event target.
-    EventTarget eventTarget = event.getEventTarget();
-    if (!Element.is(eventTarget)) {
-      return;
-    }
-    final Element target = eventTarget.cast();
-
-    // Get the event listener.
-    Element curElem = target;
-    EventListener listener = DOM.getEventListener(curElem);
-    while (curElem != null && listener == null) {
-      curElem = curElem.getParentElement();
-      listener = (curElem == null) ? null : DOM.getEventListener(curElem);
-    }
-
-    // Get the Widget from the event listener.
-    if (!(listener instanceof Widget)) {
-      return;
-    }
-    Widget widget = (Widget) listener;
-
-    // Do not special case events that occur on the widget itself.
-    if (target == widget.getElement()) {
-      return;
-    }
-
-    String type = event.getType();
-    if (BrowserEvents.FOCUSIN.equals(type)) {
-      // If this is an input element, remember that we focused it.
-      String tagName = target.getTagName().toLowerCase(Locale.ROOT);
-      if (inputTypes.contains(tagName)) {
-        focusedInput = target;
-        focusedInputValue = getInputValue(target);
-        focusedInputChangesOnBlurOnly = !"select".equals(tagName)
-            && !isCheckbox(target);
-      }
-
-      // The focus event has not fired yet, so we just need to set the
-      // CellTable as the event listener and wait for it.
-      dispatchCellEvent(widget, target, Event.ONFOCUS, null);
-    } else if (BrowserEvents.FOCUSOUT.equals(type)) {
-      // Fire a change event on the input element if the value changed.
-      maybeFireChangeEvent(widget);
-      focusedInput = null;
-
-      // The blur event has already fired, so we need to synthesize one.
-      Event blurEvent = Document.get().createFocusEvent().cast();
-      dispatchCellEvent(widget, target, Event.ONBLUR, null);
-    } else if (BrowserEvents.LOAD.equals(type) || BrowserEvents.ERROR.equals(type)) {
-      DOM.dispatchEvent(event, widget.getElement(), listener);
-    }
-  }
-
-  /**
-   * Check whether or not an element is a checkbox or radio button.
-   *
-   * @param elem the element to check
-   * @return true if a checkbox, false if not
-   */
-  private static boolean isCheckbox(Element elem) {
-    if (elem == null || !"input".equalsIgnoreCase(elem.getTagName())) {
-      return false;
-    }
-    String inputType = InputElement.as(elem).getType().toLowerCase(Locale.ROOT);
-    return "checkbox".equals(inputType) || "radio".equals(inputType);
-  }
-
-  /**
-   * Synthesize a change event on the focused input element if the value has
-   * changed.
-   *
-   * @param widget the {@link Widget} containing the element
-   */
-  private static void maybeFireChangeEvent(Widget widget) {
-    if (focusedInput == null) {
-      return;
-    }
-
-    Object newValue = getInputValue(focusedInput);
-    if (!newValue.equals(focusedInputValue)) {
-      // Save the new value in case it changes again.
-      focusedInputValue = newValue;
-
-      // Fire a synthetic event to the input element.
-      Element target = focusedInput;
-      Event changeEvent = Document.get().createChangeEvent().cast();
-      dispatchCellEvent(widget, target, Event.ONCHANGE, changeEvent);
-    }
-  }
-
-  /**
-   * The set of event types that can trigger a change event.
-   */
-  private final Set<String> changeEventTriggers;
-
-  /**
-   * If true, load events have been initialized.
-   */
-  private boolean loadEventsInitialized;
-
-  public CellBasedWidgetImplTrident() {
-    // Initialize the input types.
-    if (inputTypes == null) {
-      inputTypes = new HashSet<String>();
-      inputTypes.add("select");
-      inputTypes.add("input");
-      inputTypes.add("textarea");
-    }
-
-    // Initialize the change event triggers.
-    changeEventTriggers = new HashSet<String>();
-    changeEventTriggers.add(BrowserEvents.MOUSEUP);
-    changeEventTriggers.add(BrowserEvents.MOUSEWHEEL);
-  }
-
-  @Override
-  public boolean isFocusable(Element elem) {
-    return focusableTypes.contains(elem.getTagName().toLowerCase(Locale.ROOT))
-        || getTabIndexIfSpecified(elem) >= 0;
-  }
-
-  @Override
-  public void onBrowserEvent(final Widget widget, Event event) {
-    // We need to remove the event listener from the cell now that the event
-    // has fired.
-    String type = event.getType().toLowerCase(Locale.ROOT);
-    if (BrowserEvents.FOCUS.equals(type) || BrowserEvents.BLUR.equals(type) || BrowserEvents.CHANGE.equals(type)) {
-      EventTarget eventTarget = event.getEventTarget();
-      if (Element.is(eventTarget)) {
-        Element target = eventTarget.cast();
-        if (target != widget.getElement()) {
-          DOM.setEventListener(target, null);
-        }
-      }
-    }
-
-    // Update the value of the focused input box.
-    if (focusedInput != null && BrowserEvents.CHANGE.equals(type)) {
-      focusedInputValue = getInputValue(focusedInput);
-    }
-
-    // We might need to fire a synthetic change event on the input element.
-    if (focusedInput != null && !focusedInputChangesOnBlurOnly
-        && changeEventTriggers.contains(type)) {
-      // Defer the change event because the change does not occur until after
-      // the events specified above.
-      Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-        public void execute() {
-          maybeFireChangeEvent(widget);
-        }
-      });
-    }
-  }
-
-  @Override
-  public SafeHtml processHtml(SafeHtml html) {
-    // If the widget is listening for load events, we modify the HTML to add the
-    // load/error listeners.
-    if (loadEventsInitialized && html != null) {
-      String moduleName = GWT.getModuleName();
-      String listener = "__gwt_CellBasedWidgetImplLoadListeners[\""
-          + moduleName + "\"]();";
-
-      String htmlString = html.asString();
-      htmlString = htmlString.replaceAll("(<img)([\\s/>])", "<img onload='"
-          + listener + "' onerror='" + listener + "'$2");
-
-      // We assert that the resulting string is safe
-      html = SafeHtmlUtils.fromTrustedString(htmlString);
-    }
-    return html;
-  }
-
-  @Override
-  public void resetFocus(ScheduledCommand command) {
-    // IE will not focus an element that was created in this event loop.
-    Scheduler.get().scheduleDeferred(command);
-  }
-
-  @Override
-  protected int sinkEvent(Widget widget, String typeName) {
-    if (BrowserEvents.CHANGE.equals(typeName) || BrowserEvents.FOCUS.equals(typeName)
-        || BrowserEvents.BLUR.equals(typeName)) {
-      // Initialize the focus events.
-      if (dispatchFocusEvent == null) {
-        initFocusEventSystem();
-      }
-
-      // Sink the events required for focus. We use an attribute on the widget
-      // to remember whether or not we've sunk the events.
-      int eventsToSink = 0;
-      Element elem = widget.getElement();
-      String attr = "__gwtCellBasedWidgetImplDispatchingFocus";
-      if (!"true".equals(elem.getAttribute(attr))) {
-        elem.setAttribute(attr, "true");
-        sinkFocusEvents(elem);
-
-        // Sink the events that could trigger a change event. Change events
-        // are also triggered on blur if the value changes.
-        for (String trigger : changeEventTriggers) {
-          eventsToSink |= Event.getTypeInt(trigger);
-        }
-      }
-      return eventsToSink;
-    } else if (BrowserEvents.LOAD.equals(typeName) || BrowserEvents.ERROR.equals(typeName)) {
-      // Initialize the load listener.
-      if (!loadEventsInitialized) {
-        loadEventsInitialized = true;
-        initLoadEvents(GWT.getModuleName());
-      }
-      return -1;
-    } else {
-      return super.sinkEvent(widget, typeName);
-    }
-  }
-
-  /**
-   * Get the tab index of an element if the tab index is specified.
-   * 
-   * @param elem the Element
-   * @return the tab index, or -1 if not specified
-   */
-  private native int getTabIndexIfSpecified(Element elem) /*-{
-    var attrNode = elem.getAttributeNode('tabIndex');
-    return (attrNode != null && attrNode.specified) ? elem.tabIndex : -1;
-  }-*/;
-
-  /**
-   * Initialize the focus event listener.
-   */
-  private native void initFocusEventSystem() /*-{
-    @com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident::dispatchFocusEvent = $entry(function() {
-      @com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident::handleNonBubblingEvent(Lcom/google/gwt/user/client/Event;)($wnd.event);
-    });
-  }-*/;
-
-  /**
-   * Initialize load events. We hang a method off of $wnd so we can reference it
-   * in the HTML generated for img tags.
-   *
-   * @param moduleName the module name of the current module
-   */
-  private native void initLoadEvents(String moduleName) /*-{
-    // Initialize an array of listeners. Each module gets its own entry in the
-    // array to prevent conflicts on pages with multiple modules.
-    if (!$wnd.__gwt_CellBasedWidgetImplLoadListeners) {
-      $wnd.__gwt_CellBasedWidgetImplLoadListeners = new Array();
-    }
-
-    // Add an entry for the specified module.
-    $wnd.__gwt_CellBasedWidgetImplLoadListeners[moduleName] = $entry(function() {
-      @com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident::handleNonBubblingEvent(Lcom/google/gwt/user/client/Event;)($wnd.event);
-    });
-  }-*/;
-
-  /**
-   * Sink focus events for the specified element.
-   *
-   * @param elem the element that will receive the events
-   */
-  private native void sinkFocusEvents(Element elem) /*-{
-    elem.attachEvent('onfocusin',
-        @com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident::dispatchFocusEvent);
-    elem.attachEvent('onfocusout',
-        @com.google.gwt.user.cellview.client.CellBasedWidgetImplTrident::dispatchFocusEvent);
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/user/client/History.java b/user/src/com/google/gwt/user/client/History.java
index 5f3a167..ef96fd5 100644
--- a/user/src/com/google/gwt/user/client/History.java
+++ b/user/src/com/google/gwt/user/client/History.java
@@ -116,7 +116,7 @@
 
   /**
    * History implementation using hash tokens.
-   * <p>This is the default implementation for all browsers except IE8.
+   * <p>This is the default implementation for all browsers.
    */
   private static class HistoryImpl {
 
@@ -141,39 +141,6 @@
     }
   }
 
-  /**
-   * History implementation for IE8 using onhashchange.
-   */
-  @SuppressWarnings("unused")
-  private static class HistoryImplIE8 extends HistoryImpl {
-    @Override
-    protected native void attachListener() /*-{
-      var handler = $entry(@History::onHashChanged());
-      var oldHandler = $wnd.onhashchange;
-      $wnd.onhashchange = function() {
-        var ex;
-
-        try {
-          handler();
-        } catch(e) {
-          ex = e;
-        }
-
-        if (oldHandler != null) {
-          try {
-            oldHandler();
-          } catch(e) {
-            ex = ex || e;
-          }
-        }
-
-        if (ex != null) {
-          throw ex;
-        }
-      };
-    }-*/;
-  }
-
   @SuppressWarnings("deprecation")
   private static class WrapHistory extends BaseListenerWrapper<HistoryListener>
       implements ValueChangeHandler<String> {
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplIE8.java b/user/src/com/google/gwt/user/client/impl/DOMImplIE8.java
deleted file mode 100644
index f0bffba..0000000
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE8.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.impl;
-
-/**
- * Internet Explorer 8 implementation of
- * {@link com.google.gwt.user.client.impl.DOMImpl}.
- */
-public class DOMImplIE8 extends DOMImplTrident {
-}
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java b/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java
deleted file mode 100644
index 716c7f7..0000000
--- a/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.impl;
-
-import com.google.gwt.dom.client.BrowserEvents;
-import com.google.gwt.dom.client.Element;
-
-/**
- * IE9 implementation of {@link com.google.gwt.user.client.impl.DOMImplStandardBase}.
- */
-class DOMImplIE9 extends DOMImplStandardBase {
-
-  @Override
-  protected void sinkBitlessEventImpl(Element elem, String eventTypeName) {
-    super.sinkBitlessEventImpl(elem, eventTypeName);
-
-    if (BrowserEvents.DRAGOVER.equals(eventTypeName)) {
-      /*
-       * In IE, we have to sink dragenter with dragover in order to make an
-       * element a drop target.
-       */
-      super.sinkBitlessEventImpl(elem, BrowserEvents.DRAGENTER);
-    }
-  }
-}
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
index 4a1c359..f16659f 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandard.java
@@ -26,7 +26,11 @@
  * Base implementation of {@link com.google.gwt.user.client.impl.DOMImpl} shared
  * by those browsers that come a bit closer to supporting a common standard (ie,
  * not legacy IEs).
+ *
+ * <p>Deprecated, may be flattened into DOMImpl, as this is the only direct
+ * subclass.</p>
  */
+@Deprecated
 public abstract class DOMImplStandard extends DOMImpl {
 
   /**
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplTrident.java b/user/src/com/google/gwt/user/client/impl/DOMImplTrident.java
deleted file mode 100644
index 5fc4d97..0000000
--- a/user/src/com/google/gwt/user/client/impl/DOMImplTrident.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.impl;
-
-import com.google.gwt.core.client.JavaScriptObject;
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.user.client.Event;
-
-/**
- * Trident layout engine implementation of
- * {@link com.google.gwt.user.client.impl.DOMImpl}.
- */
-public abstract class DOMImplTrident extends DOMImpl {
-  private static JavaScriptObject callDispatchEvent;
-
-  private static JavaScriptObject callDispatchDblClickEvent;
-
-  private static JavaScriptObject callDispatchOnLoadEvent;
-
-  private static JavaScriptObject callDispatchUnhandledEvent;
-
-  /**
-   * Let every GWT app on the page preview the current event. If any app cancels
-   * the event, the event will be canceled for all apps.
-   * 
-   * @return <code>false</code> to cancel the event
-   */
-  private static native boolean previewEventImpl() /*-{
-    var isCancelled = false; 
-    for (var i = 0; i < $wnd.__gwt_globalEventArray.length; i++) {
-      if (!$wnd.__gwt_globalEventArray[i]()) {
-        isCancelled = true;
-      }
-    }
-    return !isCancelled;
-  }-*/;
-
-  @Override
-  public native Element eventGetFromElement(Event evt) /*-{
-    // Prefer 'relatedTarget' if it's set (see createMouseEvent(), which
-    // explicitly sets relatedTarget when synthesizing mouse events).
-    return evt.relatedTarget || evt.fromElement;
-  }-*/;
-
-  @Override
-  public native Element eventGetToElement(Event evt) /*-{
-    // Prefer 'relatedTarget' if it's set (see createMouseEvent(), which
-    // explicitly sets relatedTarget when synthesizing mouse events).
-    return evt.relatedTarget || evt.toElement;
-  }-*/;
-
-  @Override
-  public native Element getChild(Element elem, int index) /*-{
-    return elem.children[index];
-  }-*/;
-
-  @Override
-  public native int getChildCount(Element elem) /*-{
-    return elem.children.length;
-  }-*/;
-
-  @Override
-  public native int getChildIndex(Element parent, Element child) /*-{
-    var count = parent.children.length;
-    for (var i = 0; i < count; ++i) {
-      if (child === parent.children[i]) {
-        return i;
-      }
-    }
-    return -1;
-  }-*/;
-
-  @Override
-  public native void initEventSystem() /*-{
-    // All GWT apps on the page register themselves with the globalEventArray
-    // so that the first app to handle an event can allow all apps on the page
-    // to preview it. See issue 3892 for more details.
-    //
-    // Apps cannot just mark the event as they visit it for a few reasons.
-    // First, window level event handlers fire last in IE, so the first app to
-    // cancel the event will be the last to see it. Second, window events do
-    // not support arbitrary attributes, and the only writable field is the
-    // returnValue, which has another use. Finally, window events are not
-    // comparable (ex. a=event; b=event; a!=b), so we cannot keep a list of
-    // events that have already been previewed by the current app.
-    if ($wnd.__gwt_globalEventArray == null) {
-      $wnd.__gwt_globalEventArray = new Array();
-    }
-    $wnd.__gwt_globalEventArray[$wnd.__gwt_globalEventArray.length] = $entry(function() {
-      return @com.google.gwt.user.client.DOM::previewEvent(Lcom/google/gwt/user/client/Event;)($wnd.event);
-    });
-
-    var dispatchEvent = $entry(function() {
-      // IE doesn't define event.currentTarget, so we squirrel it away here. It
-      // also seems that IE won't allow you to add expandos to the event object,
-      // so we have to store it in a global. This is ok because only one event
-      // can actually be dispatched at a time.
-      var oldEventTarget = @com.google.gwt.dom.client.DOMImplTrident::currentEventTarget;
-      @com.google.gwt.dom.client.DOMImplTrident::currentEventTarget = this;
-
-      // The first GWT app on the page to handle the event allows all apps to
-      // preview it before continuing or cancelling, which is consistent with
-      // other browsers.
-      if ($wnd.event.returnValue == null) {
-        $wnd.event.returnValue = true;
-        if (!@com.google.gwt.user.client.impl.DOMImplTrident::previewEventImpl()()) {
-          @com.google.gwt.dom.client.DOMImplTrident::currentEventTarget = oldEventTarget;
-          return;
-        }
-      }
-
-      var getEventListener = @com.google.gwt.user.client.impl.DOMImpl::getEventListener(*);
-
-      var listener, curElem = this;
-      while (curElem && !(listener = getEventListener(curElem))) {
-        curElem = curElem.parentElement;
-      }
-
-      if (listener) {
-        @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/dom/client/Element;Lcom/google/gwt/user/client/EventListener;)($wnd.event, curElem, listener);
-      }
-
-      @com.google.gwt.dom.client.DOMImplTrident::currentEventTarget = oldEventTarget;
-    });
-
-    var dispatchDblClickEvent = $entry(function() {
-      var newEvent = $doc.createEventObject();
-      // Synthesize a click event if one hasn't already been synthesized.
-      // Issue 4027: fireEvent is undefined on disabled input elements.
-      if ($wnd.event.returnValue == null && $wnd.event.srcElement.fireEvent) {
-        $wnd.event.srcElement.fireEvent('onclick', newEvent);
-      }
-      if (this.__eventBits & 2) {
-        dispatchEvent.call(this);
-      } else if ($wnd.event.returnValue == null) {
-        // Ensure that we preview the event even if we aren't handling it.
-        $wnd.event.returnValue = true;
-        @com.google.gwt.user.client.impl.DOMImplTrident::previewEventImpl()();
-      }
-    });
-
-    var dispatchUnhandledEvent = $entry(function() {
-      this.__gwtLastUnhandledEvent = $wnd.event.type;
-      dispatchEvent.call(this);
-    });
-
-    // Hook the above functions on the current window object, and
-    // create a caller function for each one that indirects via
-    // the global object. Make sure that the caller function has
-    // no direct reference to the GWT program.
-    var moduleName = @com.google.gwt.core.client.GWT::getModuleName()().replace(/\./g,'_');
-
-    $wnd['__gwt_dispatchEvent_' + moduleName] = dispatchEvent;
-    @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent = new Function('w',
-      'return function() { w.__gwt_dispatchEvent_' + moduleName + '.call(this) }')($wnd);
-
-    $wnd['__gwt_dispatchDblClickEvent_' + moduleName] = dispatchDblClickEvent;
-    @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchDblClickEvent = new Function('w',
-      'return function() { w.__gwt_dispatchDblClickEvent_' + moduleName + '.call(this)}')($wnd);
-
-    $wnd['__gwt_dispatchUnhandledEvent_' + moduleName] = dispatchUnhandledEvent;
-    @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchUnhandledEvent = new Function('w',
-      'return function() { w.__gwt_dispatchUnhandledEvent_' + moduleName + '.call(this)}')($wnd);
-
-    @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchOnLoadEvent = new Function('w',
-      'return function() { w.__gwt_dispatchUnhandledEvent_' + moduleName + '.call(w.event.srcElement)}')($wnd);
-
-    // We need to create these delegate functions to fix up the 'this' context.
-    // Normally, 'this' is the firing element, but this is only true for
-    // 'onclick = ...' event handlers, not for handlers setup via attachEvent().
-    var bodyDispatcher = $entry(function() { dispatchEvent.call($doc.body); });
-    var bodyDblClickDispatcher = $entry(function() { dispatchDblClickEvent.call($doc.body); });
-
-    $doc.body.attachEvent('onclick', bodyDispatcher);
-    $doc.body.attachEvent('onmousedown', bodyDispatcher);
-    $doc.body.attachEvent('onmouseup', bodyDispatcher);
-    $doc.body.attachEvent('onmousemove', bodyDispatcher);
-    $doc.body.attachEvent('onmousewheel', bodyDispatcher);
-    $doc.body.attachEvent('onkeydown', bodyDispatcher);
-    $doc.body.attachEvent('onkeypress', bodyDispatcher);
-    $doc.body.attachEvent('onkeyup', bodyDispatcher);
-    $doc.body.attachEvent('onfocus', bodyDispatcher);
-    $doc.body.attachEvent('onblur', bodyDispatcher);
-    $doc.body.attachEvent('ondblclick', bodyDblClickDispatcher);
-    $doc.body.attachEvent('oncontextmenu', bodyDispatcher);
-  }-*/;
-
-  @Override
-  public native void insertChild(Element parent, Element child, int index) /*-{
-    if (index >= parent.children.length)
-      parent.appendChild(child);
-    else
-      parent.insertBefore(child, parent.children[index]);
-  }-*/;
-
-  @Override
-  public void releaseCapture(Element elem) {
-    maybeInitializeEventSystem();
-    releaseCaptureImpl(elem);
-  }
-
-  @Override
-  public void setCapture(Element elem) {
-    maybeInitializeEventSystem();
-    setCaptureImpl(elem);
-  }
-
-  @Override
-  public void sinkBitlessEvent(Element elem, String eventTypeName) {
-    // not supported
-  }
-
-  @Override
-  public void sinkEvents(Element elem, int bits) {
-    maybeInitializeEventSystem();
-    sinkEventsImpl(elem, bits);
-  }
-
-  private native void releaseCaptureImpl(Element elem) /*-{
-    elem.releaseCapture();
-  }-*/;
-
-  private native void setCaptureImpl(Element elem) /*-{
-    elem.setCapture();
-  }-*/;
-
-  private native void sinkEventsImpl(Element elem, int bits) /*-{
-    var chMask = (elem.__eventBits || 0) ^ bits;
-    elem.__eventBits = bits;
-    if (!chMask) return;
-    
-    if (chMask & 0x00001) elem.onclick       = (bits & 0x00001) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    // Add a ondblclick handler if onclick is desired to ensure that 
-    // a user's double click will result in two onclick events.
-    if (chMask & (0x00003)) elem.ondblclick  = (bits & (0x00003)) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchDblClickEvent : null;
-    if (chMask & 0x00004) elem.onmousedown   = (bits & 0x00004) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00008) elem.onmouseup     = (bits & 0x00008) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00010) elem.onmouseover   = (bits & 0x00010) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00020) elem.onmouseout    = (bits & 0x00020) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00040) elem.onmousemove   = (bits & 0x00040) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00080) elem.onkeydown     = (bits & 0x00080) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00100) elem.onkeypress    = (bits & 0x00100) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00200) elem.onkeyup       = (bits & 0x00200) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00400) elem.onchange      = (bits & 0x00400) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x00800) elem.onfocus       = (bits & 0x00800) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x01000) elem.onblur        = (bits & 0x01000) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x02000) elem.onlosecapture = (bits & 0x02000) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x04000) elem.onscroll      = (bits & 0x04000) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x08000) {
-      if (elem.nodeName == "IFRAME") {
-        if (bits & 0x08000) {
-          elem.attachEvent('onload', @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchOnLoadEvent);
-        } else {
-          elem.detachEvent('onload', @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchOnLoadEvent);
-        }
-      } else {
-       elem.onload = (bits & 0x08000) ?
-          @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchUnhandledEvent : null;
-      }
-    }
-    if (chMask & 0x10000) elem.onerror       = (bits & 0x10000) ?
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x20000) elem.onmousewheel  = (bits & 0x20000) ? 
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x40000) elem.oncontextmenu = (bits & 0x40000) ? 
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-    if (chMask & 0x80000) elem.onpaste       = (bits & 0x80000) ? 
-        @com.google.gwt.user.client.impl.DOMImplTrident::callDispatchEvent : null;
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/user/client/impl/WindowImplIE.java b/user/src/com/google/gwt/user/client/impl/WindowImplIE.java
deleted file mode 100644
index 414d030..0000000
--- a/user/src/com/google/gwt/user/client/impl/WindowImplIE.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.impl;
-
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.core.client.Scheduler.ScheduledCommand;
-import com.google.gwt.dom.client.Document;
-import com.google.gwt.dom.client.ScriptElement;
-import com.google.gwt.resources.client.ClientBundle;
-import com.google.gwt.resources.client.TextResource;
-
-/**
- * IE implementation of {@link com.google.gwt.user.client.impl.WindowImpl}.
- */
-public class WindowImplIE extends WindowImpl {
-
-  /**
-   * The resources for this implementation.
-   */
-  public interface Resources extends ClientBundle {
-    Resources INSTANCE = GWT.create(Resources.class);
-
-    /**
-     * Contains the function body used to initialize the window close handler.
-     */
-    @Source("initWindowCloseHandler.js")
-    TextResource initWindowCloseHandler();
-
-    /**
-     * Contains the function body used to initialize the window resize handler.
-     */
-    @Source("initWindowResizeHandler.js")
-    TextResource initWindowResizeHandler();
-
-    /**
-     * Contains the function body used to initialize the window scroll handler.
-     */
-    @Source("initWindowScrollHandler.js")
-    TextResource initWindowScrollHandler();
-  }
-
-  /**
-   * For IE6, reading from $wnd.location.hash drops part of the fragment if the
-   * fragment contains a '?'. To avoid this bug, we use location.href instead.
-   */
-  @Override
-  public native String getHash() /*-{
-    var href = $wnd.location.href;
-    var hashLoc = href.indexOf("#");
-    return (hashLoc > 0) ? href.substring(hashLoc) : "";
-  }-*/;
-
-  /**
-   * For IE6, reading from $wnd.location.search gets confused if hash contains
-   * a '?'. To avoid this bug, we use location.href instead.
-   */
-  @Override
-  public native String getQueryString() /*-{
-    var href = $wnd.location.href;
-    var hashLoc = href.indexOf("#");
-    if (hashLoc >= 0) {
-      // strip off any hash first
-      href = href.substring(0, hashLoc);
-    }
-    var questionLoc = href.indexOf("?");
-    return (questionLoc > 0) ? href.substring(questionLoc) : "";
-  }-*/;
-
-  @Override
-  public void initWindowCloseHandler() {
-    initHandler(Resources.INSTANCE.initWindowCloseHandler().getText(),
-        new ScheduledCommand() {
-          public void execute() {
-            initWindowCloseHandlerImpl();
-          }
-        });
-  }
-
-  @Override
-  public void initWindowResizeHandler() {
-    initHandler(Resources.INSTANCE.initWindowResizeHandler().getText(),
-        new ScheduledCommand() {
-          public void execute() {
-            initWindowResizeHandlerImpl();
-          }
-        });
-  }
-
-  @Override
-  public void initWindowScrollHandler() {
-    initHandler(Resources.INSTANCE.initWindowScrollHandler().getText(),
-        new ScheduledCommand() {
-          public void execute() {
-            initWindowScrollHandlerImpl();
-          }
-        });
-  }
-
-  /**
-   * IE6 does not allow direct access to event handlers on the parent window,
-   * so we must embed a script in the parent window that will set the event
-   * handlers in the correct context.
-   * 
-   * @param initFunc the string representation of the init function
-   * @param cmd the command to execute the init function
-   */
-  private void initHandler(String initFunc, ScheduledCommand cmd) {
-    if (GWT.isClient()) {
-      // Embed the init script on the page
-      ScriptElement scriptElem = Document.get().createScriptElement(initFunc);
-      Document.get().getBody().appendChild(scriptElem);
-  
-      // Initialize the handler
-      cmd.execute();
-  
-      // Remove the script element
-      Document.get().getBody().removeChild(scriptElem);
-    }
-  }
-
-  private native void initWindowCloseHandlerImpl() /*-{
-    $wnd.__gwt_initWindowCloseHandler(
-      $entry(@com.google.gwt.user.client.Window::onClosing()),
-      $entry(@com.google.gwt.user.client.Window::onClosed())
-    );
-  }-*/;
-
-  private native void initWindowResizeHandlerImpl() /*-{
-    $wnd.__gwt_initWindowResizeHandler(
-      $entry(@com.google.gwt.user.client.Window::onResize())
-    );
-  }-*/;
-
-  private native void initWindowScrollHandlerImpl() /*-{
-    $wnd.__gwt_initWindowScrollHandler(
-      $entry(@com.google.gwt.user.client.Window::onScroll())
-    );
-  }-*/;
-
-}
diff --git a/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js
deleted file mode 100644
index 6dc3b6e..0000000
--- a/user/src/com/google/gwt/user/client/impl/initWindowCloseHandler.js
+++ /dev/null
@@ -1,38 +0,0 @@
-function __gwt_initWindowCloseHandler(beforeunload, unload) {
-  var wnd = window
-  , oldOnBeforeUnload = wnd.onbeforeunload
-  , oldOnUnload = wnd.onunload;
-  
-  wnd.onbeforeunload = function(evt) {
-    var ret, oldRet;
-    try {
-      ret = beforeunload();
-    } finally {
-      oldRet = oldOnBeforeUnload && oldOnBeforeUnload(evt);
-    }
-    // Avoid returning null as IE6 will coerce it into a string.
-    // Ensure that "" gets returned properly.
-    if (ret != null) {
-      return ret;
-    }
-    if (oldRet != null) {
-      return oldRet;
-    }
-    // returns undefined.
-  };
-  
-  wnd.onunload = function(evt) {
-    try {
-      unload();
-    } finally {
-      oldOnUnload && oldOnUnload(evt);
-      wnd.onresize = null;
-      wnd.onscroll = null;
-      wnd.onbeforeunload = null;
-      wnd.onunload = null;
-    }
-  };
-  
-  // Remove the reference once we've initialize the handler
-  wnd.__gwt_initWindowCloseHandler = undefined;
-}
diff --git a/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js
deleted file mode 100644
index 885ea83..0000000
--- a/user/src/com/google/gwt/user/client/impl/initWindowResizeHandler.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function __gwt_initWindowResizeHandler(resize) {
-  var wnd = window, oldOnResize = wnd.onresize;
-  
-  wnd.onresize = function(evt) {
-    try {
-      resize();
-    } finally {
-      oldOnResize && oldOnResize(evt);
-    }
-  };
-  
-  // Remove the reference once we've initialize the handler
-  wnd.__gwt_initWindowResizeHandler = undefined;
-}
diff --git a/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js b/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js
deleted file mode 100644
index b6c52c7..0000000
--- a/user/src/com/google/gwt/user/client/impl/initWindowScrollHandler.js
+++ /dev/null
@@ -1,14 +0,0 @@
-function __gwt_initWindowScrollHandler(scroll) {
-  var wnd = window, oldOnScroll = wnd.onscroll;
-  
-  wnd.onscroll = function(evt) {
-    try {
-      scroll();
-    } finally {
-      oldOnScroll && oldOnScroll(evt);
-    }
-  };
-  
-  // Remove the reference once we've initialize the handler
-  wnd.__gwt_initWindowScrollHandler = undefined;
-}
diff --git a/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java b/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
index fbe6167..c98cad8 100644
--- a/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
@@ -19,13 +19,11 @@
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Style.TextAlign;
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Timer;
 
 /**
  * A panel that arranges two widgets in a single horizontal row and allows the
@@ -185,162 +183,6 @@
   }
 
   /**
-   * The IE8 implementation for horizontal split panels.
-   */
-  @SuppressWarnings("unused")
-  // will be used by IE8 permutation
-  private static class ImplIE8 extends Impl {
-
-    private boolean isResizeInProgress = false;
-
-    private int splitPosition = 0;
-
-    @Override
-    public void init(HorizontalSplitPanel panel) {
-      this.panel = panel;
-
-      final Element elem = panel.getElement();
-
-      // Prevents inherited text-align settings from interfering with the
-      // panel's layout. The setting we choose must be bidi-sensitive,
-      // as left-alignment is the default with LTR directionality, and
-      // right-alignment is the default with RTL directionality.
-      if (LocaleInfo.getCurrentLocale().isRTL()) {
-        elem.getStyle().setTextAlign(TextAlign.RIGHT);
-      } else {
-        elem.getStyle().setTextAlign(TextAlign.LEFT);
-      }
-
-      elem.getStyle().setProperty("position", "relative");
-
-      /*
-       * Technically, these are snapped to the top and bottom, but IE doesn't
-       * provide a reliable way to make that happen, so a resize listener is
-       * wired up to control the height of these elements.
-       */
-      addAbsolutePositoning(panel.getElement(LEFT));
-      addAbsolutePositoning(panel.getElement(RIGHT));
-      addAbsolutePositoning(panel.getSplitElement());
-
-      expandToFitParentUsingPercentages(panel.container);
-
-      if (LocaleInfo.getCurrentLocale().isRTL()) {
-        // Snap the left pane to the left edge of the container. We
-        // only need to do this when layout is RTL; if we don't, the
-        // left pane will overlap the right pane.
-        setLeft(panel.getElement(LEFT), "0px");
-      }
-    }
-
-    @Override
-    public void onAttach() {
-      addResizeListener(panel.container);
-      onResize();
-    }
-
-    @Override
-    public void onDetach() {
-      panel.container.setAttribute("onresize", null);
-    }
-
-    @Override
-    public void onSplitResize(int px) {
-      final int resizeUpdatePeriod = 20; // ms
-      if (!isResizeInProgress) {
-        isResizeInProgress = true;
-        new Timer() {
-          @Override
-          public void run() {
-            setSplitPositionUsingPixels(splitPosition);
-            isResizeInProgress = false;
-          }
-        }.schedule(resizeUpdatePeriod);
-      }
-      splitPosition = px;
-    }
-
-    @Override
-    public void setSplitPositionUsingPixels(int px) {
-      if (LocaleInfo.getCurrentLocale().isRTL()) {
-        final Element splitElem = panel.getSplitElement();
-
-        final int rootElemWidth = getOffsetWidth(panel.container);
-        final int splitElemWidth = getOffsetWidth(splitElem);
-
-        // This represents an invalid state where layout is incomplete. This
-        // typically happens before DOM attachment, but I leave it here as a
-        // precaution because negative width/height style attributes produce
-        // errors on IE.
-        if (rootElemWidth < splitElemWidth) {
-          return;
-        }
-
-        // Compute the new right side width.
-        int newRightWidth = rootElemWidth - px - splitElemWidth;
-
-        // Constrain the dragging to the physical size of the panel.
-        if (px < 0) {
-          px = 0;
-          newRightWidth = rootElemWidth - splitElemWidth;
-        } else if (newRightWidth < 0) {
-          px = rootElemWidth - splitElemWidth;
-          newRightWidth = 0;
-        }
-
-        // Set the width of the right side.
-        setWidth(panel.getElement(RIGHT), newRightWidth + "px");
-
-        // Move the splitter to the right edge of the left element.
-        setLeft(splitElem, px + "px");
-
-        // Update the width of the left side
-        if (px == 0) {
-
-          // This takes care of a qurky RTL layout bug with IE6.
-          // During DOM construction and layout, onResize events
-          // are fired, and this method is called with px == 0.
-          // If one tries to set the width of the LEFT element to
-          // before layout completes, the RIGHT element will
-          // appear to be blanked out.
-          Scheduler.get().scheduleDeferred(new ScheduledCommand() {
-            public void execute() {
-              setWidth(panel.getElement(LEFT), "0px");
-            }
-          });
-        } else {
-          setWidth(panel.getElement(LEFT), px + "px");
-        }
-
-      } else {
-        super.setSplitPositionUsingPixels(px);
-      }
-    }
-
-    @Override
-    public void updateRightWidth(Element rightElem, int newRightWidth) {
-      setWidth(rightElem, newRightWidth + "px");
-    }
-
-    private native void addResizeListener(Element container) /*-{
-      var self = this;
-      container.onresize = $entry(function() {
-        self.@com.google.gwt.user.client.ui.HorizontalSplitPanel$ImplIE8::onResize()();
-      });
-    }-*/;
-
-    private void onResize() {
-      final Element leftElem = panel.getElement(LEFT);
-      final Element rightElem = panel.getElement(RIGHT);
-
-      final String height = getOffsetHeight(panel.container) + "px";
-      setHeight(rightElem, height);
-      setHeight(panel.getSplitElement(), height);
-      setHeight(leftElem, height);
-      setSplitPositionUsingPixels(getOffsetWidth(leftElem));
-    }
-  }
-
-  /**
    * The Safari implementation which owes its existence entirely to a single
    * WebKit bug: http://bugs.webkit.org/show_bug.cgi?id=9137.
    */
diff --git a/user/src/com/google/gwt/user/client/ui/TreeItem.java b/user/src/com/google/gwt/user/client/ui/TreeItem.java
index 2d93044..bb1513e 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeItem.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -56,7 +56,10 @@
 
   /**
    * Implementation class for {@link TreeItem}.
+   *
+   * <p>Deprecated, this may be removed and its implementations inlined into TreeItem.</p>
    */
+  @Deprecated
   public static class TreeItemImpl {
     public TreeItemImpl() {
       initializeClonableElements();
@@ -111,17 +114,6 @@
   }
 
   /**
-   * IE specific implementation class for {@link TreeItem}.
-   */
-  public static class TreeItemImplIE8ToIE10 extends TreeItemImpl {
-    @Override
-    void convertToFullNode(TreeItem item) {
-      super.convertToFullNode(item);
-      item.getElement().getStyle().setProperty("marginBottom", "0px");
-    }
-  }
-
-  /**
    * An {@link Animation} used to open the child elements. If a {@link TreeItem}
    * is in the process of opening, it will immediately be opened and the new
    * {@link TreeItem} will use this animation.
diff --git a/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java b/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
index 2d0189f..4f72bb7 100644
--- a/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
@@ -19,12 +19,10 @@
 import com.google.gwt.core.client.Scheduler;
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Style.TextAlign;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Timer;
 
 /**
  * A panel that arranges two widgets in a single vertical column and allows the
@@ -153,121 +151,6 @@
   }
 
   /**
-   * Provides an implementation for IE8 that relies on 100% length in CSS.
-   */
-  @SuppressWarnings("unused")
-  // will be used by IE8 permutation
-  private static class ImplIE8 extends Impl {
-
-    private static void expandToFitParentHorizontally(Element elem) {
-      addAbsolutePositoning(elem);
-      setLeft(elem, "0");
-      setWidth(elem, "100%");
-    }
-
-    private boolean isResizeInProgress = false;
-
-    private int splitPosition;
-
-    private boolean isTopHidden = false, isBottomHidden = false;
-
-    @Override
-    public void init(VerticalSplitPanel panel) {
-      this.panel = panel;
-
-      final Element elem = panel.getElement();
-
-      // Prevents inherited text-align settings from interfering with the
-      // panel's layout.
-      elem.getStyle().setTextAlign(TextAlign.LEFT);
-      elem.getStyle().setProperty("position", "relative");
-
-      final Element topElem = panel.getElement(TOP);
-      final Element bottomElem = panel.getElement(BOTTOM);
-
-      expandToFitParentHorizontally(topElem);
-      expandToFitParentHorizontally(bottomElem);
-      expandToFitParentHorizontally(panel.getSplitElement());
-
-      expandToFitParentUsingPercentages(panel.container);
-    }
-
-    @Override
-    public void onAttach() {
-      addResizeListener(panel.container);
-      onResize();
-    }
-
-    @Override
-    public void onDetach() {
-      panel.container.setPropertyString("onresize", null);
-    }
-
-    @Override
-    public void onSplitterResize(int px) {
-      /*
-       * IE6/7 has event priority issues that will prevent the repaints from
-       * happening quickly enough causing the interaction to seem unresponsive.
-       * The following is simply a poor man's mouse event coalescing.
-       */
-      final int resizeUpdatePeriod = 20; // ms
-      if (!isResizeInProgress) {
-        isResizeInProgress = true;
-        new Timer() {
-          @Override
-          public void run() {
-            setSplitPosition(splitPosition);
-            isResizeInProgress = false;
-          }
-        }.schedule(resizeUpdatePeriod);
-      }
-      splitPosition = px;
-    }
-
-    @Override
-    protected void updateElements(Element topElem, Element splitElem,
-        Element bottomElem, int topHeight, int bottomTop, int bottomHeight) {
-      /*
-       * IE6/7 has a quirk where a zero height element with non-zero height
-       * children will expand larger than 100%. To prevent this, the width is
-       * explicitly set to zero when height is zero.
-       */
-      if (topHeight == 0) {
-        setWidth(topElem, "0px");
-        isTopHidden = true;
-      } else if (isTopHidden) {
-        setWidth(topElem, "100%");
-        isTopHidden = false;
-      }
-
-      if (bottomHeight == 0) {
-        setWidth(bottomElem, "0px");
-        isBottomHidden = true;
-      } else if (isBottomHidden) {
-        setWidth(bottomElem, "100%");
-        isBottomHidden = false;
-      }
-
-      super.updateElements(topElem, splitElem, bottomElem, topHeight,
-          bottomTop, bottomHeight);
-
-      // IE6/7 cannot update properly with CSS alone.
-      setHeight(bottomElem, bottomHeight + "px");
-    }
-
-    private native void addResizeListener(Element container) /*-{
-      var self = this;
-      container.onresize = $entry(function() {
-        self.@com.google.gwt.user.client.ui.VerticalSplitPanel$ImplIE8::onResize()();
-      });
-    }-*/;
-
-    private void onResize() {
-      setSplitPosition(getOffsetHeight(panel.getElement(TOP)));
-    }
-  }
-
-  /**
    * Constant makes for readable calls to {@link #getElement(int)} and
    * {@link #getWidget(int)}.
    */
diff --git a/user/src/com/google/gwt/user/client/ui/impl/FocusImplIE6.java b/user/src/com/google/gwt/user/client/ui/impl/FocusImplIE6.java
deleted file mode 100644
index 1b5f6f8..0000000
--- a/user/src/com/google/gwt/user/client/ui/impl/FocusImplIE6.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.ui.impl;
-
-import com.google.gwt.dom.client.Element;
-
-/**
- * Implementation of {@link com.google.gwt.user.client.ui.impl.FocusImpl}
- * for IE that traps invalid focus attempts to match other browsers.
- */
-public class FocusImplIE6 extends FocusImpl {
-
-  @Override
-  public native void focus(Element elem) /*-{
-    try {
-      elem.focus();
-    } catch (e) {
-      // Only trap the exception if the attempt was mostly legit
-      if (!elem || !elem.focus) {
-        // Rethrow the probable NPE or invalid type
-        throw e;
-      }
-    }
-  }-*/;
-
-}
diff --git a/user/src/com/google/gwt/user/client/ui/impl/FormPanelImpl.java b/user/src/com/google/gwt/user/client/ui/impl/FormPanelImpl.java
index 2438c0a..bf36613 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/FormPanelImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/FormPanelImpl.java
@@ -19,7 +19,10 @@
 
 /**
  * Implementation class used by {@link com.google.gwt.user.client.ui.FormPanel}.
+ *
+ * <p>Deprecated, may be inlined into FormPanel as it has no other implementations.</p>
  */
+@Deprecated
 public class FormPanelImpl {
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/impl/FormPanelImplIE8.java b/user/src/com/google/gwt/user/client/ui/impl/FormPanelImplIE8.java
deleted file mode 100644
index 2752a91..0000000
--- a/user/src/com/google/gwt/user/client/ui/impl/FormPanelImplIE8.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.ui.impl;
-
-import com.google.gwt.dom.client.Element;
-
-/**
- * IE8 implementation of {@link com.google.gwt.user.client.ui.impl.FormPanelImpl}.
- */
-public class FormPanelImplIE8 extends FormPanelImpl {
-
-  @Override
-  public native void hookEvents(Element iframe, Element form, FormPanelImplHost listener) /*-{
-    if (iframe) {
-      iframe.onreadystatechange = $entry(function() {
-        // If there is no __formAction yet, this is a spurious onreadystatechange
-        // generated when the iframe is first added to the DOM.
-        if (!iframe.__formAction)
-          return;
-
-        if (iframe.readyState == 'complete') {
-          // If the iframe's contentWindow has not navigated to the expected action
-          // url, then it must be an error, so we ignore it.
-          listener.@com.google.gwt.user.client.ui.impl.FormPanelImplHost::onFrameLoad()();
-        }
-      });
-    }
-
-    form.onsubmit = $entry(function() {
-      // Hang on to the form's action url, needed in the
-      // onload/onreadystatechange handler.
-      if (iframe)
-        iframe.__formAction = form.action;
-      return listener.@com.google.gwt.user.client.ui.impl.FormPanelImplHost::onFormSubmit()();
-    });
-  }-*/;
-
-  @Override
-  public native void unhookEvents(Element iframe, Element form) /*-{
-    if (iframe)
-      iframe.onreadystatechange = null;
-    form.onsubmit = null;
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE8toIE10.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE8toIE10.java
deleted file mode 100644
index 9500755..0000000
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE8toIE10.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.ui.impl;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.dom.client.Node;
-import com.google.gwt.safehtml.shared.annotations.IsSafeHtml;
-
-/**
- * IE6-specific implementation of rich-text editing.
- */
-public class RichTextAreaImplIE8toIE10 extends RichTextAreaImplStandard {
-
-  /**
-   * Helper method to allow {@link #insertHTML(String)} code to invoke
-   * {@link Node#isOrHasChild(Node)}, which is a JSO instance method.
-   */
-  private static boolean isOrHasChild(Node parent, Node child) {
-    return parent.isOrHasChild(child);
-  }
-
-  @Override
-  public Element createElement() {
-    Element elem = super.createElement();
-    elem.setPropertyString("src", "about:blank");
-    return elem;
-  }
-
-  @Override
-  public native void initElement() /*-{
-    var _this = this;
-    _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitializing()();
-
-    setTimeout($entry(function() {
-      if (_this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::initializing == false) {
-        return;
-      }
-
-      // Attempt to set the iframe document's body to 'contentEditable' mode.
-      // There's no way to know when the body will actually be available, so
-      // keep trying every so often until it is.
-      // Note: The body seems to be missing only rarely, so please don't remove
-      // this retry loop just because it's hard to reproduce.
-      var elem = _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-      var doc = elem.contentWindow.document;
-      if (!doc.body) {
-        // Retry in 50 ms. Faster would run the risk of pegging the CPU. Slower
-        // would increase the probability of a user-visible delay.
-        setTimeout(arguments.callee, 50);
-        return;
-      }
-      doc.body.contentEditable = true;
-
-      // Send notification that the iframe has reached design mode.
-      _this.@com.google.gwt.user.client.ui.impl.RichTextAreaImplStandard::onElementInitialized()();
-    }, 1));
-  }-*/;
-
-  @Override
-  public native void insertHTML(@IsSafeHtml String html) /*-{
-    try {
-      var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-      var doc = elem.contentWindow.document;
-      doc.body.focus();
-      var tr = doc.selection.createRange();
-      if (tr == null) {
-        return;
-      }
-      if (!@com.google.gwt.user.client.ui.impl.RichTextAreaImplIE8toIE10::isOrHasChild(*)(doc.body, tr.parentElement())) {
-        return;
-      }
-      tr.pasteHTML(html);
-    }
-    catch (e) {
-      return;
-    }
-  }-*/;
-
-  @Override
-  protected native String getTextImpl() /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    return elem.contentWindow.document.body.innerText;
-  }-*/;
-
-  @Override
-  protected native void hookEvents() /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    var body = elem.contentWindow.document.body;
-
-    var handler = $entry(function(evt) {
-      // Weird: this code has the context of the script frame, but we need the
-      // event from the edit iframe's window.
-      // this code is shared with all IE implementations (see RichText.gwt.xml)
-      // the event can be passed in as argument (IE9) or from the content window (IE8/7/6)
-      evt = evt || elem.contentWindow.event;
-      @com.google.gwt.user.client.DOM::dispatchEvent(Lcom/google/gwt/user/client/Event;Lcom/google/gwt/dom/client/Element;)(evt, elem);
-    });
-
-    body.onkeydown =
-    body.onkeyup =
-    body.onkeypress =
-    body.onmousedown =
-    body.onmouseup =
-    body.onmousemove =
-    body.onmouseover =
-    body.onmouseout =
-    body.onclick = handler;
-    
-    elem.contentWindow.onfocus =
-    elem.contentWindow.onblur = handler;
-  }-*/;
-
-  @Override
-  protected native boolean isEnabledImpl() /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    return elem.contentWindow.document.body.contentEditable.toLowerCase() == 'true'; 
-  }-*/;
-
-  @Override
-  protected native void setEnabledImpl(boolean enabled) /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    elem.contentWindow.document.body.contentEditable = enabled;
-  }-*/;
-
-  @Override
-  protected native void setTextImpl(String text) /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    elem.contentWindow.document.body.innerText = text;
-  }-*/;
-
-  @Override
-  protected native void unhookEvents() /*-{
-    var elem = this.@com.google.gwt.user.client.ui.impl.RichTextAreaImpl::elem;
-    var body = elem.contentWindow.document.body;
-
-    if (body) {
-      // The body can be undefined in the relatively obscure case that the RTA
-      // is attached and detached before it has a chance to finish initializing.
-      body.onkeydown =
-      body.onkeyup =
-      body.onkeypress =
-      body.onmousedown =
-      body.onmouseup =
-      body.onmousemove =
-      body.onmouseover =
-      body.onmouseout =
-      body.onclick = null;
-
-      elem.contentWindow.onfocus =
-      elem.contentWindow.onblur = null;
-    }
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
index 09b1267..7160ad3 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplStandard.java
@@ -26,7 +26,11 @@
 
 /**
  * Basic rich text platform implementation.
+ *
+ * <p>Deprecated, may be flattened into RichTextAreaImpl as it has no other
+ * direct subclasses.</p>
  */
+@Deprecated
 public abstract class RichTextAreaImplStandard extends RichTextAreaImpl implements
     RichTextArea.Formatter {
 
diff --git a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java b/user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java
index 5e39f77..16484f7 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/TextBoxImpl.java
@@ -19,7 +19,10 @@
 
 /**
  * Implementation class used by {@link com.google.gwt.user.client.ui.TextBox}.
+ *
+ * <p>Deprecated, may be flattened into TextBox, as this has no subclasses.</p>
  */
+@Deprecated
 public class TextBoxImpl {
 
   public native int getCursorPos(Element elem) /*-{
diff --git a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE8.java b/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE8.java
deleted file mode 100644
index ea0f644..0000000
--- a/user/src/com/google/gwt/user/client/ui/impl/TextBoxImplIE8.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2007 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.client.ui.impl;
-
-import com.google.gwt.dom.client.Element;
-
-/**
- * IE8-specific implementation of
- * {@link com.google.gwt.user.client.ui.impl.TextBoxImpl}.
- */
-public class TextBoxImplIE8 extends TextBoxImpl {
-
-  @Override
-  public native int getCursorPos(Element elem) /*-{
-    try {
-      var tr = elem.document.selection.createRange();
-      if (tr.parentElement() !== elem)
-        return -1;
-      return -tr.move("character", -65535);
-    }
-    catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  @Override
-  public native int getSelectionLength(Element elem) /*-{
-    try {
-      var tr = elem.document.selection.createRange();
-      if (tr.parentElement() !== elem)
-        return 0;
-      return tr.text.length;
-    }
-    catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  /**
-   * The text reported in the text range does not include newline characters at
-   * the end of the selection. So, we need to create 2 ranges and subtract a
-   * character from one until the lengths are different. At that point, we know
-   * exactly how many \r\n were truncated from the selection.
-   */
-  @Override
-  public native int getTextAreaCursorPos(Element elem) /*-{
-    try {
-      var tr = elem.document.selection.createRange();
-      if (tr.parentElement() !== elem)
-        return -1;
-      var tr2 = tr.duplicate();
-      tr2.moveToElementText(elem);
-      tr2.setEndPoint('EndToStart', tr);
-      var tr2Length = tr2.text.length; 
-
-      // Subtract characters from the end to account for trimmed newlines.
-      var offset = 0;
-      var tr3 = tr2.duplicate();
-      tr3.moveEnd('character', -1);
-      var tr3Length = tr3.text.length;
-      while (tr3Length == tr2Length && tr3.parentElement() == elem) {
-        offset += 2;
-        tr3.moveEnd('character', -1);
-        tr3Length = tr3.text.length;
-      }
-      return tr2Length + offset;
-    }
-    catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  @Override
-  public native int getTextAreaSelectionLength(Element elem) /*-{
-    try {
-      var tr = elem.document.selection.createRange();
-      if (tr.parentElement() !== elem)
-        return 0;
-      var trLength = tr.text.length;
-
-      // Subtract characters from the end to account for trimmed newlines.
-      var offset = 0;
-      var tr2 = tr.duplicate();
-      tr2.moveEnd('character', -1);
-      var tr2Length = tr2.text.length;
-      while (tr2Length == trLength && tr2.parentElement() == elem && tr.compareEndPoints('StartToEnd', tr2) <= 0) {
-        offset += 2;
-        tr2.moveEnd('character', -1);
-        tr2Length = tr2.text.length;
-      }
-      return trLength + offset;
-    }
-    catch (e) {
-      return 0;
-    }
-  }-*/;
-
-  /**
-   * Moving the start 1 character will move across a \r\n, but \r\n counts as
-   * two characters, so we need to offset the position accordingly.
-   */
-  @Override
-  public native void setSelectionRange(Element elem, int pos, int length) /*-{
-    try {
-      var tr = elem.createTextRange();
-      var newlinesWithin = elem.value.substr(pos, length).match(/(\r\n)/gi);
-      if (newlinesWithin != null) {
-        length -= newlinesWithin.length;
-      }
-      var newlinesBefore = elem.value.substring(0, pos).match(/(\r\n)/gi);
-      if (newlinesBefore != null) {
-        pos -= newlinesBefore.length;
-      }
-      tr.collapse(true);
-      tr.moveStart('character', pos);
-      tr.moveEnd('character', length);
-      tr.select();
-    }
-    catch (e) {
-    }
-  }-*/;
-
-}
diff --git a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
index 8df02b6..605c182 100644
--- a/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
+++ b/user/src/com/google/gwt/useragent/UserAgent.gwt.xml
@@ -18,11 +18,8 @@
   <public path="public" />
 
   <!-- Browser-sensitive code should use the 'user.agent' property -->
-  <define-property name="user.agent" values="ie8" />
-  <extend-property name="user.agent" values="gecko1_8" />
+  <define-property name="user.agent" values="gecko1_8" />
   <extend-property name="user.agent" values="safari" />
-  <extend-property name="user.agent" values="ie9" fallback-value="ie8" />
-  <extend-property name="user.agent" values="ie10" />
   <property-provider name="user.agent" generator="com.google.gwt.useragent.rebind.UserAgentPropertyGenerator"/>
 
   <!-- Set to false to avoid runtime warnings for mismatched runtime and -->
diff --git a/user/src/com/google/gwt/useragent/rebind/UserAgentPropertyGenerator.java b/user/src/com/google/gwt/useragent/rebind/UserAgentPropertyGenerator.java
index be7d991..c7d3bd6 100644
--- a/user/src/com/google/gwt/useragent/rebind/UserAgentPropertyGenerator.java
+++ b/user/src/com/google/gwt/useragent/rebind/UserAgentPropertyGenerator.java
@@ -42,9 +42,6 @@
    */
   private enum UserAgent {
     safari("return (ua.indexOf('webkit') != -1);"),
-    ie10("return (ua.indexOf('msie') != -1 && (docMode >= 10 && docMode < 11));"),
-    ie9("return (ua.indexOf('msie') != -1 && (docMode >= 9 && docMode < 11));"),
-    ie8("return (ua.indexOf('msie') != -1 && (docMode >= 8 && docMode < 11));"),
     gecko1_8("return (ua.indexOf('gecko') != -1 || docMode >= 11);");
 
     private final String predicateBlock;
diff --git a/user/src/com/google/gwt/xml/XML.gwt.xml b/user/src/com/google/gwt/xml/XML.gwt.xml
index 04c71b4..172f071 100644
--- a/user/src/com/google/gwt/xml/XML.gwt.xml
+++ b/user/src/com/google/gwt/xml/XML.gwt.xml
@@ -24,14 +24,6 @@
     <when-type-is class="com.google.gwt.xml.client.impl.XMLParserImpl"/>
   </replace-with>
 
-  <replace-with class="com.google.gwt.xml.client.impl.XMLParserImplIE6">
-    <when-type-is class="com.google.gwt.xml.client.impl.XMLParserImpl"/>
-    <any>
-      <when-property-is name="user.agent" value="ie8"/>
-      <when-property-is name="user.agent" value="ie9"/>
-    </any>
-  </replace-with>
-
   <replace-with class="com.google.gwt.xml.client.impl.XMLParserImplSafari">
     <when-type-is class="com.google.gwt.xml.client.impl.XMLParserImpl"/>
     <when-property-is name="user.agent" value="safari"/>
diff --git a/user/src/com/google/gwt/xml/client/impl/XMLParserImplIE6.java b/user/src/com/google/gwt/xml/client/impl/XMLParserImplIE6.java
deleted file mode 100644
index 275afa2..0000000
--- a/user/src/com/google/gwt/xml/client/impl/XMLParserImplIE6.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2008 Google Inc.
- * 
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License. You may obtain a copy of
- * the License at
- * 
- * http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.xml.client.impl;
-
-import com.google.gwt.core.client.JavaScriptObject;
-
-/**
- * This class is the IE6 implementation of the XMLParser interface.
- */
-class XMLParserImplIE6 extends XMLParserImpl {
-
-  /**
-   * Called from JSNI to select a DOM document; this is necessary due to
-   * different versions of IE and Windows having different available DOM
-   * implementations.
-   */
-  private static native JavaScriptObject selectDOMDocumentVersion() /*-{
-    try { return new ActiveXObject("Msxml2.DOMDocument"); } catch (e) { }
-    try { return new ActiveXObject("MSXML.DOMDocument"); } catch (e) { }
-    try { return new ActiveXObject("MSXML3.DOMDocument"); } catch (e) { }
-    try { return new ActiveXObject("Microsoft.XmlDom"); } catch (e) { }
-    try { return new ActiveXObject("Microsoft.DOMDocument"); } catch (e) { }
-  
-    throw new Error("XMLParserImplIE6.createDocumentImpl: Could not find appropriate version of DOMDocument.");
-  }-*/;
-
-  @Override
-  protected native JavaScriptObject createDocumentImpl() /*-{
-    var doc = @com.google.gwt.xml.client.impl.XMLParserImplIE6::selectDOMDocumentVersion()();
-    // preserveWhiteSpace is set to true here to prevent IE from throwing away
-    // text nodes that consist of only whitespace characters. This makes it
-    // act more like other browsers.
-    doc.preserveWhiteSpace = true;
-    doc.setProperty("SelectionNamespaces", "xmlns:xsl='http://www.w3.org/1999/XSL/Transform'");
-    doc.setProperty("SelectionLanguage", "XPath");
-    return doc;
-  }-*/;
-
-  @Override
-  protected native JavaScriptObject getElementByIdImpl(JavaScriptObject o,
-      String elementId) /*-{
-    return o.nodeFromID(elementId);
-  }-*/;
-
-  @Override
-  protected native JavaScriptObject getElementsByTagNameImpl(JavaScriptObject o,
-      String tagName) /*-{
-    return o.selectNodes(".//*[local-name()='" + tagName + "']");
-  }-*/;
-
-  @Override
-  protected native String getPrefixImpl(JavaScriptObject jsObject) /*-{
-    return jsObject.prefix;
-  }-*/;
-
-  @Override
-  protected native JavaScriptObject importNodeImpl(JavaScriptObject o,
-      JavaScriptObject importedNode, boolean deep) /*-{
-    // IE6 does not seem to need or want nodes to be imported
-    // as appends from different docs work perfectly
-    // and this method is not supplied until MSXML5.0
-    return importedNode;
-  }-*/;
-  
-  @Override
-  protected native JavaScriptObject parseImpl(String contents) /*-{
-    var doc = this.@com.google.gwt.xml.client.impl.XMLParserImplIE6::createDocumentImpl()();
-    if(!doc.loadXML(contents)) {
-      var err = doc.parseError;
-      throw new Error("line " + err.line + ", char " + err.linepos + ":" + err.reason);
-    } else {
-      return doc;
-    }
-  }-*/;
-
-  @Override
-  protected String toStringImpl(ProcessingInstructionImpl node) {
-    return toStringImpl((NodeImpl) node);
-  }
-  
-  @Override
-  protected native String toStringImpl(NodeImpl node) /*-{
-    var jsNode = node.@com.google.gwt.xml.client.impl.DOMItem::getJsObject()();
-    return jsNode.xml;
-  }-*/;
-}
diff --git a/user/src/com/google/gwt/xml/client/impl/XMLParserImplStandard.java b/user/src/com/google/gwt/xml/client/impl/XMLParserImplStandard.java
index 2c54dbc..21f9203 100644
--- a/user/src/com/google/gwt/xml/client/impl/XMLParserImplStandard.java
+++ b/user/src/com/google/gwt/xml/client/impl/XMLParserImplStandard.java
@@ -20,7 +20,11 @@
 /**
  * This class implements the methods for standard browsers that use the
  * DOMParser model of XML parsing.
+ *
+ * <p>Deprecated, may be flattened into XMLParserImpl, as this is the only
+ * direct subclass.</p>
  */
+@Deprecated
 class XMLParserImplStandard extends XMLParserImpl {
 
   protected static native JavaScriptObject createDOMParser() /*-{
diff --git a/user/test/com/google/gwt/canvas/client/CanvasTest.java b/user/test/com/google/gwt/canvas/client/CanvasTest.java
index 869d503..47d1a41 100644
--- a/user/test/com/google/gwt/canvas/client/CanvasTest.java
+++ b/user/test/com/google/gwt/canvas/client/CanvasTest.java
@@ -36,10 +36,6 @@
     return (geckoVersion != -1) && (geckoVersion >= 1009001);
   }-*/;
 
-  private static native boolean isIE8() /*-{
-    return $wnd.navigator.userAgent.toLowerCase().indexOf('msie') != -1 && $doc.documentMode == 8;
-  }-*/;
-
   private static native boolean isWebkit525OrBefore() /*-{
     return @com.google.gwt.dom.client.DOMImplWebkit::isWebkit525OrBefore()();
   }-*/;
@@ -177,10 +173,6 @@
       assertTrue(Canvas.isSupported());
       assertTrue(Canvas.isSupported());
     }
-    if (isIE8()) {
-      assertFalse(Canvas.isSupported());
-      assertFalse(Canvas.isSupported());
-    }
   }
 
   @Override
diff --git a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
index 8cc312f..c9dddf7 100644
--- a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
+++ b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
@@ -215,8 +215,7 @@
     assertEquals(0.5, context.getGlobalAlpha());
   }
 
-  // This test currently fails on IE9 and is disabled.
-  public void disabled_testGlobalComposite() {
+  public void testGlobalComposite() {
     if (canvas1 == null) {
       return; // don't continue if not supported
     }
diff --git a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
index f5eafa6..8d43b0a 100644
--- a/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
+++ b/user/test/com/google/gwt/core/client/ScriptInjectorTest.java
@@ -27,27 +27,8 @@
   private static boolean browserChecked = false;
   private static final int CHECK_DELAY = 100;
 
-  private static boolean isIE8Or9 = false;
   private static final int TEST_DELAY = 10000;
 
-  /**
-   * Check if the browser is IE8,9.
-   *
-   * @return <code>true</code> if the browser is IE8, IE9
-   *         <code>false</code> any other browser
-   */
-  static boolean isIE8Or9() {
-    if (!browserChecked) {
-      isIE8Or9 = isIE8Or9Impl();
-      browserChecked = true;
-    }
-    return isIE8Or9;
-  }
-
-  private static native boolean isIE8Or9Impl() /*-{
-    return /msie/i.test(navigator.userAgent) && $doc.documentMode >= 8 && $doc.documentMode <= 9;
-  }-*/;
-
   @Override
   public String getModuleName() {
     return "com.google.gwt.core.Core";
@@ -63,10 +44,8 @@
     new FromString(scriptBody).inject();
     boolean worked = nativeTest1Worked();
     JavaScriptObject scriptElement = findScriptTextInThisWindow(scriptBody);
-    if (!isIE8Or9()) {
-      cleanupThisWindow("__ti1_var__", scriptElement);
-      assertFalse("cleanup failed", nativeTest1Worked());
-    }
+    cleanupThisWindow("__ti1_var__", scriptElement);
+    assertFalse("cleanup failed", nativeTest1Worked());
     assertTrue("__ti1_var not set in this window", worked);
     assertNull("script element 1 not removed by injection", scriptElement);
     finishTest();
@@ -81,10 +60,8 @@
     ScriptInjector.fromString(scriptBody).setWindow(ScriptInjector.TOP_WINDOW).inject();
     boolean worked = nativeTest2Worked();
     JavaScriptObject scriptElement = findScriptTextInTopWindow(scriptBody);
-    if (!isIE8Or9()) {
-      cleanupTopWindow("__ti2_var__", scriptElement);
-      assertTrue("__ti2_var not set in top window", worked);
-    }
+    cleanupTopWindow("__ti2_var__", scriptElement);
+    assertTrue("__ti2_var not set in top window", worked);
     assertNull("script element 2 not removed by injection", scriptElement);
   }
 
@@ -99,10 +76,8 @@
     JavaScriptObject scriptElement = findScriptTextInThisWindow(scriptBody);
     // Since we are not in the top window, there is no nonce.
     assertNull(nativeGetScriptNonce(scriptElement));
-    if (!isIE8Or9()) {
-      cleanupThisWindow("__ti3_var__", scriptElement);
-      assertFalse("cleanup failed", nativeTest3Worked());
-    }
+    cleanupThisWindow("__ti3_var__", scriptElement);
+    assertFalse("cleanup failed", nativeTest3Worked());
     assertTrue(worked);
     assertNotNull("script element 3 should have been left in DOM", scriptElement);
   }
@@ -165,10 +140,6 @@
    * >aeons</a>.
    */
   public void testInjectUrlFail() {
-    if (isIE8Or9()) {
-      return;
-    }
-
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "uNkNoWn_sCrIpT_404.js";
     JavaScriptObject injectedElement =
@@ -215,10 +186,8 @@
                 JavaScriptObject scriptElement = findScriptUrlInThisWindow(scriptUrl);
                 // Since we are not in the top window, there is no nonce.
                 assertNull(nativeGetScriptNonce(scriptElement));
-                if (!isIE8Or9()) {
-                  cleanupThisWindow("__ti4_var__", scriptElement);
-                  assertFalse("cleanup failed", nativeTest4Worked());
-                }
+                cleanupThisWindow("__ti4_var__", scriptElement);
+                assertFalse("cleanup failed", nativeTest4Worked());
                 assertTrue("__ti4_var not set in this window", worked);
                 assertNotNull("script element 4 not found", scriptElement);
                 assertEquals(injectedElement, scriptElement);
@@ -256,10 +225,8 @@
                     JavaScriptObject scriptElement = findScriptUrlInThisWindow(scriptUrl);
                     // Since we are not in the top window, there is no nonce.
                     assertNull(nativeGetScriptNonce(scriptElement));
-                    if (!isIE8Or9()) {
-                      cleanupThisWindow("__ti5_var__", scriptElement);
-                      assertFalse("cleanup failed", nativeTest5Worked());
-                    }
+                    cleanupThisWindow("__ti5_var__", scriptElement);
+                    assertFalse("cleanup failed", nativeTest5Worked());
                     assertTrue("__ti5_var not set in this window", worked);
                     assertNotNull("script element 5 not found", scriptElement);
                     finishTest();
@@ -294,10 +261,8 @@
                 }
                 JavaScriptObject scriptElement = findScriptUrlInTopWindow(scriptUrl);
                 assertDefaultNonce(scriptElement);
-                if (!isIE8Or9()) {
-                  cleanupTopWindow("__ti6_var__", scriptElement);
-                  assertFalse("cleanup failed", nativeTest6Worked());
-                }
+                cleanupTopWindow("__ti6_var__", scriptElement);
+                assertFalse("cleanup failed", nativeTest6Worked());
                 assertTrue("__ti6_var not set in top window", worked);
                 assertNotNull("script element 6 not found", scriptElement);
                 finishTest();
@@ -334,10 +299,8 @@
                     boolean worked = nativeTest7Worked();
                     JavaScriptObject scriptElement = findScriptUrlInTopWindow(scriptUrl);
                     assertDefaultNonce(scriptElement);
-                    if (!isIE8Or9()) {
-                      cleanupTopWindow("__ti7_var__", scriptElement);
-                      assertFalse("cleanup failed", nativeTest7Worked());
-                    }
+                    cleanupTopWindow("__ti7_var__", scriptElement);
+                    assertFalse("cleanup failed", nativeTest7Worked());
                     assertTrue("__ti7_var not set in top window", worked);
                     assertNotNull("script element 7 not found", scriptElement);
                     finishTest();
@@ -372,10 +335,8 @@
                     String testVar = nativeGetTestUtf8Var();
                     JavaScriptObject scriptElement = findScriptUrlInTopWindow(scriptUrl);
                     assertDefaultNonce(scriptElement);
-                    if (!isIE8Or9()) {
-                      cleanupTopWindow("__ti_utf8_var__", scriptElement);
-                      assertEquals("cleanup failed", "", nativeGetTestUtf8Var());
-                    }
+                    cleanupTopWindow("__ti_utf8_var__", scriptElement);
+                    assertEquals("cleanup failed", "", nativeGetTestUtf8Var());
                     assertEquals("__ti_utf8_var not set in top window", "à", testVar);
                     assertNotNull("script element not found", scriptElement);
                     finishTest();
@@ -386,10 +347,6 @@
   }
 
   public void testInjectUrlTopWindowNoncePropegated() {
-    if (isIE8Or9()) {
-      // IE doesn't support CSP.
-      return;
-    }
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test9.js";
     final String nonceScriptUrl = "script_injector_test9_nonce.js";
@@ -416,11 +373,9 @@
                     boolean worked = nativeTest9Worked();
                     JavaScriptObject scriptElement = findScriptUrlInTopWindow(scriptUrl);
                     assertEquals(nonce, nativeGetScriptNonce(scriptElement));
-                    if (!isIE8Or9()) {
-                      cleanupTopWindow("__ti9_var__", scriptElement);
-                      cleanupTopWindow("__ti9_nonce_var__", noncedScript);
-                      assertFalse("cleanup failed", nativeTest9Worked());
-                    }
+                    cleanupTopWindow("__ti9_var__", scriptElement);
+                    cleanupTopWindow("__ti9_nonce_var__", noncedScript);
+                    assertFalse("cleanup failed", nativeTest9Worked());
                     assertTrue("__ti9_var not set in top window", worked);
                     assertNotNull("script element 9 not found", scriptElement);
                     finishTest();
@@ -431,10 +386,6 @@
   }
 
   public void testInjectUrlThisWindowNoncePropegated() {
-    if (isIE8Or9()) {
-      // IE doesn't support CSP.
-      return;
-    }
     delayTestFinish(TEST_DELAY);
     final String scriptUrl = "script_injector_test10.js";
     final String nonceScriptUrl = "script_injector_test10_nonce.js";
@@ -460,11 +411,9 @@
                     boolean worked = nativeTest10Worked();
                     JavaScriptObject scriptElement = findScriptUrlInThisWindow(scriptUrl);
                     assertEquals(nonce, nativeGetScriptNonce(scriptElement));
-                    if (!isIE8Or9()) {
-                      cleanupThisWindow("__ti10_var__", scriptElement);
-                      cleanupThisWindow("__ti10_nonce_var__", noncedScript);
-                      assertFalse("cleanup failed", nativeTest10Worked());
-                    }
+                    cleanupThisWindow("__ti10_var__", scriptElement);
+                    cleanupThisWindow("__ti10_nonce_var__", noncedScript);
+                    assertFalse("cleanup failed", nativeTest10Worked());
                     assertTrue("__ti10_var not set in top window", worked);
                     assertNotNull("script element 10 not found", scriptElement);
                     finishTest();
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceNativeTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceNativeTest.java
index 9b915a2..576eb0d 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceNativeTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceNativeTest.java
@@ -109,7 +109,7 @@
   // https://sourceforge.net/p/htmlunit/bugs/1606/
   @DoNotRunWith(Platform.HtmlUnitBug)
   public void testCollectorType() {
-    if (isIE8() || isSafari5()) {
+    if (isSafari5()) {
       assertTrue(isLegacyCollector());
     } else {
       assertTrue(isModernCollector());
@@ -124,10 +124,6 @@
     return StackTraceCreator.collector instanceof CollectorModern;
   }
 
-  private static native boolean isIE8() /*-{
-    return navigator.userAgent.toLowerCase().indexOf('msie') != -1 && $doc.documentMode == 8;
-  }-*/;
-
   private static native boolean isSafari5() /*-{
     return navigator.userAgent.match(' Safari/') && !navigator.userAgent.match(' Chrom')
         && !!navigator.userAgent.match(' Version/5.');
diff --git a/user/test/com/google/gwt/emultest/java/lang/ThrowableTest.java b/user/test/com/google/gwt/emultest/java/lang/ThrowableTest.java
index 3a6475b..f1f3693 100644
--- a/user/test/com/google/gwt/emultest/java/lang/ThrowableTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/ThrowableTest.java
@@ -112,7 +112,7 @@
   }
 
   public void testLinkedBackingObjects() {
-    if (isJvmOrIe8()) {
+    if (TestUtils.isJvm()) {
       return;
     }
     Throwable rootCause = new Throwable("Root cause");
@@ -122,7 +122,7 @@
   }
 
   public void testLinkedBackingObjects_initCause() {
-    if (isJvmOrIe8()) {
+    if (TestUtils.isJvm()) {
       return;
     }
     Throwable rootCause = new Throwable("Root cause");
@@ -133,7 +133,7 @@
   }
 
   public void testLinkedBackingObjects_noCause() {
-    if (isJvmOrIe8()) {
+    if (TestUtils.isJvm()) {
       return;
     }
     Throwable subError = new Throwable("Sub-error");
@@ -142,7 +142,7 @@
   }
 
   public void testLinkedSuppressedErrors_suppressedAddedViaInit() {
-    if (isJvmOrIe8()) {
+    if (TestUtils.isJvm()) {
       return;
     }
     final Throwable suppressed = new Throwable();
@@ -157,7 +157,7 @@
   }
 
   public void testLinkedSuppressedErrors_tryWithResources() {
-    if (isJvmOrIe8()) {
+    if (TestUtils.isJvm()) {
       return;
     }
 
@@ -177,10 +177,6 @@
         getBackingJsObject(e.getSuppressed()[0]), getBackingJsObject(e).getSuppressed()[0]);
   }
 
-  private static boolean isJvmOrIe8() {
-    return TestUtils.isJvm() || System.getProperty("user.agent", "safari").equals("ie8");
-  }
-
   @JsType(isNative = true, name = "Error", namespace = "<window>")
   private static class JsError { }
 }
diff --git a/user/test/com/google/gwt/layout/client/LayoutTest.java b/user/test/com/google/gwt/layout/client/LayoutTest.java
index 9b7f595..abe3a9a 100644
--- a/user/test/com/google/gwt/layout/client/LayoutTest.java
+++ b/user/test/com/google/gwt/layout/client/LayoutTest.java
@@ -256,10 +256,9 @@
 
   /**
    * Tests that the layout reacts to font-size changes.
-   * 
-   * TODO(jgw): Enable this test when it is fixed for IE8.
    */
-  public void disabledTestFontSizeChange() {
+  @DoNotRunWith(Platform.HtmlUnitLayout)
+  public void testFontSizeChange() {
     layer0.setLeftWidth(0, PX, 1, EM);
     layer0.setTopHeight(0, PX, 1, EM);
     layout.layout();
diff --git a/user/test/com/google/gwt/media/client/MediaTest.java b/user/test/com/google/gwt/media/client/MediaTest.java
index c1206eb..4cf9783 100644
--- a/user/test/com/google/gwt/media/client/MediaTest.java
+++ b/user/test/com/google/gwt/media/client/MediaTest.java
@@ -51,14 +51,6 @@
     return @com.google.gwt.dom.client.DOMImplMozilla::isGecko2OrBefore()();
   }-*/;
 
-  static native boolean isIE8() /*-{
-    return $wnd.navigator.userAgent.toLowerCase().indexOf('msie') != -1 && $doc.documentMode == 8;
-  }-*/;
-
-  static native boolean isOldFirefox() /*-{
-    return @com.google.gwt.dom.client.DOMImplMozilla::isGecko191OrBefore()();
-  }-*/;
-
   public void disabled_testPreload() {
     final MediaBase media = getMedia();
     if (media == null) {
@@ -312,10 +304,6 @@
 
   public void testSupported() {
     // test the isxxxSupported() call if running known sup or not sup browsers.
-    if (isIE8()) {
-      assertFalse(Audio.isSupported());
-      assertFalse(Video.isSupported());
-    }
     if (isFirefox35OrLater()) {
       assertTrue(Audio.isSupported());
       assertTrue(Video.isSupported());
diff --git a/user/test/com/google/gwt/resources/client/DataResourceDoNotEmbedTest.java b/user/test/com/google/gwt/resources/client/DataResourceDoNotEmbedTest.java
index 9a4d431..dae405f 100644
--- a/user/test/com/google/gwt/resources/client/DataResourceDoNotEmbedTest.java
+++ b/user/test/com/google/gwt/resources/client/DataResourceDoNotEmbedTest.java
@@ -46,27 +46,12 @@
    */
   private static final String DATA_URL_SCHEME = "data:";
 
-  /**
-   * HACK: Older versions of IE do not support RFC 2397 data URLs. See
-   * com/google/gwt/resources/Resources.gwt.xml
-   */
-  private static native boolean isPreIe8() /*-{
-    // Stolen from UserAgentPropertyGenerator
-    var ua = navigator.userAgent.toLowerCase();
-    return ua.indexOf("msie") != -1
-        && !($doc.documentMode >= 8);
-  }-*/;
-
   @Override
   public String getModuleName() {
     return "com.google.gwt.resources.ResourcesTest";
   }
 
   public void testDoNotEmbedAnnotationMissingShouldEmbed() {
-    if (isPreIe8()) {
-      // Skip this test for browsers which do not support data URLs
-      return;
-    }
     Resources r = GWT.create(Resources.class);
     String url = r.resourceDoNotEmbedAnnotationMissing().getUrl();
     assertTrue("url '" + url + "' doesn't start with'" + DATA_URL_SCHEME + "'",
diff --git a/user/test/com/google/gwt/user/MiscSuite.java b/user/test/com/google/gwt/user/MiscSuite.java
index c0a30b8..ef52c7b 100644
--- a/user/test/com/google/gwt/user/MiscSuite.java
+++ b/user/test/com/google/gwt/user/MiscSuite.java
@@ -16,7 +16,6 @@
 package com.google.gwt.user;
 
 import com.google.gwt.junit.tools.GWTTestSuite;
-import com.google.gwt.layout.client.LayoutTest;
 import com.google.gwt.user.client.CommandExecutorTest;
 import com.google.gwt.user.client.CookieTest;
 import com.google.gwt.user.client.DoubleClickEventSinkTest;
@@ -49,7 +48,6 @@
     suite.addTestSuite(EventTest.class);
     suite.addTestSuite(GestureEventSinkTest.class);
     suite.addTestSuite(ImageBundleGeneratorTest.class);
-    suite.addTestSuite(LayoutTest.class);
     suite.addTestSuite(TimerTest.class);
     suite.addTestSuite(TouchEventSinkTest.class);
     suite.addTestSuite(WindowTest.class);
diff --git a/user/test/com/google/gwt/user/client/EventTest.java b/user/test/com/google/gwt/user/client/EventTest.java
index f617dba..6dd05e0 100644
--- a/user/test/com/google/gwt/user/client/EventTest.java
+++ b/user/test/com/google/gwt/user/client/EventTest.java
@@ -185,13 +185,8 @@
     label.getElement().dispatchEvent(dblclickEvent);
 
     // Verify the results
-    if (isIE8OrOlder()) {
-      // IE is expected to simulate exactly 1 click event
-      assertEquals(2, clickInfo.fireCount);
-    } else {
-      // Other browsers should not simulate any events
-      assertEquals(1, clickInfo.fireCount);
-    }
+    // Other browsers should not simulate any events
+    assertEquals(1, clickInfo.fireCount);
     assertEquals(1, dblclickInfo.fireCount);
     RootPanel.get().remove(label);
   }
@@ -567,9 +562,4 @@
     reg1.removeHandler();
   }
 
-  private native boolean isIE8OrOlder() /*-{
-    // rely on IE9 & 10 behavior being closer to Standard/Chrome/Safari
-    return navigator.userAgent.toLowerCase().indexOf("msie") != -1 &&
-      document.documentMode < 9;
-  }-*/;
 }
diff --git a/user/test/com/google/gwt/user/client/ui/HistoryTest.java b/user/test/com/google/gwt/user/client/ui/HistoryTest.java
index c3985e9..e3ea748 100644
--- a/user/test/com/google/gwt/user/client/ui/HistoryTest.java
+++ b/user/test/com/google/gwt/user/client/ui/HistoryTest.java
@@ -88,11 +88,7 @@
       NativeEvent clickEvent =
           Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false);
 
-      if (isIE8orIE9()) {
-        click(anchorElement);
-      } else {
-        anchorElement.dispatchEvent(clickEvent);
-      }
+      anchorElement.dispatchEvent(clickEvent);
 
     } finally {
       Document.get().getBody().removeChild(anchorElement);
@@ -516,9 +512,4 @@
   private native void click(Element el) /*-{
    el.click();
   }-*/;
-
-  private native boolean isIE8orIE9() /*-{
-    return $wnd.navigator.userAgent.toLowerCase().indexOf('msie') != -1 &&
-        ($doc.documentMode == 8 || $doc.documentMode == 9);
-  }-*/;
 }