diff --git a/user/src/com/google/gwt/logging/client/LoggingPopup.java b/user/src/com/google/gwt/logging/client/LoggingPopup.java
index 1bb817c..7db5964 100644
--- a/user/src/com/google/gwt/logging/client/LoggingPopup.java
+++ b/user/src/com/google/gwt/logging/client/LoggingPopup.java
@@ -68,7 +68,7 @@
       DOM.setCapture(dragHandle.getElement());
       dragStartX = event.getClientX();
       dragStartY = event.getClientY();
-      DOM.eventPreventDefault(DOM.eventGetCurrentEvent());
+      DOM.eventGetCurrentEvent().preventDefault();
     }
  
     public void onMouseMove(MouseMoveEvent event) {
diff --git a/user/src/com/google/gwt/user/client/ui/AbsolutePanel.java b/user/src/com/google/gwt/user/client/ui/AbsolutePanel.java
index 33a6cdf..8ad57be 100644
--- a/user/src/com/google/gwt/user/client/ui/AbsolutePanel.java
+++ b/user/src/com/google/gwt/user/client/ui/AbsolutePanel.java
@@ -64,9 +64,9 @@
    * @param elem the DOM element
    */
   private static void changeToStaticPositioning(Element elem) {
-    DOM.setStyleAttribute(elem, "left", "");
-    DOM.setStyleAttribute(elem, "top", "");
-    DOM.setStyleAttribute(elem, "position", "");
+    elem.getStyle().setProperty("left", "");
+    elem.getStyle().setProperty("top", "");
+    elem.getStyle().setProperty("position", "");
   }
 
   /**
@@ -77,8 +77,8 @@
 
     // Setting the panel's position style to 'relative' causes it to be treated
     // as a new positioning context for its children.
-    DOM.setStyleAttribute(getElement(), "position", "relative");
-    DOM.setStyleAttribute(getElement(), "overflow", "hidden");
+    getElement().getStyle().setProperty("position", "relative");
+    getElement().getStyle().setProperty("overflow", "hidden");
   }
 
   /**
@@ -136,8 +136,8 @@
    */
   public int getWidgetLeft(Widget w) {
     checkWidgetParent(w);
-    return DOM.getAbsoluteLeft(w.getElement())
-        - DOM.getAbsoluteLeft(getElement());
+    return w.getElement().getAbsoluteLeft()
+        - getElement().getAbsoluteLeft();
   }
 
   /**
@@ -149,8 +149,8 @@
    */
   public int getWidgetTop(Widget w) {
     checkWidgetParent(w);
-    return DOM.getAbsoluteTop(w.getElement())
-        - DOM.getAbsoluteTop(getElement());
+    return w.getElement().getAbsoluteTop()
+        - getElement().getAbsoluteTop();
   }
 
   public void insert(Widget w, int beforeIndex) {
@@ -223,9 +223,9 @@
     if (left == -1 && top == -1) {
       changeToStaticPositioning(h);
     } else {
-      DOM.setStyleAttribute(h, "position", "absolute");
-      DOM.setStyleAttribute(h, "left", left + "px");
-      DOM.setStyleAttribute(h, "top", top + "px");
+      h.getStyle().setProperty("position", "absolute");
+      h.getStyle().setProperty("left", left + "px");
+      h.getStyle().setProperty("top", top + "px");
     }
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/CellPanel.java b/user/src/com/google/gwt/user/client/ui/CellPanel.java
index 8391239..f4b87f6 100644
--- a/user/src/com/google/gwt/user/client/ui/CellPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/CellPanel.java
@@ -94,7 +94,7 @@
    * @param width the width of the panel's cell borders, in pixels
    */
   public void setBorderWidth(int width) {
-    DOM.setElementProperty(table, "border", "" + width);
+    table.setPropertyString("border", "" + width);
   }
 
   /**
@@ -198,7 +198,7 @@
    */
   public void setSpacing(int spacing) {
     this.spacing = spacing;
-    DOM.setElementPropertyInt(table, "cellSpacing", spacing);
+    table.setPropertyInt("cellSpacing", spacing);
   }
 
   protected Element getBody() {
@@ -211,12 +211,12 @@
 
   protected void setCellHorizontalAlignment(Element td,
       HorizontalAlignmentConstant align) {
-    DOM.setElementProperty(td, "align", align.getTextAlignString());
+    td.setPropertyString("align", align.getTextAlignString());
   }
 
   protected void setCellVerticalAlignment(Element td,
       VerticalAlignmentConstant align) {
-    DOM.setStyleAttribute(td, "verticalAlign", align.getVerticalAlignString());
+    td.getStyle().setProperty("verticalAlign", align.getVerticalAlignString());
   }
 
   Element getWidgetTd(Widget w) {
diff --git a/user/src/com/google/gwt/user/client/ui/ComplexPanel.java b/user/src/com/google/gwt/user/client/ui/ComplexPanel.java
index bbf4966..6b692f9 100644
--- a/user/src/com/google/gwt/user/client/ui/ComplexPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/ComplexPanel.java
@@ -68,7 +68,7 @@
     } finally {
       // Physical detach.
       Element elem = w.getElement();
-      DOM.removeChild(DOM.getParent(elem), elem);
+      DOM.getParent(elem).removeChild(elem);
   
       // Logical detach.
       getChildren().remove(w);
diff --git a/user/src/com/google/gwt/user/client/ui/CustomButton.java b/user/src/com/google/gwt/user/client/ui/CustomButton.java
index 8c1ded7..d15d41e 100644
--- a/user/src/com/google/gwt/user/client/ui/CustomButton.java
+++ b/user/src/com/google/gwt/user/client/ui/CustomButton.java
@@ -164,7 +164,7 @@
      */
     @Override
     public String getHTML() {
-      return DOM.getInnerHTML(getFace());
+      return getFace().getInnerHTML();
     }
 
     /**
@@ -175,7 +175,7 @@
      */
     @Override
     public String getText() {
-      return DOM.getInnerText(getFace());
+      return getFace().getInnerText();
     }
 
     /**
@@ -198,7 +198,7 @@
     public void setHTML(String html) {
       face = DOM.createDiv();
       UIObject.setStyleName(face, STYLENAME_HTML_FACE, true);
-      DOM.setInnerHTML(face, html);
+      face.setInnerHTML(html);
       updateButtonFace();
     }
 
@@ -221,7 +221,7 @@
     public final void setText(String text) {
       face = DOM.createDiv();
       UIObject.setStyleName(face, STYLENAME_HTML_FACE, true);
-      DOM.setInnerText(face, text);
+      face.setInnerText(text);
       updateButtonFace();
     }
 
@@ -652,7 +652,7 @@
           DOM.setCapture(getElement());
           isCapturing = true;
           // Prevent dragging (on some browsers);
-          DOM.eventPreventDefault(event);
+          event.preventDefault();
         }
         break;
       case Event.ONMOUSEUP:
@@ -667,13 +667,13 @@
       case Event.ONMOUSEMOVE:
         if (isCapturing) {
           // Prevent dragging (on other browsers);
-          DOM.eventPreventDefault(event);
+          event.preventDefault();
         }
         break;
       case Event.ONMOUSEOUT:
         Element to = DOM.eventGetToElement(event);
-        if (DOM.isOrHasChild(getElement(), DOM.eventGetTarget(event))
-            && (to == null || !DOM.isOrHasChild(getElement(), to))) {
+        if (getElement().isOrHasChild(DOM.eventGetTarget(event))
+            && (to == null || !getElement().isOrHasChild(to))) {
           if (isCapturing) {
             onClickCancel();
           }
@@ -681,7 +681,7 @@
         }
         break;
       case Event.ONMOUSEOVER:
-        if (DOM.isOrHasChild(getElement(), DOM.eventGetTarget(event))) {
+        if (getElement().isOrHasChild(DOM.eventGetTarget(event))) {
           setHovering(true);
           if (isCapturing) {
             onClickStart();
@@ -706,7 +706,7 @@
 
     // Synthesize clicks based on keyboard events AFTER the normal key handling.
     if ((event.getTypeInt() & Event.KEYEVENTS) != 0) {
-      char keyCode = (char) DOM.eventGetKeyCode(event);
+      char keyCode = (char) event.getKeyCode();
       switch (type) {
         case Event.ONKEYDOWN:
           if (keyCode == ' ') {
@@ -1015,7 +1015,7 @@
   private void setCurrentFaceElement(Element newFaceElement) {
     if (curFaceElement != newFaceElement) {
       if (curFaceElement != null) {
-        DOM.removeChild(getElement(), curFaceElement);
+        getElement().removeChild(curFaceElement);
       }
       curFaceElement = newFaceElement;
       DOM.appendChild(getElement(), curFaceElement);
diff --git a/user/src/com/google/gwt/user/client/ui/DeckPanel.java b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
index 919f5a8..608ab9d 100644
--- a/user/src/com/google/gwt/user/client/ui/DeckPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DeckPanel.java
@@ -138,18 +138,18 @@
     @Override
     protected void onComplete() {
       if (growing) {
-        DOM.setStyleAttribute(container1, "height", "100%");
+        container1.getStyle().setProperty("height", "100%");
         UIObject.setVisible(container1, true);
         UIObject.setVisible(container2, false);
-        DOM.setStyleAttribute(container2, "height", "100%");
+        container2.getStyle().setProperty("height", "100%");
       } else {
         UIObject.setVisible(container1, false);
-        DOM.setStyleAttribute(container1, "height", "100%");
-        DOM.setStyleAttribute(container2, "height", "100%");
+        container1.getStyle().setProperty("height", "100%");
+        container2.getStyle().setProperty("height", "100%");
         UIObject.setVisible(container2, true);
       }
-      DOM.setStyleAttribute(container1, "overflow", "visible");
-      DOM.setStyleAttribute(container2, "overflow", "visible");
+      container1.getStyle().setProperty("overflow", "visible");
+      container2.getStyle().setProperty("overflow", "visible");
       container1 = null;
       container2 = null;
       hideOldWidget();
@@ -158,8 +158,8 @@
     @Override
     protected void onStart() {
       // Start the animation
-      DOM.setStyleAttribute(container1, "overflow", "hidden");
-      DOM.setStyleAttribute(container2, "overflow", "hidden");
+      container1.getStyle().setProperty("overflow", "hidden");
+      container2.getStyle().setProperty("overflow", "hidden");
       onUpdate(0.0);
       UIObject.setVisible(container1, true);
       UIObject.setVisible(container2, true);
@@ -175,10 +175,8 @@
       int height1;
       int height2;
       if (fixedHeight == -1) {
-        height1 = (int) (progress * DOM.getElementPropertyInt(container1,
-            "scrollHeight"));
-        height2 = (int) ((1.0 - progress) * DOM.getElementPropertyInt(
-            container2, "scrollHeight"));
+        height1 = (int) (progress * container1.getPropertyInt("scrollHeight"));
+        height2 = (int) ((1.0 - progress) * container2.getPropertyInt("scrollHeight"));
       } else {
         height1 = (int) (progress * fixedHeight);
         height2 = fixedHeight - height1;
@@ -193,8 +191,8 @@
         height2 = 1;
         height1 = Math.max(1, height1 - 1);
       }
-      DOM.setStyleAttribute(container1, "height", height1 + "px");
-      DOM.setStyleAttribute(container2, "height", height2 + "px");
+      container1.getStyle().setProperty("height", height1 + "px");
+      container2.getStyle().setProperty("height", height2 + "px");
     }
 
     /**
@@ -298,7 +296,7 @@
     if (removed) {
       resetChildWidget(w);
 
-      DOM.removeChild(getElement(), container);
+      getElement().removeChild(container);
       if (visibleWidget == w) {
         visibleWidget = null;
       }
@@ -335,10 +333,10 @@
    */
   private Element createWidgetContainer() {
     Element container = DOM.createDiv();
-    DOM.setStyleAttribute(container, "width", "100%");
-    DOM.setStyleAttribute(container, "height", "0px");
-    DOM.setStyleAttribute(container, "padding", "0px");
-    DOM.setStyleAttribute(container, "margin", "0px");
+    container.getStyle().setProperty("width", "100%");
+    container.getStyle().setProperty("height", "0px");
+    container.getStyle().setProperty("padding", "0px");
+    container.getStyle().setProperty("margin", "0px");
     return container;
   }
 
@@ -347,14 +345,14 @@
    */
   private void finishWidgetInitialization(Element container, Widget w) {
     UIObject.setVisible(container, false);
-    DOM.setStyleAttribute(container, "height", "100%");
+    container.getStyle().setProperty("height", "100%");
 
     // Set 100% by default.
     Element element = w.getElement();
-    if (DOM.getStyleAttribute(element, "width").equals("")) {
+    if (element.getStyle().getProperty("width").equals("")) {
       w.setWidth("100%");
     }
-    if (DOM.getStyleAttribute(element, "height").equals("")) {
+    if (element.getStyle().getProperty("height").equals("")) {
       w.setHeight("100%");
     }
 
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java
index b5ef039..4d00ca4 100644
--- a/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DecoratedStackPanel.java
@@ -83,9 +83,9 @@
     Element table = DOM.createTable();
     Element tbody = DOM.createTBody();
     DOM.appendChild(table, tbody);
-    DOM.setStyleAttribute(table, "width", "100%");
-    DOM.setElementPropertyInt(table, "cellSpacing", 0);
-    DOM.setElementPropertyInt(table, "cellPadding", 0);
+    table.getStyle().setProperty("width", "100%");
+    table.setPropertyInt("cellSpacing", 0);
+    table.setPropertyInt("cellPadding", 0);
 
     // Add the decorated rows
     for (int i = 0; i < DEFAULT_ROW_STYLENAMES.length; i++) {
diff --git a/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java b/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
index eab74ab..d40b5b5 100644
--- a/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DecoratorPanel.java
@@ -166,8 +166,8 @@
     Element table = getElement();
     tbody = DOM.createTBody();
     DOM.appendChild(table, tbody);
-    DOM.setElementPropertyInt(table, "cellSpacing", 0);
-    DOM.setElementPropertyInt(table, "cellPadding", 0);
+    table.setPropertyInt("cellSpacing", 0);
+    table.setPropertyInt("cellPadding", 0);
 
     // Add each row
     for (int i = 0; i < rowStyles.length; i++) {
diff --git a/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java b/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
index 92d81d3..80ae551 100644
--- a/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DisclosurePanel.java
@@ -103,9 +103,9 @@
       // Anchor is used to allow keyboard access.
       super(DOM.createAnchor());
       Element elem = getElement();
-      DOM.setElementProperty(elem, "href", "javascript:void(0);");
+      elem.setPropertyString("href", "javascript:void(0);");
       // Avoids layout problems from having blocks in inlines.
-      DOM.setStyleAttribute(elem, "display", "block");
+      elem.getStyle().setProperty("display", "block");
       sinkEvents(Event.ONCLICK);
       setStyleName(STYLENAME_HEADER);
     }
@@ -165,8 +165,7 @@
       if (!opening) {
         curPanel.contentWrapper.setVisible(false);
       }
-      DOM.setStyleAttribute(curPanel.contentWrapper.getElement(), "height",
-          "auto");
+      curPanel.contentWrapper.getElement().getStyle().setProperty("height", "auto");
       curPanel = null;
     }
 
@@ -182,17 +181,14 @@
 
     @Override
     protected void onUpdate(double progress) {
-      int scrollHeight = DOM.getElementPropertyInt(
-          curPanel.contentWrapper.getElement(), "scrollHeight");
+      int scrollHeight = curPanel.contentWrapper.getElement().getPropertyInt("scrollHeight");
       int height = (int) (progress * scrollHeight);
       if (!opening) {
         height = scrollHeight - height;
       }
       height = Math.max(height, 1);
-      DOM.setStyleAttribute(curPanel.contentWrapper.getElement(), "height",
-          height + "px");
-      DOM.setStyleAttribute(curPanel.contentWrapper.getElement(), "width",
-          "auto");
+      curPanel.contentWrapper.getElement().getStyle().setProperty("height", height + "px");
+      curPanel.contentWrapper.getElement().getStyle().setProperty("width", "auto");
     }
   }
 
@@ -246,9 +242,9 @@
       DOM.appendChild(tr, labelTD);
 
       // set image TD to be same width as image.
-      DOM.setElementProperty(imageTD, "align", "center");
-      DOM.setElementProperty(imageTD, "valign", "middle");
-      DOM.setStyleAttribute(imageTD, "width", iconImage.getWidth() + "px");
+      imageTD.setPropertyString("align", "center");
+      imageTD.setPropertyString("valign", "middle");
+      imageTD.getStyle().setProperty("width", iconImage.getWidth() + "px");
 
       DOM.appendChild(imageTD, iconImage.getElement());
 
@@ -277,7 +273,7 @@
     }
 
     public final String getText() {
-      return DOM.getInnerText(labelTD);
+      return labelTD.getInnerText();
     }
 
     public final void onClose(CloseEvent<DisclosurePanel> event) {
@@ -289,7 +285,7 @@
     }
 
     public final void setText(String text) {
-      DOM.setInnerText(labelTD, text);
+      labelTD.setInnerText(text);
     }
 
     private void setStyle() {
@@ -351,8 +347,8 @@
     initWidget(mainPanel);
     mainPanel.add(header);
     mainPanel.add(contentWrapper);
-    DOM.setStyleAttribute(contentWrapper.getElement(), "padding", "0px");
-    DOM.setStyleAttribute(contentWrapper.getElement(), "overflow", "hidden");
+    contentWrapper.getElement().getStyle().setProperty("padding", "0px");
+    contentWrapper.getElement().getStyle().setProperty("overflow", "hidden");
     setStyleName(STYLENAME_DEFAULT);
     setContentDisplay(false);
   }
diff --git a/user/src/com/google/gwt/user/client/ui/DockPanel.java b/user/src/com/google/gwt/user/client/ui/DockPanel.java
index 952d60e..969c12f 100644
--- a/user/src/com/google/gwt/user/client/ui/DockPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/DockPanel.java
@@ -149,8 +149,8 @@
    * Creates an empty dock panel.
    */
   public DockPanel() {
-    DOM.setElementPropertyInt(getTable(), "cellSpacing", 0);
-    DOM.setElementPropertyInt(getTable(), "cellPadding", 0);
+    getTable().setPropertyInt("cellSpacing", 0);
+    getTable().setPropertyInt("cellPadding", 0);
   }
 
   /**
@@ -246,7 +246,7 @@
     LayoutData data = (LayoutData) w.getLayoutData();
     data.height = height;
     if (data.td != null) {
-      DOM.setStyleAttribute(data.td, "height", data.height);
+      data.td.getStyle().setProperty("height", data.height);
     }
   }
 
@@ -274,7 +274,7 @@
     LayoutData data = (LayoutData) w.getLayoutData();
     data.width = width;
     if (data.td != null) {
-      DOM.setStyleAttribute(data.td, "width", data.width);
+      data.td.getStyle().setProperty("width", data.width);
     }
   }
 
@@ -349,7 +349,7 @@
   private void realizeTable() {
     Element bodyElem = getBody();
     while (DOM.getChildCount(bodyElem) > 0) {
-      DOM.removeChild(bodyElem, DOM.getChild(bodyElem, 0));
+      bodyElem.removeChild(DOM.getChild(bodyElem, 0));
     }
 
     int rowCount = 1, colCount = 1;
@@ -380,20 +380,20 @@
 
       Element td = DOM.createTD();
       layout.td = td;
-      DOM.setElementProperty(layout.td, "align", layout.hAlign);
-      DOM.setStyleAttribute(layout.td, "verticalAlign", layout.vAlign);
-      DOM.setElementProperty(layout.td, "width", layout.width);
-      DOM.setElementProperty(layout.td, "height", layout.height);
+      layout.td.setPropertyString("align", layout.hAlign);
+      layout.td.getStyle().setProperty("verticalAlign", layout.vAlign);
+      layout.td.setPropertyString("width", layout.width);
+      layout.td.setPropertyString("height", layout.height);
 
       if (layout.direction == NORTH) {
         DOM.insertChild(rows[northRow].tr, td, rows[northRow].center);
         DOM.appendChild(td, child.getElement());
-        DOM.setElementPropertyInt(td, "colSpan", logicalRightCol - logicalLeftCol + 1);
+        td.setPropertyInt("colSpan", logicalRightCol - logicalLeftCol + 1);
         ++northRow;
       } else if (layout.direction == SOUTH) {
         DOM.insertChild(rows[southRow].tr, td, rows[southRow].center);
         DOM.appendChild(td, child.getElement());
-        DOM.setElementPropertyInt(td, "colSpan", logicalRightCol - logicalLeftCol + 1);
+        td.setPropertyInt("colSpan", logicalRightCol - logicalLeftCol + 1);
         --southRow;
       } else if (layout.direction == CENTER) {
         // Defer adding the center widget, so that it can be added after all
@@ -403,13 +403,13 @@
         TmpRow row = rows[northRow];
         DOM.insertChild(row.tr, td, row.center++);
         DOM.appendChild(td, child.getElement());
-        DOM.setElementPropertyInt(td, "rowSpan", southRow - northRow + 1);
+        td.setPropertyInt("rowSpan", southRow - northRow + 1);
         ++logicalLeftCol;
       } else if (shouldAddToLogicalRightOfTable(layout.direction)) {
         TmpRow row = rows[northRow];
         DOM.insertChild(row.tr, td, row.center);
         DOM.appendChild(td, child.getElement());
-        DOM.setElementPropertyInt(td, "rowSpan", southRow - northRow + 1);
+        td.setPropertyInt("rowSpan", southRow - northRow + 1);
         --logicalRightCol;
       } 
     }
diff --git a/user/src/com/google/gwt/user/client/ui/FlexTable.java b/user/src/com/google/gwt/user/client/ui/FlexTable.java
index 5ec2999..16bee2f 100644
--- a/user/src/com/google/gwt/user/client/ui/FlexTable.java
+++ b/user/src/com/google/gwt/user/client/ui/FlexTable.java
@@ -15,8 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.user.client.DOM;
-
 /**
  * A flexible table that creates cells on demand. It can be jagged (that is,
  * each row can contain a different number of cells) and individual cells can be
@@ -48,7 +46,7 @@
      * @throws IndexOutOfBoundsException
      */
     public int getColSpan(int row, int column) {
-      return DOM.getElementPropertyInt(getElement(row, column), "colSpan");
+      return getElement(row, column).getPropertyInt("colSpan");
     }
 
     /**
@@ -61,7 +59,7 @@
      * @throws IndexOutOfBoundsException
      */
     public int getRowSpan(int row, int column) {
-      return DOM.getElementPropertyInt(getElement(row, column), "rowSpan");
+      return getElement(row, column).getPropertyInt("rowSpan");
     }
 
     /**
@@ -74,7 +72,7 @@
      * @throws IndexOutOfBoundsException
      */
     public void setColSpan(int row, int column, int colSpan) {
-      DOM.setElementPropertyInt(ensureElement(row, column), "colSpan", colSpan);
+      ensureElement(row, column).setPropertyInt("colSpan", colSpan);
     }
 
     /**
@@ -87,7 +85,7 @@
      * @throws IndexOutOfBoundsException
      */
     public void setRowSpan(int row, int column, int rowSpan) {
-      DOM.setElementPropertyInt(ensureElement(row, column), "rowSpan", rowSpan);
+      ensureElement(row, column).setPropertyInt("rowSpan", rowSpan);
     }
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/FocusWidget.java b/user/src/com/google/gwt/user/client/ui/FocusWidget.java
index 7c1fa55..2e5e36c 100644
--- a/user/src/com/google/gwt/user/client/ui/FocusWidget.java
+++ b/user/src/com/google/gwt/user/client/ui/FocusWidget.java
@@ -79,7 +79,6 @@
 import com.google.gwt.event.dom.client.TouchStartEvent;
 import com.google.gwt.event.dom.client.TouchStartHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.ui.impl.FocusImpl;
 
 /**
@@ -285,7 +284,7 @@
    * @return <code>true</code> if the widget is enabled
    */
   public boolean isEnabled() {
-    return !DOM.getElementPropertyBoolean(getElement(), "disabled");
+    return !getElement().getPropertyBoolean("disabled");
   }
 
   /**
@@ -334,7 +333,7 @@
   }
 
   public void setAccessKey(char key) {
-    DOM.setElementProperty(getElement(), "accessKey", "" + key);
+    getElement().setPropertyString("accessKey", "" + key);
   }
 
   /**
@@ -344,7 +343,7 @@
    *          to disable it
    */
   public void setEnabled(boolean enabled) {
-    DOM.setElementPropertyBoolean(getElement(), "disabled", !enabled);
+    getElement().setPropertyBoolean("disabled", !enabled);
   }
 
   public void setFocus(boolean focused) {
diff --git a/user/src/com/google/gwt/user/client/ui/Grid.java b/user/src/com/google/gwt/user/client/ui/Grid.java
index 8e22238..ced5ef4 100644
--- a/user/src/com/google/gwt/user/client/ui/Grid.java
+++ b/user/src/com/google/gwt/user/client/ui/Grid.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 
 /**
@@ -130,7 +129,7 @@
   public boolean clearCell(int row, int column) {
     Element td = getCellFormatter().getElement(row, column);
     boolean b = internalClearCell(td, false);
-    DOM.setInnerHTML(td, "&nbsp;");
+    td.setInnerHTML("&nbsp;");
     return b;
   }
 
@@ -271,7 +270,7 @@
 
     // Add a non-breaking space to the TD. This ensures that the cell is
     // displayed.
-    DOM.setInnerHTML(td, "&nbsp;");
+    td.setInnerHTML("&nbsp;");
     return td;
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/HTMLTable.java b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
index 3fef0e8..f35ea80 100644
--- a/user/src/com/google/gwt/user/client/ui/HTMLTable.java
+++ b/user/src/com/google/gwt/user/client/ui/HTMLTable.java
@@ -272,7 +272,7 @@
     public void setHeight(int row, int column, String height) {
       prepareCell(row, column);
       Element elem = getCellElement(bodyElem, row, column);
-      DOM.setElementProperty(elem, "height", height);
+      elem.setPropertyString("height", height);
     }
 
     /**
@@ -288,7 +288,7 @@
         HorizontalAlignmentConstant align) {
       prepareCell(row, column);
       Element elem = getCellElement(bodyElem, row, column);
-      DOM.setElementProperty(elem, "align", align.getTextAlignString());
+      elem.setPropertyString("align", align.getTextAlignString());
     }
 
     /**
@@ -331,8 +331,8 @@
     public void setVerticalAlignment(int row, int column,
         VerticalAlignmentConstant align) {
       prepareCell(row, column);
-      DOM.setStyleAttribute(getCellElement(bodyElem, row, column),
-          "verticalAlign", align.getVerticalAlignString());
+      getCellElement(bodyElem, row, column).getStyle()
+          .setProperty("verticalAlign", align.getVerticalAlignString());
     }
 
     /**
@@ -361,8 +361,7 @@
     public void setWidth(int row, int column, String width) {
       // Give the subclass a chance to prepare the cell.
       prepareCell(row, column);
-      DOM.setElementProperty(getCellElement(bodyElem, row, column), "width",
-          width);
+      getCellElement(bodyElem, row, column).setPropertyString("width", width);
     }
 
     /**
@@ -376,7 +375,7 @@
     public void setWordWrap(int row, int column, boolean wrap) {
       prepareCell(row, column);
       String wrapValue = wrap ? "" : "nowrap";
-      DOM.setStyleAttribute(getElement(row, column), "whiteSpace", wrapValue);
+      getElement(row, column).getStyle().setProperty("whiteSpace", wrapValue);
     }
 
     /**
@@ -404,7 +403,7 @@
      */
     protected String getAttr(int row, int column, String attr) {
       Element elem = getElement(row, column);
-      return DOM.getElementAttribute(elem, attr);
+      return elem.getAttribute(attr);
     }
 
     /**
@@ -418,7 +417,7 @@
      */
     protected void setAttr(int row, int column, String attrName, String value) {
       Element elem = ensureElement(row, column);
-      DOM.setElementAttribute(elem, attrName, value);
+      elem.setAttribute(attrName, value);
     }
 
     /**
@@ -544,7 +543,7 @@
      * @throws IndexOutOfBoundsException
      */
     public void setWidth(int column, String width) {
-      DOM.setElementProperty(ensureColumn(column), "width", width);
+      ensureColumn(column).setPropertyString("width", width);
     }
 
     /**
@@ -702,8 +701,7 @@
      * @throws IndexOutOfBoundsException
      */
     public void setVerticalAlign(int row, VerticalAlignmentConstant align) {
-      DOM.setStyleAttribute(ensureElement(row), "verticalAlign",
-          align.getVerticalAlignString());
+      ensureElement(row).getStyle().setProperty("verticalAlign", align.getVerticalAlignString());
     }
 
     /**
@@ -745,7 +743,7 @@
      */
     protected void setAttr(int row, String attrName, String value) {
       Element elem = ensureElement(row);
-      DOM.setElementAttribute(elem, attrName, value);
+      elem.setAttribute(attrName, value);
     }
   }
 
@@ -918,7 +916,7 @@
    * @return the cell padding, in pixels
    */
   public int getCellPadding() {
-    return DOM.getElementPropertyInt(tableElem, "cellPadding");
+    return tableElem.getPropertyInt("cellPadding");
   }
 
   /**
@@ -927,7 +925,7 @@
    * @return the cell spacing, in pixels
    */
   public int getCellSpacing() {
-    return DOM.getElementPropertyInt(tableElem, "cellSpacing");
+    return tableElem.getPropertyInt("cellSpacing");
   }
 
   /**
@@ -948,7 +946,7 @@
    * @throws IndexOutOfBoundsException
    */
   public String getHTML(int row, int column) {
-    return DOM.getInnerHTML(cellFormatter.getElement(row, column));
+    return cellFormatter.getElement(row, column).getInnerHTML();
   }
 
   /**
@@ -978,7 +976,7 @@
   public String getText(int row, int column) {
     checkCellBounds(row, column);
     Element e = cellFormatter.getElement(row, column);
-    return DOM.getInnerText(e);
+    return e.getInnerText();
   }
 
   /**
@@ -1080,7 +1078,7 @@
     } finally {
       // Physical detach.
       Element elem = widget.getElement();
-      DOM.removeChild(DOM.getParent(elem), elem);
+      DOM.getParent(elem).removeChild(elem);
   
       // Logical detach.
       widgetMap.removeByElement(elem);
@@ -1108,7 +1106,7 @@
    * @param width the width of the border, in pixels
    */
   public void setBorderWidth(int width) {
-    DOM.setElementProperty(tableElem, "border", "" + width);
+    tableElem.setPropertyString("border", "" + width);
   }
 
   /**
@@ -1117,7 +1115,7 @@
    * @param padding the cell padding, in pixels
    */
   public void setCellPadding(int padding) {
-    DOM.setElementPropertyInt(tableElem, "cellPadding", padding);
+    tableElem.setPropertyInt("cellPadding", padding);
   }
 
   /**
@@ -1126,7 +1124,7 @@
    * @param spacing the cell spacing, in pixels
    */
   public void setCellSpacing(int spacing) {
-    DOM.setElementPropertyInt(tableElem, "cellSpacing", spacing);
+    tableElem.setPropertyInt("cellSpacing", spacing);
   }
 
   /**
@@ -1141,7 +1139,7 @@
     prepareCell(row, column);
     Element td = cleanCell(row, column, html == null);
     if (html != null) {
-      DOM.setInnerHTML(td, html);
+      td.setInnerHTML(html);
     }
   }
 
@@ -1170,7 +1168,7 @@
     Element td;
     td = cleanCell(row, column, text == null);
     if (text != null) {
-      DOM.setInnerText(td, text);
+      td.setInnerText(text);
     }
   }
 
@@ -1318,7 +1316,7 @@
     Element td = DOM.eventGetTarget(event);
     for (; td != null; td = DOM.getParent(td)) {
       // If it's a TD, it might be the one we're looking for.
-      if (DOM.getElementProperty(td, "tagName").equalsIgnoreCase("td")) {
+      if (td.getPropertyString("tagName").equalsIgnoreCase("td")) {
         // Make sure it's directly a part of this table before returning
         // it.
         Element tr = DOM.getParent(td);
@@ -1403,7 +1401,7 @@
     } else {
       // Otherwise, simply clear whatever text and/or HTML may be there.
       if (clearInnerHTML) {
-        DOM.setInnerHTML(td, "");
+        td.setInnerHTML("");
       }
       return false;
     }
@@ -1479,7 +1477,7 @@
     checkCellBounds(row, column);
     Element td = cleanCell(row, column, false);
     Element tr = rowFormatter.getRow(bodyElem, row);
-    DOM.removeChild(tr, td);
+    tr.removeChild(td);
   }
 
   /**
@@ -1493,7 +1491,7 @@
     for (int column = 0; column < columnCount; ++column) {
       cleanCell(row, column, false);
     }
-    DOM.removeChild(bodyElem, rowFormatter.getRow(bodyElem, row));
+    bodyElem.removeChild(rowFormatter.getRow(bodyElem, row));
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/HorizontalPanel.java b/user/src/com/google/gwt/user/client/ui/HorizontalPanel.java
index 67d4426..df5184d 100644
--- a/user/src/com/google/gwt/user/client/ui/HorizontalPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/HorizontalPanel.java
@@ -38,8 +38,8 @@
     tableRow = DOM.createTR();
     DOM.appendChild(getBody(), tableRow);
 
-    DOM.setElementProperty(getTable(), "cellSpacing", "0");
-    DOM.setElementProperty(getTable(), "cellPadding", "0");
+    getTable().setPropertyString("cellSpacing", "0");
+    getTable().setPropertyString("cellPadding", "0");
   }
 
   @Override
@@ -84,7 +84,7 @@
     Element td = DOM.getParent(w.getElement());
     boolean removed = super.remove(w);
     if (removed) {
-      DOM.removeChild(tableRow, td);
+      tableRow.removeChild(td);
     }
     return removed;
   }
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 d1ad785..8ce20ed 100644
--- a/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/HorizontalSplitPanel.java
@@ -84,7 +84,7 @@
     public void init(HorizontalSplitPanel panel) {
       this.panel = panel;
 
-      DOM.setStyleAttribute(panel.getElement(), "position", "relative");
+      panel.getElement().getStyle().setProperty("position", "relative");
 
       expandToFitParentHorizontally(panel.getElement(LEFT));
       expandToFitParentHorizontally(panel.getElement(RIGHT));
@@ -211,7 +211,7 @@
         elem.getStyle().setTextAlign(TextAlign.LEFT);
       }
 
-      DOM.setStyleAttribute(elem, "position", "relative");
+      elem.getStyle().setProperty("position", "relative");
 
       /*
        * Technically, these are snapped to the top and bottom, but IE doesn't
@@ -240,7 +240,7 @@
 
     @Override
     public void onDetach() {
-      DOM.setElementAttribute(panel.container, "onresize", null);
+      panel.container.setAttribute("onresize", null);
     }
 
     @Override
diff --git a/user/src/com/google/gwt/user/client/ui/Hyperlink.java b/user/src/com/google/gwt/user/client/ui/Hyperlink.java
index 61b9821..60b0ed4 100644
--- a/user/src/com/google/gwt/user/client/ui/Hyperlink.java
+++ b/user/src/com/google/gwt/user/client/ui/Hyperlink.java
@@ -283,7 +283,7 @@
     super.onBrowserEvent(event);
     if (DOM.eventGetType(event) == Event.ONCLICK && impl.handleAsClick(event)) {
       History.newItem(getTargetHistoryToken());
-      DOM.eventPreventDefault(event);
+      event.preventDefault();
     }
   }
 
@@ -343,7 +343,7 @@
       : "targetHistoryToken must not be null, consider using Anchor instead";
     this.targetHistoryToken = targetHistoryToken;
     String hash = History.encodeHistoryToken(targetHistoryToken);
-    DOM.setElementProperty(anchorElem, "href", "#" + hash);
+    anchorElem.setPropertyString("href", "#" + hash);
   }
 
   public void setText(String text) {
diff --git a/user/src/com/google/gwt/user/client/ui/KeyboardListenerCollection.java b/user/src/com/google/gwt/user/client/ui/KeyboardListenerCollection.java
index 62dbde8..18e5ab4 100644
--- a/user/src/com/google/gwt/user/client/ui/KeyboardListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/KeyboardListenerCollection.java
@@ -37,10 +37,10 @@
    * @return the modifiers as defined in {@link KeyboardListener}.
    */
   public static int getKeyboardModifiers(Event event) {
-    return (DOM.eventGetShiftKey(event) ? KeyboardListener.MODIFIER_SHIFT : 0)
-        | (DOM.eventGetMetaKey(event) ? KeyboardListener.MODIFIER_META : 0)
-        | (DOM.eventGetCtrlKey(event) ? KeyboardListener.MODIFIER_CTRL : 0)
-        | (DOM.eventGetAltKey(event) ? KeyboardListener.MODIFIER_ALT : 0);
+    return (event.getShiftKey() ? KeyboardListener.MODIFIER_SHIFT : 0)
+        | (event.getMetaKey() ? KeyboardListener.MODIFIER_META : 0)
+        | (event.getCtrlKey() ? KeyboardListener.MODIFIER_CTRL : 0)
+        | (event.getAltKey() ? KeyboardListener.MODIFIER_ALT : 0);
   }
 
   /**
@@ -55,15 +55,15 @@
 
     switch (DOM.eventGetType(event)) {
       case Event.ONKEYDOWN:
-        fireKeyDown(sender, (char) DOM.eventGetKeyCode(event), modifiers);
+        fireKeyDown(sender, (char) event.getKeyCode(), modifiers);
         break;
 
       case Event.ONKEYUP:
-        fireKeyUp(sender, (char) DOM.eventGetKeyCode(event), modifiers);
+        fireKeyUp(sender, (char) event.getKeyCode(), modifiers);
         break;
 
       case Event.ONKEYPRESS:
-        fireKeyPress(sender, (char) DOM.eventGetKeyCode(event), modifiers);
+        fireKeyPress(sender, (char) event.getKeyCode(), modifiers);
         break;
     }
   }
diff --git a/user/src/com/google/gwt/user/client/ui/MenuBar.java b/user/src/com/google/gwt/user/client/ui/MenuBar.java
index c09e68c..dda33fc 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -381,7 +381,7 @@
 
     Element container = getItemContainerElement();
     while (DOM.getChildCount(container) > 0) {
-      DOM.removeChild(container, DOM.getChild(container, 0));
+      container.removeChild(DOM.getChild(container, 0));
     }
 
     // Set the parent of all items to null
@@ -625,7 +625,7 @@
       }
 
       case Event.ONKEYDOWN: {
-        int keyCode = DOM.eventGetKeyCode(event);
+        int keyCode = event.getKeyCode();
         boolean isRtl = LocaleInfo.getCurrentLocale().isRTL();
         keyCode = KeyCodes.maybeSwapArrowKeysForRtl(keyCode, isRtl);
         switch (keyCode) {
@@ -999,14 +999,14 @@
     if (submenu == null) {
       // Remove the submenu indicator
       if (tdCount == 2) {
-        DOM.removeChild(tr, DOM.getChild(tr, 1));
+        tr.removeChild(DOM.getChild(tr, 1));
       }
       setItemColSpan(item, 2);
     } else if (tdCount == 1) {
       // Show the submenu indicator
       setItemColSpan(item, 1);
       Element td = DOM.createTD();
-      DOM.setElementProperty(td, "vAlign", "middle");
+      td.setPropertyString("vAlign", "middle");
       td.setInnerSafeHtml(subMenuIcon.getSafeHtml());
       setStyleName(td, "subMenuIcon");
       DOM.appendChild(tr, td);
@@ -1046,13 +1046,13 @@
   }
 
   private void eatEvent(Event event) {
-    DOM.eventCancelBubble(event, true);
-    DOM.eventPreventDefault(event);
+    event.stopPropagation();
+    event.preventDefault();
   }
 
   private MenuItem findItem(Element hItem) {
     for (MenuItem item : items) {
-      if (DOM.isOrHasChild(item.getElement(), hItem)) {
+      if (item.getElement().isOrHasChild(hItem)) {
         return item;
       }
     }
@@ -1098,10 +1098,10 @@
     }
 
     // Hide focus outline in Mozilla/Webkit/Opera
-    DOM.setStyleAttribute(getElement(), "outline", "0px");
+    getElement().getStyle().setProperty("outline", "0px");
 
     // Hide focus outline in IE 6/7
-    DOM.setElementAttribute(getElement(), "hideFocus", "true");
+    getElement().setAttribute("hideFocus", "true");
 
     // Deselect items when blurring without a child menu.
     addDomHandler(new BlurHandler() {
@@ -1278,7 +1278,7 @@
     }
 
     Element container = getItemContainerElement();
-    DOM.removeChild(container, DOM.getChild(container, idx));
+    container.removeChild(DOM.getChild(container, idx));
     allItems.remove(idx);
     return true;
   }
@@ -1383,6 +1383,6 @@
    * @param colspan the colspan
    */
   private void setItemColSpan(UIObject item, int colspan) {
-    DOM.setElementPropertyInt(item.getElement(), "colSpan", colspan);
+    item.getElement().setPropertyInt("colSpan", colspan);
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/MenuItem.java b/user/src/com/google/gwt/user/client/ui/MenuItem.java
index 3c9cf22..52e538d 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuItem.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuItem.java
@@ -126,7 +126,7 @@
     }
     setStyleName("gwt-MenuItem");
 
-    DOM.setElementAttribute(getElement(), "id", DOM.createUniqueId());
+    getElement().setAttribute("id", DOM.createUniqueId());
     // Add a11y role "menuitem"
     Roles.getMenuitemRole().set(getElement());
   }
@@ -163,7 +163,7 @@
 
   @Override
   public String getHTML() {
-    return DOM.getInnerHTML(getElement());
+    return getElement().getInnerHTML();
   }
 
   /**
@@ -195,7 +195,7 @@
 
   @Override
   public String getText() {
-    return DOM.getInnerText(getElement());
+    return getElement().getInnerText();
   }
 
   @Override
@@ -231,7 +231,7 @@
 
   @Override
   public void setHTML(String html) {
-    DOM.setInnerHTML(getElement(), html);
+    getElement().setInnerHTML(html);
   }
 
   /**
@@ -269,7 +269,7 @@
 
   @Override
   public void setText(String text) {
-    DOM.setInnerText(getElement(), text);
+    getElement().setInnerText(text);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java b/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
index 49d849a..57c4311 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseListenerCollection.java
@@ -64,11 +64,11 @@
    */
   public void fireMouseEvent(Widget sender, Event event) {
     final Element senderElem = sender.getElement();
-    int x = DOM.eventGetClientX(event) - DOM.getAbsoluteLeft(senderElem)
-        + DOM.getElementPropertyInt(senderElem, "scrollLeft")
+    int x = event.getClientX() - senderElem.getAbsoluteLeft()
+        + senderElem.getPropertyInt("scrollLeft")
         + Window.getScrollLeft();
-    int y = DOM.eventGetClientY(event) - DOM.getAbsoluteTop(senderElem)
-        + DOM.getElementPropertyInt(senderElem, "scrollTop")
+    int y = event.getClientY() - senderElem.getAbsoluteTop()
+        + senderElem.getPropertyInt("scrollTop")
         + Window.getScrollTop();
 
     switch (DOM.eventGetType(event)) {
@@ -85,7 +85,7 @@
         // Only fire the mouseEnter event if it's coming from outside this
         // widget.
         Element from = DOM.eventGetFromElement(event);
-        if (from == null || !DOM.isOrHasChild(senderElem, from)) {
+        if (from == null || !senderElem.isOrHasChild(from)) {
           fireMouseEnter(sender);
         }
         break;
@@ -93,7 +93,7 @@
         // Only fire the mouseLeave event if it's actually leaving this
         // widget.
         Element to = DOM.eventGetToElement(event);
-        if (to == null || !DOM.isOrHasChild(senderElem, to)) {
+        if (to == null || !senderElem.isOrHasChild(to)) {
           fireMouseLeave(sender);
         }
         break;
diff --git a/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java b/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
index 3cc8703..9f5a065 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 
 /**
@@ -43,7 +42,7 @@
    * @param e the event
    */
   public MouseWheelVelocity(Event e) {
-    vY = DOM.eventGetMouseWheelVelocityY(e);
+    vY = e.getMouseWheelVelocityY();
   }
 
   @Override
diff --git a/user/src/com/google/gwt/user/client/ui/NamedFrame.java b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
index fb65033..de95fa8 100644
--- a/user/src/com/google/gwt/user/client/ui/NamedFrame.java
+++ b/user/src/com/google/gwt/user/client/ui/NamedFrame.java
@@ -112,6 +112,6 @@
    * @return the frame's name
    */
   public String getName() {
-    return DOM.getElementProperty(getElement(), "name");
+    return getElement().getPropertyString("name");
   }
 }
diff --git a/user/src/com/google/gwt/user/client/ui/Panel.java b/user/src/com/google/gwt/user/client/ui/Panel.java
index 42515a7..2884ec4 100644
--- a/user/src/com/google/gwt/user/client/ui/Panel.java
+++ b/user/src/com/google/gwt/user/client/ui/Panel.java
@@ -162,7 +162,7 @@
     // element is still attached when onDetach()/onUnload() are called.
     Element elem = w.getElement();
     w.setParent(null);
-    DOM.removeChild(DOM.getParent(elem), elem);
+    DOM.getParent(elem).removeChild(elem);
   }
 
   @Override
diff --git a/user/src/com/google/gwt/user/client/ui/PopupPanel.java b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
index ddcad33..30f5288 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -212,7 +212,7 @@
           // Set the position attribute, and then attach to the DOM. Otherwise,
           // the PopupPanel will appear to 'jump' from its static/relative
           // position to its absolute position (issue #1231).
-          DOM.setStyleAttribute(curPanel.getElement(), "position", "absolute");
+          curPanel.getElement().getStyle().setProperty("position", "absolute");
           if (curPanel.topPosition != -1) {
             curPanel.setPopupPosition(curPanel.leftPosition,
                 curPanel.topPosition);
@@ -250,14 +250,14 @@
         impl.onHide(curPanel.getElement());
       }
       impl.setClip(curPanel.getElement(), "rect(auto, auto, auto, auto)");
-      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "visible");
+      curPanel.getElement().getStyle().setProperty("overflow", "visible");
     }
 
     @Override
     protected void onStart() {
       offsetHeight = curPanel.getOffsetHeight();
       offsetWidth = curPanel.getOffsetWidth();
-      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "hidden");
+      curPanel.getElement().getStyle().setProperty("overflow", "hidden");
       super.onStart();
     }
 
@@ -337,7 +337,7 @@
         // Set the position attribute, and then attach to the DOM. Otherwise,
         // the PopupPanel will appear to 'jump' from its static/relative
         // position to its absolute position (issue #1231).
-        DOM.setStyleAttribute(curPanel.getElement(), "position", "absolute");
+        curPanel.getElement().getStyle().setProperty("position", "absolute");
         if (curPanel.topPosition != -1) {
           curPanel.setPopupPosition(curPanel.leftPosition, curPanel.topPosition);
         }
@@ -349,7 +349,7 @@
         }
         impl.onHide(curPanel.getElement());
       }
-      DOM.setStyleAttribute(curPanel.getElement(), "overflow", "visible");
+      curPanel.getElement().getStyle().setProperty("overflow", "visible");
     }
   }
 
