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);
-  }-*/;
 }
