diff --git a/user/src/com/google/gwt/junit/JUnitShell.java b/user/src/com/google/gwt/junit/JUnitShell.java
index b020a14..ad3edb7 100644
--- a/user/src/com/google/gwt/junit/JUnitShell.java
+++ b/user/src/com/google/gwt/junit/JUnitShell.java
@@ -878,7 +878,7 @@
     // TODO (amitmanjhi): Remove this hard-coding. A RunStyle somehow needs to
     // specify how it interacts with the platforms.
     return runStyle instanceof RunStyleHtmlUnit
-        && bannedPlatforms.contains(Platform.Htmlunit);
+        && bannedPlatforms.contains(Platform.HtmlUnit);
   }
 
   private void processTestResult(TestCase testCase, TestResult testResult,
diff --git a/user/src/com/google/gwt/junit/Platform.java b/user/src/com/google/gwt/junit/Platform.java
index 3928b65..fb03bf8 100644
--- a/user/src/com/google/gwt/junit/Platform.java
+++ b/user/src/com/google/gwt/junit/Platform.java
@@ -18,9 +18,9 @@
 /**
  * An enum to indicate the Platform where a test should run. In general, it
  * should be able to represent a large matrix such as: Browser * Os_combo *
- * {hosted, web} * {htmlunit, actual_browser}. For now, we just distinguish
- * between Htmlunit and non-Htmlunit platforms.
+ * {hosted, web} * {htmlUnit, actual_browser}. For now, we just distinguish
+ * between HtmlUnit and non-HtmlUnit platforms.
  */
 public enum Platform {
-  Htmlunit
+  HtmlUnit
 }
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index b3f9dde..009df34 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -65,7 +65,7 @@
   /**
    * Just make sure that reentrant behavior doesn't fail.
    */
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   public static void testReentrantCalls() {
     if (!GWT.isScript()) {
       // sample is useless in hosted mode
@@ -82,7 +82,7 @@
     assertEquals(start, end);
   }
 
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   public static void testStackTraces() {
     JsArrayString start = sample();
 
diff --git a/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java b/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
index 0637d63..97d2dc2 100644
--- a/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
+++ b/user/test/com/google/gwt/dev/jjs/test/RunAsyncMetricsIntegrationTest.java
@@ -121,7 +121,7 @@
     lwmObserver.uninstall();
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testMetricsSignalled() {
     if (!GWT.isScript()) {
       // There are no runAsync lightweight metrics in hosted mode
diff --git a/user/test/com/google/gwt/dom/client/ElementTest.java b/user/test/com/google/gwt/dom/client/ElementTest.java
index 283752c..361c8a9 100644
--- a/user/test/com/google/gwt/dom/client/ElementTest.java
+++ b/user/test/com/google/gwt/dom/client/ElementTest.java
@@ -218,7 +218,7 @@
   /**
    * scroll[Left|Top], getAbsolute[Left|Top].
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testGetAbsolutePositionWhenBodyScrolled() {
     Document doc = Document.get();
     BodyElement body = doc.getBody();
@@ -375,7 +375,7 @@
   /**
    * offset[Left|Top|Width|Height], offsetParent.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testOffsets() {
     DivElement outer = Document.get().createDivElement();
     DivElement middle = Document.get().createDivElement();
@@ -462,7 +462,7 @@
   /**
    * Tests that scrollLeft behaves as expected in RTL mode.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testScrollLeftInRtl() {
     final DivElement outer = Document.get().createDivElement();
     final DivElement inner = Document.get().createDivElement();
@@ -528,7 +528,7 @@
    */
   // TODO (amitmanjhi): Remove annotation after updating HtmlUnit. kprobst says
   // the issue has been fixed in htmlUnit trunk
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testSetInnerText() {
     Document doc = Document.get();
 
diff --git a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
index 0edb413..d885fad 100644
--- a/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
+++ b/user/test/com/google/gwt/dom/client/StyleInjectorTest.java
@@ -33,7 +33,7 @@
     return "com.google.gwt.dom.DOMTest";
   }
 
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   @SuppressWarnings("deprecation")
   public void testOldMethods() {
     final DivElement elt = Document.get().createDivElement();
@@ -62,7 +62,7 @@
   /**
    * Ensure that the IE createStyleSheet compatibility code is exercised.
    */
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   @SuppressWarnings("deprecation")
   public void testOldMethodsWithLotsOfStyles() {
     StyleElement[] elements = new StyleElement[100];
@@ -94,12 +94,12 @@
     });
   }
 
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   public void testStyleInjectorBatched() {
     testStyleInjector("testStyleInjectorBatched", false);
   }
 
-  @DoNotRunWith(value = {Platform.Htmlunit})
+  @DoNotRunWith(value = {Platform.HtmlUnit})
   public void testStyleInjectorImmediate() {
     testStyleInjector("testStyleInjectorImmediate", true);
   }
diff --git a/user/test/com/google/gwt/emultest/java/lang/StringTest.java b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
index 39fe8a1..6c00aa9 100644
--- a/user/test/com/google/gwt/emultest/java/lang/StringTest.java
+++ b/user/test/com/google/gwt/emultest/java/lang/StringTest.java
@@ -364,7 +364,7 @@
     assertEquals("ABABAB", testStr.replace('\u1111', 'A'));
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testReplaceAll() {
     String regex = hideFromCompiler("*[").replaceAll(
         "([/\\\\\\.\\*\\+\\?\\|\\(\\)\\[\\]\\{\\}])", "\\\\$1");
@@ -389,7 +389,7 @@
     assertEquals("$$x$", x5.replaceAll("(x)", "\\$\\$$1\\$"));
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testReplaceString() {
     assertEquals("foobar", hideFromCompiler("bazbar").replace("baz", "foo"));
     assertEquals("$0bar", hideFromCompiler("foobar").replace("foo", "$0"));
diff --git a/user/test/com/google/gwt/http/client/RequestBuilderTest.java b/user/test/com/google/gwt/http/client/RequestBuilderTest.java
index 4e01700..ca7b529 100644
--- a/user/test/com/google/gwt/http/client/RequestBuilderTest.java
+++ b/user/test/com/google/gwt/http/client/RequestBuilderTest.java
@@ -92,7 +92,7 @@
    * <li>url == "www.freebsd.org" - violates same source
    * </ul>
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testRequestBuilderStringString() throws RequestException {
     try {
       new RequestBuilder((RequestBuilder.Method) null, null);
diff --git a/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java b/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
index b5cf8b3..9528470 100644
--- a/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
+++ b/user/test/com/google/gwt/uibinder/sample/client/UiBinderTest.java
@@ -236,7 +236,7 @@
     WidgetBasedUi.Style style();
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testNoOverrideInheritedSharedCssClasses() {
     Bundle bundle = GWT.create(Bundle.class);
     WidgetBasedUi ui = GWT.create(WidgetBasedUi.class);
@@ -356,7 +356,7 @@
     assertNotNull(widgetUi.heartCursorResource.getUrl());
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testCssImportedScopes() {
     assertEquals(100, widgetUi.cssImportScopeSample.inner.getOffsetWidth());
   }
diff --git a/user/test/com/google/gwt/user/client/EventTest.java b/user/test/com/google/gwt/user/client/EventTest.java
index 4997547..2e6a953 100644
--- a/user/test/com/google/gwt/user/client/EventTest.java
+++ b/user/test/com/google/gwt/user/client/EventTest.java
@@ -155,7 +155,7 @@
    * Test that a double click results in exactly one simulated click event in
    * IE. See issue 3392 for more info.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testDoubleClickEvent() {
     TestLabel label = new TestLabel();
     RootPanel.get().add(label);
diff --git a/user/test/com/google/gwt/user/client/WindowTest.java b/user/test/com/google/gwt/user/client/WindowTest.java
index b06029f..9a9f82b 100644
--- a/user/test/com/google/gwt/user/client/WindowTest.java
+++ b/user/test/com/google/gwt/user/client/WindowTest.java
@@ -169,7 +169,7 @@
    * Tests the ability of the Window to get the client size correctly with and
    * without visible scroll bars.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testGetClientSize() {
 
     // NOTE: We must clear the DOM here so that previous tests do not pollute
@@ -205,7 +205,7 @@
   /**
    * Tests the ability of scroll the Window and catch scroll events.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testScrolling() {
     // Force scroll bars to appear
     Window.enableScrolling(true);
diff --git a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
index cad499d..57a7b3f 100644
--- a/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/UnicodeEscapingTest.java
@@ -202,7 +202,7 @@
    * 
    * Note that this does not test all possible combinations.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   // TODO(jat): decide if we really want to specify this behavior since some
   // browsers and OOPHM plugins have issues with it -- disabled for now
   public void disabled_testServerToClientBMPSurrogates() {
diff --git a/user/test/com/google/gwt/user/client/ui/AbsolutePanelTest.java b/user/test/com/google/gwt/user/client/ui/AbsolutePanelTest.java
index 1635e9c..df0ac9a 100644
--- a/user/test/com/google/gwt/user/client/ui/AbsolutePanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/AbsolutePanelTest.java
@@ -38,7 +38,7 @@
     absolutePanel.add(label, 10, 10);
   }
   
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testPositioning() {
     // Make an absolute panel with a label at (3, 7).
     AbsolutePanel abs = new AbsolutePanel();
diff --git a/user/test/com/google/gwt/user/client/ui/CreateEventTest.java b/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
index 611dc19..2619e15 100644
--- a/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CreateEventTest.java
@@ -239,7 +239,7 @@
   /**
    * Tests createBlurEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerBlurEvent() {
     NonBubbleAssertingEventListener listener = new NonBubbleAssertingEventListener(
         "blur") {
@@ -273,7 +273,7 @@
   /**
    * Tests createClickEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerClickEvent() {
     BubbleAssertingEventListener listener = new BubbleAssertingEventListener(
         "click") {
@@ -313,7 +313,7 @@
   /**
    * Tests createDblClickEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerDblClickEvent() {
     BubbleAssertingEventListener listener = new BubbleAssertingEventListener(
         "dblclick") {
@@ -344,7 +344,7 @@
   /**
    * Tests createErrorEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerErrorEvent() {
     ImgEventListener listener = new ImgEventListener("error");
     Event.setEventListener(parent, listener);
@@ -358,7 +358,7 @@
   /**
    * Tests createFocusEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerFocusEvent() {
     NonBubbleAssertingEventListener listener = new NonBubbleAssertingEventListener(
         "focus") {
@@ -378,7 +378,7 @@
   /**
    * Tests createKeyDownEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerKeyDownEvent() {
     KeyEventListener listener = new KeyEventListener("keydown");
     Event.setEventListener(parent, listener);
@@ -394,7 +394,7 @@
   /**
    * Tests createKeyPressEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerKeyPressEvent() {
     KeyEventListener listener = new KeyEventListener("keypress");
     Event.setEventListener(parent, listener);
@@ -410,7 +410,7 @@
   /**
    * Tests createKeyUpEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerKeyUpEvent() {
     KeyEventListener listener = new KeyEventListener("keyup");
     Event.setEventListener(parent, listener);
@@ -439,7 +439,7 @@
   /**
    * Tests createMouseDownEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerMouseDownEvent() {
     MouseEventListener listener = new MouseEventListener("mousedown");
     Event.setEventListener(parent, listener);
@@ -456,7 +456,7 @@
   /**
    * Tests createMouseMoveEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerMouseMoveEvent() {
     MouseEventListener listener = new MouseEventListener("mousemove");
     Event.setEventListener(parent, listener);
@@ -473,7 +473,7 @@
   /**
    * Tests createMouseOutEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerMouseOutEvent() {
     MouseEventListener listener = new MouseEventListener("mouseout") {
       public void onBrowserEvent(Event event) {
@@ -499,7 +499,7 @@
   /**
    * Tests createMouseOverEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerMouseOverEvent() {
     MouseEventListener listener = new MouseEventListener("mouseover") {
       public void onBrowserEvent(Event event) {
@@ -524,7 +524,7 @@
   /**
    * Tests createMouseUpEvent().
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testTriggerMouseUpEvent() {
     MouseEventListener listener = new MouseEventListener("mouseup");
     Event.setEventListener(parent, listener);
diff --git a/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java b/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
index 54a35da..ebe440b 100644
--- a/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DOMRtlTest.java
@@ -36,7 +36,7 @@
    * Tests {@link DOM#getAbsoluteLeft(Element)} for consistency when the element
    * contains children and has scrollbars.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testGetAbsolutePositionWhenScrolled() {
     assertTrue(LocaleInfo.getCurrentLocale().isRTL());
     final Element outer = DOM.createDiv();
diff --git a/user/test/com/google/gwt/user/client/ui/DOMTest.java b/user/test/com/google/gwt/user/client/ui/DOMTest.java
index b267f4d..f7b8d71 100644
--- a/user/test/com/google/gwt/user/client/ui/DOMTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DOMTest.java
@@ -292,7 +292,7 @@
    */
   // TODO (amitmanjhi): Remove annotation after updating HtmlUnit. kprobst says
   // the issue has been fixed in htmlUnit trunk
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testSetInnerText() {
     Element tableElem = DOM.createTable();
 
diff --git a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
index 58ed098..f6b2035 100644
--- a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
@@ -30,7 +30,7 @@
     return "com.google.gwt.user.User";
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testAccessors() {
     DateBox db = new DateBox();
     assertFalse(db.isDatePickerShowing());
@@ -40,7 +40,7 @@
     assertFalse(db.isDatePickerShowing());
   }
 
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testValueChangeEvent() {
 
     // Checks setValue(date, true);
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 be086cf..7ec84c2 100644
--- a/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DeckPanelTest.java
@@ -81,7 +81,7 @@
    * Test that the offsetHeight/Width of a widget are defined when the widget is
    * added to the DeckPanel.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testWidgetOffsetDimensionsOnload() {
     DeckPanel deck = new DeckPanel();
     RootPanel.get().add(deck);
diff --git a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
index 3cc558c..a5d0211 100644
--- a/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DialogBoxTest.java
@@ -87,7 +87,7 @@
     assertFalse(dialogBox.isShowing());
   }
 
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testDebugId() {
     DialogBox dBox = new DialogBox();
     dBox.setAnimationEnabled(false);
diff --git a/user/test/com/google/gwt/user/client/ui/HistoryTest.java b/user/test/com/google/gwt/user/client/ui/HistoryTest.java
index fb72aaa..7ea5857 100644
--- a/user/test/com/google/gwt/user/client/ui/HistoryTest.java
+++ b/user/test/com/google/gwt/user/client/ui/HistoryTest.java
@@ -285,7 +285,7 @@
    * Test that using an empty history token works properly. There have been
    * problems (see issue 2905) with this in the past on Safari.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testEmptyHistoryToken() {
     final ArrayList<Object> counter = new ArrayList<Object>();
 
diff --git a/user/test/com/google/gwt/user/client/ui/ImageTest.java b/user/test/com/google/gwt/user/client/ui/ImageTest.java
index 5abe47d..b89a945 100644
--- a/user/test/com/google/gwt/user/client/ui/ImageTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ImageTest.java
@@ -276,7 +276,7 @@
   /**
    * Tests the creation of an image in clipped mode.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testCreateClippedImage() {
     final Image image = new Image("counting-forwards.png", 16, 16, 16, 16);
 
@@ -361,7 +361,7 @@
    * {@link com.google.gwt.user.client.ui.Image#setUrlAndVisibleRect(String,int,int,int,int)}
    * on a clipped image.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testSetUrlAndVisibleRectOnClippedImage() {
     final Image image = new Image("counting-backwards.png", 12, 12, 12, 12);
     delayTestFinish(5000);
@@ -412,7 +412,7 @@
    * {@link com.google.gwt.user.client.ui.Image#setVisibleRect(int,int,int,int)}
    * on a clipped image.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testSetVisibleRectAndLoadEventsOnClippedImage() {
     final Image image = new Image("counting-backwards.png", 16, 16, 16, 16);
 
diff --git a/user/test/com/google/gwt/user/client/ui/ListBoxTest.java b/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
index 691d068..a251641 100644
--- a/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ListBoxTest.java
@@ -40,7 +40,7 @@
     assertEquals(0, lb.getItemCount());
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testDebugId() {
     ListBox list = new ListBox();
     list.addItem("option0", "value0");
diff --git a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
index a33f64c..aab7b47 100644
--- a/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
+++ b/user/test/com/google/gwt/user/client/ui/MenuBarTest.java
@@ -207,7 +207,7 @@
     assertNull(bar.getSelectedItem());
   }
 
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testDebugId() {
     Command emptyCommand = new Command() {
       public void execute() {
diff --git a/user/test/com/google/gwt/user/client/ui/PopupTest.java b/user/test/com/google/gwt/user/client/ui/PopupTest.java
index eb64dc0..697c7f1 100644
--- a/user/test/com/google/gwt/user/client/ui/PopupTest.java
+++ b/user/test/com/google/gwt/user/client/ui/PopupTest.java
@@ -27,7 +27,7 @@
 /**
  * Tests for {@link PopupPanel}.
  */
-@DoNotRunWith(Platform.Htmlunit)
+@DoNotRunWith(Platform.HtmlUnit)
 public class PopupTest extends GWTTestCase {
 
   /**
@@ -130,7 +130,7 @@
    * Tests that a large PopupPanel is not positioned off the top or left edges
    * of the browser window, making part of the panel unreachable.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testCenterLargePopup() {
     PopupPanel popup = new PopupPanel();
     popup.setHeight("4096px");
@@ -211,7 +211,7 @@
     }
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testPopup() {
     // Get rid of window margins so we can test absolute position.
     Window.setMargin("0px");
diff --git a/user/test/com/google/gwt/user/client/ui/RichTextAreaTest.java b/user/test/com/google/gwt/user/client/ui/RichTextAreaTest.java
index d504f19..a6ee986 100644
--- a/user/test/com/google/gwt/user/client/ui/RichTextAreaTest.java
+++ b/user/test/com/google/gwt/user/client/ui/RichTextAreaTest.java
@@ -40,7 +40,7 @@
    * IE actually preserves dynamically-created iframe contents across DOM
    * removal/re-adding).
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testAddEditRemoveAdd() {
     final RichTextArea area = new RichTextArea();
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
@@ -89,7 +89,7 @@
     }
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testFormatAfterInitialize() {
     final RichTextArea area = new RichTextArea();
 
@@ -126,7 +126,7 @@
     }
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testFormatWhenHidden() {
     final RichTextArea area = new RichTextArea();
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
@@ -148,7 +148,7 @@
   /**
    * See that the custom InitializeEvent fires.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testRichTextInitializeEvent() {
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
     final RichTextArea richTextArea = new RichTextArea();
@@ -164,7 +164,7 @@
    * Test that a delayed set of HTML is reflected. Some platforms have timing
    * subtleties that need to be tested.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testSetHTMLAfterInit() {
     final RichTextArea richTextArea = new RichTextArea();    
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
@@ -182,7 +182,7 @@
    * Test that an immediate set of HTML is reflected immediately and after the
    * area loads. Some platforms have timing subtleties that need to be tested.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testSetHTMLBeforeInit() {
     final RichTextArea richTextArea = new RichTextArea();
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
@@ -206,7 +206,7 @@
    * Test that delayed set of text is reflected. Some platforms have timing
    * subtleties that need to be tested.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testSetTextAfterInit() {
     final RichTextArea richTextArea = new RichTextArea();
     delayTestFinish(RICH_TEXT_ASYNC_DELAY);
@@ -224,7 +224,7 @@
    * Test that an immediate set of text is reflected immediately and after the
    * area loads. Some platforms have timing subtleties that need to be tested.
    */
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testSetTextBeforeInit() {
     final RichTextArea richTextArea = new RichTextArea();
     richTextArea.setText("foo");
diff --git a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
index 387ef82..b6b30fc 100644
--- a/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/StackPanelTest.java
@@ -56,7 +56,7 @@
     HasWidgetsTester.testAll(createStackPanel(), new Adder(), true);
   }
 
-  @DoNotRunWith(Platform.Htmlunit)
+  @DoNotRunWith(Platform.HtmlUnit)
   public void testDebugId() {
     final StackPanel p = createStackPanel();
     Label a = new Label("a");
diff --git a/user/test/com/google/gwt/user/client/ui/TextAreaTest.java b/user/test/com/google/gwt/user/client/ui/TextAreaTest.java
index bb4b29f..103f1c4 100644
--- a/user/test/com/google/gwt/user/client/ui/TextAreaTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TextAreaTest.java
@@ -30,7 +30,7 @@
    * designed to work on all browsers and verifies that the newlines are
    * accounted for in all browsers.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testNewline() {
     testNewline("Hello World\r\n\r\n\r\n\r\n\r\n", 15, 6, 15);
     testNewline("Hello\r\n\r\n\r\n\r\nWorld, My name is John.", 7, 3, 15);
diff --git a/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java b/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
index 7c71762..a65c876 100644
--- a/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
+++ b/user/test/com/google/gwt/user/client/ui/TextBoxBaseTestBase.java
@@ -48,7 +48,7 @@
    * Tests that {@link TextArea#setCursorPos(int)} updates the cursor position
    * correctly.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testMovingCursor() {
     TextBoxBase area = createTextBoxBase();
     RootPanel.get().add(area);
@@ -99,7 +99,7 @@
     }
   }
   
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testValueChangeEvent() {
     TextBoxBase tb = createTextBoxBase();
     // To work cross-platform, the tb must be added to the root panel.
diff --git a/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java b/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
index dc5055b..4028d06 100644
--- a/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/impl/ClippedImagePrototypeTest.java
@@ -83,7 +83,7 @@
    * {@link com.google.gwt.user.client.ui.impl.ClippedImagePrototype#applyTo(com.google.gwt.user.client.ui.Image)}
    * is called.
    */
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testApplyToClippedImage() {
     final Image image = new Image("counting-backwards.png", 12, 13, 8, 8);
 
diff --git a/user/test/com/google/gwt/xml/client/XMLTest.java b/user/test/com/google/gwt/xml/client/XMLTest.java
index 81ce61e..afe1121 100644
--- a/user/test/com/google/gwt/xml/client/XMLTest.java
+++ b/user/test/com/google/gwt/xml/client/XMLTest.java
@@ -138,7 +138,7 @@
     return "com.google.gwt.xml.XML";
   }
 
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testAttr() {
     Document d = createTestDocument();
     Element de = d.getDocumentElement();
@@ -150,7 +150,7 @@
     assertEquals(de.getAttributeNode("unset"), null);
   }
 
-  @DoNotRunWith({Platform.Htmlunit})
+  @DoNotRunWith({Platform.HtmlUnit})
   public void testCreate() {
     Document d = XMLParser.createDocument();
     CDATASection createCDATA;