@@ -589,7 +589,7 @@
    * @return the popup's left position
    */
   public int getPopupLeft() {
-    return DOM.getAbsoluteLeft(getElement());
+    return getElement().getAbsoluteLeft();
   }
 
   /**
@@ -598,12 +598,12 @@
    * @return the popup's top position
    */
   public int getPopupTop() {
-    return DOM.getAbsoluteTop(getElement());
+    return getElement().getAbsoluteTop();
   }
 
   @Override
   public String getTitle() {
-    return DOM.getElementProperty(getContainerElement(), "title");
+    return getContainerElement().getPropertyString("title");
   }
 
   /**
@@ -960,8 +960,7 @@
     // Because the panel is absolutely positioned, this will not create
     // "holes" in displayed contents and it allows normal layout passes
     // to occur so the size of the PopupPanel can be reliably determined.
-    DOM.setStyleAttribute(getElement(), "visibility", visible ? "visible"
-        : "hidden");
+    getElement().getStyle().setProperty("visibility", visible ? "visible" : "hidden");
 
     // If the PopupImpl creates an iframe shim, it's also necessary to hide it
     // as well.
diff --git a/user/src/com/google/gwt/user/client/ui/SplitPanel.java b/user/src/com/google/gwt/user/client/ui/SplitPanel.java
index b0b84b2..162d472 100644
--- a/user/src/com/google/gwt/user/client/ui/SplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/SplitPanel.java
@@ -44,7 +44,7 @@
    * @param elem the element
    */
   static void addAbsolutePositoning(Element elem) {
-    DOM.setStyleAttribute(elem, "position", "absolute");
+    elem.getStyle().setProperty("position", "absolute");
   }
 
   /**
@@ -53,7 +53,7 @@
    * @param elem the element
    */
   static final void addClipping(final Element elem) {
-    DOM.setStyleAttribute(elem, "overflow", "hidden");
+    elem.getStyle().setProperty("overflow", "hidden");
   }
 
   /**
@@ -62,7 +62,7 @@
    * @param elem the element
    */
   static final void addScrolling(final Element elem) {
-    DOM.setStyleAttribute(elem, "overflow", "auto");
+    elem.getStyle().setProperty("overflow", "auto");
   }
 
   /**
@@ -107,7 +107,7 @@
    * @return the offsetHeight property
    */
   static final int getOffsetHeight(Element elem) {
-    return DOM.getElementPropertyInt(elem, "offsetHeight");
+    return elem.getPropertyInt("offsetHeight");
   }
 
   /**
@@ -117,7 +117,7 @@
    * @return the offsetWidth property
    */
   static final int getOffsetWidth(Element elem) {
-    return DOM.getElementPropertyInt(elem, "offsetWidth");
+    return elem.getPropertyInt("offsetWidth");
   }
 
   /**
@@ -131,7 +131,7 @@
   static final Element preventBoxStyles(final Element elem) {
     DOM.setIntStyleAttribute(elem, "padding", 0);
     DOM.setIntStyleAttribute(elem, "margin", 0);
-    DOM.setStyleAttribute(elem, "border", "none");
+    elem.getStyle().setProperty("border", "none");
     return elem;
   }
 
@@ -142,7 +142,7 @@
    * @param size a CSS length value for bottom
    */
   static void setBottom(Element elem, String size) {
-    DOM.setStyleAttribute(elem, "bottom", size);
+    elem.getStyle().setProperty("bottom", size);
   }
 
   /**
@@ -152,7 +152,7 @@
    * @param className the class name
    */
   static final void setClassname(final Element elem, final String className) {
-    DOM.setElementProperty(elem, "className", className);
+    elem.setPropertyString("className", className);
   }
 
   /**
@@ -162,7 +162,7 @@
    * @param height a CSS length value for the height
    */
   static final void setHeight(Element elem, String height) {
-    DOM.setStyleAttribute(elem, "height", height);
+    elem.getStyle().setProperty("height", height);
   }
 
   /**
@@ -172,7 +172,7 @@
    * @param left a CSS length value for left
    */
   static final void setLeft(Element elem, String left) {
-    DOM.setStyleAttribute(elem, "left", left);
+    elem.getStyle().setProperty("left", left);
   }
 
   /**
@@ -182,7 +182,7 @@
    * @param right a CSS length value for right
    */
   static final void setRight(Element elem, String right) {
-    DOM.setStyleAttribute(elem, "right", right);
+    elem.getStyle().setProperty("right", right);
   }
 
   /**
@@ -192,7 +192,7 @@
    * @param top a CSS length value for top
    */
   static final void setTop(Element elem, String top) {
-    DOM.setStyleAttribute(elem, "top", top);
+    elem.getStyle().setProperty("top", top);
   }
 
   /**
@@ -202,7 +202,7 @@
    * @param width a CSS length value for the width
    */
   static final void setWidth(Element elem, String width) {
-    DOM.setStyleAttribute(elem, "width", width);
+    elem.getStyle().setProperty("width", width);
   }
 
   // The enclosed widgets.
