diff --git a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
index 8320610..5c382bb 100644
--- a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
+++ b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
@@ -161,10 +161,9 @@
       // and we may have a partial match based on fall back values
       assert minCostRuleSoFar != null;
       if (minCostRuleSoFar.getFallbackEvaluationCost() < Integer.MAX_VALUE) {
-        // todo - enable 
-        // logger.log(TreeLogger.WARN, "Could not find an exact match rule. Using 'closest' rule " + 
-        //    minCostRuleSoFar + " based on fall back values. You may need to implement a specific " +
-        //    "binding in case the fall back behavior does not replace the missing binding");
+        logger.log(TreeLogger.INFO, "Could not find an exact match rule. Using 'closest' rule " +
+          minCostRuleSoFar + " based on fall back values. You may need to implement a specific " +
+          "binding in case the fall back behavior does not replace the missing binding");
         if (!usedRules.contains(minCostRuleSoFar)) {
           usedRules.add(minCostRuleSoFar);
           logger.log(TreeLogger.DEBUG, "No exact match was found, using closest match rule " + minCostRuleSoFar);
diff --git a/user/src/com/google/gwt/dom/DOM.gwt.xml b/user/src/com/google/gwt/dom/DOM.gwt.xml
index 8187682..4fe314e 100644
--- a/user/src/com/google/gwt/dom/DOM.gwt.xml
+++ b/user/src/com/google/gwt/dom/DOM.gwt.xml
@@ -25,11 +25,16 @@
     <when-property-is name="user.agent" value="opera"/>
   </replace-with>
 
-  <replace-with class="com.google.gwt.dom.client.DOMImplSafari">
+  <replace-with class="com.google.gwt.dom.client.DOMImplWebkit">
     <when-type-is class="com.google.gwt.dom.client.DOMImpl"/>
     <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"/>
+    <when-property-is name="user.agent" value="ie9"/>
+  </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"/>
@@ -50,6 +55,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <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/DOMImplIE9.java b/user/src/com/google/gwt/dom/client/DOMImplIE9.java
new file mode 100644
index 0000000..9b3a13d
--- /dev/null
+++ b/user/src/com/google/gwt/dom/client/DOMImplIE9.java
@@ -0,0 +1,23 @@
+/*
+ * 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.user.client.impl.DOMImplStandardBase}.
+ */
+class DOMImplIE9 extends DOMImplStandardBase {
+}
+
diff --git a/user/src/com/google/gwt/dom/client/DOMImplSafari.java b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
index 71b325e..697e3f0 100644
--- a/user/src/com/google/gwt/dom/client/DOMImplSafari.java
+++ b/user/src/com/google/gwt/dom/client/DOMImplSafari.java
@@ -15,307 +15,11 @@
  */
 package com.google.gwt.dom.client;
 
-import com.google.gwt.core.client.JavaScriptObject;
-
 /**
  * Safari implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
+ * @deprecated  As of release 2.3, replaced by {@link com.google.gwt.dom.client.DOMImplWebkit}
  */
-class DOMImplSafari extends DOMImplStandard {
-
-  /**
-   * Return true if using Webkit 525.x (Safari 3) or earlier.
-   * 
-   * @return true if using Webkit 525.x (Safari 3) or earlier.
-   */
-  @SuppressWarnings("unused")
-  private static native boolean isWebkit525OrBefore() /*-{
-    var result = /safari\/([\d.]+)/.exec(navigator.userAgent.toLowerCase());
-    if (result) {
-      var version = (parseFloat(result[1]));
-      if (version < 526) {
-        return true;
-      }
-    }
-    return false;
-  }-*/;
-
-  private static class ClientRect extends JavaScriptObject {
-    
-    @SuppressWarnings("unused")
-    protected ClientRect() {
-    }
-
-    public final native int getLeft() /*-{
-      return this.left;
-    }-*/;
-
-    public final native int getTop() /*-{
-      return this.top;
-    }-*/;
-  }
-
-  private static native int getAbsoluteLeftUsingOffsets(Element elem) /*-{
-    // Unattached elements and elements (or their ancestors) with style
-    // 'display: none' have no offsetLeft.
-    if (elem.offsetLeft == null) {
-      return 0;
-    }
-
-    var left = 0;
-    var doc = elem.ownerDocument;
-    var curr = elem.parentNode;
-    if (curr) {
-      // This intentionally excludes body which has a null offsetParent.
-      while (curr.offsetParent) {
-        left -= curr.scrollLeft;
-
-        // In RTL mode, offsetLeft is relative to the left edge of the
-        // scrollable area when scrolled all the way to the right, so we need
-        // to add back that difference.
-        if (doc.defaultView.getComputedStyle(curr, '').getPropertyValue('direction') == 'rtl') {
-          left += (curr.scrollWidth - curr.clientWidth);
-        }
-
-        curr = curr.parentNode;
-      }
-    }
-
-    while (elem) {
-      left += elem.offsetLeft;
-
-      if (doc.defaultView.getComputedStyle(elem, '')['position'] == 'fixed') {
-        left += doc.body.scrollLeft;
-        return left;
-      }
-
-      // Safari 3 does not include borders with offsetLeft, so we need to add
-      // the borders of the parent manually.
-      var parent = elem.offsetParent;
-      if (parent && $wnd.devicePixelRatio) {
-        left += parseInt(doc.defaultView.getComputedStyle(parent, '').getPropertyValue('border-left-width'));
-      }
-
-      // Safari bug: a top-level absolutely positioned element includes the
-      // body's offset position already.
-      if (parent && (parent.tagName == 'BODY') &&
-          (elem.style.position == 'absolute')) {
-        break;
-      }
-
-      elem = parent;
-    }
-    return left;
-  }-*/;
-
-  private static native int getAbsoluteTopUsingOffsets(Element elem) /*-{
-    // Unattached elements and elements (or their ancestors) with style
-    // 'display: none' have no offsetTop.
-    if (elem.offsetTop == null) {
-      return 0;
-    }
-
-    var top = 0;
-    var doc = elem.ownerDocument;
-    var curr = elem.parentNode;
-    if (curr) {
-      // This intentionally excludes body which has a null offsetParent.
-      while (curr.offsetParent) {
-        top -= curr.scrollTop;
-        curr = curr.parentNode;
-      }
-    }
-
-    while (elem) {
-      top += elem.offsetTop;
-
-      if (doc.defaultView.getComputedStyle(elem, '')['position'] == 'fixed') {
-        top += doc.body.scrollTop;
-        return top;
-      }
-
-      // Safari 3 does not include borders with offsetTop, so we need to add the
-      // borders of the parent manually.
-      var parent = elem.offsetParent;
-      if (parent && $wnd.devicePixelRatio) {
-        top += parseInt(doc.defaultView.getComputedStyle(parent, '').getPropertyValue('border-top-width'));
-      }
-
-      // Safari bug: a top-level absolutely positioned element includes the
-      // body's offset position already.
-      if (parent && (parent.tagName == 'BODY') &&
-          (elem.style.position == 'absolute')) {
-        break;
-      }
-
-      elem = parent;
-    }
-    return top;
-  }-*/;
-
-  private static native ClientRect getBoundingClientRect(Element element) /*-{
-    return element.getBoundingClientRect && element.getBoundingClientRect();
-  }-*/;
-
-  /**
-   * The type property on a button element is read-only in safari, so we need to
-   * set it using setAttribute.
-   */
-  @Override
-  public native ButtonElement createButtonElement(Document doc, String type) /*-{
-    var e = doc.createElement("BUTTON");
-    e.setAttribute('type', type);
-    return e;
-  }-*/;
-
-  @Override
-  public native NativeEvent createKeyCodeEvent(Document doc, String type,
-      boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey,
-      int keyCode) /*-{
-    var evt = this.@com.google.gwt.dom.client.DOMImplSafari::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, type, true, true, ctrlKey, altKey, shiftKey, 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) /*-{
-    var evt = this.@com.google.gwt.dom.client.DOMImplSafari::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, type, canBubble, cancelable, ctrlKey, altKey, shiftKey, metaKey)
-    evt.keyCode = keyCode;
-    evt.charCode = charCode;
-    return evt;
-  }-*/;
-
-  @Override
-  public native NativeEvent createKeyPressEvent(Document doc,
-      boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey,
-      int charCode) /*-{
-    var evt = this.@com.google.gwt.dom.client.DOMImplSafari::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, 'keypress', true, true, ctrlKey, altKey, shiftKey, metaKey)
-    evt.charCode = charCode;
-    return evt;
-  }-*/;
-
-  /**
-   * Safari 2 does not support {@link ScriptElement#setText(String)}.
-   */
-  @Override
-  public ScriptElement createScriptElement(Document doc, String source) {
-    ScriptElement elem = (ScriptElement) createElement(doc, "script");
-    elem.setInnerText(source);
-    return elem;
-  }
-
-  @Override
-  public native EventTarget eventGetCurrentTarget(NativeEvent event) /*-{
-    return event.currentTarget || $wnd;
-  }-*/;
-
-  @Override
-  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
-    return Math.round(-evt.wheelDelta / 40) || 0;
-  }-*/;
-
-  @Override
-  public int getAbsoluteLeft(Element elem) {
-    ClientRect rect = getBoundingClientRect(elem);
-    return rect != null ? rect.getLeft()
-        + elem.getOwnerDocument().getBody().getScrollLeft()
-        : getAbsoluteLeftUsingOffsets(elem);
-  }
-
-  @Override
-  public int getAbsoluteTop(Element elem) {
-    ClientRect rect = getBoundingClientRect(elem);
-    return rect != null ? rect.getTop()
-        + elem.getOwnerDocument().getBody().getScrollTop()
-        : getAbsoluteTopUsingOffsets(elem);
-  }
-
-  @Override
-  public int getScrollLeft(Document doc) {
-    // Safari always applies document scrolling to the body element, even in
-    // strict mode.
-    return doc.getBody().getScrollLeft();
-  }
-
-  @Override
-  public int getScrollLeft(Element elem) {
-    if (isRTL(elem)) {
-      return super.getScrollLeft(elem)
-          - (elem.getScrollWidth() - elem.getClientWidth());
-    }
-    return super.getScrollLeft(elem);
-  }
-
-  @Override
-  public int getScrollTop(Document doc) {
-    // Safari always applies document scrolling to the body element, even in
-    // strict mode.
-    return doc.getBody().getScrollTop();
-  }
-
-  @Override
-  public native int getTabIndex(Element elem) /*-{ 
-    // tabIndex is undefined for divs and other non-focusable elements prior to
-    // Safari 4.
-    return typeof elem.tabIndex != 'undefined' ? elem.tabIndex : -1;
-  }-*/;
-
-  @Override
-  public native boolean isOrHasChild(Node parent, Node child) /*-{
-    while (child) {
-      if (parent == child) {
-        return true;
-      }
-      child = child.parentNode;
-      if (child && (child.nodeType != 1)) {
-        child = null;
-      }
-    }
-    return false;
-  }-*/;
-
-  @Override
-  public void setScrollLeft(Document doc, int left) {
-    // Safari always applies document scrolling to the body element, even in
-    // strict mode.
-    doc.getBody().setScrollLeft(left);
-  }
-
-  @Override
-  public void setScrollLeft(Element elem, int left) {
-    if (isRTL(elem)) {
-      left += elem.getScrollWidth() - elem.getClientWidth();
-    }
-    super.setScrollLeft(elem, left);
-  }
-
-  @Override
-  public void setScrollTop(Document doc, int top) {
-    // Safari always applies document scrolling to the body element, even in
-    // strict mode.
-    doc.getBody().setScrollTop(top);
-  }
-
-  @SuppressWarnings("unused")
-  private native NativeEvent createKeyEvent(Document doc, String type,
-      boolean canBubble, boolean cancelable, boolean ctrlKey, boolean altKey,
-      boolean shiftKey, boolean metaKey) /*-{
-    // WebKit's KeyboardEvent cannot set or even initialize charCode, keyCode, etc.
-    // And UIEvent's charCode and keyCode are read-only.
-    // So we "fake" an event using a raw Event and expandos
-    var evt = doc.createEvent('Event');
-    evt.initEvent(type, canBubble, cancelable);
-    evt.ctrlKey = ctrlKey;
-    evt.altKey = altKey;
-    evt.shiftKey = shiftKey;
-    evt.metaKey = metaKey;
-    return evt;
-  }-*/;
-
-  private native boolean isRTL(Element elem) /*-{
-    return elem.ownerDocument.defaultView.getComputedStyle(elem, '').direction == 'rtl';
-  }-*/;
+@Deprecated
+class DOMImplSafari extends DOMImplWebkit {
 }
 
diff --git a/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
new file mode 100644
index 0000000..a2deb0d
--- /dev/null
+++ b/user/src/com/google/gwt/dom/client/DOMImplStandardBase.java
@@ -0,0 +1,304 @@
+/*
+ * 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;
+
+import com.google.gwt.core.client.JavaScriptObject;
+
+/**
+ * StandardBase implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
+ */
+class DOMImplStandardBase extends DOMImplStandard {
+
+  private static class ClientRect extends JavaScriptObject {
+    
+    @SuppressWarnings("unused")
+    protected ClientRect() {
+    }
+
+    public final native int getLeft() /*-{
+      return this.left;
+    }-*/;
+
+    public final native int getTop() /*-{
+      return this.top;
+    }-*/;
+  }
+
+  private static native int getAbsoluteLeftUsingOffsets(Element elem) /*-{
+    // Unattached elements and elements (or their ancestors) with style
+    // 'display: none' have no offsetLeft.
+    if (elem.offsetLeft == null) {
+      return 0;
+    }
+
+    var left = 0;
+    var doc = elem.ownerDocument;
+    var curr = elem.parentNode;
+    if (curr) {
+      // This intentionally excludes body which has a null offsetParent.
+      while (curr.offsetParent) {
+        left -= curr.scrollLeft;
+
+        // In RTL mode, offsetLeft is relative to the left edge of the
+        // scrollable area when scrolled all the way to the right, so we need
+        // to add back that difference.
+        if (doc.defaultView.getComputedStyle(curr, '').getPropertyValue('direction') == 'rtl') {
+          left += (curr.scrollWidth - curr.clientWidth);
+        }
+
+        curr = curr.parentNode;
+      }
+    }
+
+    while (elem) {
+      left += elem.offsetLeft;
+
+      if (doc.defaultView.getComputedStyle(elem, '')['position'] == 'fixed') {
+        left += doc.body.scrollLeft;
+        return left;
+      }
+
+      // Safari 3 does not include borders with offsetLeft, so we need to add
+      // the borders of the parent manually.
+      var parent = elem.offsetParent;
+      if (parent && $wnd.devicePixelRatio) {
+        left += parseInt(doc.defaultView.getComputedStyle(parent, '').getPropertyValue('border-left-width'));
+      }
+
+      // Safari bug: a top-level absolutely positioned element includes the
+      // body's offset position already.
+      if (parent && (parent.tagName == 'BODY') &&
+          (elem.style.position == 'absolute')) {
+        break;
+      }
+
+      elem = parent;
+    }
+    return left;
+  }-*/;
+
+  private static native int getAbsoluteTopUsingOffsets(Element elem) /*-{
+    // Unattached elements and elements (or their ancestors) with style
+    // 'display: none' have no offsetTop.
+    if (elem.offsetTop == null) {
+      return 0;
+    }
+
+    var top = 0;
+    var doc = elem.ownerDocument;
+    var curr = elem.parentNode;
+    if (curr) {
+      // This intentionally excludes body which has a null offsetParent.
+      while (curr.offsetParent) {
+        top -= curr.scrollTop;
+        curr = curr.parentNode;
+      }
+    }
+
+    while (elem) {
+      top += elem.offsetTop;
+
+      if (doc.defaultView.getComputedStyle(elem, '')['position'] == 'fixed') {
+        top += doc.body.scrollTop;
+        return top;
+      }
+
+      // Safari 3 does not include borders with offsetTop, so we need to add the
+      // borders of the parent manually.
+      var parent = elem.offsetParent;
+      if (parent && $wnd.devicePixelRatio) {
+        top += parseInt(doc.defaultView.getComputedStyle(parent, '').getPropertyValue('border-top-width'));
+      }
+
+      // Safari bug: a top-level absolutely positioned element includes the
+      // body's offset position already.
+      if (parent && (parent.tagName == 'BODY') &&
+          (elem.style.position == 'absolute')) {
+        break;
+      }
+
+      elem = parent;
+    }
+    return top;
+  }-*/;
+
+  private static native ClientRect getBoundingClientRect(Element element) /*-{
+    return element.getBoundingClientRect && element.getBoundingClientRect();
+  }-*/;
+
+  /**
+   * The type property on a button element is read-only in safari, so we need to
+   * set it using setAttribute.
+   */
+  @Override
+  public native ButtonElement createButtonElement(Document doc, String type) /*-{
+    var e = doc.createElement("BUTTON");
+    e.setAttribute('type', type);
+    return e;
+  }-*/;
+
+  @Override
+  public native NativeEvent createKeyCodeEvent(Document doc, String type,
+      boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey,
+      int keyCode) /*-{
+    var evt = this.@com.google.gwt.dom.client.DOMImplStandardBase::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, type, true, true, ctrlKey, altKey, shiftKey, 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) /*-{
+    var evt = this.@com.google.gwt.dom.client.DOMImplStandardBase::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, type, canBubble, cancelable, ctrlKey, altKey, shiftKey, metaKey)
+    evt.keyCode = keyCode;
+    evt.charCode = charCode;
+    return evt;
+  }-*/;
+
+  @Override
+  public native NativeEvent createKeyPressEvent(Document doc,
+      boolean ctrlKey, boolean altKey, boolean shiftKey, boolean metaKey,
+      int charCode) /*-{
+    var evt = this.@com.google.gwt.dom.client.DOMImplStandardBase::createKeyEvent(Lcom/google/gwt/dom/client/Document;Ljava/lang/String;ZZZZZZ)(doc, 'keypress', true, true, ctrlKey, altKey, shiftKey, metaKey)
+    evt.charCode = charCode;
+    return evt;
+  }-*/;
+
+  /**
+   * Safari 2 does not support {@link ScriptElement#setText(String)}.
+   */
+  @Override
+  public ScriptElement createScriptElement(Document doc, String source) {
+    ScriptElement elem = (ScriptElement) createElement(doc, "script");
+    elem.setInnerText(source);
+    return elem;
+  }
+
+  @Override
+  public native EventTarget eventGetCurrentTarget(NativeEvent event) /*-{
+    return event.currentTarget || $wnd;
+  }-*/;
+
+  @Override
+  public native int eventGetMouseWheelVelocityY(NativeEvent evt) /*-{
+    return Math.round(-evt.wheelDelta / 40) || 0;
+  }-*/;
+
+  @Override
+  public int getAbsoluteLeft(Element elem) {
+    ClientRect rect = getBoundingClientRect(elem);
+    return rect != null ? rect.getLeft()
+        + elem.getOwnerDocument().getBody().getScrollLeft()
+        : getAbsoluteLeftUsingOffsets(elem);
+  }
+
+  @Override
+  public int getAbsoluteTop(Element elem) {
+    ClientRect rect = getBoundingClientRect(elem);
+    return rect != null ? rect.getTop()
+        + elem.getOwnerDocument().getBody().getScrollTop()
+        : getAbsoluteTopUsingOffsets(elem);
+  }
+
+  @Override
+  public int getScrollLeft(Document doc) {
+    // Safari always applies document scrolling to the body element, even in
+    // strict mode.
+    return doc.getBody().getScrollLeft();
+  }
+
+  @Override
+  public int getScrollLeft(Element elem) {
+    if (isRTL(elem)) {
+      return super.getScrollLeft(elem)
+          - (elem.getScrollWidth() - elem.getClientWidth());
+    }
+    return super.getScrollLeft(elem);
+  }
+
+  @Override
+  public int getScrollTop(Document doc) {
+    // Safari always applies document scrolling to the body element, even in
+    // strict mode.
+    return doc.getBody().getScrollTop();
+  }
+
+  @Override
+  public native int getTabIndex(Element elem) /*-{ 
+    // tabIndex is undefined for divs and other non-focusable elements prior to
+    // Safari 4.
+    return typeof elem.tabIndex != 'undefined' ? elem.tabIndex : -1;
+  }-*/;
+
+  @Override
+  public native boolean isOrHasChild(Node parent, Node child) /*-{
+    while (child) {
+      if (parent == child) {
+        return true;
+      }
+      child = child.parentNode;
+      if (child && (child.nodeType != 1)) {
+        child = null;
+      }
+    }
+    return false;
+  }-*/;
+
+  @Override
+  public void setScrollLeft(Document doc, int left) {
+    // Safari always applies document scrolling to the body element, even in
+    // strict mode.
+    doc.getBody().setScrollLeft(left);
+  }
+
+  @Override
+  public void setScrollLeft(Element elem, int left) {
+    if (isRTL(elem)) {
+      left += elem.getScrollWidth() - elem.getClientWidth();
+    }
+    super.setScrollLeft(elem, left);
+  }
+
+  @Override
+  public void setScrollTop(Document doc, int top) {
+    // Safari always applies document scrolling to the body element, even in
+    // strict mode.
+    doc.getBody().setScrollTop(top);
+  }
+
+  @SuppressWarnings("unused")
+  private native NativeEvent createKeyEvent(Document doc, String type,
+      boolean canBubble, boolean cancelable, boolean ctrlKey, boolean altKey,
+      boolean shiftKey, boolean metaKey) /*-{
+    // WebKit's KeyboardEvent cannot set or even initialize charCode, keyCode, etc.
+    // And UIEvent's charCode and keyCode are read-only.
+    // So we "fake" an event using a raw Event and expandos
+    var evt = doc.createEvent('Event');
+    evt.initEvent(type, canBubble, cancelable);
+    evt.ctrlKey = ctrlKey;
+    evt.altKey = altKey;
+    evt.shiftKey = shiftKey;
+    evt.metaKey = metaKey;
+    return evt;
+  }-*/;
+
+  private native boolean isRTL(Element elem) /*-{
+    return elem.ownerDocument.defaultView.getComputedStyle(elem, '').direction == 'rtl';
+  }-*/;
+}
+
diff --git a/user/src/com/google/gwt/dom/client/DOMImplWebkit.java b/user/src/com/google/gwt/dom/client/DOMImplWebkit.java
new file mode 100644
index 0000000..d292af9
--- /dev/null
+++ b/user/src/com/google/gwt/dom/client/DOMImplWebkit.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+/**
+ * WebKit based implementation of {@link com.google.gwt.user.client.impl.DOMImplStandardBase}.
+ */
+class DOMImplWebkit extends DOMImplStandardBase {
+
+  /**
+   * Return true if using Webkit 525.x (Safari 3) or earlier.
+   * 
+   * @return true if using Webkit 525.x (Safari 3) or earlier.
+   */
+  @SuppressWarnings("unused")
+  private static native boolean isWebkit525OrBefore() /*-{
+    var result = /safari\/([\d.]+)/.exec(navigator.userAgent.toLowerCase());
+    if (result) {
+      var version = (parseFloat(result[1]));
+      if (version < 526) {
+        return true;
+      }
+    }
+    return false;
+  }-*/;
+}
+
diff --git a/user/src/com/google/gwt/layout/Layout.gwt.xml b/user/src/com/google/gwt/layout/Layout.gwt.xml
index 17788a8..65797b5 100644
--- a/user/src/com/google/gwt/layout/Layout.gwt.xml
+++ b/user/src/com/google/gwt/layout/Layout.gwt.xml
@@ -20,7 +20,10 @@
 
   <replace-with class="com.google.gwt.layout.client.LayoutImplIE8">
     <when-type-is class="com.google.gwt.layout.client.LayoutImpl"/>
-    <when-property-is name="user.agent" value="ie8"/>
+    <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.layout.client.LayoutImplIE6">
diff --git a/user/src/com/google/gwt/resources/Resources.gwt.xml b/user/src/com/google/gwt/resources/Resources.gwt.xml
index a78e59a..f46be7b 100644
--- a/user/src/com/google/gwt/resources/Resources.gwt.xml
+++ b/user/src/com/google/gwt/resources/Resources.gwt.xml
@@ -54,6 +54,7 @@
         <when-property-is name="user.agent" value="opera" />
         <when-property-is name="user.agent" value="gecko1_8" />
         <when-property-is name="user.agent" value="ie8" />
+        <when-property-is name="user.agent" value="ie9" />
       </any>
     </all>
   </generate-with>
diff --git a/user/src/com/google/gwt/storage/Storage.gwt.xml b/user/src/com/google/gwt/storage/Storage.gwt.xml
index 47ee937..8c3396f 100644
--- a/user/src/com/google/gwt/storage/Storage.gwt.xml
+++ b/user/src/com/google/gwt/storage/Storage.gwt.xml
@@ -41,7 +41,10 @@
 
   <replace-with class="com.google.gwt.storage.client.StorageImplNonNativeEvents">
     <when-type-is class="com.google.gwt.storage.client.StorageImpl" />
-    <when-property-is name="user.agent" value="safari" />
+    <any>
+      <when-property-is name="user.agent" value="safari" />
+      <when-property-is name="user.agent" value="ie9" />
+    </any>
   </replace-with>
 
   <replace-with class="com.google.gwt.storage.client.StorageImplIE8">
diff --git a/user/src/com/google/gwt/user/DOM.gwt.xml b/user/src/com/google/gwt/user/DOM.gwt.xml
index 9d3bef5..30c0508 100644
--- a/user/src/com/google/gwt/user/DOM.gwt.xml
+++ b/user/src/com/google/gwt/user/DOM.gwt.xml
@@ -17,32 +17,37 @@
 <!-- This module is typically inherited via com.google.gwt.user.User        -->
 <!--                                                                        -->
 <module>
-	<inherits name="com.google.gwt.core.Core"/>
-  <inherits name="com.google.gwt.dom.DOM"/>
-	<inherits name="com.google.gwt.user.UserAgent"/>
+  <inherits name="com.google.gwt.core.Core"/>
+    <inherits name="com.google.gwt.dom.DOM"/>
+  <inherits name="com.google.gwt.user.UserAgent"/>
 
-	<replace-with class="com.google.gwt.user.client.impl.DOMImplOpera">
-		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
-		<when-property-is name="user.agent" value="opera"/>
-	</replace-with>
+  <replace-with class="com.google.gwt.user.client.impl.DOMImplOpera">
+    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
+    <when-property-is name="user.agent" value="opera"/>
+  </replace-with>
 
-	<replace-with class="com.google.gwt.user.client.impl.DOMImplSafari">
-		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
-		<when-property-is name="user.agent" value="safari"/>
-	</replace-with>
+  <replace-with class="com.google.gwt.user.client.impl.DOMImplWebkit">
+    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
+    <when-property-is name="user.agent" value="safari"/>
+  </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.DOMImplIE9">
+        <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
+        <when-property-is name="user.agent" value="ie9"/>
+    </replace-with>
 
-	<replace-with class="com.google.gwt.user.client.impl.DOMImplIE6">
-		<when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
-		<when-property-is name="user.agent" value="ie6"/>
-	</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"/>
-	</replace-with>
+  <replace-with class="com.google.gwt.user.client.impl.DOMImplIE6">
+    <when-type-is class="com.google.gwt.user.client.impl.DOMImpl"/>
+    <when-property-is name="user.agent" value="ie6"/>
+  </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"/>
+  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/Focus.gwt.xml b/user/src/com/google/gwt/user/Focus.gwt.xml
index d863ea3..1c1f5f9 100644
--- a/user/src/com/google/gwt/user/Focus.gwt.xml
+++ b/user/src/com/google/gwt/user/Focus.gwt.xml
@@ -39,6 +39,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <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/Hyperlink.gwt.xml b/user/src/com/google/gwt/user/Hyperlink.gwt.xml
index 787fbc7..fa24eda 100644
--- a/user/src/com/google/gwt/user/Hyperlink.gwt.xml
+++ b/user/src/com/google/gwt/user/Hyperlink.gwt.xml
@@ -15,8 +15,9 @@
   <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="ie6"/>
-	    <when-property-is name="user.agent" value="ie8"/>
+      <when-property-is name="user.agent" value="ie6"/>
+      <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 22694d1..be78d4e 100644
--- a/user/src/com/google/gwt/user/RichText.gwt.xml
+++ b/user/src/com/google/gwt/user/RichText.gwt.xml
@@ -26,6 +26,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6" />
       <when-property-is name="user.agent" value="ie8" />
+      <when-property-is name="user.agent" value="ie9" />
     </any>
   </replace-with>
 
diff --git a/user/src/com/google/gwt/user/Tree.gwt.xml b/user/src/com/google/gwt/user/Tree.gwt.xml
index 94b14e5..3876ba6 100644
--- a/user/src/com/google/gwt/user/Tree.gwt.xml
+++ b/user/src/com/google/gwt/user/Tree.gwt.xml
@@ -21,8 +21,9 @@
   <replace-with class="com.google.gwt.user.client.ui.TreeItem.TreeItemImplIE6">
     <when-type-is class="com.google.gwt.user.client.ui.TreeItem.TreeItemImpl"/>
     <any>
-	    <when-property-is name="user.agent" value="ie6"/>
-	    <when-property-is name="user.agent" value="ie8"/>
-	  </any>
+      <when-property-is name="user.agent" value="ie6"/>
+      <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/Window.gwt.xml b/user/src/com/google/gwt/user/Window.gwt.xml
index 8ae46ce..1351b1b 100644
--- a/user/src/com/google/gwt/user/Window.gwt.xml
+++ b/user/src/com/google/gwt/user/Window.gwt.xml
@@ -17,14 +17,15 @@
 <!-- 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"/>
+  <inherits name="com.google.gwt.core.Core"/>
+  <inherits name="com.google.gwt.user.UserAgent"/>
 
    <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="ie6"/>
-	      <when-property-is name="user.agent" value="ie8"/>
-	    </any>
+        <when-property-is name="user.agent" value="ie6"/>
+        <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/cellview/CellView.gwt.xml b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
index 00dacb0..ec6bcf2 100644
--- a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
+++ b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
@@ -35,6 +35,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <when-property-is name="user.agent" value="ie8"/>
+      <when-property-is name="user.agent" value="ie9"/>
     </any>
   </replace-with>
 
@@ -52,6 +53,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <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/cellview/client/CellBasedWidgetImplTrident.java b/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java
index eea60dd..6f2fc44 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBasedWidgetImplTrident.java
@@ -354,7 +354,8 @@
    * @return the tab index, or -1 if not specified
    */
   private native int getTabIndexIfSpecified(Element elem) /*-{
-    return elem.getAttributeNode('tabIndex').specified ? elem.tabIndex : -1;
+    var attrNode = elem.getAttributeNode('tabIndex');
+    return (attrNode != null && attrNode.specified) ? elem.tabIndex : -1;
   }-*/;
 
   /**
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java b/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java
new file mode 100644
index 0000000..a69fe1e
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplIE9.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+/**
+ * IE9 implementation of {@link com.google.gwt.user.client.impl.DOMImplStandardBase}.
+ */
+class DOMImplIE9 extends DOMImplStandardBase {
+}
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
index 16ab0ed..380ee0e 100644
--- a/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplSafari.java
@@ -17,6 +17,8 @@
 
 /**
  * Safari implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
+ * @deprecated  As of release 2.3, replaced by {@link com.google.gwt.user.client.impl.DOMImplWebkit}
  */
-class DOMImplSafari extends DOMImplStandard {
+@Deprecated
+class DOMImplSafari extends DOMImplWebkit {
 }
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplStandardBase.java b/user/src/com/google/gwt/user/client/impl/DOMImplStandardBase.java
new file mode 100644
index 0000000..3cfb006
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplStandardBase.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+/**
+ * Safari implementation of {@link com.google.gwt.user.client.impl.DOMImpl}.
+ */
+class DOMImplStandardBase extends DOMImplStandard {
+}
diff --git a/user/src/com/google/gwt/user/client/impl/DOMImplWebkit.java b/user/src/com/google/gwt/user/client/impl/DOMImplWebkit.java
new file mode 100644
index 0000000..af79d27
--- /dev/null
+++ b/user/src/com/google/gwt/user/client/impl/DOMImplWebkit.java
@@ -0,0 +1,22 @@
+/*
+ * 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;
+
+/**
+ * Webkit implementation of {@link com.google.gwt.user.client.impl.DOMImplStandardBase}.
+ */
+class DOMImplWebkit extends DOMImplStandardBase {
+}
diff --git a/user/src/com/google/gwt/xml/XML.gwt.xml b/user/src/com/google/gwt/xml/XML.gwt.xml
index be76d45..4eaf0d1 100644
--- a/user/src/com/google/gwt/xml/XML.gwt.xml
+++ b/user/src/com/google/gwt/xml/XML.gwt.xml
@@ -33,6 +33,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <when-property-is name="user.agent" value="ie8"/>
+      <when-property-is name="user.agent" value="ie9"/>
     </any>
   </replace-with>
 
diff --git a/user/super/com/google/gwt/emul/EmulationWithUserAgent.gwt.xml b/user/super/com/google/gwt/emul/EmulationWithUserAgent.gwt.xml
index 2080888..2971b65 100644
--- a/user/super/com/google/gwt/emul/EmulationWithUserAgent.gwt.xml
+++ b/user/super/com/google/gwt/emul/EmulationWithUserAgent.gwt.xml
@@ -27,6 +27,7 @@
     <any>
       <when-property-is name="user.agent" value="ie6"/>
       <when-property-is name="user.agent" value="ie8"/>
+      <when-property-is name="user.agent" value="ie9"/>
     </any>
   </replace-with>
 
diff --git a/user/test/com/google/gwt/canvas/client/CanvasTest.java b/user/test/com/google/gwt/canvas/client/CanvasTest.java
index d1b308a..8b3958a 100644
--- a/user/test/com/google/gwt/canvas/client/CanvasTest.java
+++ b/user/test/com/google/gwt/canvas/client/CanvasTest.java
@@ -35,7 +35,7 @@
   protected Canvas canvas2;
 
   native boolean isWebkit525OrBefore() /*-{
-    return @com.google.gwt.dom.client.DOMImplSafari::isWebkit525OrBefore()();
+    return @com.google.gwt.dom.client.DOMImplWebkit::isWebkit525OrBefore()();
   }-*/;
 
   @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 259cf9a..49a6aa0 100644
--- a/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
+++ b/user/test/com/google/gwt/canvas/dom/client/Context2dTest.java
@@ -44,7 +44,7 @@
   }-*/;
 
   native boolean isWebkit525OrBefore() /*-{
-    return @com.google.gwt.dom.client.DOMImplSafari::isWebkit525OrBefore()();
+    return @com.google.gwt.dom.client.DOMImplWebkit::isWebkit525OrBefore()();
   }-*/;
 
   @Override
diff --git a/user/test/com/google/gwt/storage/client/StorageTest.java b/user/test/com/google/gwt/storage/client/StorageTest.java
index e98454a..08b8c85 100644
--- a/user/test/com/google/gwt/storage/client/StorageTest.java
+++ b/user/test/com/google/gwt/storage/client/StorageTest.java
@@ -43,7 +43,7 @@
   }-*/;
 
   private native boolean isSafari3OrBefore() /*-{
-    return @com.google.gwt.dom.client.DOMImplSafari::isWebkit525OrBefore()();
+    return @com.google.gwt.dom.client.DOMImplWebkit::isWebkit525OrBefore()();
   }-*/;
 
   @Override