@@ -283,11 +283,11 @@
 
       case Event.ONMOUSEDOWN: {
         Element target = DOM.eventGetTarget(event);
-        if (DOM.isOrHasChild(splitElem, target)) {
-          startResizingFrom(DOM.eventGetClientX(event) - getAbsoluteLeft(),
-              DOM.eventGetClientY(event) - getAbsoluteTop());
+        if (splitElem.isOrHasChild(target)) {
+          startResizingFrom(event.getClientX() - getAbsoluteLeft(),
+              event.getClientY() - getAbsoluteTop());
           DOM.setCapture(getElement());
-          DOM.eventPreventDefault(event);
+          event.preventDefault();
         }
         break;
       }
@@ -306,9 +306,9 @@
       case Event.ONMOUSEMOVE: {
         if (isResizing()) {
           assert DOM.getCaptureElement() != null;
-          onSplitterResize(DOM.eventGetClientX(event) - getAbsoluteLeft(),
-              DOM.eventGetClientY(event) - getAbsoluteTop());
-          DOM.eventPreventDefault(event);
+          onSplitterResize(event.getClientX() - getAbsoluteLeft(),
+              event.getClientY() - getAbsoluteTop());
+          event.preventDefault();
         }
         break;
       }
@@ -414,7 +414,7 @@
         orphan(oldWidget);
       } finally {
         // Physical detach old.
-        DOM.removeChild(elements[index], oldWidget.getElement());
+        elements[index].removeChild(oldWidget.getElement());
         widgets[index] = null;
       }
     }
diff --git a/user/src/com/google/gwt/user/client/ui/StackPanel.java b/user/src/com/google/gwt/user/client/ui/StackPanel.java
index c7a8898..f1c809a 100644
--- a/user/src/com/google/gwt/user/client/ui/StackPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/StackPanel.java
@@ -65,8 +65,8 @@
 
     body = DOM.createTBody();
     DOM.appendChild(table, body);
-    DOM.setElementPropertyInt(table, "cellSpacing", 0);
-    DOM.setElementPropertyInt(table, "cellPadding", 0);
+    table.setPropertyInt("cellSpacing", 0);
+    table.setPropertyInt("cellPadding", 0);
 
     DOM.sinkEvents(table, Event.ONCLICK);
     setStyleName(DEFAULT_STYLENAME);
@@ -146,13 +146,13 @@
 
     // header styling
     setStyleName(tdh, DEFAULT_ITEM_STYLENAME, true);
-    DOM.setElementPropertyInt(tdh, "__owner", hashCode());
-    DOM.setElementProperty(tdh, "height", "1px");
+    tdh.setPropertyInt("__owner", hashCode());
+    tdh.setPropertyString("height", "1px");
 
     // body styling
     setStyleName(tdb, DEFAULT_STYLENAME + "Content", true);
-    DOM.setElementProperty(tdb, "height", "100%");
-    DOM.setElementProperty(tdb, "vAlign", "top");
+    tdb.setPropertyString("height", "100%");
+    tdb.setPropertyString("vAlign", "top");
 
     // Now that the DOM is connected, call insert (this ensures that onLoad() is
     // not fired until the child widget is attached to the DOM).
@@ -231,9 +231,9 @@
     Element tdWrapper = DOM.getChild(DOM.getChild(body, index * 2), 0);
     Element headerElem = DOM.getFirstChild(tdWrapper);
     if (asHTML) {
-      DOM.setInnerHTML(getHeaderTextElem(headerElem), text);
+      getHeaderTextElem(headerElem).setInnerHTML(text);
     } else {
-      DOM.setInnerText(getHeaderTextElem(headerElem), text);
+      getHeaderTextElem(headerElem).setInnerText(text);
     }
   }
 
@@ -300,10 +300,10 @@
 
   private int findDividerIndex(Element elem) {
     while (elem != null && elem != getElement()) {
-      String expando = DOM.getElementProperty(elem, "__index");
+      String expando = elem.getPropertyString("__index");
       if (expando != null) {
         // Make sure it belongs to me!
-        int ownerHash = DOM.getElementPropertyInt(elem, "__owner");
+        int ownerHash = elem.getPropertyInt("__owner");
         if (ownerHash == hashCode()) {
           // Yes, it's mine.
           return Integer.parseInt(expando);
@@ -324,9 +324,9 @@
       // Calculate which internal table elements to remove.
       int rowIndex = 2 * index;
       Element tr = DOM.getChild(body, rowIndex);
-      DOM.removeChild(body, tr);
+      body.removeChild(tr);
       tr = DOM.getChild(body, rowIndex);
-      DOM.removeChild(body, tr);
+      body.removeChild(tr);
 
       // Correct visible stack for new location.
       if (visibleStack == index) {
@@ -373,7 +373,7 @@
     for (int i = beforeIndex, c = getWidgetCount(); i < c; ++i) {
       Element childTR = DOM.getChild(body, i * 2);
       Element childTD = DOM.getFirstChild(childTR);
-      DOM.setElementPropertyInt(childTD, "__index", i);
+      childTD.setPropertyInt("__index", i);
 
       // Update the special style on the first element
       if (beforeIndex == 0) {
diff --git a/user/src/com/google/gwt/user/client/ui/SuggestBox.java b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
index a3e4be7..fd24c48 100644
--- a/user/src/com/google/gwt/user/client/ui/SuggestBox.java
+++ b/user/src/com/google/gwt/user/client/ui/SuggestBox.java
@@ -35,7 +35,6 @@
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.event.shared.HandlerRegistration;
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.ui.PopupPanel.AnimationType;
 import com.google.gwt.user.client.ui.SuggestOracle.Callback;
 import com.google.gwt.user.client.ui.SuggestOracle.Request;
@@ -616,7 +615,7 @@
       // menu. If the window is resized and the suggestion cannot fit on a
       // single row, it should be clipped (instead of wrapping around and
       // taking up a second row).
-      DOM.setStyleAttribute(getElement(), "whiteSpace", "nowrap");
+      getElement().getStyle().setProperty("whiteSpace", "nowrap");
       setStyleName(STYLENAME_DEFAULT);
       setSuggestion(suggestion);
     }
diff --git a/user/src/com/google/gwt/user/client/ui/TabBar.java b/user/src/com/google/gwt/user/client/ui/TabBar.java
index c2c6d39..d57cb6d 100644
--- a/user/src/com/google/gwt/user/client/ui/TabBar.java
+++ b/user/src/com/google/gwt/user/client/ui/TabBar.java
@@ -163,7 +163,7 @@
           break;
 
         case Event.ONKEYDOWN:
-          if (((char) DOM.eventGetKeyCode(event)) == KeyCodes.KEY_ENTER) {
+          if (((char) event.getKeyCode()) == KeyCodes.KEY_ENTER) {
             TabBar.this.selectTabByTabWidget(this);
           }
           TabBar.this.onKeyDown(this, (char) event.getKeyCode(),
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index 724cf3f..46120df 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -595,7 +595,7 @@
       case Event.ONKEYPRESS:
       case Event.ONKEYUP:
         // Issue 1890: Do not block history navigation via alt+left/right
-        if (DOM.eventGetAltKey(event) || DOM.eventGetMetaKey(event)) {
+        if (event.getAltKey() || event.getMetaKey()) {
           super.onBrowserEvent(event);
           return;
         }
@@ -641,7 +641,7 @@
       }
 
       case Event.ONKEYUP: {
-        if (DOM.eventGetKeyCode(event) == KeyCodes.KEY_TAB) {
+        if (event.getKeyCode() == KeyCodes.KEY_TAB) {
           ArrayList<Element> chain = new ArrayList<Element>();
           collectElementChain(chain, getElement(), DOM.eventGetTarget(event));
           TreeItem item = findItemByChain(chain, 0, root);
@@ -657,9 +657,9 @@
     switch (eventType) {
       case Event.ONKEYDOWN:
       case Event.ONKEYUP: {
-        if (KeyCodes.isArrowKey(DOM.eventGetKeyCode(event))) {
-          DOM.eventCancelBubble(event, true);
-          DOM.eventPreventDefault(event);
+        if (KeyCodes.isArrowKey(event.getKeyCode())) {
+          event.stopPropagation();
+          event.preventDefault();
           return;
         }
       }
@@ -965,9 +965,9 @@
     if (useLeafImages || treeItem.isFullNode()) {
       showImage(treeItem, images.treeLeaf());
     } else if (LocaleInfo.getCurrentLocale().isRTL()) {
-      DOM.setStyleAttribute(treeItem.getElement(), "paddingRight", indentValue);
+      treeItem.getElement().getStyle().setProperty("paddingRight", indentValue);
     } else {
-      DOM.setStyleAttribute(treeItem.getElement(), "paddingLeft", indentValue);
+      treeItem.getElement().getStyle().setProperty("paddingLeft", indentValue);
     }
   }
 
@@ -1000,10 +1000,10 @@
     TreeItem item = findItemByChain(chain, 0, root);
     if (item != null && item != root) {
       if (item.getChildCount() > 0
-          && DOM.isOrHasChild(item.getImageElement(), hElem)) {
+          && item.getImageElement().isOrHasChild(hElem)) {
         item.setState(!item.getState(), true);
         return true;
-      } else if (DOM.isOrHasChild(item.getElement(), hElem)) {
+      } else if (item.getElement().isOrHasChild(hElem)) {
         onSelection(item, true, !shouldTreeDelegateFocusToElement(hElem));
         return true;
       }
@@ -1063,22 +1063,22 @@
     setImages(images, useLeafImages);
     setElement(DOM.createDiv());
 
-    DOM.setStyleAttribute(getElement(), "position", "relative");
+    getElement().getStyle().setProperty("position", "relative");
 
     // Fix rendering problem with relatively-positioned elements and their
     // children by
     // forcing the element that is positioned relatively to 'have layout'
-    DOM.setStyleAttribute(getElement(), "zoom", "1");
+    getElement().getStyle().setProperty("zoom", "1");
 
     focusable = FocusPanel.impl.createFocusable();
-    DOM.setStyleAttribute(focusable, "fontSize", "0");
-    DOM.setStyleAttribute(focusable, "position", "absolute");
+    focusable.getStyle().setProperty("fontSize", "0");
+    focusable.getStyle().setProperty("position", "absolute");
 
     // Hide focus outline in Mozilla/Webkit/Opera
-    DOM.setStyleAttribute(focusable, "outline", "0px");
+    focusable.getStyle().setProperty("outline", "0px");
 
     // Hide focus outline in IE 6/7
-    DOM.setElementAttribute(focusable, "hideFocus", "true");
+    focusable.setAttribute("hideFocus", "true");
 
     DOM.setIntStyleAttribute(focusable, "zIndex", -1);
     DOM.appendChild(getElement(), focusable);
@@ -1099,7 +1099,7 @@
   private void keyboardNavigation(Event event) {
     // Handle keyboard events if keyboard navigation is enabled
     if (isKeyboardNavigationEnabled(curSelection)) {
-      int code = DOM.eventGetKeyCode(event);
+      int code = event.getKeyCode();
 
       switch (KeyCodes.maybeSwapArrowKeysForRtl(code, LocaleInfo.getCurrentLocale().isRTL())) {
         case KeyCodes.KEY_UP: {
@@ -1162,7 +1162,7 @@
     if (focusableWidget != null) {
       focusableWidget.setFocus(true);
       if (scrollOnSelectEnabled) {
-        DOM.scrollIntoView(((Widget) focusableWidget).getElement());
+        ((Widget) focusableWidget).getElement().scrollIntoView();
       }
     } else {
       if (scrollOnSelectEnabled) {
@@ -1172,10 +1172,10 @@
         int containerLeft = getAbsoluteLeft();
         int containerTop = getAbsoluteTop();
   
-        int left = DOM.getAbsoluteLeft(selectedElem) - containerLeft;
-        int top = DOM.getAbsoluteTop(selectedElem) - containerTop;
-        int width = DOM.getElementPropertyInt(selectedElem, "offsetWidth");
-        int height = DOM.getElementPropertyInt(selectedElem, "offsetHeight");
+        int left = selectedElem.getAbsoluteLeft() - containerLeft;
+        int top = selectedElem.getAbsoluteTop() - containerTop;
+        int width = selectedElem.getPropertyInt("offsetWidth");
+        int height = selectedElem.getPropertyInt("offsetHeight");
 
         // If the item is not visible, quite here
         if (width == 0 || height == 0) {
@@ -1186,13 +1186,13 @@
   
         // Set the focusable element's position and size to exactly underlap the
         // item's content element.
-        DOM.setStyleAttribute(focusable, "left", left + "px");
-        DOM.setStyleAttribute(focusable, "top", top + "px");
-        DOM.setStyleAttribute(focusable, "width", width + "px");
-        DOM.setStyleAttribute(focusable, "height", height + "px");
+        focusable.getStyle().setProperty("left", left + "px");
+        focusable.getStyle().setProperty("top", top + "px");
+        focusable.getStyle().setProperty("width", width + "px");
+        focusable.getStyle().setProperty("height", height + "px");
   
         // Scroll it into view.
-        DOM.scrollIntoView(focusable);
+        focusable.scrollIntoView();
       }
 
       // Update ARIA attributes to reflect the information from the
@@ -1292,7 +1292,7 @@
 
     if (!useLeafImages) {
       Image image = images.treeLeaf().createImage();
-      DOM.setStyleAttribute(image.getElement(), "visibility", "hidden");
+      image.getElement().getStyle().setProperty("visibility", "hidden");
       RootPanel.get().add(image);
       int size = image.getWidth() + TreeItem.IMAGE_PAD;
       image.removeFromParent();
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 949967b..10c916a 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeItem.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -71,7 +71,7 @@
         Element tdContent = DOM.getNextSibling(tdImg);
 
         // Undoes padding from table element.
-        DOM.setStyleAttribute(item.getElement(), "padding", "0px");
+        item.getElement().getStyle().setProperty("padding", "0px");
         DOM.appendChild(tdContent, item.contentElem);
         item.imageHolder = tdImg;
       }
@@ -91,18 +91,18 @@
         DOM.appendChild(tbody, tr);
         DOM.appendChild(tr, tdImg);
         DOM.appendChild(tr, tdContent);
-        DOM.setStyleAttribute(tdImg, "verticalAlign", "middle");
-        DOM.setStyleAttribute(tdContent, "verticalAlign", "middle");
+        tdImg.getStyle().setProperty("verticalAlign", "middle");
+        tdContent.getStyle().setProperty("verticalAlign", "middle");
         DOM.appendChild(tdContent, contentElem);
-        DOM.setStyleAttribute(contentElem, "display", "inline");
+        contentElem.getStyle().setProperty("display", "inline");
         setStyleName(contentElem, "gwt-TreeItem");
-        DOM.setStyleAttribute(BASE_INTERNAL_ELEM, "whiteSpace", "nowrap");
+        BASE_INTERNAL_ELEM.getStyle().setProperty("whiteSpace", "nowrap");
 
         // Create the base element that will be cloned
         BASE_BARE_ELEM = DOM.createDiv();
 
         // Simulates padding from table element.
-        DOM.setStyleAttribute(BASE_BARE_ELEM, "padding", "3px");
+        BASE_BARE_ELEM.getStyle().setProperty("padding", "3px");
         DOM.appendChild(BASE_BARE_ELEM, contentElem);
         Roles.getTreeitemRole().set(contentElem);
       }
@@ -116,7 +116,7 @@
     @Override
     void convertToFullNode(TreeItem item) {
       super.convertToFullNode(item);
-      DOM.setStyleAttribute(item.getElement(), "marginBottom", "0px");
+      item.getElement().getStyle().setProperty("marginBottom", "0px");
     }
   }
 
@@ -169,12 +169,12 @@
         if (opening) {
           UIObject.setVisible(curItem.childSpanElem, true);
           onUpdate(1.0);
-          DOM.setStyleAttribute(curItem.childSpanElem, "height", "auto");
+          curItem.childSpanElem.getStyle().setProperty("height", "auto");
         } else {
           UIObject.setVisible(curItem.childSpanElem, false);
         }
-        DOM.setStyleAttribute(curItem.childSpanElem, "overflow", "visible");
-        DOM.setStyleAttribute(curItem.childSpanElem, "width", "auto");
+        curItem.childSpanElem.getStyle().setProperty("overflow", "visible");
+        curItem.childSpanElem.getStyle().setProperty("width", "auto");
         curItem = null;
       }
     }
@@ -188,7 +188,7 @@
       if (!opening) {
         scrollHeight = curItem.childSpanElem.getScrollHeight();
       }
-      DOM.setStyleAttribute(curItem.childSpanElem, "overflow", "hidden");
+      curItem.childSpanElem.getStyle().setProperty("overflow", "hidden");
 
       // If the TreeItem is already open, onStart will set its height to its
       // natural height. If the TreeItem is currently closed, onStart will set
@@ -215,12 +215,11 @@
       // instead of hiding them completely.
       height = Math.max(height, 1);
 
-      DOM.setStyleAttribute(curItem.childSpanElem, "height", height + "px");
+      curItem.childSpanElem.getStyle().setProperty("height", height + "px");
 
       // We need to set the width explicitly of the item might be cropped
-      int scrollWidth = DOM.getElementPropertyInt(curItem.childSpanElem,
-          "scrollWidth");
-      DOM.setStyleAttribute(curItem.childSpanElem, "width", scrollWidth + "px");
+      int scrollWidth = curItem.childSpanElem.getPropertyInt("scrollWidth");
+      curItem.childSpanElem.getStyle().setProperty("width", scrollWidth + "px");
     }
   }
 
@@ -315,7 +314,7 @@
     Element elem = DOM.clone(BASE_BARE_ELEM, true);
     setElement(elem);
     contentElem = DOM.getFirstChild(elem);
-    DOM.setElementAttribute(contentElem, "id", DOM.createUniqueId());
+    contentElem.setAttribute("id", DOM.createUniqueId());
 
     // The root item always has children.
     if (isRoot) {
@@ -436,7 +435,7 @@
 
   @Override
   public String getHTML() {
-    return DOM.getInnerHTML(contentElem);
+    return contentElem.getInnerHTML();
   }
 
   /**
@@ -459,7 +458,7 @@
 
   @Override
   public String getText() {
-    return DOM.getInnerText(contentElem);
+    return contentElem.getInnerText();
   }
 
   /**
@@ -671,7 +670,7 @@
   @Override
   public void setHTML(String html) {
     setWidget(null);
-    DOM.setInnerHTML(contentElem, html);
+    contentElem.setInnerHTML(html);
   }
 
   @Override
@@ -727,7 +726,7 @@
   @Override
   public void setText(String text) {
     setWidget(null);
-    DOM.setInnerText(contentElem, text);
+    contentElem.setInnerText(text);
   }
 
   /**
@@ -764,7 +763,7 @@
     }
 
     // Clear out any existing content before adding a widget.
-    DOM.setInnerHTML(contentElem, "");
+    contentElem.setInnerHTML("");
 
     // Logical detach old/attach new.
     widget = newWidget;
@@ -782,7 +781,7 @@
       // order of the entire tree
 
       if (Tree.shouldTreeDelegateFocusToElement(widget.getElement())) {
-        DOM.setElementAttribute(widget.getElement(), "tabIndex", "-1");
+        widget.getElement().setAttribute("tabIndex", "-1");
       }
     }
   }
@@ -885,7 +884,7 @@
     convertToFullNode();
     childSpanElem = DOM.createDiv();
     DOM.appendChild(getElement(), childSpanElem);
-    DOM.setStyleAttribute(childSpanElem, "whiteSpace", "nowrap");
+    childSpanElem.getStyle().setProperty("whiteSpace", "nowrap");
     children = new ArrayList<TreeItem>();
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/UIObject.java b/user/src/com/google/gwt/user/client/ui/UIObject.java
index 6946edc..6f69f26 100644
--- a/user/src/com/google/gwt/user/client/ui/UIObject.java
+++ b/user/src/com/google/gwt/user/client/ui/UIObject.java
@@ -276,8 +276,7 @@
    * @return the objects's space-separated style names
    */
   protected static String getStyleName(Element elem) {
-    return DOM.getElementProperty(
-        elem.<com.google.gwt.user.client.Element> cast(), "className");
+    return elem.<com.google.gwt.user.client.Element>cast().getPropertyString("className");
   }
 
   /**
@@ -306,8 +305,7 @@
    * @param styleName the new style name
    */
   protected static void setStyleName(Element elem, String styleName) {
-    DOM.setElementProperty(elem.<com.google.gwt.user.client.Element> cast(),
-        "className", styleName);
+    elem.<com.google.gwt.user.client.Element>cast().setPropertyString("className", styleName);
   }
 
   /**
@@ -533,7 +531,7 @@
    * @return the object's absolute left position
    */
   public int getAbsoluteLeft() {
-    return DOM.getAbsoluteLeft(getElement());
+    return getElement().getAbsoluteLeft();
   }
 
   /**
@@ -543,7 +541,7 @@
    * @return the object's absolute top position
    */
   public int getAbsoluteTop() {
-    return DOM.getAbsoluteTop(getElement());
+    return getElement().getAbsoluteTop();
   }
 
   /**
@@ -569,7 +567,7 @@
    * @return the object's offset height
    */
   public int getOffsetHeight() {
-    return DOM.getElementPropertyInt(getElement(), "offsetHeight");
+    return getElement().getPropertyInt("offsetHeight");
   }
 
   /**
@@ -579,7 +577,7 @@
    * @return the object's offset width
    */
   public int getOffsetWidth() {
-    return DOM.getElementPropertyInt(getElement(), "offsetWidth");
+    return getElement().getPropertyInt("offsetWidth");
   }
 
   /**
@@ -613,7 +611,7 @@
    * @return the object's title
    */
   public String getTitle() {
-    return DOM.getElementProperty(getElement(), "title");
+    return getElement().getPropertyString("title");
   }
 
   @Override
@@ -656,7 +654,7 @@
     // This exists to deal with an inconsistency in IE's implementation where
     // it won't accept negative numbers in length measurements
     assert extractLengthValue(height.trim().toLowerCase()) >= 0 : "CSS heights should not be negative";
-    DOM.setStyleAttribute(getElement(), "height", height);
+    getElement().getStyle().setProperty("height", height);
   }
 
   /**
@@ -753,9 +751,9 @@
    */
   public void setTitle(String title) {
     if (title == null || title.length() == 0) {
-      DOM.removeElementAttribute(getElement(), "title");
+      getElement().removeAttribute("title");
     } else {
-      DOM.setElementAttribute(getElement(), "title", title);
+      getElement().setAttribute("title", title);
     }
   }
 
@@ -774,7 +772,7 @@
     // This exists to deal with an inconsistency in IE's implementation where
     // it won't accept negative numbers in length measurements
     assert extractLengthValue(width.trim().toLowerCase()) >= 0 : "CSS widths should not be negative";
-    DOM.setStyleAttribute(getElement(), "width", width);
+    getElement().getStyle().setProperty("width", width);
   }
 
   /**
@@ -814,7 +812,7 @@
     if (element == null) {
       return "(null handle)";
     }
-    return DOM.toString(getElement());
+    return getElement().getString();
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java b/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
index 6b79675..e5c1390 100644
--- a/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
+++ b/user/src/com/google/gwt/user/client/ui/ValueBoxBase.java
@@ -142,7 +142,7 @@
    */
   public void cancelKey() {
     if (currentEvent != null) {
-      DOM.eventPreventDefault(currentEvent);
+      currentEvent.preventDefault();
     }
   }
 
@@ -168,7 +168,7 @@
   }
 
   public String getName() {
-    return DOM.getElementProperty(getElement(), "name");
+    return getElement().getPropertyString("name");
   }
 
   /**
@@ -195,7 +195,7 @@
   }
 
   public String getText() {
-    return DOM.getElementProperty(getElement(), "value");
+    return getElement().getPropertyString("value");
   }
 
   /**
@@ -233,7 +233,7 @@
    *         <code>false</code> if the widget is currently editable
    */
   public boolean isReadOnly() {
-    return DOM.getElementPropertyBoolean(getElement(), "readOnly");
+    return getElement().getPropertyBoolean("readOnly");
   }
 
   @Override
@@ -276,7 +276,7 @@
   }
 
   public void setAlignment(TextAlignment align) {
-    DOM.setStyleAttribute(getElement(), "textAlign", align.getTextAlignString());
+    getElement().getStyle().setProperty("textAlign", align.getTextAlignString());
   }
 
   /**
@@ -326,7 +326,7 @@
   }
 
   public void setName(String name) {
-    DOM.setElementProperty(getElement(), "name", name);
+    getElement().setPropertyString("name", name);
   }
 
   /**
@@ -336,7 +336,7 @@
    *          <code>false</code> the widget becomes editable
    */
   public void setReadOnly(boolean readOnly) {
-    DOM.setElementPropertyBoolean(getElement(), "readOnly", readOnly);
+    getElement().setPropertyBoolean("readOnly", readOnly);
     String readOnlyStyle = "readonly";
     if (readOnly) {
       addStyleDependentName(readOnlyStyle);
@@ -381,7 +381,7 @@
    * @param text the object's new text
    */
   public void setText(String text) {
-    DOM.setElementProperty(getElement(), "value", text != null ? text : "");
+    getElement().setPropertyString("value", text != null ? text : "");
     autoDirHandler.refreshDirection();
   }
 
diff --git a/user/src/com/google/gwt/user/client/ui/VerticalPanel.java b/user/src/com/google/gwt/user/client/ui/VerticalPanel.java
index 3f12866..593de88 100644
--- a/user/src/com/google/gwt/user/client/ui/VerticalPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/VerticalPanel.java
@@ -35,8 +35,8 @@
    * Creates an empty vertical panel.
    */
   public VerticalPanel() {
-    DOM.setElementProperty(getTable(), "cellSpacing", "0");
-    DOM.setElementProperty(getTable(), "cellPadding", "0");
+    getTable().setPropertyString("cellSpacing", "0");
+    getTable().setPropertyString("cellPadding", "0");
   }
 
   @Override
@@ -88,7 +88,7 @@
     Element td = DOM.getParent(w.getElement());
     boolean removed = super.remove(w);
     if (removed) {
-      DOM.removeChild(getBody(), DOM.getParent(td));
+      getBody().removeChild(DOM.getParent(td));
     }
     return removed;
   }
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 b0a7846..2c0112c 100644
--- a/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/VerticalSplitPanel.java
@@ -75,8 +75,8 @@
   private static class Impl {
     private static void expandToFitParentHorizontally(Element elem) {
       addAbsolutePositoning(elem);
-      DOM.setStyleAttribute(elem, "left", "0");
-      DOM.setStyleAttribute(elem, "right", "0");
+      elem.getStyle().setProperty("left", "0");
+      elem.getStyle().setProperty("right", "0");
     }
 
     protected VerticalSplitPanel panel;
@@ -84,7 +84,7 @@
     public void init(VerticalSplitPanel panel) {
       this.panel = panel;
 
-      DOM.setStyleAttribute(panel.getElement(), "position", "relative");
+      panel.getElement().getStyle().setProperty("position", "relative");
 
       final Element topElem = panel.getElement(TOP);
       final Element bottomElem = panel.getElement(BOTTOM);
@@ -96,7 +96,7 @@
       expandToFitParentUsingCssOffsets(panel.container);
 
       // Snap the bottom wrapper to the bottom side.
-      DOM.setStyleAttribute(bottomElem, "bottom", "0");
+      bottomElem.getStyle().setProperty("bottom", "0");
     }
 
     public void onAttach() {
@@ -180,7 +180,7 @@
       // Prevents inherited text-align settings from interfering with the
       // panel's layout.
       elem.getStyle().setTextAlign(TextAlign.LEFT);
-      DOM.setStyleAttribute(elem, "position", "relative");
+      elem.getStyle().setProperty("position", "relative");
 
       final Element topElem = panel.getElement(TOP);
       final Element bottomElem = panel.getElement(BOTTOM);
@@ -200,7 +200,7 @@
 
     @Override
     public void onDetach() {
-      DOM.setElementProperty(panel.container, "onresize", null);
+      panel.container.setPropertyString("onresize", null);
     }
 
     @Override
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImpl.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImpl.java
index a25051b..a18da4b 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImpl.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImpl.java
@@ -44,11 +44,11 @@
   }
 
   public String getHTML() {
-    return DOM.getElementProperty(elem, "value");
+    return elem.getPropertyString("value");
   }
 
   public String getText() {
-    return DOM.getElementProperty(elem, "value");
+    return elem.getPropertyString("value");
   }
 
   public void initElement() {
@@ -72,7 +72,7 @@
   }-*/;
 
   public void setHTML(String html) {
-    DOM.setElementProperty(elem, "value", html);
+    elem.setPropertyString("value", html);
   }
 
   public void setOwner(HasInitializeHandlers owner) {
@@ -80,7 +80,7 @@
   }
 
   public void setText(String text) {
-    DOM.setElementProperty(elem, "value", text);
+    elem.setPropertyString("value", text);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE6.java b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE6.java
index 2dd3e80..f641c13 100644
--- a/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE6.java
+++ b/user/src/com/google/gwt/user/client/ui/impl/RichTextAreaImplIE6.java
@@ -16,7 +16,6 @@
 package com.google.gwt.user.client.ui.impl;
 
 import com.google.gwt.dom.client.Node;
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 
 /**
@@ -35,7 +34,7 @@
   @Override
   public Element createElement() {
     Element elem = super.createElement();
-    DOM.setElementProperty(elem, "src", "javascript:''");
+    elem.setPropertyString("src", "javascript:''");
     return elem;
   }
 
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 1ef2250..ba1b704 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
@@ -79,12 +79,12 @@
 
   @Override
   public final String getHTML() {
-    return beforeInitPlaceholder == null ? getHTMLImpl() : DOM.getInnerHTML(beforeInitPlaceholder);
+    return beforeInitPlaceholder == null ? getHTMLImpl() : beforeInitPlaceholder.getInnerHTML();
   }
 
   @Override
   public final String getText() {
-    return beforeInitPlaceholder == null ? getTextImpl() : DOM.getInnerText(beforeInitPlaceholder);
+    return beforeInitPlaceholder == null ? getTextImpl() : beforeInitPlaceholder.getInnerText();
   }
 
   @Override
@@ -222,7 +222,7 @@
     if (beforeInitPlaceholder == null) {
       setHTMLImpl(html);
     } else {
-      DOM.setInnerHTML(beforeInitPlaceholder, html);
+      beforeInitPlaceholder.setInnerHTML(html);
     }
   }
 
@@ -243,7 +243,7 @@
     if (beforeInitPlaceholder == null) {
       setTextImpl(text);
     } else {
-      DOM.setInnerText(beforeInitPlaceholder, text);
+      beforeInitPlaceholder.setInnerText(text);
     }
   }
 
@@ -296,7 +296,7 @@
     String html = getHTML();
     boolean enabled = isEnabled();
     beforeInitPlaceholder = DOM.createDiv();
-    DOM.setInnerHTML(beforeInitPlaceholder, html);
+    beforeInitPlaceholder.setInnerHTML(html);
     setEnabled(enabled);
   }
 
@@ -366,7 +366,7 @@
 
     // When the iframe is ready, ensure cached content is set.
     if (beforeInitPlaceholder != null) {
-      setHTMLImpl(DOM.getInnerHTML(beforeInitPlaceholder));
+      setHTMLImpl(beforeInitPlaceholder.getInnerHTML());
       setEnabledImpl(isEnabled());
       beforeInitPlaceholder = null;
     }
diff --git a/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java b/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
index b9fdd8b..9bef396 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DefaultCalendarView.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.aria.client.Roles;
 import com.google.gwt.aria.client.SelectedValue;
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
 import com.google.gwt.user.datepicker.client.DefaultCalendarView.CellGrid.DateCell;
 
@@ -134,7 +133,7 @@
       }
 
       private void setText(String value) {
-        DOM.setInnerText(getElement(), value);
+        getElement().setInnerText(value);
       }
     }
 
diff --git a/user/test/com/google/gwt/uibinder/test/client/ClickyLink.java b/user/test/com/google/gwt/uibinder/test/client/ClickyLink.java
index 236f444..26e16cb 100644
--- a/user/test/com/google/gwt/uibinder/test/client/ClickyLink.java
+++ b/user/test/com/google/gwt/uibinder/test/client/ClickyLink.java
@@ -45,7 +45,7 @@
    */
   public ClickyLink() {
     setElement(DOM.createAnchor());
-    DOM.setElementAttribute(getElement(), "href", "#");
+    getElement().setAttribute("href", "#");
     sinkEvents(Event.ONCLICK);
 
     addDomHandler(new ClickHandler() {
@@ -73,7 +73,7 @@
   }
 
   public String getText() {
-    return DOM.getInnerText(getElement());
+    return getElement().getInnerText();
   }
 
   public void setPopupText(String text) {
@@ -81,6 +81,6 @@
   }
 
   public void setText(String text) {
-    DOM.setInnerText(getElement(), text);
+    getElement().setInnerText(text);
   }
 }
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index 10d1e8a..977be95 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -61,7 +61,7 @@
     }
 
     for (int i = 0, n = toRemove.size(); i < n; ++i) {
-      DOM.removeChild(bodyElem, toRemove.get(i));
+      bodyElem.removeChild(toRemove.get(i));
     }
   }
 
diff --git a/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java b/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
index f44d04a..c4dfad5 100644
--- a/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CheckBoxTest.java
@@ -75,10 +75,10 @@
     cb.setText("test Text");
     assertEquals(cb.getText(), "test Text");
 
-    cb.setChecked(true);
-    assertTrue(cb.isChecked());
-    cb.setChecked(false);
-    assertFalse(cb.isChecked());
+    cb.setValue(true);
+    assertTrue(cb.getValue());
+    cb.setValue(false);
+    assertFalse(cb.getValue());
 
     cb.setValue(true);
     assertTrue(cb.getValue());
@@ -241,9 +241,9 @@
   public void testValueChangeEvent() {
     Handler h = new Handler();
     cb.addValueChangeHandler(h);
-    cb.setChecked(false);
+    cb.setValue(false);
     assertNull(h.received);
-    cb.setChecked(true);
+    cb.setValue(true);
     assertNull(h.received);
 
     cb.setValue(false);
diff --git a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
index 9f0b8e2..18e2c23 100644
--- a/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CustomButtonTest.java
@@ -23,7 +23,6 @@
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.junit.client.GWTTestCase;
 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.ui.CustomButton.Face;
 
@@ -102,8 +101,7 @@
     for (Map.Entry<String, Face> entry : faces.entrySet()) {
       Face f = entry.getValue();
       b.setCurrentFace(f);
-      String computedStyleName = DOM.getElementProperty(b.getElement(),
-          "className");
+      String computedStyleName = b.getElement().getPropertyString("className");
       assertTrue(computedStyleName.indexOf("random") == 0);
       assertTrue(computedStyleName.indexOf("random-" + f.getName()) >= 0);
       assertTrue(computedStyleName.indexOf("fobar") >= 0);
diff --git a/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java b/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java
index b37d6bb..b79d4cc 100644
--- a/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java
@@ -16,8 +16,6 @@
 
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.user.client.DOM;
-
 /**
  * Test for {@link DeckPanel}.
  */
@@ -131,15 +129,15 @@
     
     // Prepare widget, with width/height
     Label content = new Label("content");
-    DOM.setStyleAttribute(content.getElement(), "width", "5cm");
-    DOM.setStyleAttribute(content.getElement(), "height", "30mm");
+    content.getElement().getStyle().setProperty("width", "5cm");
+    content.getElement().getStyle().setProperty("height", "30mm");
     
     // Add a widget to the DeckPanel
     deck.add(content);
     
     // Verify width/height
-    assertEquals("5cm", DOM.getStyleAttribute(content.getElement(), "width"));
-    assertEquals("30mm", DOM.getStyleAttribute(content.getElement(), "height"));
+    assertEquals("5cm", content.getElement().getStyle().getProperty("width"));
+    assertEquals("30mm", content.getElement().getStyle().getProperty("height"));
   }
 
   @Override
diff --git a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
index d7b5c23..f913425 100644
--- a/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DecoratorPanelTest.java
@@ -31,7 +31,7 @@
    * @param styleName the style name the element should have
    */
   private static void assertStyleName(Element elem, String styleName) {
-    assertEquals(styleName, DOM.getElementProperty(elem, "className"));
+    assertEquals(styleName, elem.getPropertyString("className"));
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/DisclosurePanelTest.java b/user/test/com/google/gwt/user/client/ui/DisclosurePanelTest.java
index aac9f35..92ad196 100644
--- a/user/test/com/google/gwt/user/client/ui/DisclosurePanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DisclosurePanelTest.java
@@ -42,9 +42,8 @@
    */
   public void testCoreFunctionality() {
     final DisclosurePanel panel = createTestPanel();
-    assertTrue(DOM.getStyleAttribute(
-        DOM.getParent(panel.getContent().getElement()), "display").equalsIgnoreCase(
-        "none"));
+    assertTrue(DOM.getParent(panel.getContent().getElement())
+        .getStyle().getProperty("display").equalsIgnoreCase("none"));
 
     panel.setOpen(true);
 
@@ -53,9 +52,8 @@
     Timer t = new Timer() {
       @Override
       public void run() {
-        assertTrue(DOM.getStyleAttribute(
-            DOM.getParent(panel.getContent().getElement()), "display").trim().equals(
-            ""));
+        assertTrue(DOM.getParent(panel.getContent().getElement())
+            .getStyle().getProperty("display").trim().equals(""));
         finishTest();
       }
     };
diff --git a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
index b271f60..f5497f8 100644
--- a/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DockPanelTest.java
@@ -196,7 +196,8 @@
       Widget expectedChild) {
     Element panelElement = parent.getElement();
     Element childElement = expectedChild.getElement();
-    assertTrue("The parent's Element of the child must be the panel's Element", DOM.isOrHasChild(panelElement, childElement));
+    assertTrue("The parent's Element of the child must be the panel's Element", 
+        panelElement.isOrHasChild(childElement));
   }
 
   private DockPanel createDockPanel() {
diff --git a/user/test/com/google/gwt/user/client/ui/FlexTableTest.java b/user/test/com/google/gwt/user/client/ui/FlexTableTest.java
index 548d6a0..de1626c 100644
--- a/user/test/com/google/gwt/user/client/ui/FlexTableTest.java
+++ b/user/test/com/google/gwt/user/client/ui/FlexTableTest.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
 
 /**
@@ -58,7 +57,7 @@
         } else {
           if (widget != null) {
             System.err.println("row: " + row + ", col: " + col + ", widget: "
-                + DOM.toString(widget.getElement()));
+                + widget.getElement().getString());
           }
           assertNull(widget);
         }
diff --git a/user/test/com/google/gwt/user/client/ui/HasWidgetsTester.java b/user/test/com/google/gwt/user/client/ui/HasWidgetsTester.java
index 78fc776..3fb5e53 100644
--- a/user/test/com/google/gwt/user/client/ui/HasWidgetsTester.java
+++ b/user/test/com/google/gwt/user/client/ui/HasWidgetsTester.java
@@ -62,16 +62,14 @@
       // During onLoad, isAttached must be true, and the element be a descendant
       // of the body element.
       Assert.assertTrue(isAttached());
-      Assert.assertTrue(DOM.isOrHasChild(RootPanel.getBodyElement(),
-          getElement()));
+      Assert.assertTrue(RootPanel.getBodyElement().isOrHasChild(getElement()));
     }
 
     @Override
     protected void onUnload() {
       // During onUnload, everything must *still* be attached.
       Assert.assertTrue(isAttached());
-      Assert.assertTrue(DOM.isOrHasChild(RootPanel.getBodyElement(),
-          getElement()));
+      Assert.assertTrue(RootPanel.getBodyElement().isOrHasChild(getElement()));
     }
   }
 
@@ -147,14 +145,12 @@
     TestWidget widget = new TestWidget();
     adder.addChild(container, widget);
     Assert.assertTrue(widget.isAttached());
-    Assert.assertTrue(DOM.isOrHasChild(RootPanel.getBodyElement(),
-        widget.getElement()));
+    Assert.assertTrue(RootPanel.getBodyElement().isOrHasChild(widget.getElement()));
     container.remove(widget);
 
     // After removal, the widget should be detached.
     Assert.assertFalse(widget.isAttached());
-    Assert.assertFalse(DOM.isOrHasChild(RootPanel.getBodyElement(),
-        widget.getElement()));
+    Assert.assertFalse(RootPanel.getBodyElement().isOrHasChild(widget.getElement()));
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/HyperlinkTest.java b/user/test/com/google/gwt/user/client/ui/HyperlinkTest.java
index 6d2c5dc..9459c47 100644
--- a/user/test/com/google/gwt/user/client/ui/HyperlinkTest.java
+++ b/user/test/com/google/gwt/user/client/ui/HyperlinkTest.java
@@ -66,7 +66,7 @@
     Hyperlink link = new Hyperlink("foobar", TEST_HISTORY_TOKEN);
     Element element = link.getElement();
     Element anchorElement = (Element)element.getFirstChildElement();
-    String propertyString = DOM.getElementProperty(anchorElement, "href");
+    String propertyString = anchorElement.getPropertyString("href");
     int index = propertyString.indexOf('#');
     assertFalse(index == -1);
     String fragment = propertyString.substring(index + 1);
diff --git a/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java b/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
index d1e288a..a1cf423 100644
--- a/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
+++ b/user/test/com/google/gwt/user/client/ui/RadioButtonTest.java
@@ -182,24 +182,24 @@
     RootPanel.get().add(r3);
 
     // Check one button in each group
-    r2.setChecked(true);
-    r3.setChecked(true);
+    r2.setValue(true);
+    r3.setValue(true);
 
     // Move a button over
     r2.setName("group2");
 
     // Check that the correct buttons are checked
-    assertTrue(r2.isChecked());
-    assertFalse(r3.isChecked());
+    assertTrue(r2.getValue());
+    assertFalse(r3.getValue());
 
-    r1.setChecked(true);
-    assertTrue(r1.isChecked());
-    assertTrue(r2.isChecked());
+    r1.setValue(true);
+    assertTrue(r1.getValue());
+    assertTrue(r2.getValue());
 
-    r3.setChecked(true);
-    assertTrue(r1.isChecked());
-    assertFalse(r2.isChecked());
-    assertTrue(r3.isChecked());
+    r3.setValue(true);
+    assertTrue(r1.getValue());
+    assertFalse(r2.getValue());
+    assertTrue(r3.getValue());
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/SplitPanelTestBase.java b/user/test/com/google/gwt/user/client/ui/SplitPanelTestBase.java
index 72f0172..aa8809b 100644
--- a/user/test/com/google/gwt/user/client/ui/SplitPanelTestBase.java
+++ b/user/test/com/google/gwt/user/client/ui/SplitPanelTestBase.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.junit.DoNotRunWith;
 import com.google.gwt.junit.Platform;
-import com.google.gwt.user.client.DOM;
 
 /**
  * Tests both {@link HorizontalSplitPanel} and {@link VerticalSplitPanel}.
@@ -30,7 +29,7 @@
   private static Widget createMockWidget() {
     final Label label = new Label();
     label.setText("Testing 1, 2, 3");
-    DOM.setStyleAttribute(label.getElement(), "fontSize", "72pt");
+    label.getElement().getStyle().setProperty("fontSize", "72pt");
     return label;
   }
 
diff --git a/user/test/com/google/gwt/user/client/ui/TreeTest.java b/user/test/com/google/gwt/user/client/ui/TreeTest.java
index 8d170e6..ea3d8e6 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeTest.java
@@ -401,21 +401,21 @@
 
     // Start with html.
     TreeItem item = t.addItem(SafeHtmlUtils.fromSafeConstant("hello"));
-    String inner = DOM.getInnerHTML(item.getContentElem());
+    String inner = item.getContentElem().getInnerHTML();
     assertTrue(inner.indexOf("hello") >= 0);
     t.addItem(item);
     Widget goodbyeWidget = new Label("goodbye");
     item.setWidget(goodbyeWidget);
-    String innerWidget = DOM.getInnerHTML(item.getContentElem());
+    String innerWidget = item.getContentElem().getInnerHTML();
     assertFalse(innerWidget.indexOf("hello") >= 0);
 
     // Start with widget.
     Widget hello = new Label("hello");
     TreeItem widgetItem = t.addItem(hello);
-    assertTrue(DOM.getInnerHTML(widgetItem.getContentElem()).indexOf("hello") >= 0);
+    assertTrue(widgetItem.getContentElem().getInnerHTML().indexOf("hello") >= 0);
     widgetItem.setText("goodbye");
-    assertFalse(DOM.getInnerHTML(widgetItem.getContentElem()).indexOf("hello") >= 0);
-    assertTrue(DOM.getInnerHTML(widgetItem.getContentElem()).indexOf("goodbye") >= 0);
+    assertFalse(widgetItem.getContentElem().getInnerHTML().indexOf("hello") >= 0);
+    assertTrue(widgetItem.getContentElem().getInnerHTML().indexOf("goodbye") >= 0);
     assertNull(hello.getParent());
 
     // Move widget.
@@ -425,7 +425,7 @@
 
     // Set back to text.
     item.setText("aloha");
-    assertEquals("aloha", DOM.getInnerHTML(item.getContentElem()));
+    assertEquals("aloha", item.getContentElem().getInnerHTML());
     assertNull(goodbyeWidget.getParent());
     assertNull(item.getWidget());
   }
diff --git a/user/test/com/google/gwt/user/client/ui/UIObjectTest.java b/user/test/com/google/gwt/user/client/ui/UIObjectTest.java
index 96a5666..dfa2f23 100644
--- a/user/test/com/google/gwt/user/client/ui/UIObjectTest.java
+++ b/user/test/com/google/gwt/user/client/ui/UIObjectTest.java
@@ -51,7 +51,7 @@
    */
   public static void assertDebugId(String debugID, Element elem) {
     debugID = UIObject.DEBUG_ID_PREFIX + debugID;
-    assertEquals(debugID, DOM.getElementProperty(elem, "id"));
+    assertEquals(debugID, elem.getPropertyString("id"));
   }
 
   /**
@@ -68,7 +68,7 @@
   public static void assertDebugIdContents(String debugID, String contents) {
     debugID = UIObject.DEBUG_ID_PREFIX + debugID;
     Element elem = DOM.getElementById(debugID);
-    assertEquals(contents, DOM.getInnerHTML(elem));
+    assertEquals(contents, elem.getInnerHTML());
   }
 
   @Override
@@ -151,8 +151,8 @@
     assertDebugId("test2", oElem);
 
     // Test setting actual id
-    DOM.setElementProperty(oElem, "id", "mytest");
-    assertEquals("mytest", DOM.getElementProperty(oElem, "id"));
+    oElem.setPropertyString("id", "mytest");
+    assertEquals("mytest", oElem.getPropertyString("id"));
 
     // Test overriding with debug ID succeeds if ID present
     UIObject.ensureDebugId(oElem, "test3");
@@ -173,12 +173,12 @@
     assertDebugId("test2-subElem", o.subElement);
 
     // Test setting actual id
-    DOM.setElementProperty(oElem, "id", "mytest");
-    assertEquals("mytest", DOM.getElementProperty(oElem, "id"));
+    oElem.setPropertyString("id", "mytest");
+    assertEquals("mytest", oElem.getPropertyString("id"));
     assertDebugId("test2-subElem", o.subElement);
 
     // Test overriding with debug ID succeeds if ID present
-    assertEquals("mytest", DOM.getElementProperty(oElem, "id"));
+    assertEquals("mytest", oElem.getPropertyString("id"));
     o.ensureDebugId("test3");
     assertDebugId("test3", oElem);
     assertDebugId("test3-subElem", o.subElement);
@@ -363,14 +363,14 @@
   }
 
   private void assertPrimaryStyleNameEquals(UIObject o, String className) {
-    String attr = DOM.getElementProperty(o.getElement(), "className");
+    String attr = o.getElement().getPropertyString("className");
     assertTrue(attr.indexOf(className) == 0);
     assertTrue(attr.length() == className.length()
         || attr.charAt(className.length()) == ' ');
   }
 
   private boolean containsClass(UIObject o, String className) {
-    String[] classes = DOM.getElementProperty(o.getElement(), "className").split(
+    String[] classes = o.getElement().getPropertyString("className").split(
         "\\s+");
     for (int i = 0; i < classes.length; i++) {
       if (className.equals(classes[i])) {
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java b/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java
index dc6170f..6d0e951 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java
@@ -17,7 +17,6 @@
 
 import com.google.gwt.event.logical.shared.AttachEvent;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 
 /**
@@ -98,7 +97,7 @@
   static int orderIndex;
 
   static boolean isElementAttached(Element elem) {
-    return DOM.isOrHasChild(RootPanel.getBodyElement(), elem);
+    return RootPanel.getBodyElement().isOrHasChild(elem);
   }
 
   @Override
