diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/DynaTableRf.gwt.xml b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/DynaTableRf.gwt.xml
index 4dd6e1d..63af732 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/DynaTableRf.gwt.xml
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/DynaTableRf.gwt.xml
@@ -22,7 +22,7 @@
   
   <inherits name='com.google.gwt.logging.Logging'/>
   <set-property name="gwt.logging.enabled" value="TRUE"/> 
-  <set-property name="gwt.logging.logLevel" value="INFO"/>
+  <set-property name="gwt.logging.logLevel" value="SEVERE"/>
   <set-property name="gwt.logging.consoleHandler" value="ENABLED" />
   <set-property name="gwt.logging.developmentModeHandler" value="ENABLED" />
   <set-property name="gwt.logging.firebugHandler" value="ENABLED" />
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/DynaTableRf.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/DynaTableRf.java
index 4f78598..377e8b2 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/DynaTableRf.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/DynaTableRf.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2007 Google Inc.
+ * Copyright 2010 Google Inc.
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
@@ -28,7 +28,6 @@
 import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
-import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.ui.RootLayoutPanel;
 import com.google.gwt.user.client.ui.Widget;
 
@@ -57,10 +56,12 @@
   @UiField(provided = true)
   DayFilterWidget filter;
 
+  /**
+   * This method sets up the top-level services used by the application.
+   */
   public void onModuleLoad() {
     GWT.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {
       public void onUncaughtException(Throwable e) {
-        Window.alert("Error: " + e.getMessage());
         log.log(Level.SEVERE, e.getMessage(), e);
       }
     });
@@ -74,6 +75,7 @@
         return requests.loggingRequest();
       }
     };
+    Logger.getLogger("").addHandler(new ErrorDialog().getHandler());
     Logger.getLogger("").addHandler(
         new RequestFactoryLogHandler(provider, Level.WARNING,
             new ArrayList<String>()));
@@ -86,5 +88,13 @@
 
     RootLayoutPanel.get().add(
         GWT.<Binder> create(Binder.class).createAndBindUi(this));
+
+    // Fast test to see if the sample is not being run from devmode
+    if (GWT.getHostPageBaseURL().startsWith("file:")) {
+      log.log(Level.SEVERE, "The DynaTableRf sample cannot be run without its"
+          + " server component.  If you are running the sample from a"
+          + " GWT distribution, use the 'ant devmode' target to launch"
+          + " the DTRF server.");
+    }
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.java
new file mode 100644
index 0000000..63f0f8c
--- /dev/null
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.sample.dynatablerf.client;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.uibinder.client.UiBinder;
+import com.google.gwt.uibinder.client.UiField;
+import com.google.gwt.uibinder.client.UiHandler;
+import com.google.gwt.user.client.Window;
+import com.google.gwt.user.client.ui.DialogBox;
+import com.google.gwt.user.client.ui.TextArea;
+
+import java.util.logging.Handler;
+import java.util.logging.Level;
+import java.util.logging.LogRecord;
+
+/**
+ * A simple glasspanel popup that terminates interaction with the application.
+ */
+class ErrorDialog {
+  interface Binder extends UiBinder<DialogBox, ErrorDialog> {
+  }
+
+  @UiField
+  DialogBox errorDialog;
+
+  @UiField
+  TextArea errorMessage;
+
+  public ErrorDialog() {
+    GWT.<Binder> create(Binder.class).createAndBindUi(this);
+  }
+
+  /**
+   * @return
+   */
+  public Handler getHandler() {
+    return new Handler() {
+      {
+        setLevel(Level.SEVERE);
+      }
+
+      @Override
+      public void close() {
+      }
+
+      @Override
+      public void flush() {
+      }
+
+      @Override
+      public void publish(LogRecord record) {
+        if (isLoggable(record)) {
+          errorMessage.setText(record.getMessage());
+          errorDialog.center();
+        }
+      }
+    };
+  }
+
+  @UiHandler("dismiss")
+  void onDismiss(ClickEvent event) {
+    errorDialog.hide();
+  }
+
+  @UiHandler("reload")
+  void onReload(ClickEvent event) {
+    Window.Location.reload();
+  }
+}
\ No newline at end of file
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.ui.xml b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.ui.xml
new file mode 100644
index 0000000..5ca904c
--- /dev/null
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/ErrorDialog.ui.xml
@@ -0,0 +1,39 @@
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'>
+  <ui:style>
+    .dialog {
+    	background: white;
+    	border: thin solid black;
+    	margin: 2px;
+    	overflow: hidden;
+    	padding: 5px;
+    	-moz-border-radius: 5px;
+    	-webkit-border-radius: 5px;
+    }
+    
+    .glass {
+    	filter: literal('alpha(opacity = 75)');
+    	opacity: 0.75;
+    	background-color: #000000;
+    }
+    
+    .message {
+    	height: 400px;
+    	width: 400px;
+    }
+  </ui:style>
+  <g:DialogBox ui:field="errorDialog" glassEnabled="true"
+    stylePrimaryName="{style.dialog}" glassStyleName="{style.glass}">
+    <g:caption>
+      <b>An unexpected application error has occurred</b>
+      <br />
+      You may wish to reload the application
+    </g:caption>
+    <g:HTMLPanel>
+      <g:TextArea ui:field="errorMessage" readOnly="true"
+        stylePrimaryName="{style.message}"></g:TextArea>
+      <br />
+      <g:Button ui:field="dismiss">Continue</g:Button>
+      <g:Button ui:field="reload">Reload</g:Button>
+    </g:HTMLPanel>
+  </g:DialogBox>
+</ui:UiBinder>
\ No newline at end of file
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/FavoritesManager.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/FavoritesManager.java
index b291835..a2696aa 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/FavoritesManager.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/FavoritesManager.java
@@ -82,14 +82,13 @@
     return favoriteIds.contains(person.stableId());
   }
 
-  public void setFavorite(PersonProxy person, boolean isFavorite) {
+  public void setFavorite(EntityProxyId<PersonProxy> id, boolean isFavorite) {
     if (isFavorite) {
-      favoriteIds.add(person.stableId());
+      favoriteIds.add(id);
     } else {
-      favoriteIds.remove(person.stableId());
+      favoriteIds.remove(id);
     }
 
-    eventBus.fireEventFromSource(new MarkFavoriteEvent(person, isFavorite),
-        this);
+    eventBus.fireEventFromSource(new MarkFavoriteEvent(id, isFavorite), this);
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/PersonEditorWorkflow.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/PersonEditorWorkflow.java
index 6e36f94..81dae75 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/PersonEditorWorkflow.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/PersonEditorWorkflow.java
@@ -30,8 +30,8 @@
 import com.google.gwt.sample.dynatablerf.client.events.EditPersonEvent;
 import com.google.gwt.sample.dynatablerf.client.widgets.PersonEditor;
 import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory;
-import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.PersonRequest;
+import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
@@ -99,38 +99,60 @@
     }, KeyUpEvent.getType());
   }
 
+  /**
+   * Called by the cancel button when it is clicked. This method will just tear
+   * down the UI and clear the state of the workflow.
+   */
   @UiHandler("cancel")
-  void onCancel(@SuppressWarnings("unused") ClickEvent event) {
+  void onCancel(ClickEvent event) {
     dialog.hide();
   }
 
+  /**
+   * Called by the edit dialog's save button. This method will flush the
+   * contents of the UI into the PersonProxy that is being edited, check for
+   * errors, and send the request to the server.
+   */
   @UiHandler("save")
-  void onSave(@SuppressWarnings("unused") ClickEvent event) {
-    // MOVE TO ACTIVITY END
+  void onSave(ClickEvent event) {
+    // Flush the contents of the UI
     RequestContext context = editorDriver.flush();
+
+    // Check for errors
     if (editorDriver.hasErrors()) {
       dialog.setText("Errors detected locally");
       return;
     }
+
+    // Send the request
     context.fire(new Receiver<Void>() {
       @Override
       public void onSuccess(Void response) {
+        // If everything went as planned, just dismiss the dialog box
         dialog.hide();
       }
 
       @Override
       public void onViolation(Set<Violation> errors) {
+        // Otherwise, show ConstraintViolations in the UI
         dialog.setText("Errors detected on the server");
         editorDriver.setViolations(errors);
       }
     });
   }
 
+  /**
+   * Called by the favorite checkbox when its value has been toggled.
+   */
   @UiHandler("favorite")
-  void onValueChanged(@SuppressWarnings("unused") ValueChangeEvent<Boolean> event) {
-    manager.setFavorite(person, favorite.getValue());
+  void onValueChanged(ValueChangeEvent<Boolean> event) {
+    manager.setFavorite(person.stableId(), favorite.getValue());
   }
 
+  /**
+   * Construct and display the UI that will be used to edit the current
+   * PersonProxy, using the given RequestContext to accumulate the edits.
+   */
   private void edit(RequestContext requestContext) {
     editorDriver = GWT.create(Driver.class);
     editorDriver.initialize(requestFactory, personEditor);
@@ -149,19 +171,23 @@
   private void fetchAndEdit() {
     // The request is configured arbitrarily
     Request<PersonProxy> fetchRequest = requestFactory.find(person.stableId());
-    // Add the paths that the EditorDelegate computes are necessary
+
+    // Add the paths that the EditorDrives computes
     fetchRequest.with(editorDriver.getPaths());
 
     // We could do more with the request, but we just fire it
-    fetchRequest.fire(new Receiver<PersonProxy>() {
+    fetchRequest.to(new Receiver<PersonProxy>() {
       @Override
       public void onSuccess(PersonProxy person) {
         PersonEditorWorkflow.this.person = person;
         // Start the edit process
         PersonRequest context = requestFactory.personRequest();
-        context.persist().using(person);
+        // Display the UI
         edit(context);
+        // Configure the method invocation to be sent in the context
+        context.persist().using(person);
+        // The context will be fire()'ed from the onSave() method
       }
-    });
+    }).fire();
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/MarkFavoriteEvent.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/MarkFavoriteEvent.java
index 0f04762..a63d1f0 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/MarkFavoriteEvent.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/MarkFavoriteEvent.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.requestfactory.shared.EntityProxyId;
 import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 
 /**
@@ -32,11 +33,11 @@
 
   public static final Type<Handler> TYPE = new Type<Handler>();
 
-  private final PersonProxy person;
+  private final EntityProxyId<PersonProxy> id;
   private final boolean isFavorite;
 
-  public MarkFavoriteEvent(PersonProxy person, boolean isFavorite) {
-    this.person = person;
+  public MarkFavoriteEvent(EntityProxyId<PersonProxy> id, boolean isFavorite) {
+    this.id = id;
     this.isFavorite = isFavorite;
   }
 
@@ -45,8 +46,8 @@
     return TYPE;
   }
 
-  public PersonProxy getPerson() {
-    return person;
+  public EntityProxyId<PersonProxy> getId() {
+    return id;
   }
 
   public boolean isFavorite() {
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.java
index 3a210a2..f4578a6 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.java
@@ -38,7 +38,7 @@
   @UiField
   ValueBoxEditorDecorator<String> state;
   @UiField
-  ValueBoxEditorDecorator<Integer> zip;
+  ValueBoxEditorDecorator<String> zip;
 
   public AddressEditor() {
     initWidget(GWT.<Binder> create(Binder.class).createAndBindUi(this));
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.ui.xml b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.ui.xml
index 52c2792..992b10c 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.ui.xml
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/AddressEditor.ui.xml
@@ -1,4 +1,5 @@
 <ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' 
+    xmlns:dt='urn:import:com.google.gwt.sample.dynatablerf.client.widgets'
     xmlns:g='urn:import:com.google.gwt.user.client.ui'
     xmlns:e='urn:import:com.google.gwt.editor.ui.client'>
   <ui:style src="../common.css">
@@ -34,7 +35,7 @@
       <e:ValueBoxEditorDecorator ui:field="zip"
         stylePrimaryName="{style.editField}">
         <e:valuebox>
-          <g:IntegerBox stylePrimaryName="{style.editField}" />
+          <dt:ZipPlusFourBox stylePrimaryName="{style.editField}" />
         </e:valuebox>
       </e:ValueBoxEditorDecorator>
       <br />
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.ui.xml b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.ui.xml
index f6ec9f9..658a9ab 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.ui.xml
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.ui.xml
@@ -1,5 +1,5 @@
-<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder' xmlns:g='urn:import:com.google.gwt.user.client.ui'
-  xmlns:dt='urn:import:com.google.gwt.sample.dynatablerf.client.widgets'>
+<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
+  xmlns:g='urn:import:com.google.gwt.user.client.ui' xmlns:dt='urn:import:com.google.gwt.sample.dynatablerf.client.widgets'>
   <ui:style>
     .all {
     	float: left;
@@ -14,23 +14,22 @@
     }
   </ui:style>
   <g:FlowPanel>
-    <dt:DayCheckBox ui:field="sunday" caption="Sunday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="monday" caption="Monday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="tuesday" caption="Tuesday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="wednesday" caption="Wednesday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="thursday" caption="Thursday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="friday" caption="Friday" day="0"
-      styleName="{style.cb}" />
-    <dt:DayCheckBox ui:field="saturday" caption="Saturday" day="0"
-      styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="sunday" caption="Sunday"
+      day="0" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="monday" caption="Monday"
+      day="1" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="tuesday" caption="Tuesday"
+      day="2" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="wednesday" caption="Wednesday"
+      day="3" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="thursday" caption="Thursday"
+      day="4" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="friday" caption="Friday"
+      day="5" styleName="{style.cb}" />
+    <dt:DayCheckBox ui:field="saturday" caption="Saturday"
+      day="6" styleName="{style.cb}" />
 
-    <g:Button ui:field="all" enabled="false" styleName="{style.all}">All</g:Button>
-    <g:Button ui:field="none" enabled="false" styleName="{style.none}">None</g:Button>
-    <g:Label>Not implemented yet</g:Label>
+    <g:Button ui:field="all" styleName="{style.all}">All</g:Button>
+    <g:Button ui:field="none" styleName="{style.none}">None</g:Button>
   </g:FlowPanel>
 </ui:UiBinder>
\ No newline at end of file
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/FavoritesWidget.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/FavoritesWidget.java
index 62e87d6..cc4b598 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/FavoritesWidget.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/FavoritesWidget.java
@@ -48,6 +48,10 @@
   interface Binder extends UiBinder<Widget, FavoritesWidget> {
   }
 
+  /**
+   * A driver that accepts a List of PersonProxy objects, controlled by a
+   * ListEditor of PersonProxy instances, displayed using NameLabels.
+   */
   interface Driver extends RequestFactoryEditorDriver<List<PersonProxy>, //
       ListEditor<PersonProxy, NameLabel>> {
   }
@@ -57,7 +61,7 @@
   }
 
   /**
-   * This is used by a ListEditor.
+   * This is used by the ListEditor to control the state of the UI.
    */
   private class NameLabelSource extends EditorSource<NameLabel> {
     @Override
@@ -86,10 +90,14 @@
   @UiField
   Style style;
 
+  /**
+   * This list is a facade provided by the ListEditor. Structural modifications
+   * to this list (e.g. add(), set(), remove()) will trigger UI update events.
+   */
   private final List<PersonProxy> displayedList;
   private final EventBus eventBus;
   private final RequestFactory factory;
-  private FavoritesManager manager;
+  private final FavoritesManager manager;
   private HandlerRegistration subscription;
 
   public FavoritesWidget(EventBus eventBus, RequestFactory factory,
@@ -111,9 +119,7 @@
     ListEditor<PersonProxy, NameLabel> listEditor = editor;
     driver.initialize(eventBus, factory, listEditor);
 
-    /*
-     * Notice the backing list is essentially anonymous.
-     */
+    // Notice the backing list is essentially anonymous.
     driver.display(new ArrayList<PersonProxy>());
 
     // Modifying this list triggers widget creation and destruction
@@ -122,19 +128,16 @@
 
   @Override
   protected void onLoad() {
+    // Subscribe to notifications from the FavoritesManager
     subscription = manager.addMarkFavoriteHandler(new MarkFavoriteEvent.Handler() {
       public void onMarkFavorite(MarkFavoriteEvent event) {
         FavoritesWidget.this.onMarkFavorite(event);
       }
     });
 
+    // Initialize the UI with the existing list of favorites
     for (EntityProxyId<PersonProxy> id : manager.getFavoriteIds()) {
-      factory.find(id).fire(new Receiver<PersonProxy>() {
-        @Override
-        public void onSuccess(PersonProxy person) {
-          onMarkFavorite(new MarkFavoriteEvent(person, true));
-        }
-      });
+      onMarkFavorite(new MarkFavoriteEvent(id, true));
     }
   }
 
@@ -143,31 +146,36 @@
     subscription.removeHandler();
   }
 
-  void onMarkFavorite(MarkFavoriteEvent event) {
-    PersonProxy person = event.getPerson();
-    if (person == null) {
+  private void onMarkFavorite(MarkFavoriteEvent event) {
+    EntityProxyId<PersonProxy> id = event.getId();
+    if (id == null) {
       return;
     }
 
     // EntityProxies should be compared by stable id
-    EntityProxyId<PersonProxy> lookFor = person.stableId();
     PersonProxy found = null;
     for (PersonProxy displayed : displayedList) {
-      if (displayed.stableId().equals(lookFor)) {
+      if (displayed.stableId().equals(id)) {
         found = displayed;
         break;
       }
     }
 
     if (event.isFavorite() && found == null) {
-      displayedList.add(person);
+      factory.find(id).to(new Receiver<PersonProxy>() {
+        @Override
+        public void onSuccess(PersonProxy response) {
+          displayedList.add(response);
+          sortDisplayedList();
+        }
+      }).fire();
     } else if (!event.isFavorite() && found != null) {
-      displayedList.remove(person);
-    } else {
-      // No change
-      return;
+      displayedList.remove(found);
+      sortDisplayedList();
     }
+  }
 
+  private void sortDisplayedList() {
     // Sorting the list of PersonProxies will also change the UI display
     Collections.sort(displayedList, new Comparator<PersonProxy>() {
       public int compare(PersonProxy o1, PersonProxy o2) {
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/MentorSelector.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/MentorSelector.java
index 7925ceb..b48101f 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/MentorSelector.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/MentorSelector.java
@@ -74,7 +74,7 @@
   }
 
   @UiHandler("choose")
-  void onChoose(@SuppressWarnings("unused") ClickEvent event) {
+  void onChoose(ClickEvent event) {
     setEnabled(false);
     factory.schoolCalendarRequest().getRandomPerson().to(
         new Receiver<PersonProxy>() {
@@ -87,7 +87,7 @@
   }
 
   @UiHandler("clear")
-  void onClear(@SuppressWarnings("unused") ClickEvent event) {
+  void onClear(ClickEvent event) {
     setValue(null);
   }
 
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/NameLabel.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/NameLabel.java
index d7ebe00..b169461 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/NameLabel.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/NameLabel.java
@@ -31,6 +31,10 @@
  * the displayed object.
  */
 class NameLabel extends Composite implements ValueAwareEditor<PersonProxy> {
+  /**
+   * Many of the GWT UI widgets that implement TakesValue also implement
+   * IsEditor and are directly usable as sub-Editors.
+   */
   final Label nameEditor = new Label();
   private PersonProxy person;
   private HandlerRegistration subscription;
@@ -59,7 +63,9 @@
   }
 
   public void setDelegate(EditorDelegate<PersonProxy> delegate) {
-    assert subscription == null;
+    if (subscription != null) {
+      subscription.removeHandler();
+    }
     subscription = delegate.subscribe();
   }
 
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/SummaryWidget.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/SummaryWidget.java
index 348d2f2..213fd21 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/SummaryWidget.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/SummaryWidget.java
@@ -15,8 +15,12 @@
  */
 package com.google.gwt.sample.dynatablerf.client.widgets;
 
+import static com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.SchoolCalendarRequest.ALL_DAYS;
+
 import com.google.gwt.cell.client.TextCell;
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.core.client.Scheduler;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.requestfactory.shared.EntityProxyChange;
@@ -28,15 +32,15 @@
 import com.google.gwt.sample.dynatablerf.client.events.FilterChangeEvent;
 import com.google.gwt.sample.dynatablerf.shared.AddressProxy;
 import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory;
-import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.PersonRequest;
+import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.uibinder.client.UiHandler;
 import com.google.gwt.user.cellview.client.CellTable;
 import com.google.gwt.user.cellview.client.Column;
-import com.google.gwt.user.cellview.client.SimplePager;
 import com.google.gwt.user.cellview.client.HasKeyboardSelectionPolicy.KeyboardSelectionPolicy;
+import com.google.gwt.user.cellview.client.SimplePager;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.DockLayoutPanel;
 import com.google.gwt.user.client.ui.Widget;
@@ -45,6 +49,7 @@
 import com.google.gwt.view.client.SelectionChangeEvent;
 import com.google.gwt.view.client.SingleSelectionModel;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -111,13 +116,13 @@
   CellTable<PersonProxy> table;
 
   private final EventBus eventBus;
+  private List<Boolean> filter = new ArrayList<Boolean>(ALL_DAYS);
+  private int lastFetch;
   private final int numRows;
+  private boolean pending;
   private final DynaTableRequestFactory requestFactory;
   private final SingleSelectionModel<PersonProxy> selectionModel = new SingleSelectionModel<PersonProxy>();
 
-  private boolean[] filter = new boolean[] {
-      true, true, true, true, true, true, true};
-
   public SummaryWidget(EventBus eventBus,
       DynaTableRequestFactory requestFactory, int numRows) {
     this.eventBus = eventBus;
@@ -148,8 +153,16 @@
 
     FilterChangeEvent.register(eventBus, new FilterChangeEvent.Handler() {
       public void onFilterChanged(FilterChangeEvent e) {
-        filter[e.getDay()] = e.isSelected();
-        fetch(0);
+        filter.set(e.getDay(), e.isSelected());
+        if (!pending) {
+          pending = true;
+          Scheduler.get().scheduleFinally(new ScheduledCommand() {
+            public void execute() {
+              pending = false;
+              fetch(0);
+            }
+          });
+        }
       }
     });
 
@@ -162,8 +175,8 @@
     fetch(0);
   }
 
-  @UiHandler("create") 
-  void onCreate(@SuppressWarnings("unused") ClickEvent event) {
+  @UiHandler("create")
+  void onCreate(ClickEvent event) {
     PersonRequest context = requestFactory.personRequest();
     AddressProxy address = context.create(AddressProxy.class);
     PersonProxy person = context.edit(context.create(PersonProxy.class));
@@ -173,6 +186,12 @@
   }
 
   void onPersonChanged(EntityProxyChange<PersonProxy> event) {
+    if (WriteOperation.PERSIST.equals(event.getWriteOperation())) {
+      // Re-fetch if we're already displaying the last page
+      if (table.isRowCountExact()) {
+        fetch(lastFetch + 1);
+      }
+    }
     if (WriteOperation.UPDATE.equals(event.getWriteOperation())) {
       EntityProxyId<PersonProxy> personId = event.getProxyId();
 
@@ -213,14 +232,15 @@
   }
 
   private void fetch(final int start) {
-    // XXX add back filter
-    requestFactory.schoolCalendarRequest().getPeople(start, numRows).fire(
+    lastFetch = start;
+    requestFactory.schoolCalendarRequest().getPeople(start, numRows, filter).fire(
         new Receiver<List<PersonProxy>>() {
           @Override
           public void onSuccess(List<PersonProxy> response) {
             int responses = response.size();
             table.setRowData(start, response);
-            if (!table.isRowCountExact()) {
+            pager.setPageStart(start);
+            if (start == 0 || !table.isRowCountExact()) {
               table.setRowCount(start + responses, responses < numRows);
             }
           }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/ZipPlusFourBox.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/ZipPlusFourBox.java
new file mode 100644
index 0000000..f035f77
--- /dev/null
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/ZipPlusFourBox.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.sample.dynatablerf.client.widgets;
+
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.regexp.shared.RegExp;
+import com.google.gwt.text.shared.Parser;
+import com.google.gwt.text.shared.Renderer;
+import com.google.gwt.user.client.ui.ValueBox;
+
+import java.io.IOException;
+import java.text.ParseException;
+
+/**
+ * A simple implementation of a US zip code input field.
+ * <p>
+ * Accepted formats are <code>ddddd</code> or <code>ddddd-dddd</code>.
+ */
+public class ZipPlusFourBox extends ValueBox<String> {
+  private static final RegExp PATTERN = RegExp.compile("^\\d{5}(-\\d{4})?$");
+  private static final Renderer<String> RENDERER = new Renderer<String>() {
+    public String render(String object) {
+      if (object == null) {
+        return null;
+      }
+      StringBuilder sb = new StringBuilder(String.valueOf(object));
+      if (sb.length() == 9) {
+        sb.insert(5, '-');
+      }
+      return sb.toString();
+    }
+
+    public void render(String object, Appendable appendable) throws IOException {
+      appendable.append(render(object));
+    }
+  };
+  private static final Parser<String> PARSER = new Parser<String>() {
+    public String parse(CharSequence text) throws ParseException {
+      switch (text.length()) {
+        case 9:
+          text = text.subSequence(0, 5) + "-" + text.subSequence(5, 9);
+          // Fall-though intentional
+          // CHECKSTYLE_OFF
+        case 5:
+          // Fall-through intentional
+        case 10:
+          // CHECKSTYLE_ON
+          if (PATTERN.test(text.toString())) {
+            return text.toString();
+          } else {
+            throw new ParseException("Illegal value", 0);
+          }
+      }
+      throw new ParseException("Illegal length", 0);
+    }
+  };
+
+  public ZipPlusFourBox() {
+    super(Document.get().createTextInputElement(), RENDERER, PARSER);
+  }
+}
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Address.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Address.java
index b87ee48..c7059bd 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Address.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Address.java
@@ -19,6 +19,7 @@
 
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
 import javax.validation.constraints.Size;
 
 /**
@@ -53,8 +54,8 @@
   private Integer version = 0;
 
   @NotNull
-  @DecimalMin("10000")
-  private Integer zip;
+  @Pattern(regexp = "\\d{5}(-\\d{4})?")
+  private String zip;
 
   public Address() {
   }
@@ -92,7 +93,7 @@
     return version;
   }
 
-  public Integer getZip() {
+  public String getZip() {
     return zip;
   }
 
@@ -129,7 +130,7 @@
     this.version = version;
   }
 
-  public void setZip(Integer zip) {
+  public void setZip(String zip) {
     this.zip = zip;
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Person.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Person.java
index d7eec2d..3c10fd8 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Person.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Person.java
@@ -15,8 +15,12 @@
  */
 package com.google.gwt.sample.dynatablerf.domain;
 
+import static com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.SchoolCalendarRequest.ALL_DAYS;
+
 import com.google.gwt.sample.dynatablerf.server.SchoolCalendarService;
 
+import java.util.List;
+
 import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
@@ -69,8 +73,7 @@
 
   private String note;
 
-  private final boolean[] daysFilters = new boolean[] {
-      true, true, true, true, true, true, true};
+  private List<Boolean> daysFilters = ALL_DAYS;
 
   public Person() {
   }
@@ -129,7 +132,7 @@
     return getScheduleWithFilter(daysFilters);
   }
 
-  public String getScheduleWithFilter(boolean[] daysFilter) {
+  public String getScheduleWithFilter(List<Boolean> daysFilter) {
     return classSchedule.getDescription(daysFilter);
   }
 
@@ -158,10 +161,9 @@
     this.address.copyFrom(address);
   }
 
-  public void setDaysFilter(boolean[] daysFilter) {
-    assert daysFilter.length == this.daysFilters.length;
-    System.arraycopy(daysFilter, 0, this.daysFilters, 0,
-        this.daysFilters.length);
+  public void setDaysFilter(List<Boolean> daysFilter) {
+    assert daysFilter.size() == this.daysFilters.size();
+    this.daysFilters = daysFilter;
   }
 
   public void setDescription(String description) {
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Schedule.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Schedule.java
index 6a7cfad..14b6ddb 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Schedule.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/domain/Schedule.java
@@ -32,10 +32,10 @@
     timeSlots.add(timeSlot);
   }
 
-  public String getDescription(boolean[] daysFilter) {
+  public String getDescription(List<Boolean> daysFilter) {
     String s = null;
     for (TimeSlot timeSlot : timeSlots) {
-      if (daysFilter[timeSlot.getDayOfWeek()]) {
+      if (daysFilter.get(timeSlot.getDayOfWeek())) {
         if (s == null) {
           s = timeSlot.getDescription();
         } else {
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/AddressFuzzer.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/AddressFuzzer.java
index 16bcc4d..25bdb93 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/AddressFuzzer.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/AddressFuzzer.java
@@ -49,6 +49,11 @@
     a.setStreet(r.nextInt(4096) + " "
         + STREET_NAMES[r.nextInt(STREET_NAMES.length)]);
     a.setState(STATE_NAMES[r.nextInt(STATE_NAMES.length)]);
-    a.setZip(10000 + r.nextInt(89999));
+    StringBuilder zip = new StringBuilder();
+    zip.append(String.format("%05d", r.nextInt(99999)));
+    if (r.nextBoolean()) {
+      zip.append(String.format("-%04d", r.nextInt(9999)));
+    }
+    a.setZip(zip.toString());
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/PersonSource.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/PersonSource.java
index 08ec81c..19b06e5 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/PersonSource.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/PersonSource.java
@@ -15,17 +15,24 @@
  */
 package com.google.gwt.sample.dynatablerf.server;
 
+import static com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.SchoolCalendarRequest.ALL_DAYS;
+import static com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.SchoolCalendarRequest.NO_DAYS;
+
 import com.google.gwt.sample.dynatablerf.domain.Address;
 import com.google.gwt.sample.dynatablerf.domain.Person;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
- * 
+ * Provides a number of Person objects as a demonstration datasource. Many of
+ * the operations in this implementation would be much more efficient in a real
+ * database, but are implemented is a straightforward fashion because they're
+ * not really important for understanding the RequestFactory framework.
  */
 public abstract class PersonSource {
   static class Backing extends PersonSource {
@@ -43,7 +50,7 @@
 
     @Override
     public List<Person> getPeople(int startIndex, int maxCount,
-        boolean[] daysFilter) {
+        List<Boolean> daysFilter) {
       int peopleCount = countPeople();
 
       int start = startIndex;
@@ -55,8 +62,31 @@
       if (start == end) {
         return Collections.emptyList();
       }
-      // This is ugly, but a real backend would have a skip mechanism
-      return new ArrayList<Person>(people.values()).subList(start, end);
+
+      // If there's a simple filter, use a fast path
+      if (ALL_DAYS.equals(daysFilter)) {
+        return new ArrayList<Person>(people.values()).subList(start, end);
+      } else if (NO_DAYS.equals(daysFilter)) {
+        return new ArrayList<Person>();
+      }
+
+      /*
+       * Otherwise, iterate from the start position until we collect enough
+       * People or hit the end of the list.
+       */
+      Iterator<Person> it = people.values().iterator();
+      int skipped = 0;
+      List<Person> toReturn = new ArrayList<Person>(maxCount);
+      while (toReturn.size() < maxCount && it.hasNext()) {
+        Person person = it.next();
+        if (person.getScheduleWithFilter(daysFilter).length() > 0) {
+          if (skipped++ < startIndex) {
+            continue;
+          }
+          toReturn.add(person);
+        }
+      }
+      return toReturn;
     }
 
     @Override
@@ -107,13 +137,13 @@
 
     @Override
     public List<Person> getPeople(int startIndex, int maxCount,
-        boolean[] daysFilter) {
+        List<Boolean> daysFilter) {
       List<Person> toReturn = new ArrayList<Person>(maxCount);
       for (Person person : backingStore.getPeople(startIndex, maxCount,
           daysFilter)) {
         Person copy = findPerson(person.getId());
-        toReturn.add(copy);
         copy.setDaysFilter(daysFilter);
+        toReturn.add(copy);
       }
       return toReturn;
     }
@@ -155,7 +185,7 @@
   public abstract Person findPerson(String id);
 
   public abstract List<Person> getPeople(int startIndex, int maxCount,
-      boolean[] daysFilter);
+      List<Boolean> daysFilter);
 
   public abstract void persist(Address address);
 
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/SchoolCalendarService.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/SchoolCalendarService.java
index 7bcdcd3..5493cd7 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/SchoolCalendarService.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/server/SchoolCalendarService.java
@@ -15,6 +15,8 @@
  */
 package com.google.gwt.sample.dynatablerf.server;
 
+import static com.google.gwt.sample.dynatablerf.shared.DynaTableRequestFactory.SchoolCalendarRequest.ALL_DAYS;
+
 import com.google.gwt.sample.dynatablerf.domain.Address;
 import com.google.gwt.sample.dynatablerf.domain.Person;
 
@@ -33,8 +35,6 @@
  * The server side service class.
  */
 public class SchoolCalendarService implements Filter {
-  private static final boolean[] ALL_DAYS = new boolean[] {
-      true, true, true, true, true, true, true};
 
   private static final ThreadLocal<PersonSource> PERSON_SOURCE = new ThreadLocal<PersonSource>();
 
@@ -50,8 +50,10 @@
     return PERSON_SOURCE.get().findPerson(id);
   }
 
-  public static List<Person> getPeople(int startIndex, int maxCount) {
-    return getPeople(startIndex, maxCount, ALL_DAYS);
+  public static List<Person> getPeople(int startIndex, int maxCount,
+      List<Boolean> filter) {
+    checkPersonSource();
+    return PERSON_SOURCE.get().getPeople(startIndex, maxCount, filter);
   }
 
   public static Person getRandomPerson() {
@@ -77,15 +79,6 @@
     }
   }
 
-  /**
-   * XXX private due to inability to add method overloads.
-   */
-  private static List<Person> getPeople(int startIndex, int maxCount,
-      boolean[] filter) {
-    checkPersonSource();
-    return PERSON_SOURCE.get().getPeople(startIndex, maxCount, filter);
-  }
-
   private PersonSource backingStore;
 
   public void destroy() {
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/AddressProxy.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/AddressProxy.java
index 3f59f78..f96e5c8 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/AddressProxy.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/AddressProxy.java
@@ -31,7 +31,7 @@
 
   String getStreet();
 
-  Integer getZip();
+  String getZip();
 
   void setCity(String city);
 
@@ -39,7 +39,7 @@
 
   void setStreet(String street);
 
-  void setZip(Integer zip);
+  void setZip(String zip);
 
   EntityProxyId<AddressProxy> stableId();
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/DynaTableRequestFactory.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/DynaTableRequestFactory.java
index f7aa832..0a0e38a 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/DynaTableRequestFactory.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/shared/DynaTableRequestFactory.java
@@ -25,6 +25,8 @@
 import com.google.gwt.sample.dynatablerf.domain.Person;
 import com.google.gwt.sample.dynatablerf.server.SchoolCalendarService;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -54,7 +56,14 @@
    */
   @Service(SchoolCalendarService.class)
   interface SchoolCalendarRequest extends RequestContext {
-    Request<List<PersonProxy>> getPeople(int startIndex, int maxCount);
+    List<Boolean> ALL_DAYS = Collections.unmodifiableList(Arrays.asList(true,
+        true, true, true, true, true, true));
+    List<Boolean> NO_DAYS = Collections.unmodifiableList(Arrays.asList(false,
+        false, false, false, false, false, false));
+
+    Request<List<PersonProxy>> getPeople(int startIndex, int maxCount,
+        List<Boolean> dayFilter);
+
     Request<PersonProxy> getRandomPerson();
   }
 
diff --git a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstants.java b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstants.java
index 8f10a94..7dec58d 100644
--- a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstants.java
+++ b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstants.java
@@ -5,12 +5,12 @@
 
 public interface NumberFormatConstants extends Constants {
   /**
-   * @return the localized decimal separator
+   * Returns the localized decimal separator.
    */
   String decimalSeparator();
 
   /**
-   * @return the localized thousands separator
+   * Returns the localized thousands separator.
    */
   String thousandsSeparator();
 }
diff --git a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsAnnot.java b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsAnnot.java
index 074705b..34384a5 100644
--- a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsAnnot.java
+++ b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsAnnot.java
@@ -5,13 +5,13 @@
 
 public interface NumberFormatConstantsAnnot extends Constants {
   /**
-   * @return the localized decimal separator
+   * Returns the localized decimal separator.
    */
   @DefaultStringValue(".")
   String decimalSeparator();
 
   /**
-   * @return the localized thousands separator
+   * Returns the localized thousands separator.
    */
   @DefaultStringValue(",")
   String thousandsSeparator();
diff --git a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithAltKey.java b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithAltKey.java
index 770b894..735c20a 100644
--- a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithAltKey.java
+++ b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithAltKey.java
@@ -5,13 +5,13 @@
 
 public interface NumberFormatConstantsWithAltKey extends Constants {
   /**
-   * @return the localized decimal separator
+   * Returns the localized decimal separator.
    */
   @Key("fmt.sep.decimal")
   String decimalSeparator();
 
   /**
-   * @return the localized thousands separator
+   * Returns the localized thousands separator.
    */
   @Key("fmt.sep.thousands")
   String thousandsSeparator();
diff --git a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithLookup.java b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithLookup.java
index 5d40fbe..a47d16b 100644
--- a/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithLookup.java
+++ b/user/javadoc/com/google/gwt/examples/i18n/NumberFormatConstantsWithLookup.java
@@ -4,12 +4,12 @@
 
 public interface NumberFormatConstantsWithLookup extends ConstantsWithLookup {
   /**
-   * @return the localized decimal separator
+   * Returns the localized decimal separator.
    */
   String decimalSeparator();
 
   /**
-   * @return the localized thousands separator
+   * Returns the localized thousands separator.
    */
   String thousandsSeparator();
 }
diff --git a/user/src/com/google/gwt/activity/shared/AbstractActivity.java b/user/src/com/google/gwt/activity/shared/AbstractActivity.java
index a4cfd70..59e596c 100644
--- a/user/src/com/google/gwt/activity/shared/AbstractActivity.java
+++ b/user/src/com/google/gwt/activity/shared/AbstractActivity.java
@@ -16,11 +16,6 @@
 package com.google.gwt.activity.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Simple Activity implementation that is always willing to stop,
  * and does nothing onStop and onCancel.
  */
diff --git a/user/src/com/google/gwt/activity/shared/Activity.java b/user/src/com/google/gwt/activity/shared/Activity.java
index a197523..f141171 100644
--- a/user/src/com/google/gwt/activity/shared/Activity.java
+++ b/user/src/com/google/gwt/activity/shared/Activity.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,11 +19,6 @@
 import com.google.gwt.user.client.ui.AcceptsOneWidget;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Implemented by objects that control a piece of user interface, with a life
  * cycle managed by an {@link ActivityManager}, in response to
  * {@link com.google.gwt.place.shared.PlaceChangeEvent} events as the user
@@ -32,7 +27,7 @@
 public interface Activity {
   /**
    * Called when the user is trying to navigate away from this activity.
-   * 
+   *
    * @return A message to display to the user, e.g. to warn of unsaved work, or
    *         null to say nothing
    */
@@ -53,14 +48,14 @@
   /**
    * Called when the Activity should ready its widget for the user. When the
    * widget is ready (typically after an RPC response has been received),
-   * receiver should present it by calling {@link AcceptsOneWidget#setWidget}
-   * on the given panel.
+   * receiver should present it by calling
+   * {@link AcceptsOneWidget#setWidget(IsWidget)} on the given panel.
    * <p>
    * Any handlers attached to the provided event bus will be de-registered when
    * the activity is stopped, so activities will rarely need to hold on to the
    * {@link com.google.gwt.event.shared.HandlerRegistration HandlerRegistration}
    * instances returned by {@link EventBus#addHandler}.
-   * 
+   *
    * @param panel the panel to display this activity's widget when it is ready
    * @param eventBus the event bus
    */
diff --git a/user/src/com/google/gwt/activity/shared/ActivityManager.java b/user/src/com/google/gwt/activity/shared/ActivityManager.java
index 6be2d6d..7043665 100644
--- a/user/src/com/google/gwt/activity/shared/ActivityManager.java
+++ b/user/src/com/google/gwt/activity/shared/ActivityManager.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -28,11 +28,6 @@
 import java.util.Set;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Manages {@link Activity} objects that should be kicked off in response to
  * {@link PlaceChangeEvent} events. Each activity can start itself
  * asynchronously, and provides a widget to be shown when it's ready to run.
@@ -79,7 +74,7 @@
 
   /**
    * Create an ActivityManager. Next call {@link #setDisplay}.
-   * 
+   *
    * @param mapper finds the {@link Activity} for a given
    *          {@link com.google.gwt.place.shared.Place}
    * @param eventBus source of {@link PlaceChangeEvent} and
@@ -92,7 +87,7 @@
   }
 
   /**
-   * Deactive the current activity, find the next one from our ActivityMapper,
+   * Deactivate the current activity, find the next one from our ActivityMapper,
    * and start it.
    * <p>
    * The current activity's widget will be hidden immediately, which can cause
@@ -101,7 +96,7 @@
    * this by providing a widget immediately, with some kind of "loading"
    * treatment.
    * 
-   * @see PlaceChangeEvent.Handler#onPlaceChange(PlaceChangeEvent)
+   * @see com.google.gwt.place.shared.PlaceChangeEvent.Handler#onPlaceChange(PlaceChangeEvent)
    */
   public void onPlaceChange(PlaceChangeEvent event) {
     Activity nextActivity = getNextActivity(event);
@@ -182,7 +177,7 @@
   /**
    * Reject the place change if the current activity is not willing to stop.
    * 
-   * @see PlaceChangeRequestEvent.Handler#onPlaceChangeRequest(PlaceChangeRequestEvent)
+   * @see com.google.gwt.place.shared.PlaceChangeRequestEvent.Handler#onPlaceChangeRequest(PlaceChangeRequestEvent)
    */
   public void onPlaceChangeRequest(PlaceChangeRequestEvent event) {
     if (!currentActivity.equals(NULL_ACTIVITY)) {
diff --git a/user/src/com/google/gwt/activity/shared/ActivityMapper.java b/user/src/com/google/gwt/activity/shared/ActivityMapper.java
index f9c95a9..aa404fb 100644
--- a/user/src/com/google/gwt/activity/shared/ActivityMapper.java
+++ b/user/src/com/google/gwt/activity/shared/ActivityMapper.java
@@ -18,11 +18,6 @@
 import com.google.gwt.place.shared.Place;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Finds the activity to run for a given {@link Place}, used to configure
  * an {@link ActivityManager}.
  */
diff --git a/user/src/com/google/gwt/cell/client/DatePickerCell.java b/user/src/com/google/gwt/cell/client/DatePickerCell.java
index 65ca6ef..236fb03 100644
--- a/user/src/com/google/gwt/cell/client/DatePickerCell.java
+++ b/user/src/com/google/gwt/cell/client/DatePickerCell.java
@@ -137,10 +137,16 @@
     // Hide the panel and call valueUpdater.update when a date is selected
     datePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
       public void onValueChange(ValueChangeEvent<Date> event) {
+        // Remember the values before hiding the popup.
+        Element cellParent = lastParent;
+        Date oldValue = lastValue;
+        Object key = lastKey;
         panel.hide();
+
+        // Update the cell and value updater.
         Date date = event.getValue();
-        setViewData(lastKey, date);
-        setValue(lastParent, lastValue, lastKey);
+        setViewData(key, date);
+        setValue(cellParent, oldValue, key);
         if (valueUpdater != null) {
           valueUpdater.update(date);
         }
diff --git a/user/src/com/google/gwt/dom/client/TagName.java b/user/src/com/google/gwt/dom/client/TagName.java
index 98c1681..3c81549 100644
--- a/user/src/com/google/gwt/dom/client/TagName.java
+++ b/user/src/com/google/gwt/dom/client/TagName.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,15 +20,15 @@
 import java.lang.annotation.Target;
 
 /**
- * Indicates the tag name of an {@link Element} subclass.  
+ * Indicates the tag name of an {@link Element} subclass.
  */
 @Documented
 @Target(ElementType.TYPE)
 public @interface TagName {
 
   /**
-   * @return The tag names that this {@link com.google.gwt.dom.client.Element} 
-   * subclass can represent
+   * Returns the tag names that this {@link com.google.gwt.dom.client.Element}
+   * subclass can represent.
    */
   String[] value();
 }
diff --git a/user/src/com/google/gwt/editor/client/EditorDelegate.java b/user/src/com/google/gwt/editor/client/EditorDelegate.java
index d51c32b..b77dbde 100644
--- a/user/src/com/google/gwt/editor/client/EditorDelegate.java
+++ b/user/src/com/google/gwt/editor/client/EditorDelegate.java
@@ -18,11 +18,6 @@
 import com.google.gwt.event.shared.HandlerRegistration;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be changed. Use it at your own risk.
- * </span>
- * </p>
  * Binds an individual Editor to the backing service. Every Editor has a peer
  * EditorDelegate. If an Editor implements the {@link ValueAwareEditor}
  * interface, the EditorDriver will make the delegate available through the
diff --git a/user/src/com/google/gwt/editor/client/IsEditor.java b/user/src/com/google/gwt/editor/client/IsEditor.java
index 265f936..f787df2 100644
--- a/user/src/com/google/gwt/editor/client/IsEditor.java
+++ b/user/src/com/google/gwt/editor/client/IsEditor.java
@@ -17,7 +17,28 @@
 
 /**
  * Extended by view objects that wish to participate in an Editor hierarchy, but
- * that do not implement the {@link Editor} contract directly.
+ * that do not implement the {@link Editor} contract directly. The primary
+ * advantage of the IsEditor interface is that is allows composition of behavior
+ * without the need to implement delegate methods for every interface
+ * implemented by the common editor logic.
+ * <p>
+ * For example, an editor Widget that supports adding and removing elements from
+ * a list might wish to re-use the provided
+ * {@link com.google.gwt.editor.client.adapters.ListEditor ListEditor}
+ * controller. It might be roughly built as:
+ * 
+ * <pre>
+ * class MyListEditor extends Composite implements IsEditor&lt;ListEditor&lt;Foo, FooEditor>> {
+ *   private ListEditor&lt;Foo, FooEditor> controller = ListEditor.of(new FooEditorSource());
+ *   public ListEditor&lt;Foo, FooEditor> asEditor() {return controller;}
+ *   void onAddButtonClicked() { controller.getList().add(new Foo()); }
+ *   void onClearButtonClicked() { controller.getList().clear(); }
+ * }
+ * </pre>
+ * By implementing only the one <code>asEditor()</code> method, the
+ * <code>MyListEditor</code> type is able to incorporate the
+ * <code>ListEditor</code> behavior without needing to write delegate methods
+ * for every method in <code>ListEditor</code>.
  * <p>
  * It is legal for a type to implement both Editor and IsEditor. In this case,
  * the Editor returned from {@link #asEditor()} will be a co-Editor of the
diff --git a/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java b/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
index 0e05174..6d08afd 100644
--- a/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
+++ b/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
@@ -18,11 +18,6 @@
 import java.util.List;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be changed. Use it at your own risk.
- * </span>
- * </p>
  * Automates editing of simple bean-like objects. The {@link EditorDelegate}
  * provided from this driver has a no-op implementation of
  * {@link EditorDelegate#subscribe()}.
diff --git a/user/src/com/google/gwt/event/dom/client/HasErrorHandlers.java b/user/src/com/google/gwt/event/dom/client/HasErrorHandlers.java
index 758b78d..9aaa6a2 100644
--- a/user/src/com/google/gwt/event/dom/client/HasErrorHandlers.java
+++ b/user/src/com/google/gwt/event/dom/client/HasErrorHandlers.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -24,8 +24,8 @@
  */
 public interface HasErrorHandlers extends HasHandlers {
   /**
-   * Adds a {@link ErrorEvent} handler.
-   * 
+   * Adds an {@link ErrorEvent} handler.
+   *
    * @param handler the error handler
    * @return {@link HandlerRegistration} used to remove this handler
    */
diff --git a/user/src/com/google/gwt/event/logical/shared/AttachEvent.java b/user/src/com/google/gwt/event/logical/shared/AttachEvent.java
index 2c1ef1b..9f97ce2 100644
--- a/user/src/com/google/gwt/event/logical/shared/AttachEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/AttachEvent.java
@@ -38,7 +38,8 @@
   static Type<AttachEvent.Handler> TYPE;
 
   /**
-   * Fires a {@link AttachEvent} on all registered handlers in the handler source.
+   * Fires an {@link AttachEvent} on all registered handlers in the handler
+   * source.
    *
    * @param <S> The handler source type
    * @param source the source of the handlers
@@ -69,7 +70,7 @@
   /**
    * Construct a new {@link AttachEvent}.
    *
-   * @param attached true if the source has been attached 
+   * @param attached true if the source has been attached
    */
   protected AttachEvent(boolean attached) {
     this.attached = attached;
@@ -81,8 +82,8 @@
   }
 
   /**
-   * @return true if this event announces that the source has been attached,
-   * false if it has been detached
+   * Returns true if this event announces that the source has been attached,
+   * false if it has been detached.
    */
   public boolean isAttached() {
     return attached;
diff --git a/user/src/com/google/gwt/event/logical/shared/HasAttachHandlers.java b/user/src/com/google/gwt/event/logical/shared/HasAttachHandlers.java
index c01efe3..442f094 100644
--- a/user/src/com/google/gwt/event/logical/shared/HasAttachHandlers.java
+++ b/user/src/com/google/gwt/event/logical/shared/HasAttachHandlers.java
@@ -24,7 +24,7 @@
  */
 public interface HasAttachHandlers extends HasHandlers {
   /**
-   * Adds a {@link AttachEvent} handler.
+   * Adds an {@link AttachEvent} handler.
    *
    * @param handler the handler
    * @return the handler registration
diff --git a/user/src/com/google/gwt/event/logical/shared/HasInitializeHandlers.java b/user/src/com/google/gwt/event/logical/shared/HasInitializeHandlers.java
index 1eba044..04fba91 100644
--- a/user/src/com/google/gwt/event/logical/shared/HasInitializeHandlers.java
+++ b/user/src/com/google/gwt/event/logical/shared/HasInitializeHandlers.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,14 +21,14 @@
 /**
  * A widget that implements this interface is a public source of
  * {@link InitializeEvent} events.
- * 
+ *
  */
 public interface HasInitializeHandlers extends HasHandlers {
   /**
-   * Adds a {@link InitializeEvent} handler.
-   * 
+   * Adds an {@link InitializeEvent} handler.
+   *
    * @param handler the handler
    * @return the registration for the event
    */
   HandlerRegistration addInitializeHandler(InitializeHandler handler);
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/event/logical/shared/HasOpenHandlers.java b/user/src/com/google/gwt/event/logical/shared/HasOpenHandlers.java
index d3130d4..d2b7b03 100644
--- a/user/src/com/google/gwt/event/logical/shared/HasOpenHandlers.java
+++ b/user/src/com/google/gwt/event/logical/shared/HasOpenHandlers.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,13 +21,13 @@
 /**
  * A widget that implements this interface is a public source of
  * {@link OpenEvent} events.
- * 
+ *
  * @param <T> the type being opened
  */
 public interface HasOpenHandlers<T> extends HasHandlers {
   /**
-   * Adds a {@link OpenEvent} handler.
-   * 
+   * Adds an {@link OpenEvent} handler.
+   *
    * @param handler the handler
    * @return the registration for the event
    */
diff --git a/user/src/com/google/gwt/i18n/client/BidiPolicy.java b/user/src/com/google/gwt/i18n/client/BidiPolicy.java
index cd08e1f..fe8e411 100644
--- a/user/src/com/google/gwt/i18n/client/BidiPolicy.java
+++ b/user/src/com/google/gwt/i18n/client/BidiPolicy.java
@@ -43,7 +43,7 @@
   private static BidiPolicyImpl impl = GWT.create(BidiPolicyImpl.class);
 
   /**
-   * @return true if bidi is enabled, false if disabled.
+   * Returns true if bidi is enabled, false if disabled.
    */
   public static boolean isBidiEnabled() {
     return impl.isBidiEnabled();
diff --git a/user/src/com/google/gwt/i18n/client/CurrencyData.java b/user/src/com/google/gwt/i18n/client/CurrencyData.java
index e4eda01..0e286f5 100644
--- a/user/src/com/google/gwt/i18n/client/CurrencyData.java
+++ b/user/src/com/google/gwt/i18n/client/CurrencyData.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,56 +21,56 @@
 public interface CurrencyData {
 
   /**
-   * @return the ISO4217 code for this currency
+   * Returns the ISO4217 code for this currency.
    */
   String getCurrencyCode();
 
   /**
-   * @return the default symbol to use for this currency
+   * Returns the default symbol to use for this currency.
    */
   String getCurrencySymbol();
 
   /**
-   * @return the default number of decimal positions for this currency
+   * Returns the default number of decimal positions for this currency.
    */
   int getDefaultFractionDigits();
 
   /**
-   * @return the default symbol to use for this currency, intended to be
+   * Returns the default symbol to use for this currency, intended to be
    * recognizable in most locales.  If such a symbol is not available, it is
    * acceptable to return the same value as {@link #getCurrencySymbol()}.
    */
   String getPortableCurrencySymbol();
 
   /**
-   * @return true if this currency is deprecated and should not be returned by
+   * Returns true if this currency is deprecated and should not be returned by
    * default in currency lists.
    */
   boolean isDeprecated();
 
   /**
-   * @return true if there should always be a space between the currency symbol
+   * Returns true if there should always be a space between the currency symbol
    * and the number, false if there should be no space.  Ignored unless
    * {@link #isSpacingFixed()} returns true.
    */
   boolean isSpaceForced();
 
   /**
-   * @return true if the spacing between the currency symbol and the number is
+   * Returns true if the spacing between the currency symbol and the number is
    * fixed regardless of locale defaults.  In this case, spacing will be
    * determined by {@link #isSpaceForced()}.
    */
   boolean isSpacingFixed();
 
   /**
-   * @return true if the position of the currency symbol relative to the number
+   * Returns true if the position of the currency symbol relative to the number
    * is fixed regardless of locale defaults.  In this case, the position will be
    * determined by {@link #isSymbolPrefix()}.
    */
   boolean isSymbolPositionFixed();
 
   /**
-   * @return true if the currency symbol should go before the number, false if
+   * Returns true if the currency symbol should go before the number, false if
    * it should go after the number.  This is ignored unless
    * {@link #isSymbolPositionFixed()} is true.
    */
diff --git a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java b/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java
index 0386b57..a4d3fb2 100644
--- a/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java
+++ b/user/src/com/google/gwt/i18n/client/DateTimeFormatInfo.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,7 +17,7 @@
 
 /**
  * Information required for formatting and parsing localized date/time values.
- * 
+ *
  * <p>Implementors should subclass {@link DefaultDateTimeFormatInfo} so when
  * methods are added they will get reasonable defaults and not break.  See the
  * same class for example values returned by these methods.
@@ -25,328 +25,323 @@
 public interface DateTimeFormatInfo {
 
   /**
-   * @return array of strings containing abbreviations for Ante Meridiem and
+   * Returns array of strings containing abbreviations for Ante Meridiem and
    * Post Meridiem.
    */
   String[] ampms();
 
   /**
-   * @return a safe default date format.
+   * Returns a safe default date format.
    */
   String dateFormat();
 
   /**
-   * @return a "full" date format.
+   * Returns a "full" date format.
    */
   String dateFormatFull();
 
   /**
-   * @return a "long" date format.
+   * Returns a "long" date format.
    */
   String dateFormatLong();
 
   /**
-   * @return a "medium" date format.
+   * Returns a "medium" date format.
    */
   String dateFormatMedium();
 
   /**
-   * @return a "short" date format.
+   * Returns a "short" date format.
    */
   String dateFormatShort();
 
   /**
-   * Construct a date/time format from a date format pattern and a time format
+   * Returns a date/time format from a date format pattern and a time format
    * pattern, using the locale default joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
+   *
+   * @param timePattern the time pattern String
+   * @param datePattern the data pattern String
    */
   String dateTime(String timePattern, String datePattern);
 
   /**
-   * Construct a date/time format from a date format pattern and a time format
+   * Returns a date/time format from a date format pattern and a time format
    * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
+   *
+   * @param timePattern the time pattern String
+   * @param datePattern the data pattern String
    */
   String dateTimeFull(String timePattern, String datePattern);
 
   /**
-   * Construct a date/time format from a date format pattern and a time format
+   * Returns a date/time format from a date format pattern and a time format
    * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
+   *
+   * @param timePattern the time pattern String
+   * @param datePattern the data pattern String
    */
   String dateTimeLong(String timePattern, String datePattern);
 
   /**
-   * Construct a date/time format from a date format pattern and a time format
+   * Returns a date/time format from a date format pattern and a time format
    * pattern, using "full" joining.
-   * @param timePattern
-   * @param datePattern
-   * 
-   * @return a date/time format
+   *
+   * @param timePattern the time pattern String
+   * @param datePattern the data pattern String
    */
   String dateTimeMedium(String timePattern, String datePattern);
 
   /**
-   * Construct a date/time format from a date format pattern and a time format
+   * Returns a date/time format from a date format pattern and a time format
    * pattern, using "full" joining.
-   * 
-   * @param datePattern
-   * @param timePattern
-   * @return a date/time format
+   *
+   * @param timePattern the time pattern String
+   * @param datePattern the data pattern String
    */
   String dateTimeShort(String datePattern, String timePattern);
 
   /**
-   * @return an array of the full era names.
+   * Returns an array of the full era names.
    */
   String[] erasFull();
 
   /**
-   * @return abbreviations of the era names.
+   * Returns abbreviations of the era names.
    */
   String[] erasShort();
 
   /**
-   * @return the day which generally comes first in a weekly calendar view, as
+   * Returns the day which generally comes first in a weekly calendar view, as
    *     an index into the return value of {@link #weekdaysFull()}.
    */
   int firstDayOfTheWeek();
 
   /**
-   * @return localized format equivalent to the "d" skeleton pattern.
+   * Returns localized format equivalent to the "d" skeleton pattern.
    */
   String formatDay();
 
   /**
-   * @return localized format equivalent to the "hm" skeleton pattern.
+   * Returns localized format equivalent to the "hm" skeleton pattern.
    */
   String formatHour12Minute();
 
   /**
-   * @return localized format equivalent to the "hms" skeleton pattern.
+   * Returns localized format equivalent to the "hms" skeleton pattern.
    */
   String formatHour12MinuteSecond();
 
   /**
-   * @return localized format equivalent to the "Hm" skeleton pattern.
+   * Returns localized format equivalent to the "Hm" skeleton pattern.
    */
   String formatHour24Minute();
 
   /**
-   * @return localized format equivalent to the "Hms" skeleton pattern.
+   * Returns localized format equivalent to the "Hms" skeleton pattern.
    */
   String formatHour24MinuteSecond();
 
   /**
-   * @return localized format equivalent to the "ms" skeleton pattern.
+   * Returns localized format equivalent to the "ms" skeleton pattern.
    */
   String formatMinuteSecond();
 
   /**
-   * @return localized format equivalent to the "MMM" skeleton pattern.
+   * Returns localized format equivalent to the "MMM" skeleton pattern.
    */
   String formatMonthAbbrev();
 
   /**
-   * @return localized format equivalent to the "MMMd" skeleton pattern.
+   * Returns localized format equivalent to the "MMMd" skeleton pattern.
    */
   String formatMonthAbbrevDay();
 
   /**
-   * @return localized format equivalent to the "MMMM" skeleton pattern.
+   * Returns localized format equivalent to the "MMMM" skeleton pattern.
    */
   String formatMonthFull();
 
   /**
-   * @return localized format equivalent to the "MMMMd" skeleton pattern.
+   * Returns localized format equivalent to the "MMMMd" skeleton pattern.
    */
   String formatMonthFullDay();
 
   /**
-   * @return localized format equivalent to the "MMMMEEEEd" skeleton pattern.
+   * Returns localized format equivalent to the "MMMMEEEEd" skeleton pattern.
    */
   String formatMonthFullWeekdayDay();
 
   /**
-   * @return localized format equivalent to the "Md" skeleton pattern.
+   * Returns localized format equivalent to the "Md" skeleton pattern.
    */
   String formatMonthNumDay();
 
   /**
-   * @return localized format equivalent to the "y" skeleton pattern.
+   * Returns localized format equivalent to the "y" skeleton pattern.
    */
   String formatYear();
 
   /**
-   * @return localized format equivalent to the "yMMM" skeleton pattern.
+   * Returns localized format equivalent to the "yMMM" skeleton pattern.
    */
   String formatYearMonthAbbrev();
 
   /**
-   * @return localized format equivalent to the "yMMMd" skeleton pattern.
+   * Returns localized format equivalent to the "yMMMd" skeleton pattern.
    */
   String formatYearMonthAbbrevDay();
 
   /**
-   * @return localized format equivalent to the "yMMMM" skeleton pattern.
+   * Returns localized format equivalent to the "yMMMM" skeleton pattern.
    */
   String formatYearMonthFull();
 
   /**
-   * @return localized format equivalent to the "yMMMMd" skeleton pattern.
+   * Returns localized format equivalent to the "yMMMMd" skeleton pattern.
    */
   String formatYearMonthFullDay();
 
   /**
-   * @return localized format equivalent to the "yM" skeleton pattern.
+   * Returns localized format equivalent to the "yM" skeleton pattern.
    */
   String formatYearMonthNum();
 
   /**
-   * @return localized format equivalent to the "yMd" skeleton pattern.
+   * Returns localized format equivalent to the "yMd" skeleton pattern.
    */
   String formatYearMonthNumDay();
 
   /**
-   * @return localized format equivalent to the "yMMMEEEd" skeleton pattern.
+   * Returns localized format equivalent to the "yMMMEEEd" skeleton pattern.
    */
   String formatYearMonthWeekdayDay();
 
   /**
-   * @return localized format equivalent to the "yQQQQ" skeleton pattern.
+   * Returns localized format equivalent to the "yQQQQ" skeleton pattern.
    */
   String formatYearQuarterFull();
 
   /**
-   * @return localized format equivalent to the "yQ" skeleton pattern.
+   * Returns localized format equivalent to the "yQ" skeleton pattern.
    */
   String formatYearQuarterShort();
 
   /**
-   * @return an array of full month names.
+   * Returns an array of full month names.
    */
   String[] monthsFull();
 
   /**
-   * @return an array of month names for use in a stand-alone context.
+   * Returns an array of month names for use in a stand-alone context.
    */
   String[] monthsFullStandalone();
 
   /**
-   * @return an array of the shortest abbreviations for months, typically a
+   * Returns an array of the shortest abbreviations for months, typically a
    *     single character and not guaranteed to be unique.
    */
   String[] monthsNarrow();
 
   /**
-   * @return an array of the shortest abbreviations for months suitable for use
+   * Returns an array of the shortest abbreviations for months suitable for use
    *     in a stand-alone context, typically a single character and not
    *     guaranteed to be unique.
    */
   String[] monthsNarrowStandalone();
 
   /**
-   * @return an array of month abbreviations.
+   * Returns an array of month abbreviations.
    */
   String[] monthsShort();
 
   /**
-   * @return an array of month abbreviations, suitable for use in a stand-alone
+   * Returns an array of month abbreviations, suitable for use in a stand-alone
    *     context.
    */
   String[] monthsShortStandalone();
 
   /**
-   * @return an array of full quarter names.
+   * Returns an array of full quarter names.
    */
   String[] quartersFull();
 
   /**
-   * @return an array of abbreviations for quarters.
+   * Returns an array of abbreviations for quarters.
    */
   String[] quartersShort();
 
   /**
-   * @return a safe default time format.
+   * Returns a safe default time format.
    */
   String timeFormat();
 
   /**
-   * @return a "full" time format.
+   * Returns a "full" time format.
    */
   String timeFormatFull();
 
   /**
-   * @return a "long" time format.
+   * Returns a "long" time format.
    */
   String timeFormatLong();
 
   /**
-   * @return a "medium" time format.
+   * Returns a "medium" time format.
    */
   String timeFormatMedium();
 
   /**
-   * @return a "short" time format.
+   * Returns a "short" time format.
    */
   String timeFormatShort();
 
   /**
-   * @return an array of the full names of weekdays.
+   * Returns an array of the full names of weekdays.
    */
   String[] weekdaysFull();
 
   /**
-   * @return an array of the full names of weekdays, suitable for use in a
+   * Returns an array of the full names of weekdays, suitable for use in a
    *     stand-alone context.
    */
   String[] weekdaysFullStandalone();
 
   /**
-   * @return an array of the shortest abbreviations for weekdays, typically a
+   * Returns an array of the shortest abbreviations for weekdays, typically a
    *     single character and not guaranteed to be unique.
    */
   String[] weekdaysNarrow();
 
   /**
-   * @return an array of the shortest abbreviations for weekdays suitable for
+   * Returns an array of the shortest abbreviations for weekdays suitable for
    *     use in a stand-alone context, typically a single character and not
    *     guaranteed to be unique.
    */
   String[] weekdaysNarrowStandalone();
 
   /**
-   * @return an array of abbreviations for weekdays.
+   * Returns an array of abbreviations for weekdays.
    */
   String[] weekdaysShort();
 
   /**
-   * @return an array of abbreviations for weekdays, suitable for use in a
+   * Returns an array of abbreviations for weekdays, suitable for use in a
    *     stand-alone context.
    */
   String[] weekdaysShortStandalone();
 
   /**
-   * @return the day which starts the weekend, as an index into the return value
+   * Returns the day which starts the weekend, as an index into the return value
    *     of {@link #weekdaysFull()}.
    */
   int weekendEnd();
 
   /**
-   * @return the day which ends the weekend, as an index into the return value
+   * Returns the day which ends the weekend, as an index into the return value
    *     of {@link #weekdaysFull()}.  Note that this value may be numerically less
    *     than {@link #weekendEnd()} - for example, {@link #weekendEnd()} of 6
    *     and {@link #weekendStart()} of 0 means Saturday and Sunday are the
    *     weekend.
    */
   int weekendStart();
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/i18n/client/LocaleInfo.java b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
index da0025a..f3b9535 100644
--- a/user/src/com/google/gwt/i18n/client/LocaleInfo.java
+++ b/user/src/com/google/gwt/i18n/client/LocaleInfo.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -38,7 +38,7 @@
       (CldrImpl) GWT.create(CldrImpl.class));
 
   /**
-   * @return an array of available locale names
+   * Returns an array of available locale names.
    */
   public static final String[] getAvailableLocaleNames() {
     /*
@@ -46,7 +46,7 @@
      * is static.  Ideally, the set of available locales would be generated
      * by a different GWT.create but that would slow the compilation process
      * unnecessarily.
-     * 
+     *
      * This is static, and accesses infoImpl this way, with an eye towards
      * when we implement static LocaleInfo getLocale(String localeName) as
      * you might want to get the list of available locales in order to create
@@ -54,9 +54,9 @@
      */
     return instance.infoImpl.getAvailableLocaleNames();
   }
-  
+
   /**
-   * @return a LocaleInfo instance for the current locale
+   * Returns a LocaleInfo instance for the current locale.
    */
   public static final LocaleInfo getCurrentLocale() {
     /*
@@ -69,14 +69,14 @@
   }
 
   /**
-   * Return the display name of the requested locale in its native locale, if
+   * Returns the display name of the requested locale in its native locale, if
    * possible. If no native localization is available, the English name will
    * be returned, or as a last resort just the locale name will be returned.  If
    * the locale name is unknown (including an user overrides) or is not a valid
    * locale property value, null is returned.
-   * 
+   *
    * If the I18N module has not been imported, this will always return null.
-   * 
+   *
    * @param localeName the name of the locale to lookup.
    * @return the name of the locale in its native locale
    */
@@ -88,7 +88,7 @@
   }
 
   /**
-   * @return true if any locale supported by this build of the app is RTL.
+   * Returns true if any locale supported by this build of the app is RTL.
    */
   public static boolean hasAnyRTL() {
     return instance.infoImpl.hasAnyRTL();
@@ -101,7 +101,7 @@
   private DateTimeConstants dateTimeConstants;
 
   private DateTimeFormatInfo dateTimeFormatInfo;
-  
+
   private NumberConstants numberConstants;
 
   /**
@@ -115,7 +115,7 @@
 
   /**
    * Create a LocaleInfo instance, passing in the implementation classes.
-   * 
+   *
    * @param impl LocaleInfoImpl instance to use
    * @param cldr CldrImpl instance to use
    */
@@ -125,7 +125,7 @@
   }
 
   /**
-   * @return a DateTimeConstants instance for this locale.
+   * Returns a DateTimeConstants instance for this locale.
    */
   public final DateTimeConstants getDateTimeConstants() {
     ensureDateTimeConstants();
@@ -133,7 +133,7 @@
   }
 
   /**
-   * @return a DateTimeConstants instance for this locale.
+   * Returns a DateTimeConstants instance for this locale.
    */
   public final DateTimeFormatInfo getDateTimeFormatInfo() {
     ensureDateTimeFormatInfo();
@@ -141,14 +141,14 @@
   }
 
   /**
-   * @return the name of this locale, such as "default, "en_US", etc
+   * Returns the name of this locale, such as "default, "en_US", etc.
    */
   public final String getLocaleName() {
     return infoImpl.getLocaleName();
   }
 
   /**
-   * @return a NumberConstants instance for this locale.
+   * Returns a NumberConstants instance for this locale.
    */
   public final NumberConstants getNumberConstants() {
     ensureNumberConstants();
@@ -156,7 +156,7 @@
   }
 
   /**
-   * @return true if this locale is right-to-left instead of left-to-right
+   * Returns true if this locale is right-to-left instead of left-to-right.
    */
   public final boolean isRTL() {
     return cldrImpl.isRTL();
@@ -174,7 +174,7 @@
       dateTimeFormatInfo = infoImpl.getDateTimeFormatInfo();
     }
   }
-  
+
   private void ensureNumberConstants() {
     if (numberConstants == null) {
       numberConstants = infoImpl.getNumberConstants();
diff --git a/user/src/com/google/gwt/i18n/client/NumberFormat.java b/user/src/com/google/gwt/i18n/client/NumberFormat.java
index 6d3a60d..c7c5ff6 100644
--- a/user/src/com/google/gwt/i18n/client/NumberFormat.java
+++ b/user/src/com/google/gwt/i18n/client/NumberFormat.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,7 +22,7 @@
 
 /**
  * Formats and parses numbers using locale-sensitive patterns.
- * 
+ *
  * This class provides comprehensive and flexible support for a wide variety of
  * localized formats, including
  * <ul>
@@ -40,7 +40,7 @@
  * possible to parse and format numbers in any locale, including support for
  * Western, Arabic, and Indic digits</li>
  * </ul>
- * 
+ *
  * <h3>Patterns</h3>
  * <p>
  * Formatting and parsing are based on customizable patterns that can include a
@@ -51,7 +51,7 @@
  * hand, stand for other characters, strings, or classes of characters. For
  * example, the '<code>#</code>' character is replaced by a localized digit.
  * </p>
- * 
+ *
  * <p>
  * Often the replacement character is the same as the pattern character. In the
  * U.S. locale, for example, the '<code>,</code>' grouping character is
@@ -62,7 +62,7 @@
  * presence. For example, if the percent character is seen, then the value is
  * multiplied by 100 before being displayed.
  * </p>
- * 
+ *
  * <p>
  * The characters listed below are used in patterns. Localized symbols use the
  * corresponding characters taken from corresponding locale symbol collection,
@@ -72,7 +72,7 @@
  * meaning) the character must be quoted. There are some exceptions to this
  * which are noted below.
  * </p>
- * 
+ *
  * <table>
  * <tr>
  * <th>Symbol</th>
@@ -80,42 +80,42 @@
  * <th>Localized?</th>
  * <th>Meaning</th>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>0</code></td>
  * <td>Number</td>
  * <td>Yes</td>
  * <td>Digit</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>#</code></td>
  * <td>Number</td>
  * <td>Yes</td>
  * <td>Digit, zero shows as absent</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>.</code></td>
  * <td>Number</td>
  * <td>Yes</td>
  * <td>Decimal separator or monetary decimal separator</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>-</code></td>
  * <td>Number</td>
  * <td>Yes</td>
  * <td>Minus sign</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>,</code></td>
  * <td>Number</td>
  * <td>Yes</td>
  * <td>Grouping separator</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>E</code></td>
  * <td>Number</td>
@@ -123,28 +123,28 @@
  * <td>Separates mantissa and exponent in scientific notation; need not be
  * quoted in prefix or suffix</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>;</code></td>
  * <td>Subpattern boundary</td>
  * <td>Yes</td>
  * <td>Separates positive and negative subpatterns</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>%</code></td>
  * <td>Prefix or suffix</td>
  * <td>Yes</td>
  * <td>Multiply by 100 and show as percentage</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><nobr><code>\u2030</code> (\u005Cu2030)</nobr></td>
  * <td>Prefix or suffix</td>
  * <td>Yes</td>
  * <td>Multiply by 1000 and show as per mille</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><nobr><code>\u00A4</code> (\u005Cu00A4)</nobr></td>
  * <td>Prefix or suffix</td>
@@ -153,7 +153,7 @@
  * international currency symbol; if present in a pattern, the monetary decimal
  * separator is used instead of the decimal separator</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td><code>'</code></td>
  * <td>Prefix or suffix</td>
@@ -163,9 +163,9 @@
  * to create a single quote itself, use two in succession, such as
  * <code>"# o''clock"</code></td>
  * </tr>
- * 
+ *
  * </table>
- * 
+ *
  * <p>
  * A <code>NumberFormat</code> pattern contains a postive and negative
  * subpattern separated by a semicolon, such as
@@ -179,7 +179,7 @@
  * subpattern. That means that <code>"#,##0.0#;(#)"</code> has precisely the
  * same result as <code>"#,##0.0#;(#,##0.0#)"</code>.
  * </p>
- * 
+ *
  * <p>
  * The prefixes, suffixes, and various symbols used for infinity, digits,
  * thousands separators, decimal separators, etc. may be set to arbitrary
@@ -188,7 +188,7 @@
  * unreliable. For example, the decimal separator and thousands separator should
  * be distinct characters, or parsing will be impossible.
  * </p>
- * 
+ *
  * <p>
  * The grouping separator is a character that separates clusters of integer
  * digits to make large numbers more legible. It commonly used for thousands,
@@ -196,12 +196,12 @@
  * number of digits between the grouping separators, such as 3 for "100,000,000"
  * or 4 for "1 0000 0000".
  * </p>
- * 
+ *
  * <h3>Pattern Grammar (BNF)</h3>
  * <p>
  * The pattern itself uses the following grammar:
  * </p>
- * 
+ *
  * <table>
  * <tr>
  * <td>pattern</td>
@@ -263,46 +263,46 @@
  * <td>'<code>\u005Cu0000</code>'..'<code>\u005CuFFFD</code>' - quote</td>
  * </tr>
  * </table>
- * 
+ *
  * <p>
  * Notation:
  * </p>
- * 
+ *
  * <table>
  * <tr>
  * <td>X*</td>
  * <td style="white-space: nowrap">0 or more instances of X</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td>X?</td>
  * <td style="white-space: nowrap">0 or 1 instances of X</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td>X|Y</td>
  * <td style="white-space: nowrap">either X or Y</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td>C..D</td>
  * <td style="white-space: nowrap">any character from C up to D, inclusive</td>
  * </tr>
- * 
+ *
  * <tr>
  * <td>S-T</td>
  * <td style="white-space: nowrap">characters in S, except those in T</td>
  * </tr>
  * </table>
- * 
+ *
  * <p>
  * The first subpattern is for positive numbers. The second (optional)
  * subpattern is for negative numbers.
  * </p>
- * 
+ *
  *  <h3>Example</h3> {@example com.google.gwt.examples.NumberFormatExample}
  *
- * 
+ *
  */
 public class NumberFormat {
 
@@ -345,8 +345,8 @@
   private static final char QUOTE = '\'';
 
   /**
-   * @return true if all new NumberFormat instances will use latin digits
-   *     and related characters rather than the localized ones. 
+   * Returns true if all new NumberFormat instances will use latin digits and
+   * related characters rather than the localized ones.
    */
   public static boolean forcedLatinDigits() {
     return defaultNumberConstants != localizedNumberConstants;
@@ -354,7 +354,7 @@
 
   /**
    * Provides the standard currency format for the default locale.
-   * 
+   *
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         currency format for the default locale
    */
@@ -369,7 +369,7 @@
   /**
    * Provides the standard currency format for the default locale using a
    * specified currency.
-   * 
+   *
    * @param currencyData currency data to use
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         currency format for the default locale
@@ -382,8 +382,8 @@
   /**
    * Provides the standard currency format for the default locale using a
    * specified currency.
-   * 
-   * @param currencyCode valid currency code, as defined in 
+   *
+   * @param currencyCode valid currency code, as defined in
    *     com.google.gwt.i18n.client.constants.CurrencyCodeMapConstants.properties
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         currency format for the default locale
@@ -397,7 +397,7 @@
 
   /**
    * Provides the standard decimal format for the default locale.
-   * 
+   *
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         decimal format for the default locale
    */
@@ -413,7 +413,7 @@
   /**
    * Gets a <code>NumberFormat</code> instance for the default locale using
    * the specified pattern and the default currencyCode.
-   * 
+   *
    * @param pattern pattern for this formatter
    * @return a NumberFormat instance
    * @throws IllegalArgumentException if the specified pattern is invalid
@@ -425,7 +425,7 @@
   /**
    * Gets a custom <code>NumberFormat</code> instance for the default locale
    * using the specified pattern and currency code.
-   * 
+   *
    * @param pattern pattern for this formatter
    * @param currencyData currency data
    * @return a NumberFormat instance
@@ -439,7 +439,7 @@
   /**
    * Gets a custom <code>NumberFormat</code> instance for the default locale
    * using the specified pattern and currency code.
-   * 
+   *
    * @param pattern pattern for this formatter
    * @param currencyCode international currency code
    * @return a NumberFormat instance
@@ -452,7 +452,7 @@
 
   /**
    * Provides the standard percent format for the default locale.
-   * 
+   *
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         percent format for the default locale
    */
@@ -467,7 +467,7 @@
 
   /**
    * Provides the standard scientific format for the default locale.
-   * 
+   *
    * @return a <code>NumberFormat</code> capable of producing and consuming
    *         scientific format for the default locale
    */
@@ -483,7 +483,7 @@
   /**
    * Specify whether all new NumberFormat instances will use latin digits
    * and related characters rather than the localized ones.
-   *  
+   *
    * @param useLatinDigits true if latin digits/etc should be used, false if
    *    localized digits/etc should be used.
    */
@@ -508,7 +508,7 @@
 
   /**
    * Create a delocalized NumberConstants instance from a localized one.
-   * 
+   *
    * @param orig localized NumberConstants instance
    * @return NumberConstants instance using latin digits/etc
    */
@@ -589,13 +589,13 @@
 
       public String zeroDigit() {
         return "0";
-      }      
+      }
     };
   }
 
   /**
    * Remap a localized separator to an equivalent latin one.
-   * 
+   *
    * @param separator
    * @return delocalized separator character
    */
@@ -615,7 +615,7 @@
    * (which is the number of places to the right of the end of the string the
    * decimal point should be moved -- i.e., 3.5 would be added to the buffer
    * as "35" and a returned scale of -1).
-   * 
+   *
    * @param buf
    * @param val
    * @return scale to apply to the result
@@ -653,7 +653,7 @@
 
   /**
    * Lookup a currency code.
-   * 
+   *
    * @param currencyCode ISO4217 currency code
    * @return a CurrencyData instance
    * @throws IllegalArgumentException if the currency code is unknown
@@ -671,7 +671,7 @@
   /**
    * Convert a double to a string with {@code digits} precision.  The resulting
    * string may still be in exponential notation.
-   * 
+   *
    * @param d double value
    * @param digits number of digits of precision to include
    * @return non-localized string representation of {@code d}
@@ -750,7 +750,7 @@
 
   /**
    * Constructs a format object based on the specified settings.
-   * 
+   *
    * @param numberConstants the locale-specific number constants to use for this
    *          format -- **NOTE** subclasses passing their own instance here
    *          should pay attention to {@link #forcedLatinDigits()} and remap
@@ -781,7 +781,7 @@
   /**
    * Constructs a format object for the default locale based on the specified
    * settings.
-   * 
+   *
    * @param pattern pattern that specify how number should be formatted
    * @param cdata currency data that should be used
    * @param userSuppliedPattern true if the pattern was supplied by the user
@@ -792,7 +792,7 @@
 
   /**
    * This method formats a double to produce a string.
-   * 
+   *
    * @param number The double to format
    * @return the formatted number string
    */
@@ -834,7 +834,7 @@
    * <p>
    * Any {@link Number} which is not a {@link BigDecimal}, {@link BigInteger},
    * or {@link Long} instance is formatted as a {@code double} value.
-   * 
+   *
    * @param number The Number instance to format
    * @return the formatted number string
    */
@@ -879,7 +879,7 @@
    * Parses text to produce a numeric value. A {@link NumberFormatException} is
    * thrown if either the text is empty or if the parse does not consume all
    * characters of the text.
-   * 
+   *
    * @param text the string being parsed
    * @return a double value representing the parsed number
    * @throws NumberFormatException if the entire text could not be converted
@@ -896,7 +896,7 @@
 
   /**
    * Parses text to produce a numeric value.
-   * 
+   *
    * <p>
    * The method attempts to parse text starting at the index given by pos. If
    * parsing succeeds, then the index of <code>pos</code> is updated to the
@@ -906,7 +906,7 @@
    * for the next call to this method. If an error occurs, then the index of
    * <code>pos</code> is not changed.
    * </p>
-   * 
+   *
    * @param text the string to be parsed
    * @param inOutPos position to pass in and get back
    * @return a double value representing the parsed number
@@ -918,8 +918,8 @@
 
     boolean gotPositivePrefix = text.startsWith(positivePrefix, inOutPos[0]);
     boolean gotNegativePrefix = text.startsWith(negativePrefix, inOutPos[0]);
-    boolean gotPositiveSuffix = text.endsWith(positiveSuffix); 
-    boolean gotNegativeSuffix = text.endsWith(negativeSuffix); 
+    boolean gotPositiveSuffix = text.endsWith(positiveSuffix);
+    boolean gotNegativeSuffix = text.endsWith(negativeSuffix);
     boolean gotPositive = gotPositivePrefix && gotPositiveSuffix;
     boolean gotNegative = gotNegativePrefix && gotNegativeSuffix;
 
@@ -998,7 +998,7 @@
    * <li>.0001
    * <br>{@code isNegative=false, digits="1" ("0001" would be ok), scale=-4}
    * </ul>
-   *  
+   *
    * @param isNegative true if the value to be formatted is negative
    * @param digits a StringBuilder containing just the significant digits in
    *     the value to be formatted, the formatted result will be left here
@@ -1056,7 +1056,7 @@
    * Parses text to produce a numeric value. A {@link NumberFormatException} is
    * thrown if either the text is empty or if the parse does not consume all
    * characters of the text.
-   * 
+   *
    * param text the string to be parsed
    * return a parsed number value, which may be a Double, BigInteger, or
    *     BigDecimal
@@ -1070,7 +1070,7 @@
 
   /**
    * Parses text to produce a numeric value.
-   * 
+   *
    * <p>
    * The method attempts to parse text starting at the index given by pos. If
    * parsing succeeds, then the index of <code>pos</code> is updated to the
@@ -1080,7 +1080,7 @@
    * for the next call to this method. If an error occurs, then the index of
    * <code>pos</code> is not changed.
    * </p>
-   * 
+   *
    * param text the string to be parsed
    * pparam inOutPos position to pass in and get back
    * return a parsed number value, which may be a Double, BigInteger, or
@@ -1096,7 +1096,7 @@
 
   /**
    * Format a possibly scaled long value.
-   * 
+   *
    * @param value value to format
    * @param scale the number of places to the right the decimal point should
    *     be moved in the digit string -- negative means the value contains
@@ -1116,50 +1116,50 @@
   }
 
   /**
-   * @return the number of digits between grouping separators in the integer
-   *         portion of a number.
+   * Returns the number of digits between grouping separators in the integer
+   * portion of a number.
    */
   protected int getGroupingSize() {
     return groupingSize;
   }
 
   /**
-   * @return the prefix to use for negative values.
+   * Returns the prefix to use for negative values.
    */
   protected String getNegativePrefix() {
     return negativePrefix;
   }
 
   /**
-   * @return the suffix to use for negative values.
+   * Returns the suffix to use for negative values.
    */
   protected String getNegativeSuffix() {
     return negativeSuffix;
   }
 
   /**
-   * @return the NumberConstants instance for this formatter.
+   * Returns the NumberConstants instance for this formatter.
    */
   protected NumberConstants getNumberConstants() {
     return numberConstants;
   }
 
   /**
-   * @return the prefix to use for positive values.
+   * Returns the prefix to use for positive values.
    */
   protected String getPositivePrefix() {
     return positivePrefix;
   }
 
   /**
-   * @return the suffix to use for positive values.
+   * Returns the suffix to use for positive values.
    */
   protected String getPositiveSuffix() {
     return positiveSuffix;
   }
 
   /**
-   * @return true if the decimal separator should always be shown.
+   * Returns true if the decimal separator should always be shown.
    */
   protected boolean isDecimalSeparatorAlwaysShown() {
     return decimalSeparatorAlwaysShown;
@@ -1167,7 +1167,7 @@
 
   /**
    * Add exponent suffix.
-   * 
+   *
    * @param digits
    */
   private void addExponent(StringBuilder digits) {
@@ -1203,7 +1203,7 @@
   /**
    * Adjust the fraction digits, adding trailing zeroes if necessary or removing
    * excess trailing zeroes.
-   * 
+   *
    * @param digits
    */
   private void adjustFractionDigits(StringBuilder digits) {
@@ -1235,7 +1235,7 @@
   /**
    * Compute the exponent to use and adjust decimal position if we are using
    * exponential notation.
-   * 
+   *
    * @param digits
    */
   private void computeExponent(StringBuilder digits) {
@@ -1277,7 +1277,7 @@
   /**
    * This method return the digit that represented by current character, it
    * could be either '0' to '9', or a locale specific digit.
-   * 
+   *
    * @param ch character that represents a digit
    * @return the digit value
    */
@@ -1292,7 +1292,7 @@
 
   /**
    * Insert grouping separators if needed.
-   * 
+   *
    * @param digits
    * @param groupingSeparator
    * @param g
@@ -1310,7 +1310,7 @@
 
   /**
    * Replace locale-independent digits with locale-specific ones.
-   *  
+   *
    * @param digits StringBuilder containing formatted number
    * @param zero locale-specific zero character -- the rest of the digits must
    *     be consecutive
@@ -1328,12 +1328,12 @@
 
   /**
    * This method parses affix part of pattern.
-   * 
+   *
    * @param pattern pattern string that need to be parsed
    * @param start start position to parse
    * @param affix store the parsed result
    * @param inNegativePattern true if we are parsing the negative pattern and
-   *     therefore only care about the prefix and suffix 
+   *     therefore only care about the prefix and suffix
    * @return how many characters parsed
    */
   private int parseAffix(String pattern, int start, StringBuffer affix,
@@ -1409,7 +1409,7 @@
   /**
    * This function parses a "localized" text into a <code>double</code>. It
    * needs to handle locale specific decimal, grouping, exponent and digit.
-   * 
+   *
    * @param text the text that need to be parsed
    * @param pos in/out parsing position. in case of failure, this shouldn't be
    *          changed
@@ -1489,7 +1489,7 @@
 
   /**
    * Method parses provided pattern, result is stored in member variables.
-   * 
+   *
    * @param pattern
    */
   private void parsePattern(String pattern) {
@@ -1518,7 +1518,7 @@
 
   /**
    * This method parses the trunk part of a pattern.
-   * 
+   *
    * @param pattern pattern string that need to be parsed
    * @param start where parse started
    * @param ignorePattern true if we are only parsing this for length
@@ -1656,7 +1656,7 @@
 
   /**
    * Remove excess leading zeros or add some if we don't have enough.
-   * 
+   *
    * @param digits
    */
   private void processLeadingZeros(StringBuilder digits) {
@@ -1699,7 +1699,7 @@
 
   /**
    * Propagate a carry from incrementing the {@code i+1}'th digit.
-   * 
+   *
    * @param digits
    * @param i digit to start incrementing
    */
@@ -1725,11 +1725,11 @@
 
   /**
    * Round the value at the requested place, propagating any carry backward.
-   * 
+   *
    * @param digits
    */
   private void roundValue(StringBuilder digits) {
-    // TODO(jat): other rounding modes?    
+    // TODO(jat): other rounding modes?
     if (digitsLength > decimalPosition + maximumFractionDigits
         && digits.charAt(decimalPosition + maximumFractionDigits) >= '5') {
       int i = decimalPosition + maximumFractionDigits - 1;
diff --git a/user/src/com/google/gwt/i18n/client/PluralRule.java b/user/src/com/google/gwt/i18n/client/PluralRule.java
index 23c6949..e5c3dee 100644
--- a/user/src/com/google/gwt/i18n/client/PluralRule.java
+++ b/user/src/com/google/gwt/i18n/client/PluralRule.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -35,17 +35,17 @@
 
     /**
      * Create the plural form.
-     * 
+     *
      * @param name
      * @param description
      */
     public PluralForm(String name, String description) {
       this(name, description, false);
     }
-    
+
     /**
      * Create the plural form.
-     * 
+     *
      * @param name
      * @param description
      * @param noWarn if true, do not warn if this form is missing from a
@@ -59,44 +59,44 @@
     }
 
     /**
-     * @return the description.
+     * Returns the description.
      */
     public String getDescription() {
       return description;
     }
-    
+
     /**
-     * @return the name.
+     * Returns the name.
      */
     public String getName() {
       return name;
     }
 
     /**
-     * @return true if the generator should warn if this plural form
-     *     is not present.
+     * Returns true if the generator should warn if this plural form is not
+     * present.
      */
     public boolean getWarnIfMissing() {
       return !noWarn;
     }
   }
-  
+
   /**
    * Returns the list of values which are valid for this rule.  The
    * default or "other" plural form must be first in the list with
    * an index of 0 -- this form will be used if no other form applies
    * and is also mapped to the default text for a given message.
-   * 
+   *
    * This method will be executed at compile time and may not contain
    * any references, even indirectly, to JSNI methods.
    */
   PluralForm[] pluralForms();
-  
+
   /**
    * Returns the plural form appropriate for this count.
-   * 
+   *
    * This method will be executed at runtime, so must be translatable.
-   * 
+   *
    * @param n count of items to choose plural form for
    * @return the plural form to use (must be a valid index
    *     into the array returned by pluralForms).
diff --git a/user/src/com/google/gwt/i18n/client/TimeZone.java b/user/src/com/google/gwt/i18n/client/TimeZone.java
index 4334a81..57ab166 100644
--- a/user/src/com/google/gwt/i18n/client/TimeZone.java
+++ b/user/src/com/google/gwt/i18n/client/TimeZone.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -29,13 +29,13 @@
  * in which case the data could be retrieved from
  * the {@link com.google.gwt.i18n.client.constants.TimeZoneConstants TimeZoneConstants}
  * class. Applications can also choose to instantiate from a string obtained
- * from a server. The time zone string contains locale specific data. If the 
+ * from a server. The time zone string contains locale specific data. If the
  * application only uses a short representation, the English data will usually
- * satisfy the user's need. In the case that only the time zone offset is known, 
+ * satisfy the user's need. In the case that only the time zone offset is known,
  * there is a decent fallback that only uses the time zone offset to create a
  * TimeZone object.
  */
-public class TimeZone {  
+public class TimeZone {
   // constants to reference time zone names in the time zone names array
   private static final int STD_SHORT_NAME = 0;
   private static final int STD_LONG_NAME = 1;
@@ -45,7 +45,7 @@
   /**
    * This factory method provides a decent fallback to create a time zone object
    * just based on a given time zone offset.
-   * 
+   *
    * @param timeZoneOffsetInMinutes time zone offset in minutes
    * @return a new time zone object
    */
@@ -53,7 +53,7 @@
     TimeZone tz = new TimeZone();
     tz.standardOffset = timeZoneOffsetInMinutes;
     tz.timezoneID = composePOSIXTimeZoneID(timeZoneOffsetInMinutes);
-    tz.tzNames = new String[2]; 
+    tz.tzNames = new String[2];
     tz.tzNames[0] = composeUTCString(timeZoneOffsetInMinutes);
     tz.tzNames[1] = composeUTCString(timeZoneOffsetInMinutes);
     tz.transitionPoints = null;
@@ -68,13 +68,13 @@
    * string from the server. Either way, the application obtains the original
    * string from the data provided in the TimeZoneConstant.properties file,
    * which was carefully prepared from CLDR and Olson time zone database.
-   * 
+   *
    * @param tzJSON JSON string that contains time zone data
    * @return a new time zone object
    */
   public static TimeZone createTimeZone(String tzJSON) {
     TimeZoneInfo tzData = TimeZoneInfo.buildTimeZoneData(tzJSON);
-    
+
     return createTimeZone(tzData);
   }
 
@@ -83,16 +83,16 @@
 
     tz.timezoneID = timezoneData.getID();
     tz.standardOffset = -timezoneData.getStandardOffset();
-    
+
     JsArrayString jsTimezoneNames = timezoneData.getNames();
-    
+
     tz.tzNames = new String[jsTimezoneNames.length()];
-    
+
     for (int i = 0; i < jsTimezoneNames.length(); i++) {
       tz.tzNames[i] = jsTimezoneNames.get(i);
     }
 
-    JsArrayInteger transitions = timezoneData.getTransitions();    
+    JsArrayInteger transitions = timezoneData.getTransitions();
 
     if (transitions == null || transitions.length() == 0) {
       tz.transitionPoints = null;
@@ -127,8 +127,8 @@
     return new String(data);
   }
 
-  /** 
-   * POSIX time zone ID as fallback. 
+  /**
+   * POSIX time zone ID as fallback.
    */
   private static String composePOSIXTimeZoneID(int offset) {
     if (offset == 0) {
@@ -157,7 +157,7 @@
     }
     return str + offsetDisplay(offset);
   }
-  
+
   private static String offsetDisplay(int offset) {
     int hour = offset / 60;
     int mins = offset % 60;
@@ -177,10 +177,10 @@
   }
 
   /**
-   * Return the daylight savings time adjustment, in minutes, for the given
+   * Returns the daylight savings time adjustment, in minutes, for the given
    * date. If daylight savings time is in effect on the given date, the number
    * will be positive, otherwise 0.
-   * 
+   *
    * @param date the date to check
    * @return offset amount
    */
@@ -190,7 +190,7 @@
     }
     long timeInHours = date.getTime() / 1000 / 3600;
     int index = 0;
-    while (index < transitionPoints.length && 
+    while (index < transitionPoints.length &&
         timeInHours >= transitionPoints[index]) {
       ++index;
     }
@@ -198,8 +198,8 @@
   }
 
   /**
-   * Return the GMT representation of this time zone object.
-   * 
+   * Returns the GMT representation of this time zone object.
+   *
    * @param date The date from which the time information should be extracted
    * @return A GMT representation of the time given by the date
    */
@@ -208,10 +208,10 @@
   }
 
   /**
-   * Return time zone id for this time zone. For time zone objects that have
+   * Returns time zone id for this time zone. For time zone objects that have
    * been instantiated from a time zone offset, the POSIX time zone id will be
    * returned.
-   * 
+   *
    * @return time zone id
    */
   public String getID() {
@@ -242,19 +242,19 @@
    * Returns the long version of the time zone name for the given date; the
    * result of this method will be different if daylight savings time is in
    * effect.
-   * 
+   *
    * @param date The date for which the long time zone name is returned
    * @return long time zone name
    */
   public String getLongName(Date date) {
-    return tzNames[isDaylightTime(date) ? DLT_LONG_NAME : STD_LONG_NAME]; 
+    return tzNames[isDaylightTime(date) ? DLT_LONG_NAME : STD_LONG_NAME];
   }
 
   /**
    * Returns the RFC representation of the time zone name for the given date.
    * To be consistent with JDK/Javascript API, west of Greenwich will be
    * positive.
-   * 
+   *
    *  @param date The date for which time to retrieve time zone offset
    *  @return time zone offset in minutes
    */
@@ -283,16 +283,16 @@
 
   /**
    * Returns the short time zone name for a given date.
-   * 
+   *
    * @param date The date for which time to retrieve short time zone
    * @return short time zone name
    */
   public String getShortName(Date date) {
-    return tzNames[isDaylightTime(date) ? DLT_SHORT_NAME : STD_SHORT_NAME]; 
+    return tzNames[isDaylightTime(date) ? DLT_SHORT_NAME : STD_SHORT_NAME];
   }
 
   /**
-   * @return the standard time zone offset, in minutes.
+   * Returns the standard time zone offset, in minutes.
    */
   public int getStandardOffset() {
     return standardOffset;
@@ -301,7 +301,7 @@
   /**
    * Check whether the given date and time falls within a daylight savings time
    * period.
-   * 
+   *
    * @param date and time to check
    * @return true if daylight savings time is in effect
    */
diff --git a/user/src/com/google/gwt/i18n/client/impl/CldrImpl.java b/user/src/com/google/gwt/i18n/client/impl/CldrImpl.java
index c30a088..1bb55a1 100644
--- a/user/src/com/google/gwt/i18n/client/impl/CldrImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/CldrImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,9 +20,9 @@
 /**
  * Implementation detail of LocaleInfo -- not a public API and subject to
  * change.
- * 
+ *
  * Locale data from CLDR.
- * 
+ *
  * Subclasses of this are currently hand-written, but will eventually be
  * generated directly from the CLDR data and make available most of the
  * information present in CLDR.
@@ -34,9 +34,9 @@
    */
 
   /**
-   * @return true if the current locale is right-to-left rather than
-   *         left-to-right.
-   * 
+   * Returns true if the current locale is right-to-left rather than
+   * left-to-right.
+   *
    * Most languages are left-to-right, so the default is false.
    */
   public boolean isRTL() {
diff --git a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
index d36b23a..f4dd43a 100644
--- a/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
+++ b/user/src/com/google/gwt/i18n/client/impl/LocaleInfoImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -24,35 +24,35 @@
 /**
  * Implementation detail of LocaleInfo -- not a public API and subject to
  * change.
- * 
+ *
  * Generated interface for locale information.  The default implementation
  * returns null, which is used if the i18n module is not imported.
- * 
+ *
  * @see com.google.gwt.i18n.client.LocaleInfo
  */
 public class LocaleInfoImpl {
 
   /**
-   * @return the runtime locale (note that this requires the i18n locale
-   *     property provider's assistance)
+   * Returns the runtime locale (note that this requires the i18n locale property
+   * provider's assistance).
    */
   static native String getRuntimeLocale() /*-{
     return $wnd['__gwt_Locale'];
   }-*/;
 
   /**
-   * @return an array of available locale names
+   * Returns an array of available locale names.
    */
   public String[] getAvailableLocaleNames() {
     return null;
   }
-  
+
   /**
    * Create a {@link DateTimeFormatInfo} instance appropriate for this locale.
-   * 
+   *
    * Note that the caller takes care of any caching so subclasses need not
    * bother.
-   * 
+   *
    * @return a {@link DateTimeFormatInfo} instance
    */
   public DateTimeFormatInfo getDateTimeFormatInfo() {
@@ -60,34 +60,34 @@
   }
 
   /**
-   * @return the current locale name, such as "default, "en_US", etc.
+   * Returns the current locale name, such as "default, "en_US", etc.
    */
   public String getLocaleName() {
     return null;
   }
 
   /**
-   * Return the display name of the requested locale in its native locale, if
+   * Returns the display name of the requested locale in its native locale, if
    * possible. If no native localization is available, the English name will
    * be returned, or as a last resort just the locale name will be returned.  If
    * the locale name is unknown (including user overrides), null is returned.
-   * 
+   *
    * @param localeName the name of the locale to lookup.
    * @return the name of the locale in its native locale
    */
   public String getLocaleNativeDisplayName(String localeName) {
     return null;
   }
-  
+
   /**
-   * @return a NumberConstants instance appropriate for this locale.
+   * Returns a NumberConstants instance appropriate for this locale.
    */
   public NumberConstants getNumberConstants() {
     return GWT.create(NumberConstantsImpl.class);
   }
-  
+
   /**
-   * @return true if any locale supported by this build of the app is RTL.
+   * Returns true if any locale supported by this build of the app is RTL.
    */
   public boolean hasAnyRTL() {
     return false;
diff --git a/user/src/com/google/gwt/i18n/rebind/AbstractResource.java b/user/src/com/google/gwt/i18n/rebind/AbstractResource.java
index 82ad3ef..6a8f5d4 100644
--- a/user/src/com/google/gwt/i18n/rebind/AbstractResource.java
+++ b/user/src/com/google/gwt/i18n/rebind/AbstractResource.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -93,25 +93,25 @@
    * Definition of a single entry for a resource.
    */
   public interface ResourceEntry {
-    
+
     /**
      * Retrieve a particular form for this entry.
-     * 
+     *
      * @param form form to retrieve (null for the default)
      * @return null if the requested form is not present
      */
     String getForm(String form);
-    
+
     /**
-     * @return list of forms associated with this entry.
-     * 
+     * Returns a list of forms associated with this entry.
+     *
      * The default form (also the only form for anything other than messages
      * with plural support) is always available and not present in this list.
      */
     Collection<String> getForms();
-    
+
     /**
-     * @return key for this entry (must not be null).
+     * Returns key for this entry (must not be null).
      */
     String getKey();
   }
@@ -125,7 +125,7 @@
     private List<AbstractResource> list = new ArrayList<AbstractResource>();
 
     private Map<String, PluralForm[]> pluralForms = new HashMap<String, PluralForm[]>();
-    
+
     private Set<AbstractResource> set = new HashSet<AbstractResource>();
 
     @Override
@@ -148,7 +148,7 @@
 
     /**
      * Add all keys known by this ResourceList to the specified set.
-     * 
+     *
      * @param s set to add keys to
      */
     public void addToKeySet(Set<String> s) {
@@ -193,7 +193,7 @@
           best = matchLocale;
         }
       }
-      return best; 
+      return best;
     }
 
     @Override
@@ -202,8 +202,8 @@
     }
 
     /**
-     * Return the first AnnotationsResource containing a specified key.
-     * 
+     * Returns the first AnnotationsResource containing a specified key.
+     *
      * @param logger
      * @param key
      * @return first AnnotationsResource containing key, or null if none
@@ -236,8 +236,8 @@
     }
 
     /**
-     * Return the list of extensions available for a given key.
-     * 
+     * Returns the list of extensions available for a given key.
+     *
      * @param key
      * @return collection of extensions for the given key
      */
@@ -250,7 +250,7 @@
     }
 
     /**
-     * Return the list of plural forms for a given key.
+     * Returns the list of plural forms for a given key.
      *
      * @param key
      * @return array of plural forms.
@@ -260,8 +260,8 @@
     }
 
     /**
-     * Return a translation for a key, or throw an exception.
-     * 
+     * Returns a translation for a key, or throw an exception.
+     *
      * @param key
      * @return translated string for key
      * @throws MissingResourceException
@@ -276,8 +276,8 @@
     }
 
     /**
-     * Return a translation for a key/extension, or throw an exception.
-     * 
+     * Returns a translation for a key/extension, or throw an exception.
+     *
      * @param key
      * @param ext key extension, null if none
      * @return translated string for key
@@ -293,8 +293,8 @@
     }
 
     /**
-     * Return a translation for a key, or null if not found.
-     * 
+     * Returns a translation for a key, or null if not found.
+     *
      * @param key
      * @return translated string for key
      */
@@ -309,8 +309,8 @@
     }
 
     /**
-     * Return a translation for a key/extension, or null if not found.
-     * 
+     * Returns a translation for a key/extension, or null if not found.
+     *
      * @param key
      * @param extension key extension, null if none
      * @return translated string for key
@@ -336,7 +336,7 @@
     }
 
     /**
-     * @return set of keys present across all resources
+     * Returns set of keys present across all resources.
      */
     public Set<String> keySet() {
       Set<String> keySet = new HashSet<String>();
@@ -360,7 +360,7 @@
 
     /**
      * Set the plural forms associated with a given message.
-     * 
+     *
      * @param key
      * @param forms
      */
@@ -384,7 +384,7 @@
     private final String key;
     private final Map<String, String> values = new HashMap<String, String>();
     private final Set<String> forms = new HashSet<String>();
- 
+
     public MultipleFormEntry(String key) {
       this.key = key;
     }
@@ -395,7 +395,7 @@
         forms.add(form);
       }
     }
- 
+
     public String getForm(String form) {
       return values.get(form);
     }
@@ -416,7 +416,7 @@
 
     private final String key;
     private final String value;
-  
+
     public SimpleEntry(String key, String value) {
       this.key = key;
       this.value = value;
@@ -474,9 +474,9 @@
   public AbstractResource(GwtLocale matchLocale) {
     this.matchLocale = matchLocale;
   }
-  
+
   /**
-   * Return an entry in this resource.
+   * Returns an entry in this resource.
    *
    * @param key
    * @return ResourceEntry instance
@@ -495,7 +495,7 @@
 
   /**
    * Get a string and fail if not present.
-   * 
+   *
    * @param key
    * @return the requested string
    */
@@ -505,7 +505,7 @@
 
   /**
    * Get a string (with optional extension) and fail if not present.
-   * 
+   *
    * @param key
    * @param extension
    * @return the requested string
@@ -522,7 +522,7 @@
 
   /**
    * Get a key.
-   * 
+   *
    * @param key key to lookup
    * @return the string for the given key or null if not found
    * @see java.util.ResourceBundle#getString(java.lang.String)
@@ -533,7 +533,7 @@
 
   /**
    * Get a key with an extension. Identical to getString() if extension is null.
-   * 
+   *
    * @param key to lookup
    * @param extension extension of the key, nullable
    * @return string or null
@@ -542,7 +542,7 @@
 
   /**
    * Keys associated with this resource.
-   * 
+   *
    * @return keys
    */
   public Set<String> keySet() {
@@ -554,7 +554,7 @@
   }
 
   /**
-   * @return true if this resource has any keys
+   * Returns true if this resource has any keys.
    */
   public boolean notEmpty() {
     return !keySet.isEmpty();
@@ -567,7 +567,7 @@
 
   /**
    * A multi-line representation of this object.
-   * 
+   *
    * @return verbose string
    */
   public String toVerboseString() {
diff --git a/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java b/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
index 1bfc834..eee04b0 100644
--- a/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
+++ b/user/src/com/google/gwt/i18n/rebind/LocaleUtils.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -58,7 +58,7 @@
   /**
    * Create a new LocaleUtils instance for the given PropertyOracle.  Returned
    * instances will be immutable and can be shared across threads.
-   * 
+   *
    * @param logger
    * @param propertyOracle
    * @return LocaleUtils instance
@@ -91,7 +91,7 @@
 
   /**
    * Get a shared GwtLocale factory so instances are cached between all uses.
-   * 
+   *
    * @return singleton GwtLocaleFactory instance.
    */
   public static GwtLocaleFactory getLocaleFactory() {
@@ -174,7 +174,7 @@
 
   /**
    * Returns the set of all compile-time locales.
-   * 
+   *
    * @return unmodifiable set of all compile-time locales
    */
   public Set<GwtLocale> getAllCompileLocales() {
@@ -184,7 +184,7 @@
   /**
    * Returns the set of all available locales, whether compile-time locales or
    * runtime locales.
-   * 
+   *
    * @return unmodifiable set of all locales
    */
   public Set<GwtLocale> getAllLocales() {
@@ -192,7 +192,7 @@
   }
 
   /**
-   * @return the static compile-time locale for this permutation.
+   * Returns the static compile-time locale for this permutation.
    */
   public GwtLocale getCompileLocale() {
     return compileLocale;
@@ -201,7 +201,7 @@
   /**
    * Returns a list of locales which are children of the current compile-time
    * locale.
-   * 
+   *
    * @return unmodifiable list of matching locales
    */
   public Set<GwtLocale> getRuntimeLocales() {
diff --git a/user/src/com/google/gwt/i18n/rebind/LookupMethodCreator.java b/user/src/com/google/gwt/i18n/rebind/LookupMethodCreator.java
index a9a9dd7..fed873c 100644
--- a/user/src/com/google/gwt/i18n/rebind/LookupMethodCreator.java
+++ b/user/src/com/google/gwt/i18n/rebind/LookupMethodCreator.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -35,7 +35,7 @@
 
   /**
    * Constructor for <code>LookupMethodCreator</code>.
-   * 
+   *
    * @param classCreator parent class creator
    * @param returnType associated return type
    */
@@ -52,7 +52,7 @@
   }
 
   /**
-   * @return string containing return type name
+   * Returns a {@code String} containing the return type name.
    */
   protected String getReturnTypeName() {
     String type;
diff --git a/user/src/com/google/gwt/i18n/rebind/MessageFormatParser.java b/user/src/com/google/gwt/i18n/rebind/MessageFormatParser.java
index 7573250..663bba0 100644
--- a/user/src/com/google/gwt/i18n/rebind/MessageFormatParser.java
+++ b/user/src/com/google/gwt/i18n/rebind/MessageFormatParser.java
@@ -266,21 +266,21 @@
         throws UnableToCompleteException;
 
     /**
-     * @return the string as this chunk would be represented in a MessageFormat
-     *         template, with any required quoting such that reparsing this
-     *         value would produce an equivalent (note, not identical) parse.
+     * Returns the string as this chunk would be represented in a MessageFormat
+     * template, with any required quoting such that reparsing this value would
+     * produce an equivalent (note, not identical) parse.
      *
-     *          Note that the default implementation may not be sufficient for
-     *         all subclasses.
+     * Note that the default implementation may not be sufficient for all
+     * subclasses.
      */
     public String getAsMessageFormatString() {
       return getStringValue(true);
     }
 
     /**
-     * @return the string as this chunk would be represented in a MessageFormat
-     *         template, with any quoting removed. Note that this is distinct
-     *         from toString in that the latter is intend for human consumption.
+     * Returns the string as this chunk would be represented in a MessageFormat
+     * template, with any quoting removed. Note that this is distinct from
+     * toString in that the latter is intend for human consumption.
      */
     public String getString() {
       return getStringValue(false);
diff --git a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
index bc551f0..b5e1729 100644
--- a/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
+++ b/user/src/com/google/gwt/i18n/rebind/MessagesMethodCreator.java
@@ -337,21 +337,21 @@
   private interface Parameters {
 
     /**
-     * @return the count of parameters.
+     * Returns the count of parameters.
      */
     int getCount();
 
     /**
-     * Return the given parameter.
-     * 
+     * Returns the given parameter.
+     *
      * @param i index of the parameter to return, 0 .. getCount() - 1
      * @return parameter or null if i is out of range
      */
     JParameter getParameter(int i);
 
     /**
-     * Return the given parameter.
-     * 
+     * Returns the given parameter.
+     *
      * @param name the name of the parameter to return
      * @return parameter or null if the named parameter doesn't exist
      */
@@ -359,7 +359,7 @@
 
     /**
      * Find the index of a parameter by name.
-     * 
+     *
      * @param name
      * @return index of requested parameter or -1 if not found
      */
@@ -967,7 +967,7 @@
 
   /**
    * Generate code for one list pattern.
-   * 
+   *
    * @param logger logger to use for error/warning messages
    * @param locale locale we are generating code for
    * @param listArg the {n,list,...} argument in the original format pattern
@@ -1026,7 +1026,7 @@
 
   /**
    * Generates code to format a list in a format pattern.
-   * 
+   *
    * @param logger logger to use for error/warning messages
    * @param locale locale we are generating code for
    * @param generated a StringBuffer holding the generated code
diff --git a/user/src/com/google/gwt/i18n/rebind/format/MessageCatalogFormat.java b/user/src/com/google/gwt/i18n/rebind/format/MessageCatalogFormat.java
index 5693c39..60019a4 100644
--- a/user/src/com/google/gwt/i18n/rebind/format/MessageCatalogFormat.java
+++ b/user/src/com/google/gwt/i18n/rebind/format/MessageCatalogFormat.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -24,21 +24,21 @@
 
 /**
  * Interface for writing various message catalog formats.
- * 
+ *
  * <p><hr><b>WARNING:</b> this API is expected to change as we develop additional
  * message catalog formats.  In particular, this interface will be extended
  * to support reading message catalogs and further changes may be required.
  * <hr></p>
- * 
+ *
  * <p>Implementations of this interface are executed at compile time and
  * therefore must not contain any JSNI code.
  * </p>
  */
 public interface MessageCatalogFormat {
-  
+
   /**
    * Write a message catalog file.
-   * 
+   *
    * @param logger TreeLogger for logging errors/etc
    * @param locale locale of this output file
    * @param resourceList the contents to write
@@ -52,9 +52,9 @@
   void write(TreeLogger logger, String locale, ResourceList resourceList,
       PrintWriter out, JClassType messageInterface)
       throws UnableToCompleteException;
-  
+
   /**
-   * @return the extension to use for this file type, including the dot
+   * Returns the extension to use for this file type, including the dot.
    */
   String getExtension();
 }
diff --git a/user/src/com/google/gwt/i18n/shared/BidiFormatter.java b/user/src/com/google/gwt/i18n/shared/BidiFormatter.java
index dec7ced..09170ee 100644
--- a/user/src/com/google/gwt/i18n/shared/BidiFormatter.java
+++ b/user/src/com/google/gwt/i18n/shared/BidiFormatter.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -58,7 +58,7 @@
  * Thus, in a single call, the formatter will escape the input string as
  * specified, determine its direction, and wrap it as necessary. It is then up
  * to the caller to insert the return value in the output.
- * 
+ *
  */
 public class BidiFormatter {
 
@@ -76,22 +76,22 @@
      * Unicode "Left-To-Right Embedding" (LRE) character.
      */
     public static final char LRE = '\u202A';
-    
+
     /**
      * Unicode "Left-To-Right Mark" (LRM) character.
-     */ 
+     */
     public static final char LRM = '\u200E';
-    
+
     /**
      * String representation of LRM.
      */
     public static final String LRM_STRING = Character.toString(LRM);
-    
+
     /**
      * Unicode "Pop Directional Formatting" (PDF) character.
-     */ 
+     */
     public static final char PDF = '\u202C';
-    
+
     /**
      * "right" string constant.
      */
@@ -99,9 +99,9 @@
 
     /**
      * Unicode "Right-To-Left Embedding" (RLE) character.
-     */ 
+     */
     public static final char RLE = '\u202B';
-    
+
     /**
      * Unicode "Right-To-Left Mark" (RLM) character.
      */
@@ -114,7 +114,7 @@
 
     // Not instantiable.
     private Format() {
-    } 
+    }
   }
 
   /**
@@ -135,7 +135,7 @@
   /**
    * Factory for creating an instance of BidiFormatter given the context
    * direction and the desired span wrapping behavior (see below).
-   * 
+   *
    * @param rtlContext Whether the context direction is RTL. See an example of
    *          a simple use case at {@link #getInstance(boolean)}
    * @param alwaysSpan Whether {@link #spanWrap} (and its variations) should
@@ -154,7 +154,7 @@
    * direction. The default behavior of {@link #spanWrap} and its variations is
    * set to avoid span wrapping unless it's necessary ('dir' attribute needs to
    * be set).
-   * 
+   *
    * @param contextDir The context direction. See an example of a simple use
    *          case at {@link #getInstance(boolean)}. Note: Direction.DEFAULT
    *          indicates unknown context direction. Try not to use it, since it
@@ -168,7 +168,7 @@
   /**
    * Factory for creating an instance of BidiFormatter given the context
    * direction and the desired span wrapping behavior (see below).
-   * 
+   *
    * @param contextDir The context direction. See an example of a simple use
    *          case at {@link #getInstance(boolean)}. Note: Direction.DEFAULT
    *          indicates unknown context direction. Try not to use it, since it
@@ -183,7 +183,7 @@
       boolean alwaysSpan) {
     return new BidiFormatter(contextDir, alwaysSpan);
   }
-  
+
   /**
    * Factory for creating an instance of BidiFormatter whose context direction
    * matches the current locale's direction. The default behavior of {@link
@@ -192,7 +192,7 @@
    */
   public static BidiFormatter getInstanceForCurrentLocale() {
     return getInstanceForCurrentLocale(false);
-  }  
+  }
 
   /**
    * Factory for creating an instance of BidiFormatter whose context direction
@@ -206,8 +206,8 @@
    */
   public static BidiFormatter getInstanceForCurrentLocale(boolean alwaysSpan) {
     return getInstance(LocaleInfo.getCurrentLocale().isRTL(), alwaysSpan);
-  }  
-  
+  }
+
   private boolean alwaysSpan;
   private Direction contextDir;
 
@@ -226,7 +226,7 @@
   /**
    * Like {@link #dirAttr(String, boolean)}, but assumes {@code isHtml} is
    * false.
-   * 
+   *
    * @param str String whose direction is to be estimated
    * @return "dir=rtl" for RTL text in non-RTL context; "dir=ltr" for LTR text
    *         in non-LTR context; else, the empty string.
@@ -239,7 +239,7 @@
    * Returns "dir=ltr" or "dir=rtl", depending on {@code str}'s estimated
    * direction, if it is not the same as the context direction. Otherwise,
    * returns the empty string.
-   * 
+   *
    * @param str String whose direction is to be estimated
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @return "dir=rtl" for RTL text in non-RTL context; "dir=ltr" for LTR text
@@ -260,7 +260,7 @@
   /**
    * Like {@link #estimateDirection(String, boolean)}, but assumes {@code
    * isHtml} is false.
-   * 
+   *
    * @param str String whose direction is to be estimated
    * @return {@code str}'s estimated overall direction
    */
@@ -272,7 +272,7 @@
    * Estimates the direction of a string using the best known general-purpose
    * method, i.e. using relative word counts. Direction.DEFAULT return value
    * indicates completely neutral input.
-   * 
+   *
    * @param str String whose direction is to be estimated
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @return {@code str}'s estimated overall direction
@@ -282,23 +282,22 @@
   }
 
   /**
-   * @return Whether the span structure added by the formatter should be stable,
-   *         i.e. spans added even when the direction does not need to be
-   *         declared
+   * Returns whether the span structure added by the formatter should be stable,
+   * i.e., spans added even when the direction does not need to be declared.
    */
   public boolean getAlwaysSpan() {
     return alwaysSpan;
   }
 
   /**
-   * @return The context direction
+   * Returns the context direction.
    */
   public Direction getContextDir() {
     return contextDir;
   }
 
   /**
-   * @return Whether the context direction is RTL
+   * Returns whether the context direction is RTL.
    */
   public boolean isRtlContext() {
     return contextDir == Direction.RTL;
@@ -307,7 +306,7 @@
   /**
    * Returns "dir=ltr" or "dir=rtl", depending on the given direction, if it is
    * not the same as the context direction. Otherwise, returns the empty string.
-   * 
+   *
    * @param dir Given direction
    * @return "dir=rtl" for RTL text in non-RTL context; "dir=ltr" for LTR text
    *         in non-LTR context; else, the empty string.
@@ -333,7 +332,7 @@
   /**
    * Like {@link #markAfter(String, boolean)}, but assumes {@code isHtml} is
    * false.
-   * 
+   *
    * @param str String after which the mark may need to appear
    * @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
    *         else, the empty string.
@@ -346,7 +345,7 @@
    * Returns a Unicode BiDi mark matching the context direction (LRM or RLM) if
    * either the direction or the exit direction of {@code str} is opposite to
    * the context direction. Otherwise returns the empty string.
-   * 
+   *
    * @param str String after which the mark may need to appear
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @return LRM for RTL text in LTR context; RLM for LTR text in RTL context;
@@ -361,7 +360,7 @@
   /**
    * Like {@link #spanWrap(String, boolean, boolean)}, but assumes {@code
    * isHtml} is false and {@code dirReset} is true.
-   * 
+   *
    * @param str The input string
    * @return Input string after applying the above processing.
    */
@@ -372,7 +371,7 @@
   /**
    * Like {@link #spanWrap(String, boolean, boolean)}, but assumes {@code
    * dirReset} is true.
-   * 
+   *
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @return Input string after applying the above processing.
@@ -398,7 +397,7 @@
    * mark matching the context direction is appended (LRM or RLM).
    * <p>
    * If !{@code isHtml}, HTML-escapes {@code str} regardless of wrapping.
-   * 
+   *
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @param dirReset Whether to append a trailing unicode bidi mark matching the
@@ -414,7 +413,7 @@
   /**
    * Like {@link #spanWrapWithKnownDir(HasDirection.Direction, String, boolean, boolean)},
    * but assumes {@code isHtml} is false and {@code dirReset} is true.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @return Input string after applying the above processing.
@@ -426,7 +425,7 @@
   /**
    * Like {@link #spanWrapWithKnownDir(HasDirection.Direction, String, boolean, boolean)},
    * but assumes {@code dirReset} is true.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
@@ -453,7 +452,7 @@
    * mark matching the context direction is appended (LRM or RLM).
    * <p>
    * If !{@code isHtml}, HTML-escapes {@code str} regardless of wrapping.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
@@ -497,7 +496,7 @@
   /**
    * Like {@link #unicodeWrap(String, boolean, boolean)}, but assumes {@code
    * isHtml} is false and {@code dirReset} is true.
-   * 
+   *
    * @param str The input string
    * @return Input string after applying the above processing.
    */
@@ -508,7 +507,7 @@
   /**
    * Like {@link #unicodeWrap(String, boolean, boolean)}, but assumes {@code
    * dirReset} is true.
-   * 
+   *
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @return Input string after applying the above processing.
@@ -534,7 +533,7 @@
    * BiDi mark matching the context direction is appended (LRM or RLM).
    * <p>
    * Does *not* do HTML-escaping regardless of the value of {@code isHtml}.
-   * 
+   *
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
    * @param dirReset Whether to append a trailing unicode bidi mark matching the
@@ -550,7 +549,7 @@
   /**
    * Like {@link #unicodeWrapWithKnownDir(HasDirection.Direction, String, boolean, boolean)},
    * but assumes {@code isHtml} is false and {@code dirReset} is true.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @return Input string after applying the above processing.
@@ -562,7 +561,7 @@
   /**
    * Like {@link #unicodeWrapWithKnownDir(HasDirection.Direction, String, boolean, boolean)},
    * but assumes {@code dirReset} is true.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
@@ -590,7 +589,7 @@
    * BiDi mark matching the context direction is appended (LRM or RLM).
    * <p>
    * Does *not* do HTML-escaping regardless of the value of {@code isHtml}.
-   * 
+   *
    * @param dir {@code str}'s direction
    * @param str The input string
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
@@ -619,7 +618,7 @@
    * {@code dirReset}, and if the overall direction or the exit direction of
    * {@code str} are opposite to the context direction. Otherwise returns the
    * empty string.
-   * 
+   *
    * @param str The input string
    * @param dir {@code str}'s overall direction
    * @param isHtml Whether {@code str} is HTML / HTML-escaped
@@ -648,4 +647,3 @@
     return str.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;").replace("\n", "<br>");
   }
 }
-
diff --git a/user/src/com/google/gwt/i18n/shared/GwtLocale.java b/user/src/com/google/gwt/i18n/shared/GwtLocale.java
index 8dd7bb4..9a065ab 100644
--- a/user/src/com/google/gwt/i18n/shared/GwtLocale.java
+++ b/user/src/com/google/gwt/i18n/shared/GwtLocale.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -32,19 +32,19 @@
   int compareTo(GwtLocale o);
 
   /**
-   * Return the list of aliases for this locale.  The canonical form of the
+   * Returns the list of aliases for this locale.  The canonical form of the
    * current locale is always first on the list.
-   * 
+   *
    * Language/region codes have changed over time, so some systems continue to
    * use the older codes.  Aliases allow GWT to use the official Unicode CLDR
    * locales while still interoperating with such systems.
-   * 
+   *
    * @return alias list
    */
   List<GwtLocale> getAliases();
-  
+
   /**
-   * Return the locale as a fixed-format string suitable for use in searching
+   * Returns the locale as a fixed-format string suitable for use in searching
    * for localized resources.  The format is language_Script_REGION_VARIANT,
    * where language is a 2-8 letter code (possibly with 3-letter extensions),
    * script is a 4-letter code with an initial capital letter, region is a
@@ -52,7 +52,7 @@
    * character (may be 4 if the first character is numeric) code.  If a
    * component is missing, its preceding _ is also omitted.  If this is the
    * default locale, the empty string will be returned.
-   * 
+   *
    * @return String representing locale
    */
   String getAsString();
@@ -66,92 +66,92 @@
    *  <li>no/nb/nn are normalized
    *  <li>Default region for zh_Hans and zh_Hant if none specified
    * </ul>
-   * 
-   * @return GwtLocale instance 
+   *
+   * @return GwtLocale instance
    */
   GwtLocale getCanonicalForm();
 
   /**
-   * Return the complete list of locales to search for the current locale.
+   * Returns the complete list of locales to search for the current locale.
    * This list will always start with the canonical form of this locale, and
    * end with "default", and include all appropriate aliases along the way.
-   * 
+   *
    * @return search list
    */
   List<GwtLocale> getCompleteSearchList();
-  
+
   /**
-   * Return a list of locales to search for, in order of preference.  The
+   * Returns a list of locales to search for, in order of preference.  The
    * current locale is always first on the list.  Aliases are not included
    * in the list -- use {@link #getAliases} to expand those.
-   * 
+   *
    * @return inheritance list
    */
   List<GwtLocale> getInheritanceChain();
-  
+
   /**
-   * @return the language portion of the locale, or null if none.
+   * Returns the language portion of the locale, or null if none.
    */
   String getLanguage();
 
   /**
-   * @return the language portion of the locale, or the empty string if none.
+   * Returns the language portion of the locale, or the empty string if none.
    */
   String getLanguageNotNull();
 
   /**
-   * @return the region portion of the locale, or null if none.
+   * Returns the region portion of the locale, or null if none.
    */
   String getRegion();
-  
+
   /**
-   * @return the region portion of the locale, or the empty string if none.
+   * Returns the region portion of the locale, or the empty string if none.
    */
   String getRegionNotNull();
 
   /**
-   * @return the script portion of the locale, or null if none.
+   * Returns the script portion of the locale, or null if none.
    */
   String getScript();
-  
+
   /**
-   * @return the script portion of the locale, or the empty string if none.
+   * Returns the script portion of the locale, or the empty string if none.
    */
   String getScriptNotNull();
-  
+
   /**
-   * @return the variant portion of the locale, or null if none.
+   * Returns the variant portion of the locale, or null if none.
    */
   String getVariant();
-  
+
   /**
-   * @return the variant portion of the locale, or the empty string if none.
+   * Returns the variant portion of the locale, or the empty string if none.
    */
   String getVariantNotNull();
 
   /**
-   * Return true if this locale inherits from the specified locale.  Note that
+   * Returns true if this locale inherits from the specified locale.  Note that
    * locale.inheritsFrom(locale) is false -- if you want that to be true, you
    * should just use locale.getInheritanceChain().contains(x).
-   * 
+   *
    * @param parent locale to test against
    * @return true if parent is an ancestor of this locale
    */
   boolean inheritsFrom(GwtLocale parent);
 
   /**
-   * @return true if this is the default or root locale.
+   * Returns true if this is the default or root locale.
    */
   boolean isDefault();
 
   /**
-   * @return a human readable string -- "default" or the same as getAsString().
+   * Returns a human readable string -- "default" or the same as getAsString().
    */
   String toString();
 
   /**
    * Checks if this locale uses the same script as another locale.
-   * 
+   *
    * @param other
    * @return true if the scripts are the same
    */
diff --git a/user/src/com/google/gwt/i18n/shared/GwtLocaleFactory.java b/user/src/com/google/gwt/i18n/shared/GwtLocaleFactory.java
index dc5a47e..1a767a2 100644
--- a/user/src/com/google/gwt/i18n/shared/GwtLocaleFactory.java
+++ b/user/src/com/google/gwt/i18n/shared/GwtLocaleFactory.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,9 +22,9 @@
 
   /**
    * Construct a GWT locale from its component parts.
-   * 
+   *
    * Null or empty strings are accepted for parts not present.
-   * 
+   *
    * @param language
    * @param script
    * @param region
@@ -41,16 +41,16 @@
    * also private-use tags are only supported for the entire tag).
    * Only minimal validation of BCP47 tags is performed, and will continue
    * with what it is able to parse if unexpected input is encountered.
-   * 
+   *
    * A null or empty string is treated as the default locale.
-   * 
+   *
    * @param localeName
    * @return a locale instance, always the same one for a given localeName
    */
   GwtLocale fromString(String localeName);
-  
+
   /**
-   * @return an instance of the default locale.
+   * Returns an instance of the default locale.
    */
   GwtLocale getDefault();
 }
diff --git a/user/src/com/google/gwt/i18n/shared/HasDirectionEstimator.java b/user/src/com/google/gwt/i18n/shared/HasDirectionEstimator.java
index 15181b4..661a0b8 100644
--- a/user/src/com/google/gwt/i18n/shared/HasDirectionEstimator.java
+++ b/user/src/com/google/gwt/i18n/shared/HasDirectionEstimator.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,22 +21,22 @@
 public interface HasDirectionEstimator {
 
   /**
-   * @return the {@code DirectionEstimator} object.
+   * Returns the {@code DirectionEstimator} object.
    */
   DirectionEstimator getDirectionEstimator();
 
   /**
    * Toggles on / off direction estimation.
-   * 
+   *
    * @param enabled Whether to enable direction estimation. If {@code true},
    *          sets the {@link DirectionEstimator} object to a default
    *          {@code DirectionEstimator}.
    */
   void setDirectionEstimator(boolean enabled);
-  
+
   /**
    * Sets the {@link DirectionEstimator} object.
-   * 
+   *
    * @param directionEstimator The {code DirectionEstimator} to be set. {@code
    *        null} means turning off direction estimation.
    */
diff --git a/user/src/com/google/gwt/jsonp/client/JsonpRequest.java b/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
index c199339..54ca127 100644
--- a/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
+++ b/user/src/com/google/gwt/jsonp/client/JsonpRequest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,7 +26,7 @@
 
 /**
  * A JSONP request that is waiting for a response. The request can be canceled.
- * 
+ *
  * @param <T> the type of the response object.
  */
 public class JsonpRequest<T> {
@@ -42,22 +42,22 @@
    */
   private static final String CALLBACKS_NAME = "__gwt_jsonp__";
   private static final JavaScriptObject CALLBACKS = getOrCreateCallbacksObject();
-  
+
   /**
-   * @return the next ID to use, incrementing the global counter.
+   * Returns the next ID to use, incrementing the global counter.
    */
   private static native int getAndIncrementCallbackCounter() /*-{
     var name = @com.google.gwt.jsonp.client.JsonpRequest::CALLBACKS_NAME;
     var ctr = @com.google.gwt.jsonp.client.JsonpRequest::CALLBACKS_COUNTER_NAME;
     return $wnd[name][ctr]++;
   }-*/;
-  
+
   private static Node getHeadElement() {
     return Document.get().getElementsByTagName("head").getItem(0);
   }
-  
+
   /**
-   * @return a global object to store callbacks of pending requests, creating
+   * Returns a global object to store callbacks of pending requests, creating
    * it if it doesn't exist.
    */
   private static native JavaScriptObject getOrCreateCallbacksObject() /*-{
@@ -98,7 +98,7 @@
 
   /**
    * Create a new JSONP request.
-   * 
+   *
    * @param callback The callback instance to notify when the response comes
    *          back
    * @param timeout Time in ms after which a {@link TimeoutException} will be
@@ -147,7 +147,7 @@
 
   /**
    * Sends a request using the JSONP mechanism.
-   * 
+   *
    * @param baseUri To be sent to the server.
    */
   void send(final String baseUri) {
@@ -155,7 +155,7 @@
     StringBuffer uri = new StringBuffer(baseUri);
     uri.append(baseUri.contains("?") ? "&" : "?");
     String prefix = CALLBACKS_NAME + "." + callbackId;
-    
+
     uri.append(callbackParam).append("=").append(prefix).append(
         ".onSuccess");
     if (failureCallbackParam != null) {
@@ -209,7 +209,7 @@
    * Registers the callback methods that will be called when the JSONP response
    * comes back. 2 callbacks are created, one to return the value, and one to
    * notify a failure.
-   * 
+   *
    * @param callbacks the global JS object which stores callbacks
    */
   private native void registerCallbacks(JavaScriptObject callbacks) /*-{
diff --git a/user/src/com/google/gwt/jsonp/client/JsonpRequestBuilder.java b/user/src/com/google/gwt/jsonp/client/JsonpRequestBuilder.java
index e5a376d..9fe9b86 100644
--- a/user/src/com/google/gwt/jsonp/client/JsonpRequestBuilder.java
+++ b/user/src/com/google/gwt/jsonp/client/JsonpRequestBuilder.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -106,23 +106,23 @@
   private String failureCallbackParam = null;
 
   /**
-   * @return the name of the callback url parameter to send to the server. The default value is
-   *     "callback".
+   * Returns the name of the callback url parameter to send to the server. The
+   * default value is "callback".
    */
   public String getCallbackParam() {
     return callbackParam;
   }
 
   /**
-   * @return the name of the failure callback url parameter to send to the server. The default is
-   *     null.
+   * Returns the name of the failure callback url parameter to send to the
+   * server. The default is null.
    */
   public String getFailureCallbackParam() {
     return failureCallbackParam;
   }
 
   /**
-   * @return the expected timeout (ms) for this request.
+   * Returns the expected timeout (ms) for this request.
    */
   public int getTimeout() {
     return timeout;
diff --git a/user/src/com/google/gwt/junit/GWTDummyBridge.java b/user/src/com/google/gwt/junit/GWTDummyBridge.java
index f062e22..f3adda7 100644
--- a/user/src/com/google/gwt/junit/GWTDummyBridge.java
+++ b/user/src/com/google/gwt/junit/GWTDummyBridge.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,22 +23,22 @@
 
 /**
  * A dummy implementation of {@link GWTBridge}, which instantiates nothing.
- * 
+ *
  * @see GWTMockUtilities
  */
 class GWTDummyBridge extends GWTBridge {
   private static final Logger logger = Logger.getLogger(GWTDummyBridge.class.getName());
 
   /**
-   * @return null
+   * Returns null.
    */
   @Override
   public <T> T create(Class<?> classLiteral) {
     return null;
   }
-      
+
   /**
-   * @return the current version of GWT ({@link About#getGwtVersionNum()})
+   * Returns the current version of GWT ({@link About#getGwtVersionNum()}).
    */
   @Override
   public String getVersion() {
@@ -46,7 +46,7 @@
   }
 
   /**
-   * @return false
+   * Returns false.
    */
   @Override
   public boolean isClient() {
diff --git a/user/src/com/google/gwt/junit/client/GWTTestCase.java b/user/src/com/google/gwt/junit/client/GWTTestCase.java
index b87324c..a2e254b 100644
--- a/user/src/com/google/gwt/junit/client/GWTTestCase.java
+++ b/user/src/com/google/gwt/junit/client/GWTTestCase.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -35,7 +35,7 @@
  * hook the run method and stash the TestResult object for later communication
  * between the test runner and the unit test shell that drives the test case
  * inside a hosted browser.
- * 
+ *
  * <p>
  * There are two versions of this class. This version is the binary version that
  * derives from JUnit's {@link TestCase} and handles all the work of starting up
@@ -72,7 +72,7 @@
     private String moduleName;
     private String syntheticModuleName;
     private Strategy strategy;
-    
+
     /**
      * The ordered tests in this synthetic module.
      */
@@ -80,7 +80,7 @@
 
     /**
      * Construct a new {@link TestModuleInfo}.
-     * 
+     *
      * @param moduleName the module name
      * @param syntheticModuleName the synthetic module name
      * @param strategy the test {@link Strategy}
@@ -105,7 +105,7 @@
     }
 
     /**
-     * @return the tests that are part of this module
+     * Returns the tests that are part of this module.
      */
     public Set<TestInfo> getTests() {
       return tests;
@@ -126,7 +126,7 @@
 
   /**
    * Get the names of all test modules.
-   * 
+   *
    * @return all test module names
    */
   public static String[] getAllTestModuleNames() {
@@ -137,7 +137,7 @@
 
   /**
    * Get the number of modules.
-   * 
+   *
    * @return the module count.
    */
   public static int getModuleCount() {
@@ -145,10 +145,10 @@
       return ALL_GWT_TESTS.size();
     }
   }
-  
+
   /**
    * Get the set of all {@link TestInfo} for the specified module.
-   * 
+   *
    * @param syntheticModuleName the synthetic module name
    * @return all tests for the module
    */
@@ -196,7 +196,7 @@
    * checkpoint messages will be appended to the getException description. This
    * can be useful in web mode for determining how far test execution progressed
    * before a failure occurs.
-   * 
+   *
    * @param msg the checkpoint message to add
    * @deprecated This method will be removed when web mode supports stack
    *             traces. It can be useful for debugging web mode failures, but
@@ -213,7 +213,7 @@
    * escape to the browser. This will break the normal JUnit reporting
    * functionality, but can be useful in web mode with a JavaScript debugger to
    * pin down where exceptions are originating.
-   * 
+   *
    * @return <code>true</code> for normal JUnit behavior, or
    *         <code>false</code> to disable normal JUnit getException reporting
    */
@@ -223,7 +223,7 @@
 
   /**
    * Clears the accumulated list of checkpoint messages.
-   * 
+   *
    * @see #addCheckpoint(String)
    * @deprecated This method will be removed if and when web mode supports stack
    *             traces. It can be useful for debugging web mode failures, but
@@ -236,7 +236,7 @@
 
   /**
    * Returns the current set of checkpoint messages.
-   * 
+   *
    * @return a non-<code>null</code> array of checkpoint messages
    * @see #addCheckpoint(String)
    * @deprecated This method will be removed if and when web mode supports stack
@@ -253,7 +253,7 @@
    * Specifies a module to use when running this test case. Subclasses must
    * return the name of a module that will cause the source for that subclass to
    * be included.
-   * 
+   *
    * @return the fully qualified name of a module, or <code>null</code> to run
    *         as a pure Java (non-GWT) test case (same effect as passing
    *         <code>true</code> to {@link #setForcePureJava})
@@ -264,7 +264,7 @@
 
   /**
    * Get the {@link Strategy} to use when compiling and running this test.
-   *  
+   *
    * @return the test {@link Strategy}
    */
   public Strategy getStrategy() {
@@ -277,7 +277,7 @@
   /**
    * Get the synthetic module name, which includes the synthetic extension
    * defined by the {@link Strategy}.
-   * 
+   *
    * @return the synthetic module name, or <code>null</code> if this test case
    *         is run in pure Java mode (non-GWT)
    *
@@ -360,7 +360,7 @@
    * normally, this test will not immediately succeed. Instead, a <i>delay
    * period</i> begins. During the delay period, the test system will wait for
    * one of three things to happen:
-   * 
+   *
    * <ol>
    * <li> If {@link #finishTest()} is called before the delay period expires,
    * the test will succeed.</li>
@@ -369,20 +369,20 @@
    * <li> If the delay period expires and neither of the above has happened, the
    * test will error with a {@link TimeoutException}. </li>
    * </ol>
-   * 
+   *
    * <p>
    * This method is typically used to test event driven functionality.
    * </p>
-   * 
+   *
    * <p>
    * <b>Example:</b>
    * {@example com.google.gwt.examples.AsyncJUnitExample#testTimer()}
    * </p>
-   * 
+   *
    * @param timeoutMillis how long to wait before the current test will time out
    * @tip Subsequent calls to this method reset the timeout.
    * @see #finishTest()
-   * 
+   *
    * @throws UnsupportedOperationException if {@link #supportsAsync()} is false
    */
   protected final void delayTestFinish(int timeoutMillis) {
@@ -394,21 +394,21 @@
    * {@link #delayTestFinish(int)}, call this method during the delay period to
    * cause this test to succeed. This method is typically called from an event
    * handler some time after the test method returns control to the caller.
-   * 
+   *
    * <p>
    * Calling this method before the test method completes, will undo the effect
    * of having called <code>delayTestFinish()</code>. The test will revert to
    * normal, non-asynchronous mode.
    * </p>
-   * 
+   *
    * <p>
    * <b>Example:</b>
    * {@example com.google.gwt.examples.AsyncJUnitExample#testTimer()}
    * </p>
-   * 
+   *
    * @throws IllegalStateException if this test is not in asynchronous mode
    * @throws UnsupportedOperationException if {@link #supportsAsync()} is false
-   * 
+   *
    * @see #delayTestFinish(int)
    */
   protected final void finishTest() {
diff --git a/user/src/com/google/gwt/place/shared/Place.java b/user/src/com/google/gwt/place/shared/Place.java
index cd1af45..9b2a462 100644
--- a/user/src/com/google/gwt/place/shared/Place.java
+++ b/user/src/com/google/gwt/place/shared/Place.java
@@ -16,11 +16,6 @@
 package com.google.gwt.place.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Represents a bookmarkable location in an app. Implementations are expected to
  * provide correct {@link Object#equals(Object)} and {@link Object#hashCode()}
  * methods.
diff --git a/user/src/com/google/gwt/place/shared/PlaceChangeEvent.java b/user/src/com/google/gwt/place/shared/PlaceChangeEvent.java
index 5a4a081..b3aa594 100644
--- a/user/src/com/google/gwt/place/shared/PlaceChangeEvent.java
+++ b/user/src/com/google/gwt/place/shared/PlaceChangeEvent.java
@@ -19,11 +19,6 @@
 import com.google.gwt.event.shared.GwtEvent;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Event thrown when the user has reached a new location in the app.
  */
 public class PlaceChangeEvent extends GwtEvent<PlaceChangeEvent.Handler> {
diff --git a/user/src/com/google/gwt/place/shared/PlaceChangeRequestEvent.java b/user/src/com/google/gwt/place/shared/PlaceChangeRequestEvent.java
index fff23d1..35d63e4 100644
--- a/user/src/com/google/gwt/place/shared/PlaceChangeRequestEvent.java
+++ b/user/src/com/google/gwt/place/shared/PlaceChangeRequestEvent.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,11 +19,6 @@
 import com.google.gwt.event.shared.GwtEvent;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Event thrown when the user may go to a new place in the app, or tries to
  * leave it. Receivers can call {@link #setWarning(String)} request that the
  * user be prompted to confirm the change.
@@ -54,15 +49,15 @@
   }
 
   /**
-   * @return the place we may navigate to, or null on window close
+   * Returns the place we may navigate to, or null on window close.
    */
   public Place getNewPlace() {
     return newPlace;
   }
 
   /**
-   * @return the warning message to show the user before allowing the place
-   *         change, or null if none has been set
+   * Returns the warning message to show the user before allowing the place
+   * change, or null if none has been set.
    */
   public String getWarning() {
     return warning;
diff --git a/user/src/com/google/gwt/place/shared/PlaceController.java b/user/src/com/google/gwt/place/shared/PlaceController.java
index a28a5d0..4a7e497 100644
--- a/user/src/com/google/gwt/place/shared/PlaceController.java
+++ b/user/src/com/google/gwt/place/shared/PlaceController.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -25,11 +25,6 @@
 import java.util.logging.Logger;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * In charge of the user's location in the app.
  */
 public class PlaceController {
@@ -91,7 +86,7 @@
   }
 
   /**
-   * @return the current place
+   * Returns the current place.
    */
   public Place getWhere() {
     return where;
diff --git a/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java b/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
index d170761..145b92e 100644
--- a/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
+++ b/user/src/com/google/gwt/place/shared/PlaceHistoryMapper.java
@@ -16,11 +16,6 @@
 package com.google.gwt.place.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Maps {@link Place}s to/from tokens, used to configure a
  * {@link PlaceHistoryHandler}.
  */
diff --git a/user/src/com/google/gwt/regexp/shared/MatchResult.java b/user/src/com/google/gwt/regexp/shared/MatchResult.java
index a74a98ee..4f651aa 100644
--- a/user/src/com/google/gwt/regexp/shared/MatchResult.java
+++ b/user/src/com/google/gwt/regexp/shared/MatchResult.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -35,7 +35,7 @@
 
   /**
    * Retrieves the matched string or the given matched group.
-   * 
+   *
    * @param index the index of the group to return, 0 to return the whole
    *        matched string; must be between 0 and {@code getGroupCount() - 1}
    *        included
@@ -49,22 +49,22 @@
   }
 
   /**
-   * @return The number of groups, including the matched string hence greater or
-   *         equal than 1.
+   * Returns the number of groups, including the matched string hence greater or
+   * equal than 1.
    */
   public int getGroupCount() {
     return groups.size();
   }
 
   /**
-   * @return The zero-based index of the match in the input string.
+   * Returns the zero-based index of the match in the input string.
    */
   public int getIndex() {
     return index;
   }
 
   /**
-   * @return The original input string.
+   * Returns the original input string.
    */
   public String getInput() {
     return input;
diff --git a/user/src/com/google/gwt/regexp/shared/RegExp.java b/user/src/com/google/gwt/regexp/shared/RegExp.java
index 7b29158..82e10fe 100644
--- a/user/src/com/google/gwt/regexp/shared/RegExp.java
+++ b/user/src/com/google/gwt/regexp/shared/RegExp.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -37,7 +37,7 @@
  * implementation, not the pure Java implementation, which rejects them.
  */
 public class RegExp {
-  
+
   // In JS syntax, a \ in the replacement string has no special meaning.
   // In Java syntax, a \ in the replacement string escapes the next character,
   // so we have to translate \ to \\ before passing it to Java.
@@ -78,7 +78,7 @@
 
   /**
    * Creates a regular expression object from a pattern with no flags.
-   * 
+   *
    * @param pattern the Javascript regular expression pattern to compile
    * @return a new regular expression
    * @throws RuntimeException if the pattern is invalid
@@ -86,10 +86,10 @@
   public static RegExp compile(String pattern) {
     return compile(pattern, "");
   }
-  
+
   /**
    * Creates a regular expression object from a pattern using the given flags.
-   * 
+   *
    * @param pattern the Javascript regular expression pattern to compile
    * @param flags the flags string, containing at most one occurrence of {@code
    *        'g'} ({@link #getGlobal()}), {@code 'i'} ({@link #getIgnoreCase()}),
@@ -125,11 +125,11 @@
 
     return new RegExp(pattern, javaPattern, globalFlag);
   }
-  
+
   /**
    * Parses a flags string as a set of characters. Does not reject unknown
    * flags.
-   * 
+   *
    * @param flags the flag string to parse
    * @return a set of flags
    * @throws IllegalArgumentException if a flag is duplicated
@@ -145,7 +145,7 @@
     }
     return flagsSet;
   }
-  
+
   private final boolean globalFlag;
 
   private int lastIndex;
@@ -164,7 +164,7 @@
   /**
    * Applies the regular expression to the given string. This call affects the
    * value returned by {@link #getLastIndex()} if the global flag is set.
-   * 
+   *
    * @param input the string to apply the regular expression to
    * @return a match result if the string matches, else {@code null}
    */
@@ -209,26 +209,26 @@
   }
 
   /**
-   * @return Whether the regular expression captures all occurrences of the
-   *         pattern.
+   * Returns whether the regular expression captures all occurrences of the
+   * pattern.
    */
   public boolean getGlobal() {
     return globalFlag;
   }
 
   /**
-   * @return Whether the regular expression ignores case.
+   * Returns whether the regular expression ignores case.
    */
   public boolean getIgnoreCase() {
     return (pattern.flags() & Pattern.CASE_INSENSITIVE) != 0;
   }
 
   /**
-   * @return The zero-based position at which to start the next match. The
-   *         return value is not defined if the global flag is not set. After a
-   *         call to {@link #exec} or {@link #test}, this method returns the
-   *         next position following the most recent match.
-   * 
+   * Returns the zero-based position at which to start the next match. The
+   * return value is not defined if the global flag is not set. After a call
+   * to {@link #exec(String)} or {@link #test(String)}, this method returns
+   * the next position following the most recent match.
+   *
    * @see #getGlobal()
    */
   public int getLastIndex() {
@@ -236,15 +236,15 @@
   }
 
   /**
-   * @return Whether '$' and '^' match line returns ('\n' and '\r') in addition
-   *         to the beginning or end of the string.
+   * Returns whether '$' and '^' match line returns ('\n' and '\r') in addition
+   * to the beginning or end of the string.
    */
   public boolean getMultiline() {
     return (pattern.flags() & Pattern.MULTILINE) != 0;
   }
 
   /**
-   * @return The pattern string of the regular expression.
+   * Returns the pattern string of the regular expression.
    */
   public String getSource() {
     return source;
@@ -265,7 +265,7 @@
    * </ul>
    * Note: $` and $' are *not* supported in the pure Java implementation, and
    * throw an exception.
-   * 
+   *
    * @param input the string in which the regular expression is to be searched.
    * @param replacement the replacement string.
    * @return the input string with the regular expression replaced by the
@@ -309,7 +309,7 @@
    * regular expression is completely empty, splits the input string into its
    * constituent characters. If the regular expression is not empty but matches
    * an empty string, the results are not well defined.
-   * 
+   *
    * @param input the string to be split.
    * @return the strings split off, any of which may be empty.
    */
@@ -322,11 +322,11 @@
    * regular expression is completely empty, splits the input string into its
    * constituent characters. If the regular expression is not empty but matches
    * an empty string, the results are not well defined.
-   * 
-   * Note: There are some browser inconsistencies with this implementation, as 
+   *
+   * Note: There are some browser inconsistencies with this implementation, as
    * it is delegated to the browser, and no browser follows the spec completely.
    * A major difference is that IE will exclude empty strings in the result.
-   * 
+   *
    * @param input the string to be split.
    * @param limit the the maximum number of strings to split off and return,
    *        ignoring the rest of the input string. If negative, there is no
@@ -365,7 +365,7 @@
    * Determines if the regular expression matches the given string. This call
    * affects the value returned by {@link #getLastIndex()} if the global flag is
    * set. Equivalent to: {@code exec(input) != null}
-   * 
+   *
    * @param input the string to apply the regular expression to
    * @return whether the regular expression matches the given string.
    */
diff --git a/user/src/com/google/gwt/regexp/shared/SplitResult.java b/user/src/com/google/gwt/regexp/shared/SplitResult.java
index 66e3e36..5a8f694 100644
--- a/user/src/com/google/gwt/regexp/shared/SplitResult.java
+++ b/user/src/com/google/gwt/regexp/shared/SplitResult.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -28,7 +28,7 @@
 
   /**
    * Returns one the strings split off.
-   * 
+   *
    * @param index the index of the string to be returned.
    * @return The index'th string resulting from the split.
    */
@@ -37,7 +37,7 @@
   }
 
   /**
-   * @return The number of strings split off.
+   * Returns the number of strings split off.
    */
   public int length() {
     return result.length;
@@ -45,7 +45,7 @@
 
   /**
    * Sets (overrides) one of the strings split off.
-   * 
+   *
    * @param index the index of the string to be set.
    */
   public void set(int index, String value) {
diff --git a/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/MatchResult.java b/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/MatchResult.java
index 89b03d1..a4ef2b9 100644
--- a/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/MatchResult.java
+++ b/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/MatchResult.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,7 +27,7 @@
 
   /**
    * Retrieves the matched string or the given matched group.
-   * 
+   *
    * @param index the index of the group to return, 0 to return the whole
    *          matched string; must be between 0 and {@code getGroupCount() - 1}
    *          included
@@ -41,22 +41,22 @@
    }-*/;
 
   /**
-   * @return The number of groups, including the matched string hence greater or
-   *         equal than 1.
+   * Returns the number of groups, including the matched string hence greater or
+   * equal than 1.
    */
   public final native int getGroupCount() /*-{
      return this.length;
    }-*/;
-  
-  /** 
-   * @return The zero-based index of the match in the input string.
+
+  /**
+   * Returns the zero-based index of the match in the input string.
    */
   public final native int getIndex() /*-{
      return this.index;
    }-*/;
 
   /**
-   * @return The original input string.
+   * Returns the original input string.
    */
   public final native String getInput() /*-{
      return this.input;
diff --git a/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/RegExp.java b/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/RegExp.java
index 8307ba8..5c41859 100644
--- a/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/RegExp.java
+++ b/user/src/com/google/gwt/regexp/super/com/google/gwt/regexp/shared/RegExp.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -25,7 +25,7 @@
 
   /**
    * Creates a regular expression object from a pattern with no flags.
-   * 
+   *
    * @param pattern the Javascript regular expression pattern to compile
    * @return a new regular expression
    * @throws RuntimeException if the pattern is invalid
@@ -36,7 +36,7 @@
 
   /**
    * Creates a regular expression object from a pattern with no flags.
-   * 
+   *
    * @param pattern the Javascript regular expression pattern to compile
    * @param flags the flags string, containing at most one occurence of {@code
    *          'g'} ({@link #getGlobal()}), {@code 'i'} ({@link #getIgnoreCase()}
@@ -54,7 +54,7 @@
   /**
    * Applies the regular expression to the given string. This call affects the
    * value returned by {@link #getLastIndex()} if the global flag is set.
-   * 
+   *
    * @param input the string to apply the regular expression to
    * @return a match result if the string matches, else {@code null}
    */
@@ -63,26 +63,26 @@
    }-*/;
 
   /**
-   * @return Whether the regular expression captures all occurences of the
-   *         pattern.
+   * Returns whether the regular expression captures all occurences of the
+   * pattern.
    */
   public final native boolean getGlobal() /*-{
     return this.global;
   }-*/;
 
   /**
-   * @return Whether the regular expression ignores case.
+   * Returns whether the regular expression ignores case.
    */
   public final native boolean getIgnoreCase() /*-{
     return this.ignoreCase;
   }-*/;
 
   /**
-   * @return The zero-based position at which to start the next match. The
-   *         return value is not defined if the global flag is not set. After a
-   *         call to {@link #exec} or {@link #test}, this method returns the
-   *         next position following the most recent match.
-   * 
+   * Returns the zero-based position at which to start the next match. The
+   * return value is not defined if the global flag is not set. After a call
+   * to {@link #exec(String)} or {@link #test(String)}, this method returns
+   * the next position following the most recent match.
+   *
    * @see #getGlobal()
    */
   public final native int getLastIndex() /*-{
@@ -90,15 +90,15 @@
    }-*/;
 
   /**
-   * @return Whether '$' and '^' match line returns ('\n' and '\r') in addition
-   *         to the beginning or end of the string.
+   * Returns whether '$' and '^' match line returns ('\n' and '\r') in addition
+   * to the beginning or end of the string.
    */
   public final native boolean getMultiline() /*-{
     return this.multiline;
   }-*/;
 
   /**
-   * @return The pattern string of the regular expression.
+   * Returns the pattern string of the regular expression.
    */
   public final native String getSource() /*-{
      return this.source;
@@ -117,12 +117,12 @@
    * <li>$&amp; - inserts the entire string matched by the regular expression.
    * <li>$$ - inserts a $.
    * </ul>
-   * 
+   *
    * @param input the string in which the regular expression is to be searched.
    * @param replacement the replacement string.
    * @return the input string with the regular expression replaced with the
    *         replacement string.
-   * @throws RuntimeException if {@code replacement} is invalid        
+   * @throws RuntimeException if {@code replacement} is invalid
    */
   public final native String replace(String input, String replacement) /*-{
      return input.replace(this, replacement);
@@ -140,9 +140,9 @@
    * regular expression is completely empty, splits the input string into its
    * constituent characters. If the regular expression is not empty but matches
    * an empty string, the results are not well defined.
-   * 
+   *
    * @param input the string to be split.
-   * 
+   *
    * @return the strings split off, any of which may be empty.
    */
   public final native SplitResult split(String input) /*-{
@@ -154,12 +154,12 @@
    * regular expression is completely empty, splits the input string into its
    * constituent characters. If the regular expression is not empty but matches
    * an empty string, the results are not well defined.
-   * 
+   *
    * @param input the string to be split.
    * @param limit the the maximum number of strings to split off and return,
    *          ignoring the rest of the input string. If negative, there is no
    *          limit.
-   * 
+   *
    * @return the strings split off, any of which may be empty.
    */
   public final native SplitResult split(String input, int limit) /*-{
@@ -170,7 +170,7 @@
    * Determines if the regular expression matches the given string. This call
    * affects the value returned by {@link #getLastIndex()} if the global flag is
    * not set. Equivalent to: {@code exec(input) != null}
-   * 
+   *
    * @param input the string to apply the regular expression to
    * @return whether the regular expression matches the given string.
    */
@@ -178,4 +178,3 @@
      return this.test(input);
    }-*/;
 }
-
diff --git a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
index f5f3c1a..66ec958 100644
--- a/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
+++ b/user/src/com/google/gwt/requestfactory/client/impl/AbstractRequest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -48,7 +48,7 @@
  * </p>
  * Abstract implementation of {@link Request}. Each request stores a
  * {@link DeltaValueStoreJsonImpl}.
- * 
+ *
  * @param <T> return type
  */
 public abstract class AbstractRequest<T> implements Request<T>,
@@ -76,7 +76,7 @@
   }
 
   /**
-   * @return the properties
+   * Returns the properties.
    */
   public Set<String> getPropertyRefs() {
     return Collections.unmodifiableSet(propertyRefs);
diff --git a/user/src/com/google/gwt/requestfactory/rebind/model/RequestFactoryModel.java b/user/src/com/google/gwt/requestfactory/rebind/model/RequestFactoryModel.java
index 3ecc1f5..3803b1f 100644
--- a/user/src/com/google/gwt/requestfactory/rebind/model/RequestFactoryModel.java
+++ b/user/src/com/google/gwt/requestfactory/rebind/model/RequestFactoryModel.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -128,7 +128,7 @@
       die(poisonedMessage());
     }
   }
-  
+
   public Collection<EntityProxyModel> getAllProxyModels() {
     return Collections.unmodifiableCollection(peers.values());
   }
@@ -194,7 +194,7 @@
   }
 
   /**
-   * Return a list of public methods that match the given methodName.
+   * Returns a list of public methods that match the given methodName.
    */
   private List<Method> findMethods(Class<?> domainType, String methodName) {
     List<Method> toReturn = new ArrayList<Method>();
@@ -327,7 +327,6 @@
       return false;
     }
 
-
     if (instanceRequestInterface.isAssignableFrom(requestReturnType)) {
       if (isStatic(domainMethod)) {
         poison("Method %s.%s is an instance method, "
diff --git a/user/src/com/google/gwt/requestfactory/server/DefaultSecurityProvider.java b/user/src/com/google/gwt/requestfactory/server/DefaultSecurityProvider.java
index 72b1ed2..7b60641 100644
--- a/user/src/com/google/gwt/requestfactory/server/DefaultSecurityProvider.java
+++ b/user/src/com/google/gwt/requestfactory/server/DefaultSecurityProvider.java
@@ -18,13 +18,8 @@
 import com.google.gwt.requestfactory.shared.Service;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
- * A security provider that enforces {@link com.google.gwt.requestfactory.shared.Service}
- * annotations.
+ * A security provider that enforces
+ * {@link com.google.gwt.requestfactory.shared.Service} annotations.
  */
 public class DefaultSecurityProvider implements RequestSecurityProvider {
 
diff --git a/user/src/com/google/gwt/requestfactory/server/OperationRegistry.java b/user/src/com/google/gwt/requestfactory/server/OperationRegistry.java
index 06c7675..c769ee0 100644
--- a/user/src/com/google/gwt/requestfactory/server/OperationRegistry.java
+++ b/user/src/com/google/gwt/requestfactory/server/OperationRegistry.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.server;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Maps operation name to {RequestDefinition}.
  */
 public interface OperationRegistry {
diff --git a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
index 3720195..b2c89bf 100644
--- a/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
+++ b/user/src/com/google/gwt/requestfactory/server/ReflectionBasedOperationRegistry.java
@@ -29,11 +29,6 @@
 import java.util.Set;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * OperationRegistry which uses the operation name as a convention for
  * reflection to a method on a class, and returns an appropriate {@link
  * com.google.gwt.requestfactory.server.RequestDefinition}.
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java b/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
index 9d5223b..1e0db57 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestDefinition.java
@@ -19,11 +19,6 @@
 import java.lang.reflect.Type;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Implemented by enums that define the mapping between request objects and
  * service methods.
  */
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
index cdf9ef3..1f8eb6b 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestFactoryServlet.java
@@ -29,11 +29,6 @@
 import javax.servlet.http.HttpServletResponse;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Handles GWT RequestFactory JSON requests. Does user authentication on every
  * request, returning SC_UNAUTHORIZED if authentication fails, as well as a
  * header named "login" which contains the URL the user should be sent in to
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestProperty.java b/user/src/com/google/gwt/requestfactory/server/RequestProperty.java
index ec183b8..b1aeb0c 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestProperty.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestProperty.java
@@ -21,9 +21,7 @@
 import java.util.Map;
 
 /**
- * <p> <span style="color:red">Experimental API: This class is still under rapid development, and is
- * very likely to be deleted. Use it at your own risk. </span> </p> Represents one piece in a
- * property reference sequence.
+ * Represents one piece in a property reference sequence.
  */
 public class RequestProperty implements Iterable<RequestProperty> {
 
diff --git a/user/src/com/google/gwt/requestfactory/server/RequestSecurityProvider.java b/user/src/com/google/gwt/requestfactory/server/RequestSecurityProvider.java
index b16dd02..9a404af 100644
--- a/user/src/com/google/gwt/requestfactory/server/RequestSecurityProvider.java
+++ b/user/src/com/google/gwt/requestfactory/server/RequestSecurityProvider.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.server;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Enforces security policy for operations and classes, as well as permitting
  * request obfuscation.
  */
diff --git a/user/src/com/google/gwt/requestfactory/server/SampleDataPopulator.java b/user/src/com/google/gwt/requestfactory/server/SampleDataPopulator.java
index 1162a9d..2ffd72e 100644
--- a/user/src/com/google/gwt/requestfactory/server/SampleDataPopulator.java
+++ b/user/src/com/google/gwt/requestfactory/server/SampleDataPopulator.java
@@ -34,11 +34,6 @@
 import java.io.UnsupportedEncodingException;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Class to populate the datastore with sample data in a JSON file.
  */
 public class SampleDataPopulator {
diff --git a/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java b/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
index ec92a32..64072ce 100644
--- a/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
+++ b/user/src/com/google/gwt/requestfactory/shared/EntityProxy.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * A proxy for a server-side domain object.
  */
 public interface EntityProxy {
diff --git a/user/src/com/google/gwt/requestfactory/shared/EntityProxyChange.java b/user/src/com/google/gwt/requestfactory/shared/EntityProxyChange.java
index 29517cb..3b7abde 100644
--- a/user/src/com/google/gwt/requestfactory/shared/EntityProxyChange.java
+++ b/user/src/com/google/gwt/requestfactory/shared/EntityProxyChange.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,12 +21,8 @@
 import com.google.gwt.event.shared.HandlerRegistration;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
- * Abstract base class for an event announcing changes to a {@link EntityProxy}.
+ * Abstract base class for an event announcing changes to an
+ * {@link EntityProxy}.
  * <p>
  * Note that this event includes an unpopulated copy of the changed proxy
  * &mdash; all properties are undefined except it's id. That is, the event
@@ -34,12 +30,12 @@
  * themselves fresh copies of the proxy.
  * <p>
  * TODO: use ProxyId rather than an empty proxy
- * 
+ *
  * @param <P> the type of the proxy
  */
 public class EntityProxyChange<P extends EntityProxy> extends
     GwtEvent<EntityProxyChange.Handler<P>> {
-  
+
   /**
    * Implemented by methods that handle EntityProxyChange events.
    * @param <P> the proxy type
@@ -81,8 +77,8 @@
   }
 
   /**
-   * @return an unpopulated copy of the changed proxy &mdash; all properties are
-   *         undefined except its id
+   * Returns an unpopulated copy of the changed proxy &mdash; all properties are
+   * undefined except its id.
    */
   @SuppressWarnings("unchecked")
   public EntityProxyId<P> getProxyId() {
diff --git a/user/src/com/google/gwt/requestfactory/shared/Id.java b/user/src/com/google/gwt/requestfactory/shared/Id.java
index cb9db03..6340eff 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Id.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Id.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Marks the id property of an entity.
  */
 public @interface Id {
diff --git a/user/src/com/google/gwt/requestfactory/shared/ProxyFor.java b/user/src/com/google/gwt/requestfactory/shared/ProxyFor.java
index f118ac8..7a8c747 100644
--- a/user/src/com/google/gwt/requestfactory/shared/ProxyFor.java
+++ b/user/src/com/google/gwt/requestfactory/shared/ProxyFor.java
@@ -21,9 +21,7 @@
 import java.lang.annotation.Target;
 
 /**
- * <p> <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span> </p> Annotation on Record classes specifying 'type'. 'type'
+ * Annotation on Record classes specifying 'type'. 'type'
  * represents the server-side counterpart of the Record.
  */
 @Retention(RetentionPolicy.RUNTIME)
diff --git a/user/src/com/google/gwt/requestfactory/shared/Receiver.java b/user/src/com/google/gwt/requestfactory/shared/Receiver.java
index 8ba90ae..4f28289 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Receiver.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Receiver.java
@@ -18,11 +18,6 @@
 import java.util.Set;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Implemented by objects that display values.
  * 
  * @param <V> value type
diff --git a/user/src/com/google/gwt/requestfactory/shared/Request.java b/user/src/com/google/gwt/requestfactory/shared/Request.java
index a2965d0..4ca7a23 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Request.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Request.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Implemented by the request objects created by this factory.
  * 
  * @param <T> The return type of objects in the corresponding response.
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestEvent.java b/user/src/com/google/gwt/requestfactory/shared/RequestEvent.java
index b490984..cd9faf3 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestEvent.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestEvent.java
@@ -22,11 +22,6 @@
 import com.google.gwt.http.client.Response;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * An event posted whenever an RPC request is sent or its response is received.
  */
 public class RequestEvent extends GwtEvent<RequestEvent.Handler> {
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
index dce35e2..1b44616 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
@@ -18,11 +18,6 @@
 import com.google.gwt.event.shared.EventBus;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Marker interface for the RequestFactory code generator.
  */
 public interface RequestFactory {
diff --git a/user/src/com/google/gwt/requestfactory/shared/Service.java b/user/src/com/google/gwt/requestfactory/shared/Service.java
index 1baddc0..59f2cf5 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Service.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Service.java
@@ -21,11 +21,6 @@
 import java.lang.annotation.Target;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Annotation on Request classes specifying the server side implementations that
  * back them.
  */
diff --git a/user/src/com/google/gwt/requestfactory/shared/Version.java b/user/src/com/google/gwt/requestfactory/shared/Version.java
index a28a139..5e66314 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Version.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Version.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Marks the version property of an entity.
  */
 public @interface Version {
diff --git a/user/src/com/google/gwt/requestfactory/shared/Violation.java b/user/src/com/google/gwt/requestfactory/shared/Violation.java
index 45b96d5..2119c24 100644
--- a/user/src/com/google/gwt/requestfactory/shared/Violation.java
+++ b/user/src/com/google/gwt/requestfactory/shared/Violation.java
@@ -16,12 +16,8 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
- * A lightweight representation of a ConstraintViolation.
+ * A lightweight representation of a
+ * {@link javax.validation.ConstraintViolation}.
  */
 public interface Violation {
   String getMessage();
diff --git a/user/src/com/google/gwt/requestfactory/shared/WriteOperation.java b/user/src/com/google/gwt/requestfactory/shared/WriteOperation.java
index 71d71fd..34ff6fb 100644
--- a/user/src/com/google/gwt/requestfactory/shared/WriteOperation.java
+++ b/user/src/com/google/gwt/requestfactory/shared/WriteOperation.java
@@ -16,11 +16,6 @@
 package com.google.gwt.requestfactory.shared;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * The enum used in {@link EntityProxyChange}.
  * <ul>
  * <li>A PERSIST event is fired after a proxy that was created on the client has
diff --git a/user/src/com/google/gwt/requestfactory/shared/impl/Property.java b/user/src/com/google/gwt/requestfactory/shared/impl/Property.java
index e81adf3..06bd8ba 100644
--- a/user/src/com/google/gwt/requestfactory/shared/impl/Property.java
+++ b/user/src/com/google/gwt/requestfactory/shared/impl/Property.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,8 +21,8 @@
  * development, and is very likely to be deleted. Use it at your own risk.
  * </span>
  * </p>
- * Defines a property of a {@link EntityProxy}.
- * 
+ * Defines a property of an {@link EntityProxy}.
+ *
  * @param <V> the type of the property's value
  */
 public class Property<V> {
diff --git a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
index 45cb529..baed540 100644
--- a/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
+++ b/user/src/com/google/gwt/resources/ext/ResourceGeneratorUtil.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -107,7 +107,7 @@
   /**
    * These are type names from previous APIs or from APIs with similar
    * functionality that might be confusing.
-   * 
+   *
    * @see #checkForDeprecatedAnnotations
    */
   private static final String[] DEPRECATED_ANNOTATION_NAMES = {
@@ -149,7 +149,7 @@
    * method is intended to be called by Generators that create ClientBundle
    * instances and need to pass source data to the ClientBundle system that is
    * not accessible through the classpath.
-   * 
+   *
    * @param resourceName the path at which the contents of <code>file</code>
    *          should be made available
    * @param file the File whose contents are to be provided to the ClientBundle
@@ -164,9 +164,9 @@
   }
 
   /**
-   * Return the base filename of a resource. The behavior is similar to the unix
+   * Returns the base filename of a resource. The behavior is similar to the unix
    * command <code>basename</code>.
-   * 
+   *
    * @param resource the URL of the resource
    * @return the final name segment of the resource
    */
@@ -187,7 +187,7 @@
    * Loading through a ClassLoader with this method is much slower than the
    * other <code>findResources</code> methods which make use of the compiler's
    * ResourceOracle.
-   * 
+   *
    * @param logger a TreeLogger that will be used to report errors or warnings
    * @param context the ResourceContext in which the ResourceGenerator is
    *          operating
@@ -227,8 +227,8 @@
    * <p>
    * If the method's return type declares the {@link DefaultExtensions}
    * annotation, the value of this annotation will be used to find matching
-   * resource names if the method lacks an {@link Source} annotation.
-   * 
+   * resource names if the method lacks a {@link Source} annotation.
+   *
    * @param logger a TreeLogger that will be used to report errors or warnings
    * @param context the ResourceContext in which the ResourceGenerator is
    *          operating
@@ -267,7 +267,7 @@
    * will fall back to using the current thread's context ClassLoader. If it is
    * necessary to alter the way in which resources are located, use the overload
    * that accepts a ClassLoader.
-   * 
+   *
    * @param logger a TreeLogger that will be used to report errors or warnings
    * @param context the ResourceContext in which the ResourceGenerator is
    *          operating
@@ -299,13 +299,13 @@
   /**
    * Finds a method by following a dotted path interpreted as a series of no-arg
    * method invocations from an instance of a given root type.
-   * 
+   *
    * @param rootType the type from which the search begins
    * @param pathElements a sequence of no-arg method names
    * @param expectedReturnType the expected return type of the method to locate,
    *          or <code>null</code> if no constraint on the return type is
    *          necessary
-   * 
+   *
    * @return the requested JMethod
    * @throws NotFoundException if the requested method could not be found
    */
@@ -483,7 +483,7 @@
 
   /**
    * Converts a package relative path into an absolute path.
-   * 
+   *
    * @param pkg the package
    * @param path a path relative to the package
    * @return an absolute path
@@ -494,7 +494,7 @@
 
   /**
    * This performs the locale lookup function for a given resource name.
-   * 
+   *
    * @param locator the Locator to use to load the resources
    * @param resourceName the string name of the desired resource
    * @param locale the locale of the current rebind permutation
diff --git a/user/src/com/google/gwt/resources/rebind/context/ClientBundleContext.java b/user/src/com/google/gwt/resources/rebind/context/ClientBundleContext.java
index c151bd2..29fb817 100644
--- a/user/src/com/google/gwt/resources/rebind/context/ClientBundleContext.java
+++ b/user/src/com/google/gwt/resources/rebind/context/ClientBundleContext.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -24,7 +24,7 @@
 public class ClientBundleContext {
   /**
    * A general purpose String to object class which backs the interfaces defined
-   * in @{link ResourceContext}.
+   * in {@link ResourceContext}.
    */
   private final Map<String, Object> cachedData = new HashMap<String, Object>();
 
diff --git a/user/src/com/google/gwt/safehtml/rebind/HtmlTemplateParser.java b/user/src/com/google/gwt/safehtml/rebind/HtmlTemplateParser.java
index 8db7e1e..6329130 100644
--- a/user/src/com/google/gwt/safehtml/rebind/HtmlTemplateParser.java
+++ b/user/src/com/google/gwt/safehtml/rebind/HtmlTemplateParser.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -38,7 +38,7 @@
 
 /**
  * A HTML context-aware parser for a simple HTML template language.
- * 
+ *
  * <p>This parser parses templates consisting of well-formed XML or XHTML
  * markup, with template parameters of the form {@code "{n}"}. For example, a
  * template might look like,
@@ -78,7 +78,7 @@
  * <p>The implementation is subject to the following limitations:
  * <ul>
  *   <li>The input template must be well-formed XML/XHTML. If it is not,
- *       a {@link UnableToCompleteException} is thrown and details regarding
+ *       an {@link UnableToCompleteException} is thrown and details regarding
  *       the source of the parse failure are logged to this parser's logger.
  *   <li>Template parameters can only appear within inner text and within
  *       attributes. In particular, parameters cannot appear within a HTML
@@ -145,11 +145,11 @@
     /*
      * Throw errors on various irrelevant SAX events that we don't want to
      * handle, and which should not occur in templates.
-     * 
+     *
      * It may be reasonable to just silently ignore these events, but failing
      * explicitly seems more helpful to developers.
      */
-    
+
     @Override
     public void notationDecl(String name, String publicId, String systemId)
         throws SAXException {
@@ -220,11 +220,11 @@
 
     /**
      * Returns exception for unsupported event in SafeHtmlTemplates.
-     * 
+     *
      * <p>
      * Returns an exception indicating that the event in question is not
      * supported in SafeHtmlTemplates.
-     * 
+     *
      * @param what unsupported SAX event that should not occur in templates
      * @return exception stating that the event is not allowed
      */
@@ -300,14 +300,14 @@
     } catch (SAXParseException e) {
       String logMessage = "Parse Error during template parsing, at line "
           + e.getLineNumber() + ", column " + e.getColumnNumber();
-      // Attempt to extract (some) of the input to provide a more useful 
+      // Attempt to extract (some) of the input to provide a more useful
       // error message.
       try {
         input.reset();
         char[] buf = new char[200];
         int len = input.read(buf);
         if (len > 0) {
-          logMessage += " of input " + new String(buf, 0, len); 
+          logMessage += " of input " + new String(buf, 0, len);
         }
       } catch (IOException e1) {
         // We tried, but resetting/reading from the input stream failed. Sorry.
diff --git a/user/src/com/google/gwt/text/client/DoubleParser.java b/user/src/com/google/gwt/text/client/DoubleParser.java
index b3d3560..c3977dd 100644
--- a/user/src/com/google/gwt/text/client/DoubleParser.java
+++ b/user/src/com/google/gwt/text/client/DoubleParser.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -28,7 +28,7 @@
   private static DoubleParser INSTANCE;
 
   /**
-   * @return the instance of the no-op renderer
+   * Returns the instance of the no-op renderer.
    */
   public static Parser<Double> instance() {
     if (INSTANCE == null) {
diff --git a/user/src/com/google/gwt/text/client/DoubleRenderer.java b/user/src/com/google/gwt/text/client/DoubleRenderer.java
index 4c53c1e..0a526bf 100644
--- a/user/src/com/google/gwt/text/client/DoubleRenderer.java
+++ b/user/src/com/google/gwt/text/client/DoubleRenderer.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,7 +26,7 @@
   private static DoubleRenderer INSTANCE;
 
   /**
-   * @return the instance
+   * Returns the instance.
    */
   public static Renderer<Double> instance() {
     if (INSTANCE == null) {
@@ -42,7 +42,7 @@
     if (object == null) {
       return "";
     }
-    
+
     return NumberFormat.getDecimalFormat().format(object);
   }
 }
diff --git a/user/src/com/google/gwt/text/client/IntegerParser.java b/user/src/com/google/gwt/text/client/IntegerParser.java
index f959fb0..9638347 100644
--- a/user/src/com/google/gwt/text/client/IntegerParser.java
+++ b/user/src/com/google/gwt/text/client/IntegerParser.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -28,7 +28,7 @@
   private static IntegerParser INSTANCE;
 
   /**
-   * @return the instance of the no-op renderer
+   * Returns the instance of the no-op renderer.
    */
   public static Parser<Integer> instance() {
     if (INSTANCE == null) {
diff --git a/user/src/com/google/gwt/text/client/IntegerRenderer.java b/user/src/com/google/gwt/text/client/IntegerRenderer.java
index d9efe2d..4a6f5a6 100644
--- a/user/src/com/google/gwt/text/client/IntegerRenderer.java
+++ b/user/src/com/google/gwt/text/client/IntegerRenderer.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,7 +19,6 @@
 import com.google.gwt.text.shared.AbstractRenderer;
 import com.google.gwt.text.shared.Renderer;
 
-
 /**
  * A localized renderer based on {@link NumberFormat#getDecimalFormat}.
  */
@@ -27,7 +26,7 @@
   private static IntegerRenderer INSTANCE;
 
   /**
-   * @return the instance
+   * Returns the instance.
    */
   public static Renderer<Integer> instance() {
     if (INSTANCE == null) {
@@ -43,7 +42,7 @@
     if (null == object) {
       return "";
     }
-    
+
     return NumberFormat.getDecimalFormat().format(object);
   }
 }
diff --git a/user/src/com/google/gwt/text/client/LongParser.java b/user/src/com/google/gwt/text/client/LongParser.java
index f896ca4..5115cf3 100644
--- a/user/src/com/google/gwt/text/client/LongParser.java
+++ b/user/src/com/google/gwt/text/client/LongParser.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.text.client;
 
-
 import com.google.gwt.i18n.client.NumberFormat;
 import com.google.gwt.text.shared.Parser;
 
@@ -27,9 +26,9 @@
 public class LongParser implements Parser<Long> {
 
   private static LongParser INSTANCE;
-  
+
   /**
-   * @return the instance of the no-op renderer
+   * Returns the instance of the no-op renderer.
    */
   public static Parser<Long> instance() {
     if (INSTANCE == null) {
@@ -37,7 +36,7 @@
     }
     return INSTANCE;
   }
-  
+
   protected LongParser() {
   }
 
@@ -48,7 +47,7 @@
 
     try {
       return (long) NumberFormat.getDecimalFormat().parse(object.toString());
-    } catch (NumberFormatException e) { 
+    } catch (NumberFormatException e) {
       throw new ParseException(e.getMessage(), 0);
     }
   }
diff --git a/user/src/com/google/gwt/text/client/LongRenderer.java b/user/src/com/google/gwt/text/client/LongRenderer.java
index 0c3a92a..1edf218 100644
--- a/user/src/com/google/gwt/text/client/LongRenderer.java
+++ b/user/src/com/google/gwt/text/client/LongRenderer.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,7 +19,6 @@
 import com.google.gwt.text.shared.AbstractRenderer;
 import com.google.gwt.text.shared.Renderer;
 
-
 /**
  * A localized renderer based on {@link NumberFormat#getDecimalFormat}.
  */
@@ -27,7 +26,7 @@
   private static LongRenderer INSTANCE;
 
   /**
-   * @return the instance
+   * Returns the instance.
    */
   public static Renderer<Long> instance() {
     if (INSTANCE == null) {
diff --git a/user/src/com/google/gwt/text/shared/AbstractRenderer.java b/user/src/com/google/gwt/text/shared/AbstractRenderer.java
index 3c69c9e..946cfa7 100644
--- a/user/src/com/google/gwt/text/shared/AbstractRenderer.java
+++ b/user/src/com/google/gwt/text/shared/AbstractRenderer.java
@@ -18,10 +18,6 @@
 import java.io.IOException;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * Abstract implementation of a renderer to make implementation of rendering
  * simpler.
  * 
diff --git a/user/src/com/google/gwt/text/shared/AbstractSafeHtmlRenderer.java b/user/src/com/google/gwt/text/shared/AbstractSafeHtmlRenderer.java
index 521fcb3..7a33b69 100644
--- a/user/src/com/google/gwt/text/shared/AbstractSafeHtmlRenderer.java
+++ b/user/src/com/google/gwt/text/shared/AbstractSafeHtmlRenderer.java
@@ -20,10 +20,6 @@
 import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * Abstract implementation of a safe HTML renderer to make implementation of
  * rendering simpler.
  *
diff --git a/user/src/com/google/gwt/text/shared/Parser.java b/user/src/com/google/gwt/text/shared/Parser.java
index ba25b95..c848649 100644
--- a/user/src/com/google/gwt/text/shared/Parser.java
+++ b/user/src/com/google/gwt/text/shared/Parser.java
@@ -18,10 +18,6 @@
 import java.text.ParseException;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * An object that can parse text and return a value.
  *
  * @param <T> the type to parse
diff --git a/user/src/com/google/gwt/text/shared/Renderer.java b/user/src/com/google/gwt/text/shared/Renderer.java
index 431307a..f428e87 100644
--- a/user/src/com/google/gwt/text/shared/Renderer.java
+++ b/user/src/com/google/gwt/text/shared/Renderer.java
@@ -18,10 +18,6 @@
 import java.io.IOException;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * An object that can render other objects of a particular type into plain-text
  * form. Allows decoupling that is useful for a dependency-injection
  * architecture.
diff --git a/user/src/com/google/gwt/text/shared/SafeHtmlRenderer.java b/user/src/com/google/gwt/text/shared/SafeHtmlRenderer.java
index f244e4f..7685b23 100644
--- a/user/src/com/google/gwt/text/shared/SafeHtmlRenderer.java
+++ b/user/src/com/google/gwt/text/shared/SafeHtmlRenderer.java
@@ -19,10 +19,6 @@
 import com.google.gwt.safehtml.shared.SafeHtmlBuilder;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * An object that can render other objects of a particular type into safe HTML
  * form. Allows decoupling that is useful for a dependency-injection
  * architecture.
diff --git a/user/src/com/google/gwt/text/shared/testing/PassthroughParser.java b/user/src/com/google/gwt/text/shared/testing/PassthroughParser.java
index 3cc6555..927bf72 100644
--- a/user/src/com/google/gwt/text/shared/testing/PassthroughParser.java
+++ b/user/src/com/google/gwt/text/shared/testing/PassthroughParser.java
@@ -17,20 +17,15 @@
 
 import com.google.gwt.text.shared.Parser;
 
-
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A no-op String parser.
  */
 public class PassthroughParser implements Parser<String> {
 
   private static PassthroughParser INSTANCE;
-  
+
   /**
-   * @return the instance of the no-op renderer
+   * Returns the instance of the no-op renderer.
    */
   public static Parser<String> instance() {
     if (INSTANCE == null) {
@@ -38,7 +33,7 @@
     }
     return INSTANCE;
   }
-  
+
   protected PassthroughParser() {
   }
 
diff --git a/user/src/com/google/gwt/text/shared/testing/PassthroughRenderer.java b/user/src/com/google/gwt/text/shared/testing/PassthroughRenderer.java
index 4967058..26f4816 100644
--- a/user/src/com/google/gwt/text/shared/testing/PassthroughRenderer.java
+++ b/user/src/com/google/gwt/text/shared/testing/PassthroughRenderer.java
@@ -18,21 +18,16 @@
 import com.google.gwt.text.shared.AbstractRenderer;
 import com.google.gwt.text.shared.Renderer;
 
-
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A no-op String renderer. This is rarely or never the right
  * thing to use in production, but it's handy for tests.
  */
 public class PassthroughRenderer extends AbstractRenderer<String> {
 
   private static PassthroughRenderer INSTANCE;
-  
+
   /**
-   * @return the instance of the no-op renderer
+   * Returns the instance of the no-op renderer.
    */
   public static Renderer<String> instance() {
     if (INSTANCE == null) {
@@ -40,7 +35,7 @@
     }
     return INSTANCE;
   }
-  
+
   protected PassthroughRenderer() {
   }
 
diff --git a/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java b/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
index 85cbb45..2e99553 100644
--- a/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
+++ b/user/src/com/google/gwt/uibinder/attributeparsers/FieldReferenceConverter.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -58,7 +58,7 @@
    */
   interface Delegate {
     /**
-     * @return the type any parsed field references are expected to return
+     * Returns the type any parsed field references are expected to return.
      */
     JType getType();
 
@@ -111,9 +111,9 @@
 
   private static final Pattern BRACES = Pattern.compile("[{]([^}]*)[}]");
   private static final Pattern LEGAL_FIRST_CHAR = Pattern.compile("^[$_a-zA-Z].*");
-  
+
   /**
-   * @return true if the given string holds one or more field references
+   * Returns true if the given string holds one or more field references.
    */
   public static boolean hasFieldReferences(String string) {
     Telltale telltale = new Telltale();
diff --git a/user/src/com/google/gwt/uibinder/client/UiTemplate.java b/user/src/com/google/gwt/uibinder/client/UiTemplate.java
index f677d44..6c3bf3c 100644
--- a/user/src/com/google/gwt/uibinder/client/UiTemplate.java
+++ b/user/src/com/google/gwt/uibinder/client/UiTemplate.java
@@ -27,7 +27,7 @@
 public @interface UiTemplate {
 
   /**
-   * @return The template name
+   * Returns the template name.
    */
   String value();
 }
diff --git a/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtils.java b/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtils.java
index 4ca3e48..5d194c3 100644
--- a/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtils.java
+++ b/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtils.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -29,19 +29,19 @@
   void addDeclarations(IndentedWriter w);
 
   /**
-   * @return the name of "Impl", unique each time if it is design time.
+   * Returns the name of "Impl", unique each time if it is design time.
    */
   String getImplName(String implName);
 
   /**
-   * @return the path of given {@link Element}.
+   * Returns the path of given {@link Element}.
    */
   String getPath(Element element);
 
   /**
-   * @return the design time content of <code>*.ui.xml</code> template to parse,
-   *         or <code>null</code> if not design time, or this template is not
-   *         under design.
+   * Returns the design time content of <code>*.ui.xml</code> template to parse,
+   * or <code>null</code> if not design time, or this template is not under
+   * design.
    */
   String getTemplateContent(String path);
 
@@ -51,9 +51,9 @@
   void handleUIObject(Statements writer, XMLElement elem, String fieldName);
 
   /**
-   * @return <code>true</code> if this template is under design now, so some of
-   *         UiBinder features should be disables. This includes assigning
-   *         values into "@UiField", processing "@UiHandler".
+   * Returns <code>true</code> if this template is under design now, so some of
+   * UiBinder features should be disables. This includes assigning values into
+   * "@UiField", processing "@UiHandler".
    */
   boolean isDesignTime();
 
@@ -77,4 +77,4 @@
    * Writes remembered values of attributes.
    */
   void writeAttributes(Statements writer);
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtilsImpl.java b/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtilsImpl.java
index d0c1f94..9acd169 100644
--- a/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtilsImpl.java
+++ b/user/src/com/google/gwt/uibinder/rebind/DesignTimeUtilsImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -29,10 +29,10 @@
  */
 public class DesignTimeUtilsImpl implements DesignTimeUtils {
   /**
-   * @return <code>true</code> if given "Binder" is under design now. We should
-   *         not use "design time" globally, because while one widget in under
-   *         design, it may use other widgets and we want to execute them as is,
-   *         without design time tweaks.
+   * Returns <code>true</code> if given "Binder" is under design now. We should
+   * not use "design time" globally, because while one widget in under design,
+   * it may use other widgets and we want to execute them as is, without design
+   * time tweaks.
    */
   public static boolean isDesignTime(String fqInterfaceName) {
     if (Beans.isDesignTime()) {
@@ -121,7 +121,7 @@
   }
 
   /**
-   * @return remembered attributes, used during tests only.
+   * Returns remembered attributes, used during tests only.
    */
   Map<String, String> getAttributes() {
     return attributes;
@@ -142,4 +142,4 @@
       }
     }
   }
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldReference.java b/user/src/com/google/gwt/uibinder/rebind/FieldReference.java
index abea40b..74fa092 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldReference.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldReference.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -68,7 +68,7 @@
   }
 
   /**
-   * @return A failure message if the types don't mesh, or null on success
+   * Returns a failure message if the types don't mesh, or null on success.
    */
   private void ensureAssignable(JType leftHandType, JType rightHandType,
       MonitoredLogger logger) {
@@ -144,7 +144,7 @@
      * Integer i = (int) 1.0 is okay
      * int i = (int) Double.valueOf(1.0) is not
      */
-    if (isNumber(leftHandType) && isNumber(rightHandType) 
+    if (isNumber(leftHandType) && isNumber(rightHandType)
         && (rightHandType.isPrimitive() != null)) {
       return true; // They will be cast into submission
     }
diff --git a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
index 77456d5..6e411a4 100644
--- a/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/FieldWriter.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -36,35 +36,35 @@
 public interface FieldWriter {
 
   /**
-   * @return the type of this field, or for generated types the type it extends
+   * Returns the type of this field, or for generated types the type it extends.
    */
   // TODO(rjrjr) When ui:style is able to implement multiple interfaces,
   // this will need to become a set
   JClassType getAssignableType();
 
   /**
-   * @return the custom initializer for this field, or null if it is not set
+   * Returns the custom initializer for this field, or null if it is not set.
    */
   String getInitializer();
 
   /**
-   * @return the type of this field, or null if this field is of a type that has
-   *         not yet been generated
+   * Returns the type of this field, or null if this field is of a type that has
+   * not yet been generated.
    */
   JClassType getInstantiableType();
 
   /**
-   * @return the qualified source name of this type
+   * Returns the qualified source name of this type.
    */
   String getQualifiedSourceName();
 
   /**
-   * @return the return type found at the end of the given method call
+   * Returns the return type found at the end of the given method call
    * path, which must begin with the receiver's name, or null if the
-   * path is invalid
+   * path is invalid.
    */
   JType getReturnType(String[] path, MonitoredLogger logger);
-  
+
   /**
    * Declares that the receiver depends upon the given field.
    */
@@ -74,7 +74,7 @@
    * Used to provide an initializer string to use instead of a
    * {@link com.google.gwt.core.client.GWT#create()} call. Note that this is an
    * RHS expression. Don't include the leading '=', and don't end it with ';'.
-   * 
+   *
    * @throws UnableToCompleteException
    * @throws IllegalStateException on second attempt to set the initializer
    */
@@ -84,4 +84,4 @@
    * Write the field delcaration.
    */
   void write(IndentedWriter w) throws UnableToCompleteException;
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/uibinder/rebind/MonitoredLogger.java b/user/src/com/google/gwt/uibinder/rebind/MonitoredLogger.java
index 3f54f27..9f03693 100644
--- a/user/src/com/google/gwt/uibinder/rebind/MonitoredLogger.java
+++ b/user/src/com/google/gwt/uibinder/rebind/MonitoredLogger.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -38,7 +38,7 @@
   }
 
   /**
-   * @return true if {@link #error} has ever been called.
+   * Returns true if {@link #error} has ever been called.
    */
   public boolean hasErrors() {
     return hasErrors;
diff --git a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
index 9a93a1e..5d9def6 100644
--- a/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/UiBinderWriter.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -52,10 +52,10 @@
 
 /**
  * Writer for UiBinder generated classes.
- * 
+ *
  * TODO(rdamazio): Refactor this, extract model classes, improve ordering
  * guarantees, etc.
- * 
+ *
  * TODO(rjrjr): Line numbers in error messages.
  */
 @SuppressWarnings("deprecation")
@@ -127,7 +127,7 @@
   /**
    * Returns a list of the given type and all its superclasses and implemented
    * interfaces in a breadth-first traversal.
-   * 
+   *
    * @param type the base type
    * @return a breadth-first collection of its type hierarchy
    */
@@ -277,7 +277,7 @@
    * Add a statement to be executed right after the current attached element is
    * detached. This is useful for doing things that might be expensive while the
    * element is attached to the DOM.
-   * 
+   *
    * @param format
    * @param args
    * @see #beginAttachedSection(String)
@@ -311,7 +311,7 @@
    * Succeeding calls made to {@link #ensureAttached} and
    * {@link #ensureFieldAttached} must refer to children of this element, until
    * {@link #endAttachedSection} is called.
-   * 
+   *
    * @param element Java expression for the generated code that will return the
    *          dom element to be attached.
    */
@@ -329,7 +329,7 @@
    * generate a unique dom id at runtime. Further code will be generated to be
    * run after widgets are instantiated, to use that dom id in a getElementById
    * call and assign the Element instance to its field.
-   * 
+   *
    * @param fieldName The name of the field being declared
    */
   public String declareDomField(String fieldName)
@@ -347,7 +347,7 @@
   /**
    * Declare a variable that will be filled at runtime with a unique id, safe
    * for use as a dom element's id attribute.
-   * 
+   *
    * @return that variable's name.
    */
   public String declareDomIdHolder() throws UnableToCompleteException {
@@ -387,7 +387,7 @@
    * If this element has a gwt:field attribute, create a field for it of the
    * appropriate type, and return the field name. If no gwt:field attribute is
    * found, do nothing and return null
-   * 
+   *
    * @return The new field name, or null if no field is created
    */
   public String declareFieldIfNeeded(XMLElement elem)
@@ -439,7 +439,7 @@
   /**
    * End the current attachable section. This will detach the element if it was
    * ever attached and execute any detach statements.
-   * 
+   *
    * @see #beginAttachedSection(String)
    */
   public void endAttachedSection() {
@@ -456,7 +456,7 @@
 
   /**
    * Ensure that the specified element is attached to the DOM.
-   * 
+   *
    * @see #beginAttachedSection(String)
    */
   public void ensureAttached() {
@@ -475,7 +475,7 @@
    * Ensure that the specified field is attached to the DOM. The field must hold
    * an object that responds to Element getElement(). Convenience wrapper for
    * {@link ensureAttached}<code>(field + ".getElement()")</code>.
-   * 
+   *
    * @see #beginAttachedSection(String)
    */
   public void ensureCurrentFieldAttached() {
@@ -485,7 +485,7 @@
   /**
    * Finds the JClassType that corresponds to this XMLElement, which must be a
    * Widget or an Element.
-   * 
+   *
    * @throws UnableToCompleteException If no such widget class exists
    * @throws RuntimeException if asked to handle a non-widget, non-DOM element
    */
@@ -533,7 +533,7 @@
   /**
    * Finds an attribute {@link BundleAttributeParser} for the given xml
    * attribute, if any, based on its namespace uri.
-   * 
+   *
    * @return the parser or null
    * @deprecated exists only to support {@link BundleAttributeParser}, which
    *             will be leaving us soon.
@@ -549,15 +549,15 @@
   }
 
   /**
-   * @return the {@link DesignTimeUtils}, not <code>null</code>.
+   * Returns the {@link DesignTimeUtils}, not <code>null</code>.
    */
   public DesignTimeUtils getDesignTime() {
     return designTime;
   }
 
   /**
-   * @return The logger, at least until we get get it handed off to parsers via
-   *         constructor args.
+   * Returns the logger, at least until we get get it handed off to parsers via
+   * constructor args.
    */
   public MortalLogger getLogger() {
     return logger;
@@ -600,7 +600,7 @@
    * name of the field (possibly private) that will hold it. The element is
    * likely to make recursive calls back to this method to have its children
    * parsed.
-   * 
+   *
    * @param elem the xml element to be parsed
    * @return the name of the field containing the parsed widget
    */
@@ -634,7 +634,7 @@
   /**
    * Gives the writer the initializer to use for this field instead of the
    * default GWT.create call.
-   * 
+   *
    * @throws IllegalStateException if an initializer has already been set
    */
   public void setFieldInitializer(String fieldName, String factoryMethod) {
@@ -644,7 +644,7 @@
   /**
    * Instructs the writer to initialize the field with a specific constructor
    * invocation, instead of the default GWT.create call.
-   * 
+   *
    * @param fieldName the field to initialize
    * @param type the type of the field
    * @param args arguments to the constructor call
@@ -662,7 +662,7 @@
    * token, surrounded by plus signs. This is useful in strings to be handed to
    * setInnerHTML() and setText() calls, to allow a unique dom id attribute or
    * other runtime expression in the string.
-   * 
+   *
    * @param expression
    */
   public String tokenForExpression(String expression) {
@@ -694,7 +694,7 @@
    * Entry point for the code generation logic. It generates the
    * implementation's superstructure, and parses the root widget (leading to all
    * of its children being parsed as well).
-   * 
+   *
    * @param doc TODO
    */
   void parseDocument(Document doc, PrintWriter printWriter)
@@ -745,7 +745,7 @@
   /**
    * Ensures that all of the internal data structures are cleaned up correctly
    * at the end of parsing the document.
-   * 
+   *
    * @throws UnableToCompleteException
    */
   private void ensureAttachmentCleanedUp() {
@@ -792,7 +792,7 @@
   /**
    * Inspects this element for a gwt:field attribute. If one is found, the
    * attribute is consumed and its value returned.
-   * 
+   *
    * @return The field name declared by an element, or null if none is declared
    */
   private String getFieldName(XMLElement elem) throws UnableToCompleteException {
@@ -835,7 +835,7 @@
 
   /**
    * Find a set of element parsers for the given ui type.
-   * 
+   *
    * The list of parsers will be returned in order from most- to least-specific.
    */
   private Iterable<ElementParser> getParsersForClass(JClassType type) {
@@ -844,7 +844,7 @@
     /*
      * Let this non-widget parser go first (it finds <m:attribute/> elements).
      * Any other such should land here too.
-     * 
+     *
      * TODO(rjrjr) Need a scheme to associate these with a namespace uri or
      * something?
      */
@@ -948,7 +948,7 @@
 
   /**
    * Parses a package uri (e.g., package://com.google...).
-   * 
+   *
    * @throws UnableToCompleteException on bad package name
    */
   private JPackage parseNamespacePackage(String ns)
@@ -1078,7 +1078,7 @@
    * gwt:field in the template. For those that have not had constructor
    * generation suppressed, emit GWT.create() calls instantiating them (or die
    * if they have no default constructor).
-   * 
+   *
    * @throws UnableToCompleteException on constructor problem
    */
   private void writeGwtFields(IndentedWriter niceWriter)
diff --git a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
index 9e283d1..74ea05d 100644
--- a/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
+++ b/user/src/com/google/gwt/uibinder/rebind/XMLElement.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -56,7 +56,7 @@
   public interface Interpreter<T> {
     /**
      * Given an XMLElement, return its filtered value.
-     * 
+     *
      * @throws UnableToCompleteException on error
      */
     T interpretElement(XMLElement elem) throws UnableToCompleteException;
@@ -185,7 +185,7 @@
 
   /**
    * Ensure that the receiver has no attributes left.
-   * 
+   *
    * @throws UnableToCompleteException if it does
    */
   public void assertNoAttributes() throws UnableToCompleteException {
@@ -206,7 +206,7 @@
 
   /**
    * Require that the receiver's body is empty of text and has no child nodes.
-   * 
+   *
    * @throws UnableToCompleteException if it isn't
    */
   public void assertNoBody() throws UnableToCompleteException {
@@ -222,7 +222,7 @@
 
   /**
    * Require that the receiver's body is empty of text.
-   * 
+   *
    * @throws UnableToCompleteException if it isn't
    */
   public void assertNoText() throws UnableToCompleteException {
@@ -237,7 +237,7 @@
   /**
    * Consumes the given attribute as a literal or field reference. The type
    * parameter is required to determine how the value is parsed and validated.
-   * 
+   *
    * @param name the attribute's full name (including prefix)
    * @param type the type this attribute is expected to provide
    * @return the attribute's value as a Java expression, or null if it is not
@@ -252,7 +252,7 @@
   /**
    * Consumes the given attribute as a literal or field reference. The type
    * parameter is required to determine how the value is parsed and validated.
-   * 
+   *
    * @param name the attribute's full name (including prefix)
    * @param defaultValue the value to @return if the attribute was unset
    * @param type the type this attribute is expected to provide
@@ -302,10 +302,10 @@
   /**
    * Convenience method for parsing the named attribute as a boolean value or
    * reference.
-   * 
+   *
    * @return an expression that will evaluate to a boolean value in the
    *         generated code, or null if there is no such attribute
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value
    */
   public String consumeBooleanAttribute(String name)
@@ -316,11 +316,11 @@
   /**
    * Convenience method for parsing the named attribute as a boolean value or
    * reference.
-   * 
+   *
    * @param defaultValue value to return if attribute was not set
    * @return an expression that will evaluate to a boolean value in the
    *         generated code, or defaultValue if there is no such attribute
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value
    */
   public String consumeBooleanAttribute(String name, boolean defaultValue)
@@ -333,10 +333,10 @@
    * Consumes the named attribute as a boolean expression. This will not accept
    * {field.reference} expressions. Useful for values that must be resolved at
    * compile time, such as generated annotation values.
-   * 
+   *
    * @return {@link Boolean#TRUE}, {@link Boolean#FALSE}, or null if no such
    *         attribute
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value
    */
   public Boolean consumeBooleanConstantAttribute(String name)
@@ -354,7 +354,7 @@
 
   /**
    * Consumes and returns all child elements.
-   * 
+   *
    * @throws UnableToCompleteException if extra text nodes are found
    */
   public Iterable<XMLElement> consumeChildElements()
@@ -368,7 +368,7 @@
    * Consumes and returns all child elements selected by the interpreter. Note
    * that text nodes are not elements, and so are not presented for
    * interpretation, and are not consumed.
-   * 
+   *
    * @param interpreter Should return true for any child that should be consumed
    *          and returned by the consumeChildElements call
    * @throws UnableToCompleteException
@@ -399,7 +399,7 @@
   /**
    * Convenience method for parsing the named attribute as an ImageResource
    * value or reference.
-   * 
+   *
    * @return an expression that will evaluate to an ImageResource value in the
    *         generated code, or null if there is no such attribute
    * @throws UnableToCompleteException on unparseable value
@@ -423,7 +423,7 @@
    * for an HTML value, or
    * {@link com.google.gwt.uibinder.elementparsers.templates.parsers.TextInterpreter}
    * for text.
-   * 
+   *
    * @param interpreter Called for each element, expected to return a string
    *          replacement for it, or null if it should be left as is
    */
@@ -468,7 +468,7 @@
    * This call requires an interpreter to make sense of any special children.
    * The odds are you want to use
    * {@link com.google.gwt.uibinder.elementparsers.templates.parsers.TextInterpreter}
-   * 
+   *
    * @throws UnableToCompleteException If any elements present are not consumed
    *           by the interpreter
    */
@@ -497,11 +497,11 @@
 
   /**
    * Convenience method for parsing the named attribute as a CSS length value.
-   * 
+   *
    * @return a (double, Unit) pair literal, an expression that will evaluate to
    *         such a pair in the generated code, or null if there is no such
    *         attribute
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value
    */
   public String consumeLengthAttribute(String name)
@@ -527,7 +527,7 @@
    * Consumes the named attribute and parses it to an unparsed, unescaped array
    * of Strings. The strings in the attribute may be comma or space separated
    * (or a mix of both).
-   * 
+   *
    * @return array of String, empty if the attribute was not set.
    */
   public String[] consumeRawArrayAttribute(String name) {
@@ -542,7 +542,7 @@
   /**
    * Consumes the given attribute and returns its trimmed value, or null if it
    * was unset. The returned string is not escaped.
-   * 
+   *
    * @param name the attribute's full name (including prefix)
    * @return the attribute's value, or ""
    */
@@ -558,7 +558,7 @@
   /**
    * Consumes the given attribute and returns its trimmed value, or the given
    * default value if it was unset. The returned string is not escaped.
-   * 
+   *
    * @param name the attribute's full name (including prefix)
    * @param defaultValue the value to return if the attribute was unset
    * @return the attribute's value, or defaultValue
@@ -575,7 +575,7 @@
    * Consumes the given required attribute as a literal or field reference. The
    * types parameters are required to determine how the value is parsed and
    * validated.
-   * 
+   *
    * @param name the attribute's full name (including prefix)
    * @param types the type(s) this attribute is expected to provide
    * @return the attribute's value as a Java expression
@@ -609,10 +609,10 @@
   /**
    * Convenience method for parsing the named required attribute as a double
    * value or reference.
-   * 
+   *
    * @return a double literal, an expression that will evaluate to a double
    *         value in the generated code
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value, or if the attribute
    *           is empty or unspecified
    */
@@ -624,10 +624,10 @@
   /**
    * Convenience method for parsing the named required attribute as a integer
    * value or reference.
-   * 
+   *
    * @return a integer literal, an expression that will evaluate to a integer
    *         value in the generated code
-   * 
+   *
    * @throws UnableToCompleteException on unparseable value, or if the attribute
    *           is empty or unspecified
    */
@@ -651,7 +651,7 @@
   /**
    * Consumes a single child element, ignoring any text nodes and throwing an
    * exception if no child is found, or more than one child element is found.
-   * 
+   *
    * @throws UnableToCompleteException on no children, or too many
    */
   public XMLElement consumeSingleChildElement()
@@ -678,7 +678,7 @@
    * Consumes the named attribute and parses it to an array of String
    * expressions. The strings in the attribute may be comma or space separated
    * (or a mix of both).
-   * 
+   *
    * @return array of String expressions, empty if the attribute was not set.
    * @throws UnableToCompleteException on unparseable value
    */
@@ -702,7 +702,7 @@
   /**
    * Convenience method for parsing the named attribute as a String value or
    * reference.
-   * 
+   *
    * @return an expression that will evaluate to a String value in the generated
    *         code, or null if there is no such attribute
    * @throws UnableToCompleteException on unparseable value
@@ -715,7 +715,7 @@
   /**
    * Convenience method for parsing the named attribute as a String value or
    * reference.
-   * 
+   *
    * @return an expression that will evaluate to a String value in the generated
    *         code, or the given defaultValue if there is no such attribute
    * @throws UnableToCompleteException on unparseable value
@@ -731,7 +731,7 @@
    * <p>
    * You probably want to use
    * {@link #consumeInnerTextEscapedAsHtmlStringLiteral} instead.
-   * 
+   *
    * @return the text
    * @throws UnableToCompleteException if it held anything other than text nodes
    */
@@ -759,7 +759,7 @@
 
   /**
    * Get the attribute with the given name.
-   * 
+   *
    * @return the attribute, or null if there is none of that name
    */
   public XMLAttribute getAttribute(String name) {
@@ -771,7 +771,7 @@
   }
 
   /**
-   * @return The number of attributes this element has
+   * Returns the number of attributes this element has.
    */
   public int getAttributeCount() {
     return elem.getAttributes().getLength();
@@ -785,8 +785,8 @@
   }
 
   /**
-   * @return the design time path of this element, in form of indexes from root,
-   *         such as "0/0/1/0".
+   * Returns the design time path of this element, in form of indexes from root,
+   * such as "0/0/1/0".
    */
   public String getDesignTimePath() {
     return designTime.getPath(elem);
@@ -816,8 +816,8 @@
   }
 
   /**
-   * @return the parent element, or null if parent is null or a node type other
-   *         than Element
+   * Returns the parent element, or null if parent is null or a node type other
+   * than Element.
    */
   public XMLElement getParent() {
     Node parent = elem.getParentNode();
diff --git a/user/src/com/google/gwt/uibinder/rebind/messages/MessagesWriter.java b/user/src/com/google/gwt/uibinder/rebind/messages/MessagesWriter.java
index e4353c5..1ddab62 100644
--- a/user/src/com/google/gwt/uibinder/rebind/messages/MessagesWriter.java
+++ b/user/src/com/google/gwt/uibinder/rebind/messages/MessagesWriter.java
@@ -166,7 +166,7 @@
   }
 
   /**
-   * @return the expression that will instantiate the Messages interface
+   * Returns the expression that will instantiate the Messages interface.
    */
   public String getDeclaration() {
     return String.format(
@@ -179,8 +179,8 @@
   }
 
   /**
-   * @return The namespace prefix (not including :) declared by the template for
-   *         message elements and attributes
+   * Returns the namespace prefix (not including :) declared by the template for
+   * message elements and attributes.
    */
   public String getMessagesPrefix() {
     return messagesPrefix;
@@ -196,7 +196,7 @@
   }
 
   /**
-   * @return true iff any messages have been declared
+   * Returns true iff any messages have been declared.
    */
   public boolean hasMessages() {
     return !messages.isEmpty();
@@ -222,8 +222,8 @@
   }
 
   /**
-   * @return The set of AttributeMessages that were found in elem and stored by
-   *         a previous call to {@link #consumeAndStoreMessageAttributesFor}
+   * Returns the set of AttributeMessages that were found in elem and stored by a
+   * previous call to {@link #consumeAndStoreMessageAttributesFor}.
    */
   public Collection<AttributeMessage> retrieveMessageAttributesFor(
       XMLElement elem) {
diff --git a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
index 4ba585d..5a2b817 100644
--- a/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
+++ b/user/src/com/google/gwt/uibinder/rebind/model/ImplicitCssResource.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -73,15 +73,15 @@
   }
 
   /**
-   * @return the name of the CssResource interface
+   * Returns the name of the CssResource interface.
    */
   public String getClassName() {
     return className;
   }
 
   /**
-   * @return the set of CSS classnames in the underlying .css files
-   * 
+   * Returns the set of CSS classnames in the underlying .css files.
+   *
    * @throws UnableToCompleteException if the user has called for a .css file we
    *           can't find.
    */
@@ -107,29 +107,29 @@
   }
 
   /**
-   * @return the public interface that this CssResource implements
+   * Returns the public interface that this CssResource implements.
    */
   public JClassType getExtendedInterface() {
     return extendedInterface;
   }
 
   /**
-   * @return the set of CssResource types whose scopes are imported
+   * Returns the set of CssResource types whose scopes are imported.
    */
   public Set<JClassType> getImports() {
     return imports;
   }
 
   /**
-   * @return the name of this resource. This is both its method name in the
-   *         owning {@link ImplicitClientBundle} and its ui:field name
+   * Returns the name of this resource. This is both its method name in the
+   * owning {@link ImplicitClientBundle} and its ui:field name.
    */
   public String getName() {
     return name;
   }
 
   /**
-   * @return css class names with dashed-names normalized like so: dashedNames
+   * Returns css class names with dashed-names normalized like so: dashedNames.
    */
   public Set<String> getNormalizedCssClassNames()
       throws UnableToCompleteException {
@@ -144,15 +144,15 @@
   }
 
   /**
-   * @return the package in which the generated CssResource interface should
-   *         reside
+   * Returns the package in which the generated CssResource interface should
+   * reside.
    */
   public String getPackageName() {
     return packageName;
   }
 
   /**
-   * @return name of the generated type
+   * Returns the name of the generated type.
    */
   public String getQualifiedSourceName() {
     if (packageName.length() == 0) {
@@ -163,7 +163,7 @@
   }
 
   /**
-   * @return the name of the .css file(s), separate by white space
+   * Returns the name of the .css file(s), separate by white space.
    */
   public Collection<String> getSource() {
     if (body.length() == 0) {
diff --git a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
index 22a4326..bb7ffa1 100644
--- a/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
+++ b/user/src/com/google/gwt/user/cellview/CellView.gwt.xml
@@ -55,4 +55,12 @@
       <when-property-is name="user.agent" value="ie8"/>
     </any>
   </replace-with>
+
+  <!-- IE6-specific CellTree implementation. -->
+  <replace-with class="com.google.gwt.user.cellview.client.CellTree.ImplIE6">
+    <when-type-is class="com.google.gwt.user.cellview.client.CellTree.Impl"/>
+    <any>
+      <when-property-is name="user.agent" value="ie6"/>
+    </any>
+  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTree.java b/user/src/com/google/gwt/user/cellview/client/CellTree.java
index fa93a60..bbe2b4d 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTree.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTree.java
@@ -21,6 +21,7 @@
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
 import com.google.gwt.dom.client.Element;
 import com.google.gwt.dom.client.Style.Display;
+import com.google.gwt.dom.client.Style.Overflow;
 import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.dom.client.Style.Unit;
 import com.google.gwt.event.dom.client.KeyCodes;
@@ -226,6 +227,7 @@
     protected void onStart() {
       if (opening) {
         animFrame.getStyle().setHeight(1.0, Unit.PX);
+        animFrame.getStyle().setPosition(Position.RELATIVE);
         animFrame.getStyle().clearDisplay();
         height = contentContainer.getScrollHeight();
       } else {
@@ -242,6 +244,10 @@
         double curHeight = (1.0 - progress) * height;
         animFrame.getStyle().setHeight(curHeight, Unit.PX);
       }
+
+      // Remind IE6 that we want the overflow to be hidden.
+      animFrame.getStyle().setOverflow(Overflow.HIDDEN);
+      animFrame.getStyle().setPosition(Position.RELATIVE);
     }
 
     /**
@@ -288,6 +294,7 @@
         childContainer.setInnerHTML("");
       }
       animFrame.getStyle().clearHeight();
+      animFrame.getStyle().clearPosition();
       this.contentContainer = null;
       this.childContainer = null;
       this.animFrame = null;
@@ -437,6 +444,48 @@
         + "width:{2}px;height:{3}px;\">{4}</div>")
     SafeHtml imageWrapper(String classes, String direction, int width,
         int height, SafeHtml image);
+
+    @Template("<div class=\"{0}\" style=\"position:absolute;{1}:-{2}px;"
+        + "width:{2}px;height:{3}px;\">{4}</div>")
+    SafeHtml imageWrapperIE6(String classes, String direction, int width,
+        int height, SafeHtml image);
+  }
+
+  /**
+   * Implementation of {@link CellTree}.
+   */
+  private static class Impl {
+    /**
+     * Create an image wrapper.
+     */
+    public SafeHtml imageWrapper(String classes, String direction, int width,
+        int height, SafeHtml image) {
+      return template.imageWrapper(classes, direction, width, height, image);
+    }
+  }
+
+  /**
+   * Implementation of {@link CellTable} used by IE6.
+   */
+  @SuppressWarnings("unused")
+  private static class ImplIE6 extends Impl {
+    @Override
+    public SafeHtml imageWrapper(String classes, String direction, int width,
+        int height, SafeHtml image) {
+      /*
+       * In IE6, left/right positions are relative to the inside of the padding
+       * instead of the outside of the padding. The bug does not happen on IE7,
+       * which maps to the IE6 user agent, so we need a runtime check for IE6.
+       */
+      if (isIe6()) {
+        return template.imageWrapperIE6(classes, direction, width, height, image);
+      }
+      return super.imageWrapper(classes, direction, width, height, image);
+    }
+
+    private native boolean isIe6() /*-{
+      return @com.google.gwt.dom.client.DOMImplIE6::isIE6()();
+    }-*/;
   }
 
   /**
@@ -446,6 +495,7 @@
 
   private static Resources DEFAULT_RESOURCES;
 
+  private static Impl TREE_IMPL;
   private static Template template;
 
   private static Resources getDefaultResources() {
@@ -565,6 +615,9 @@
     if (template == null) {
       template = GWT.create(Template.class);
     }
+    if (TREE_IMPL == null) {
+      TREE_IMPL = GWT.create(Impl.class);
+    }
     this.style = resources.cellTreeStyle();
     this.style.ensureInjected();
     initWidget(new SimplePanel());
@@ -959,7 +1012,7 @@
 
     AbstractImagePrototype proto = AbstractImagePrototype.create(res);
     SafeHtml image = SafeHtmlUtils.fromTrustedString(proto.getHTML());
-    return template.imageWrapper(classesBuilder.toString(), direction,
+    return TREE_IMPL.imageWrapper(classesBuilder.toString(), direction,
         res.getWidth(), res.getHeight(), image);
   }
 
diff --git a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
index f9e524b..7104c01 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellTreeNodeView.java
@@ -24,7 +24,6 @@
 import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.dom.client.Style.Display;
 import com.google.gwt.dom.client.Style.Overflow;
-import com.google.gwt.dom.client.Style.Position;
 import com.google.gwt.event.logical.shared.CloseEvent;
 import com.google.gwt.event.logical.shared.OpenEvent;
 import com.google.gwt.event.shared.EventHandler;
@@ -1051,7 +1050,6 @@
   Element ensureAnimationFrame() {
     if (animationFrame == null) {
       animationFrame = Document.get().createDivElement();
-      animationFrame.getStyle().setPosition(Position.RELATIVE);
       animationFrame.getStyle().setOverflow(Overflow.HIDDEN);
       animationFrame.getStyle().setDisplay(Display.NONE);
       getElement().appendChild(animationFrame);
diff --git a/user/src/com/google/gwt/user/cellview/client/Column.java b/user/src/com/google/gwt/user/cellview/client/Column.java
index 83055bb..7802303 100644
--- a/user/src/com/google/gwt/user/cellview/client/Column.java
+++ b/user/src/com/google/gwt/user/cellview/client/Column.java
@@ -74,7 +74,7 @@
   }
 
   /**
-   * Return the column value from within the underlying data object.
+   * Returns the column value from within the underlying data object.
    */
   public abstract C getValue(T object);
 
@@ -102,7 +102,7 @@
 
   /**
    * Render the object into the cell.
-   * 
+   *
    * @param object the object to render
    * @param keyProvider the {@link ProvidesKey} for the object
    * @param sb the buffer to render into
@@ -112,7 +112,6 @@
     cell.render(getValue(object), key, sb);
   }
 
-
   /**
    * Set the {@link FieldUpdater} used for updating values in the column.
    *
diff --git a/user/src/com/google/gwt/user/client/WindowCloseListener.java b/user/src/com/google/gwt/user/client/WindowCloseListener.java
index 5e6ed4a..606a786 100644
--- a/user/src/com/google/gwt/user/client/WindowCloseListener.java
+++ b/user/src/com/google/gwt/user/client/WindowCloseListener.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,11 +17,11 @@
 
 /**
  * Implement this interface to receive closing events from the browser window.
- * 
+ *
  * @see com.google.gwt.user.client.Window#addWindowCloseListener(WindowCloseListener)
  * @deprecated use {@link Window.ClosingHandler} and
  *             {@link com.google.gwt.event.logical.shared.CloseHandler} instead
- * 
+ *
  */
 @Deprecated
 public interface WindowCloseListener extends java.util.EventListener {
@@ -29,7 +29,7 @@
   /**
    * Fired just before the browser window closes or navigates to a different
    * site. No user-interface may be displayed during shutdown.
-   * 
+   *
    * @return non-<code>null</code> to present a confirmation dialog that asks
    *         the user whether or not she wishes to navigate away from the page.
    *         The string returned will be displayed in the close confirmation
@@ -41,7 +41,7 @@
 
   /**
    * Fired after the browser window closes or navigates to a different site.
-   * This event cannot be cancelled, and is used mainly to clean up application
+   * This event cannot be canceled, and is used mainly to clean up application
    * state and/or save state to the server.
    */
   @Deprecated
diff --git a/user/src/com/google/gwt/user/client/ui/AcceptsOneWidget.java b/user/src/com/google/gwt/user/client/ui/AcceptsOneWidget.java
index 6fe3cdf..44059c9 100644
--- a/user/src/com/google/gwt/user/client/ui/AcceptsOneWidget.java
+++ b/user/src/com/google/gwt/user/client/ui/AcceptsOneWidget.java
@@ -16,7 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 /**
- * Implemented by displays that can be given accept a {@link IsWidget}
+ * Implemented by displays that can be given accept an {@link IsWidget}
  * to show.
  */
 public interface AcceptsOneWidget {
diff --git a/user/src/com/google/gwt/user/client/ui/CaptionPanel.java b/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
index e2b4f92..5fda0ff 100644
--- a/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/CaptionPanel.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -144,7 +144,7 @@
 
   /**
    * Constructs a CaptionPanel having the specified caption.
-   * 
+   *
    * @param caption the caption to display
    * @param asHTML if <code>true</code>, the <code>caption</code> param is
    *            interpreted as HTML; otherwise, <code>caption</code> is
@@ -174,9 +174,8 @@
   }
 
   /**
-   * @return the caption as HTML; note that if the caption was previously set
-   *         using {@link #setCaptionText(String)}, the return value is
-   *         undefined
+   * Returns the caption as HTML; note that if the caption was previously set
+   * using {@link #setCaptionText(String)}, the return value is undefined.
    */
   public String getCaptionHTML() {
     String html = legend.getInnerHTML();
@@ -185,9 +184,8 @@
   }
 
   /**
-   * @return the caption as text; note that if the caption was previously set
-   *         using {@link #setCaptionHTML(String)}, the return value is
-   *         undefined
+   * Returns the caption as text; note that if the caption was previously set
+   * using {@link #setCaptionHTML(String)}, the return value is undefined.
    */
   public String getCaptionText() {
     String text = legend.getInnerText();
@@ -197,7 +195,7 @@
 
   /**
    * Accesses the content widget, if present.
-   * 
+   *
    * @return the content widget specified previously in
    *         {@link #setContentWidget(Widget)}
    */
@@ -215,7 +213,7 @@
   /**
    * Removes the specified widget, although in practice the specified widget
    * must be the content widget.
-   * 
+   *
    * @param w the widget to remove; note that anything other than the Widget
    *            returned by {@link #getContentWidget()} will have no effect
    */
@@ -226,7 +224,7 @@
   /**
    * Sets the caption for the panel using an HTML fragment. Pass in empty string
    * to remove the caption completely, leaving just the unadorned panel.
-   * 
+   *
    * @param html HTML for the new caption; must not be <code>null</code>
    */
   public void setCaptionHTML(String html) {
@@ -257,7 +255,7 @@
 
   /**
    * Sets or replaces the content widget within the CaptionPanel.
-   * 
+   *
    * @param w the content widget to be set
    */
   public void setContentWidget(Widget w) {
diff --git a/user/src/com/google/gwt/user/client/ui/Composite.java b/user/src/com/google/gwt/user/client/ui/Composite.java
index 4f2c795..c90cc4e 100644
--- a/user/src/com/google/gwt/user/client/ui/Composite.java
+++ b/user/src/com/google/gwt/user/client/ui/Composite.java
@@ -15,6 +15,7 @@
  */
 package com.google.gwt.user.client.ui;
 
+import com.google.gwt.event.logical.shared.AttachEvent;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
 
@@ -109,12 +110,14 @@
 
     // Call onLoad() directly, because we're not calling super.onAttach().
     onLoad();
+    AttachEvent.fire(this, true);
   }
 
   @Override
   protected void onDetach() {
     try {
       onUnload();
+      AttachEvent.fire(this, false);
     } finally {
       // We don't want an exception in user code to keep us from calling the
       // super implementation (or event listeners won't get cleaned up and
diff --git a/user/src/com/google/gwt/user/client/ui/DoubleBox.java b/user/src/com/google/gwt/user/client/ui/DoubleBox.java
index 960f0ca..5c939f3 100644
--- a/user/src/com/google/gwt/user/client/ui/DoubleBox.java
+++ b/user/src/com/google/gwt/user/client/ui/DoubleBox.java
@@ -20,10 +20,6 @@
 import com.google.gwt.text.client.DoubleRenderer;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A ValueBox that uses {@link DoubleParser} and {@link DoubleRenderer}.
  */
 public class DoubleBox extends ValueBox<Double> {
diff --git a/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java b/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
index abdd2db..31cb1a4 100644
--- a/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
+++ b/user/src/com/google/gwt/user/client/ui/FormHandlerCollection.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,7 +22,7 @@
  * {@link com.google.gwt.user.client.ui.FormHandler FormHandlers}. This subclass
  * of ArrayList assumes that all items added to it will be of type
  * {@link com.google.gwt.user.client.ui.FormHandler}.
- * 
+ *
  * @deprecated Widgets should now manage their own handlers via {@link Widget#addDomHandler}
  */
 @Deprecated
@@ -31,7 +31,7 @@
   /**
    * Fires a {@link FormHandler#onSubmitComplete(FormSubmitCompleteEvent)} on
    * all handlers in the collection.
-   * 
+   *
    * @param sender the object sending the event
    * @param results the results of the form submission
    * @deprecated {@link FormPanel} now implements all handler management internally
@@ -47,9 +47,9 @@
   /**
    * Fires a {@link FormHandler#onSubmit(FormSubmitEvent)} on all handlers in
    * the collection.
-   * 
+   *
    * @param sender the object sending the event
-   * @return <code>true</code> if the event should be cancelled
+   * @return <code>true</code> if the event should be canceled
    * @deprecated {@link FormPanel} now implements all handler management internally
    */
   @Deprecated
diff --git a/user/src/com/google/gwt/user/client/ui/FormPanel.java b/user/src/com/google/gwt/user/client/ui/FormPanel.java
index 2ad6825..697b158 100644
--- a/user/src/com/google/gwt/user/client/ui/FormPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/FormPanel.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -30,7 +30,7 @@
 
 /**
  * A panel that wraps its contents in an HTML &lt;FORM&gt; element.
- * 
+ *
  * <p>
  * This panel can be used to achieve interoperability with servers that accept
  * traditional HTML form encoding. The following widgets (those that implement
@@ -52,7 +52,7 @@
  * <i>only</i> useful when used within a FormPanel, because the browser will
  * only upload files using form submission.
  * </p>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.FormPanelExample}
@@ -73,7 +73,7 @@
 
     /**
      * Handler hook.
-     * 
+     *
      * @return the handler hook
      */
     static Type<SubmitCompleteHandler> getType() {
@@ -87,7 +87,7 @@
 
     /**
      * Create a submit complete event.
-     * 
+     *
      * @param resultsHtml the results from submitting the form
      */
     protected SubmitCompleteEvent(String resultsHtml) {
@@ -101,7 +101,7 @@
 
     /**
      * Gets the result text of the form submission.
-     * 
+     *
      * @return the result html, or <code>null</code> if there was an error
      *         reading it
      * @tip The result html can be <code>null</code> as a result of submitting a
@@ -123,7 +123,7 @@
   public interface SubmitCompleteHandler extends EventHandler {
     /**
      * Fired when a form has been submitted successfully.
-     * 
+     *
      * @param event the event
      */
     void onSubmitComplete(FormPanel.SubmitCompleteEvent event);
@@ -140,7 +140,7 @@
 
     /**
      * Handler hook.
-     * 
+     *
      * @return the handler hook
      */
     static Type<SubmitHandler> getType() {
@@ -167,7 +167,7 @@
 
     /**
      * Gets whether this form submit will be canceled.
-     * 
+     *
      * @return <code>true</code> if the form submit will be canceled
      */
     public boolean isCanceled() {
@@ -182,7 +182,7 @@
     /**
      * This method is used for legacy support and should be removed when
      * {@link FormHandler} is removed.
-     * 
+     *
      * @deprecated Use {@link FormPanel.SubmitEvent#cancel()} instead
      */
     @Deprecated
@@ -197,13 +197,13 @@
   public interface SubmitHandler extends EventHandler {
     /**
      *Fired when the form is submitted.
-     * 
+     *
      * <p>
      * The FormPanel must <em>not</em> be detached (i.e. removed from its parent
      * or otherwise disconnected from a {@link RootPanel}) until the submission
      * is complete. Otherwise, notification of submission will fail.
      * </p>
-     * 
+     *
      * @param event the event
      */
     void onSubmit(FormPanel.SubmitEvent event);
@@ -240,16 +240,16 @@
 
   /**
    * Creates a FormPanel that wraps an existing &lt;form&gt; element.
-   * 
+   *
    * This element must already be attached to the document. If the element is
    * removed from the document, you must call
    * {@link RootPanel#detachNow(Widget)}.
-   * 
+   *
    * <p>
    * The specified form element's target attribute will not be set, and the
    * {@link FormSubmitCompleteEvent} will not be fired.
    * </p>
-   * 
+   *
    * @param element the element to be wrapped
    */
   public static FormPanel wrap(Element element) {
@@ -267,18 +267,18 @@
 
   /**
    * Creates a FormPanel that wraps an existing &lt;form&gt; element.
-   * 
+   *
    * This element must already be attached to the document. If the element is
    * removed from the document, you must call
    * {@link RootPanel#detachNow(Widget)}.
-   * 
+   *
    * <p>
    * If the createIFrame parameter is set to <code>true</code>, then the wrapped
    * form's target attribute will be set to a hidden iframe. If not, the form's
    * target will be left alone, and the FormSubmitComplete event will not be
    * fired.
    * </p>
-   * 
+   *
    * @param element the element to be wrapped
    * @param createIFrame <code>true</code> to create an &lt;iframe&gt; element
    *          that will be targeted by this form
@@ -303,7 +303,7 @@
    * Creates a new FormPanel. When created using this constructor, it will be
    * submitted to a hidden &lt;iframe&gt; element, and the results of the
    * submission made available via {@link SubmitCompleteHandler}.
-   * 
+   *
    * <p>
    * The back-end server is expected to respond with a content-type of
    * 'text/html', meaning that the text returned will be treated as HTML. If any
@@ -312,7 +312,7 @@
    * {@link SubmitCompleteHandler#onSubmitComplete(com.google.gwt.user.client.ui.FormPanel.SubmitCompleteEvent)
    * onSubmitComplete} event may not fire at all.
    * </p>
-   * 
+   *
    * @tip The initial implementation of FormPanel specified that the server
    *      respond with a content-type of 'text/plain'. This has been
    *      intentionally changed to specify 'text/html' because 'text/plain'
@@ -326,12 +326,12 @@
    * Creates a FormPanel that targets a {@link NamedFrame}. The target frame is
    * not physically attached to the form, and must therefore still be added to a
    * panel elsewhere.
-   * 
+   *
    * <p>
    * When the FormPanel targets an external frame in this way, it will not fire
    * the FormSubmitComplete event.
    * </p>
-   * 
+   *
    * @param frameTarget the {@link NamedFrame} to be targetted
    */
   public FormPanel(NamedFrame frameTarget) {
@@ -342,12 +342,12 @@
    * Creates a new FormPanel. When created using this constructor, it will be
    * submitted either by replacing the current page, or to the named
    * &lt;iframe&gt;.
-   * 
+   *
    * <p>
    * When the FormPanel targets an external frame in this way, it will not fire
    * the FormSubmitComplete event.
    * </p>
-   * 
+   *
    * @param target the name of the &lt;iframe&gt; to receive the results of the
    *          submission, or <code>null</code> to specify that the current page
    *          be replaced
@@ -360,12 +360,12 @@
   /**
    * This constructor may be used by subclasses to explicitly use an existing
    * element. This element must be a &lt;form&gt; element.
-   * 
+   *
    * <p>
    * The specified form element's target attribute will not be set, and the
    * {@link FormSubmitCompleteEvent} will not be fired.
    * </p>
-   * 
+   *
    * @param element the element to be used
    */
   protected FormPanel(Element element) {
@@ -375,14 +375,14 @@
   /**
    * This constructor may be used by subclasses to explicitly use an existing
    * element. This element must be a &lt;form&gt; element.
-   * 
+   *
    * <p>
    * If the createIFrame parameter is set to <code>true</code>, then the wrapped
    * form's target attribute will be set to a hidden iframe. If not, the form's
    * target will be left alone, and the FormSubmitComplete event will not be
    * fired.
    * </p>
-   * 
+   *
    * @param element the element to be used
    * @param createIFrame <code>true</code> to create an &lt;iframe&gt; element
    *          that will be targeted by this form
@@ -414,7 +414,7 @@
 
   /**
    * Adds a {@link SubmitCompleteEvent} handler.
-   * 
+   *
    * @param handler the handler
    * @return the handler registration used to remove the handler
    */
@@ -425,7 +425,7 @@
 
   /**
    * Adds a {@link SubmitEvent} handler.
-   * 
+   *
    * @param handler the handler
    * @return the handler registration used to remove the handler
    */
@@ -436,7 +436,7 @@
   /**
    * Gets the 'action' associated with this form. This is the URL to which it
    * will be submitted.
-   * 
+   *
    * @return the form's action
    */
   public String getAction() {
@@ -446,7 +446,7 @@
   /**
    * Gets the encoding used for submitting this form. This should be either
    * {@link #ENCODING_MULTIPART} or {@link #ENCODING_URLENCODED}.
-   * 
+   *
    * @return the form's encoding
    */
   public String getEncoding() {
@@ -456,7 +456,7 @@
   /**
    * Gets the HTTP method used for submitting this form. This should be either
    * {@link #METHOD_GET} or {@link #METHOD_POST}.
-   * 
+   *
    * @return the form's method
    */
   public String getMethod() {
@@ -467,7 +467,7 @@
    * Gets the form's 'target'. This is the name of the {@link NamedFrame} that
    * will receive the results of submission, or <code>null</code> if none has
    * been specified.
-   * 
+   *
    * @return the form's target.
    */
   public String getTarget() {
@@ -476,7 +476,7 @@
 
   /**
    * Fired when a form is submitted.
-   * 
+   *
    * @return true if the form is submitted, false if canceled
    */
   public boolean onFormSubmit() {
@@ -506,7 +506,7 @@
   /**
    * Sets the 'action' associated with this form. This is the URL to which it
    * will be submitted.
-   * 
+   *
    * @param url the form's action
    */
   public void setAction(String url) {
@@ -516,7 +516,7 @@
   /**
    * Sets the encoding used for submitting this form. This should be either
    * {@link #ENCODING_MULTIPART} or {@link #ENCODING_URLENCODED}.
-   * 
+   *
    * @param encodingType the form's encoding
    */
   public void setEncoding(String encodingType) {
@@ -526,7 +526,7 @@
   /**
    * Sets the HTTP method used for submitting this form. This should be either
    * {@link #METHOD_GET} or {@link #METHOD_POST}.
-   * 
+   *
    * @param method the form's method
    */
   public void setMethod(String method) {
@@ -535,7 +535,7 @@
 
   /**
    * Submits the form.
-   * 
+   *
    * <p>
    * The FormPanel must <em>not</em> be detached (i.e. removed from its parent
    * or otherwise disconnected from a {@link RootPanel}) until the submission is
@@ -602,7 +602,7 @@
 
   /**
    * Fire a {@link FormPanel.SubmitEvent}.
-   * 
+   *
    * @return true to continue, false if canceled
    */
   private boolean fireSubmitEvent() {
@@ -616,7 +616,7 @@
   }
 
   /**
-   * @return true if the form is submitted, false if canceled
+   * Returns true if the form is submitted, false if canceled.
    */
   private boolean onFormSubmitImpl() {
     return fireSubmitEvent();
diff --git a/user/src/com/google/gwt/user/client/ui/FormSubmitEvent.java b/user/src/com/google/gwt/user/client/ui/FormSubmitEvent.java
index c8fbb40..59b7216 100644
--- a/user/src/com/google/gwt/user/client/ui/FormSubmitEvent.java
+++ b/user/src/com/google/gwt/user/client/ui/FormSubmitEvent.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,7 +27,7 @@
 
   /**
    * Creates a new event with information about the source.
-   * 
+   *
    * @param source the object sending the event
    */
   public FormSubmitEvent(FormPanel source) {
@@ -35,17 +35,17 @@
   }
 
   /**
-   * Gets whether this form submit will be cancelled.
-   * 
-   * @return <code>true</code> if the form submit will be cancelled
+   * Gets whether this form submit will be canceled.
+   *
+   * @return <code>true</code> if the form submit will be canceled
    */
   public boolean isCancelled() {
     return cancel;
   }
 
   /**
-   * Sets whether the form submit will be cancelled.
-   * 
+   * Sets whether the form submit will be canceled.
+   *
    * @param cancel <code>true</code> to cancel the submit
    */
   public void setCancelled(boolean cancel) {
diff --git a/user/src/com/google/gwt/user/client/ui/HasAnimation.java b/user/src/com/google/gwt/user/client/ui/HasAnimation.java
index 350bac1..2ae126e 100644
--- a/user/src/com/google/gwt/user/client/ui/HasAnimation.java
+++ b/user/src/com/google/gwt/user/client/ui/HasAnimation.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,14 +21,14 @@
  */
 public interface HasAnimation {
   /**
-   * @return true if animations are enabled, false if not
+   * Returns true if animations are enabled, false if not.
    */
   boolean isAnimationEnabled();
 
   /**
    * Enable or disable animations.
-   * 
+   *
    * @param enable true to enable, false to disable
    */
   void setAnimationEnabled(boolean enable);
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/user/client/ui/HasEnabled.java b/user/src/com/google/gwt/user/client/ui/HasEnabled.java
index cf5adb6..835bbc2 100644
--- a/user/src/com/google/gwt/user/client/ui/HasEnabled.java
+++ b/user/src/com/google/gwt/user/client/ui/HasEnabled.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,13 +22,13 @@
 public interface HasEnabled {
 
   /**
-   * @return true if the widget is enabled, false if not
+   * Returns true if the widget is enabled, false if not.
    */
   boolean isEnabled();
 
   /**
    * Sets whether this widget is enabled.
-   * 
+   *
    * @param enabled <code>true</code> to enable the widget, <code>false</code>
    *          to disable it
    */
diff --git a/user/src/com/google/gwt/user/client/ui/IntegerBox.java b/user/src/com/google/gwt/user/client/ui/IntegerBox.java
index 0f6b1f6..350f82a 100644
--- a/user/src/com/google/gwt/user/client/ui/IntegerBox.java
+++ b/user/src/com/google/gwt/user/client/ui/IntegerBox.java
@@ -20,10 +20,6 @@
 import com.google.gwt.text.client.IntegerRenderer;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A ValueBox that uses {@link IntegerParser} and {@link IntegerRenderer}.
  */
 public class IntegerBox extends ValueBox<Integer> {
diff --git a/user/src/com/google/gwt/user/client/ui/IsWidget.java b/user/src/com/google/gwt/user/client/ui/IsWidget.java
index 85331ca..78d0b3f 100644
--- a/user/src/com/google/gwt/user/client/ui/IsWidget.java
+++ b/user/src/com/google/gwt/user/client/ui/IsWidget.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,9 +21,9 @@
  * ability to provide a mock view instance in JRE unit tests.
  */
 public interface IsWidget {
-  
+
   /**
-   * @return the {@link Widget} aspect of the receiver
+   * Returns the {@link Widget} aspect of the receiver.
    */
   Widget asWidget();
 }
diff --git a/user/src/com/google/gwt/user/client/ui/LongBox.java b/user/src/com/google/gwt/user/client/ui/LongBox.java
index 0121583..5e4820f 100644
--- a/user/src/com/google/gwt/user/client/ui/LongBox.java
+++ b/user/src/com/google/gwt/user/client/ui/LongBox.java
@@ -20,10 +20,6 @@
 import com.google.gwt.text.client.LongRenderer;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A ValueBox that uses {@link LongParser} and {@link LongRenderer}.
  */
 public class LongBox extends ValueBox<Long> {
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 68ee719..fc3061a 100644
--- a/user/src/com/google/gwt/user/client/ui/MenuBar.java
+++ b/user/src/com/google/gwt/user/client/ui/MenuBar.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -44,11 +44,11 @@
  * A standard menu bar widget. A menu bar can contain any number of menu items,
  * each of which can either fire a {@link com.google.gwt.user.client.Command} or
  * open a cascaded menu bar.
- * 
+ *
  * <p>
  * <img class='gallery' src='doc-files/MenuBar.png'/>
  * </p>
- * 
+ *
  * <h3>CSS Style Rules</h3>
  * <dl>
  * <dt>.gwt-MenuBar</dt>
@@ -102,12 +102,12 @@
  * <dt>.gwt-MenuBarPopup .menuPopupBottomRightInner</dt>
  * <dd>the inner element of the cell</dd>
  * </dl>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.MenuBarExample}
  * </p>
- * 
+ *
  * <h3>Use in UiBinder Templates</h3>
  * <p>
  * MenuBar elements in UiBinder template files can have a <code>vertical</code>
@@ -115,7 +115,7 @@
  * elements as children. MenuItems may contain HTML and MenuBars.
  * <p>
  * For example:
- * 
+ *
  * <pre>
  * &lt;g:MenuBar>
  *   &lt;g:MenuItem>Higgledy
@@ -150,14 +150,14 @@
 
   /**
    * An {@link ImageBundle} that provides images for {@link MenuBar}.
-   * 
+   *
    * @deprecated replaced by {@link Resources}
    */
   @Deprecated
   public interface MenuBarImages extends ImageBundle {
     /**
      * An image indicating a {@link MenuItem} has an associated submenu.
-     * 
+     *
      * @return a prototype of this image
      */
     AbstractImagePrototype menuBarSubMenuIcon();
@@ -206,7 +206,7 @@
 
   /**
    * Creates an empty menu bar.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    */
   public MenuBar(boolean vertical) {
@@ -216,7 +216,7 @@
   /**
    * Creates an empty menu bar that uses the specified image bundle for menu
    * images.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    * @param images a bundle that provides images for this menu
    * @deprecated replaced by {@link #MenuBar(boolean, Resources)}
@@ -229,7 +229,7 @@
   /**
    * Creates an empty menu bar that uses the specified ClientBundle for menu
    * images.
-   * 
+   *
    * @param vertical <code>true</code> to orient the menu bar vertically
    * @param resources a bundle that provides images for this menu
    */
@@ -241,7 +241,7 @@
   /**
    * Creates an empty horizontal menu bar that uses the specified image bundle
    * for menu images.
-   * 
+   *
    * @param images a bundle that provides images for this menu
    * @deprecated replaced by {@link #MenuBar(Resources)}
    */
@@ -253,7 +253,7 @@
   /**
    * Creates an empty horizontal menu bar that uses the specified ClientBundle
    * for menu images.
-   * 
+   *
    * @param resources a bundle that provides images for this menu
    */
   public MenuBar(Resources resources) {
@@ -266,7 +266,7 @@
 
   /**
    * Adds a menu item to the bar.
-   * 
+   *
    * @param item the item to be added
    * @return the {@link MenuItem} object
    */
@@ -275,9 +275,9 @@
   }
 
   /**
-   * Adds a menu item to the bar containing SafeHtml, that will fire the given 
+   * Adds a menu item to the bar containing SafeHtml, that will fire the given
    * command when it is selected.
-   * 
+   *
    * @param html the item's html text
    * @param cmd the command to be fired
    * @return the {@link MenuItem} object created
@@ -289,7 +289,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param cmd the command to be fired
@@ -302,7 +302,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param html the item's html text
    * @param popup the menu to be cascaded from it
    * @return the {@link MenuItem} object created
@@ -314,7 +314,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param asHTML <code>true</code> to treat the specified text as html
    * @param popup the menu to be cascaded from it
@@ -327,7 +327,7 @@
   /**
    * Adds a menu item to the bar, that will fire the given command when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param cmd the command to be fired
    * @return the {@link MenuItem} object created
@@ -339,7 +339,7 @@
   /**
    * Adds a menu item to the bar, that will open the specified menu when it is
    * selected.
-   * 
+   *
    * @param text the item's text
    * @param popup the menu to be cascaded from it
    * @return the {@link MenuItem} object created
@@ -351,7 +351,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @return the {@link MenuItemSeparator} object created
    */
   public MenuItemSeparator addSeparator() {
@@ -361,7 +361,7 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be added
    * @return the {@link MenuItemSeparator} object
    */
@@ -428,7 +428,7 @@
   /**
    * Gets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @return <code>true</code> if child menus will auto-open
    */
   public boolean getAutoOpen() {
@@ -437,7 +437,7 @@
 
   /**
    * Get the index of a {@link MenuItem}.
-   * 
+   *
    * @return the index of the item, or -1 if it is not contained by this MenuBar
    */
   public int getItemIndex(MenuItem item) {
@@ -446,7 +446,7 @@
 
   /**
    * Get the index of a {@link MenuItemSeparator}.
-   * 
+   *
    * @return the index of the separator, or -1 if it is not contained by this
    *         MenuBar
    */
@@ -456,7 +456,7 @@
 
   /**
    * Adds a menu item to the bar at a specific index.
-   * 
+   *
    * @param item the item to be inserted
    * @param beforeIndex the index where the item should be inserted
    * @return the {@link MenuItem} object
@@ -491,8 +491,8 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
-   * @param beforeIndex the index where the seperator should be inserted
+   *
+   * @param beforeIndex the index where the separator should be inserted
    * @return the {@link MenuItemSeparator} object
    * @throws IndexOutOfBoundsException if <code>beforeIndex</code> is out of
    *           range
@@ -504,9 +504,9 @@
   /**
    * Adds a thin line to the {@link MenuBar} to separate sections of
    * {@link MenuItem}s at the specified index.
-   * 
+   *
    * @param separator the {@link MenuItemSeparator} to be inserted
-   * @param beforeIndex the index where the seperator should be inserted
+   * @param beforeIndex the index where the separator should be inserted
    * @return the {@link MenuItemSeparator} object
    * @throws IndexOutOfBoundsException if <code>beforeIndex</code> is out of
    *           range
@@ -534,7 +534,7 @@
   /**
    * Check whether or not this widget will steal keyboard focus when the mouse
    * hovers over it.
-   * 
+   *
    * @return true if enabled, false if disabled
    */
   public boolean isFocusOnHoverEnabled() {
@@ -653,7 +653,7 @@
             break;
           case KeyCodes.KEY_TAB:
             closeAllParentsAndChildren();
-            break;  
+            break;
           case KeyCodes.KEY_ENTER:
             if (!selectFirstItemIfNoneSelected()) {
               doItemAction(selectedItem, true, true);
@@ -670,7 +670,7 @@
 
   /**
    * Closes the menu bar.
-   * 
+   *
    * @deprecated Use {@link #addCloseHandler(CloseHandler)} instead
    */
   @Deprecated
@@ -693,7 +693,7 @@
 
   /**
    * Removes the specified menu item from the bar.
-   * 
+   *
    * @param item the item to be removed
    */
   public void removeItem(MenuItem item) {
@@ -711,7 +711,7 @@
 
   /**
    * Removes the specified {@link MenuItemSeparator} from the bar.
-   * 
+   *
    * @param separator the separator to be removed
    */
   public void removeSeparator(MenuItemSeparator separator) {
@@ -722,7 +722,7 @@
 
   /**
    * Select the given MenuItem, which must be a direct child of this MenuBar.
-   * 
+   *
    * @param item the MenuItem to select, or null to clear selection
    */
   public void selectItem(MenuItem item) {
@@ -771,7 +771,7 @@
   /**
    * Sets whether this menu bar's child menus will open when the mouse is moved
    * over it.
-   * 
+   *
    * @param autoOpen <code>true</code> to cause child menus to auto-open
    */
   public void setAutoOpen(boolean autoOpen) {
@@ -783,7 +783,7 @@
    * allows the MenuBar to respond to keyboard events without the user having to
    * click on it, but it will steal focus from other elements on the page.
    * Enabled by default.
-   * 
+   *
    * @param enabled true to enable, false to disable
    */
   public void setFocusOnHoverEnabled(boolean enabled) {
@@ -794,7 +794,7 @@
    * Returns a list containing the <code>MenuItem</code> objects in the menu
    * bar. If there are no items in the menu bar, then an empty <code>List</code>
    * object will be returned.
-   * 
+   *
    * @return a list containing the <code>MenuItem</code> objects in the menu bar
    */
   protected List<MenuItem> getItems() {
@@ -805,7 +805,7 @@
    * Returns the <code>MenuItem</code> that is currently selected (highlighted)
    * by the user. If none of the items in the menu are currently selected, then
    * <code>null</code> will be returned.
-   * 
+   *
    * @return the <code>MenuItem</code> that is currently selected, or
    *         <code>null</code> if no items are currently selected
    */
@@ -828,7 +828,7 @@
    * <ul>
    * <li>-item# = the {@link MenuItem} at the specified index.</li>
    * </ul>
-   * 
+   *
    * @see UIObject#onEnsureDebugId(String)
    */
   @Override
@@ -867,7 +867,7 @@
    * popup associated with it, the popup will be shown. If it has a command
    * associated with it, and 'fireCommand' is true, then the command will be
    * fired. Popups associated with other items will be hidden.
-   * 
+   *
    * @param item the item whose popup is to be shown. @param fireCommand
    * <code>true</code> if the item's command should be fired, <code>false</code>
    * otherwise.
@@ -966,7 +966,7 @@
 
   /**
    * Set the IDs of the menu items.
-   * 
+   *
    * @param baseID the base ID
    */
   void setMenuItemDebugIds(String baseID) {
@@ -979,7 +979,7 @@
 
   /**
    * Show or hide the icon used for items with a submenu.
-   * 
+   *
    * @param item the item with or without a submenu
    */
   void updateSubmenuIcon(MenuItem item) {
@@ -1018,8 +1018,8 @@
   /**
    * Physically add the td element of a {@link MenuItem} or
    * {@link MenuItemSeparator} to this {@link MenuBar}.
-   * 
-   * @param beforeIndex the index where the seperator should be inserted
+   *
+   * @param beforeIndex the index where the separator should be inserted
    * @param tdElem the td element to be added
    */
   private void addItemElement(int beforeIndex, Element tdElem) {
@@ -1035,7 +1035,7 @@
 
   /**
    * Closes this menu (if it is a popup).
-   * 
+   *
    * @param focus true to move focus to the parent
    */
   private void close(boolean focus) {
@@ -1267,7 +1267,7 @@
   /**
    * Removes the specified item from the {@link MenuBar} and the physical DOM
    * structure.
-   * 
+   *
    * @param item the item to be removed
    * @return true if the item was removed
    */
@@ -1286,7 +1286,7 @@
   /**
    * Selects the first item in the menu if no items are currently selected. Has
    * no effect if there are no items.
-   * 
+   *
    * @return true if no item was previously selected, false otherwise
    */
   private boolean selectFirstItemIfNoneSelected() {
@@ -1378,7 +1378,7 @@
 
   /**
    * Set the colspan of a {@link MenuItem} or {@link MenuItemSeparator}.
-   * 
+   *
    * @param item the {@link MenuItem} or {@link MenuItemSeparator}
    * @param colspan the colspan
    */
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 86732d3..3cc8703 100644
--- a/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
+++ b/user/src/com/google/gwt/user/client/ui/MouseWheelVelocity.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,7 +22,7 @@
  * Encapsulates the direction and velocity of mouse wheel events. Not all
  * combinations of browser and user input devices can generate all combinations
  * of direction or range of velocity information.
- * 
+ *
  * @see com.google.gwt.user.client.DOM#eventGetMouseWheelVelocityY An
  *      explanation of the units used for mouse wheel velocity.
  * @deprecated use
@@ -39,7 +39,7 @@
 
   /**
    * Construct the higher-level view of the original ONMOUSEWHEEL Event.
-   * 
+   *
    * @param e the event
    */
   public MouseWheelVelocity(Event e) {
@@ -57,10 +57,10 @@
   }
 
   /**
-   * @return the change in the mouse wheel position along the Y-axis; positive
-   *         if the mouse wheel is moving north (toward the top of the screen)
-   *         or negative if the mouse wheel is moving south (toward the bottom
-   *         of the screen)
+   * Returns the change in the mouse wheel position along the Y-axis; positive if
+   * the mouse wheel is moving north (toward the top of the screen) or negative
+   * if the mouse wheel is moving south (toward the bottom of the screen).
+   *
    * @deprecated use
    *             {@link com.google.gwt.event.dom.client.MouseWheelEvent#getDeltaY()}
    *             instead
@@ -78,7 +78,7 @@
   /**
    * Convenience method that returns <code>true</code> if {@link #getDeltaY()}
    * is a negative value.
-   * 
+   *
    * @return <code>true</code> if the velocity includes a component directed
    *         toword the top of the screen
    * @deprecated use
@@ -93,7 +93,7 @@
   /**
    * Convenience method that returns <code>true</code> if {@link #getDeltaY()}
    * is a positive value.
-   * 
+   *
    * @return <code>true</code> if the velocity includes a component directed
    *         toword the bottom of the screen
    * @deprecated use
diff --git a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
index ea960ce..daa7ad1 100644
--- a/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
+++ b/user/src/com/google/gwt/user/client/ui/MultiWordSuggestOracle.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2007 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -77,7 +77,7 @@
 
     /**
      * Constructor for <code>MultiWordSuggestion</code>.
-     * 
+     *
      * @param replacementString the string to enter into the SuggestBox's text
      *          box if the suggestion is chosen
      * @param displayString the display string
@@ -97,21 +97,21 @@
   }
 
   /**
-   * A class reresenting the bounds of a word within a string. 
-   * 
+   * A class reresenting the bounds of a word within a string.
+   *
    * The bounds are represented by a {@code startIndex} (inclusive) and
    * an {@code endIndex} (exclusive).
    */
   private static class WordBounds implements Comparable<WordBounds> {
-  
+
     final int startIndex;
     final int endIndex;
-    
+
     public WordBounds(int startIndex, int length) {
       this.startIndex = startIndex;
       this.endIndex = startIndex + length;
     }
-    
+
     public int compareTo(WordBounds that) {
       int comparison = this.startIndex - that.startIndex;
       if (comparison == 0) {
@@ -120,7 +120,7 @@
       return comparison;
     }
   }
-  
+
   private static final char WHITESPACE_CHAR = ' ';
   private static final String WHITESPACE_STRING = " ";
 
@@ -155,7 +155,7 @@
   /**
    * Constructor for <code>MultiWordSuggestOracle</code>. This uses a space as
    * the whitespace character.
-   * 
+   *
    * @see #MultiWordSuggestOracle(String)
    */
   public MultiWordSuggestOracle() {
@@ -172,7 +172,7 @@
    * matching. For example, the query "bar" would match "bar", but not "foo
    * bar".
    * </p>
-   * 
+   *
    * @param whitespaceChars the characters to treat as word separators
    */
   public MultiWordSuggestOracle(String whitespaceChars) {
@@ -184,7 +184,7 @@
 
   /**
    * Adds a suggestion to the oracle. Each suggestion must be plain text.
-   * 
+   *
    * @param suggestion the suggestion
    */
   public void add(String suggestion) {
@@ -208,7 +208,7 @@
 
   /**
    * Adds all suggestions specified. Each suggestion must be plain text.
-   * 
+   *
    * @param collection the collection
    */
   public final void addAll(Collection<String> collection) {
@@ -255,7 +255,7 @@
     }
 
     // Convert candidates to suggestions.
-    List<MultiWordSuggestion> suggestions = 
+    List<MultiWordSuggestion> suggestions =
         convertToFormattedSuggestions(query, candidates);
 
     Response response = new Response(suggestions);
@@ -266,7 +266,7 @@
 
   /**
    * Sets the default suggestion collection.
-   * 
+   *
    * @param suggestionList the default list of suggestions
    */
   public void setDefaultSuggestions(Collection<Suggestion> suggestionList) {
@@ -275,9 +275,9 @@
 
   /**
    * A convenience method to set default suggestions using plain text strings.
-   * 
+   *
    * Note to use this method each default suggestion must be plain text.
-   * 
+   *
    * @param suggestionList the default list of suggestions
    */
   public final void setDefaultSuggestionsFromText(
@@ -291,11 +291,11 @@
 
   /**
    * Creates the suggestion based on the given replacement and display strings.
-   * 
+   *
    * @param replacementString the string to enter into the SuggestBox's text box
    *          if the suggestion is chosen
    * @param displayString the display string
-   * 
+   *
    * @return the suggestion created
    */
   protected MultiWordSuggestion createSuggestion(String replacementString,
@@ -306,7 +306,7 @@
   /**
    * Returns real suggestions with the given query in <code>strong</code> html
    * font.
-   * 
+   *
    * @param query query string
    * @param candidates candidates
    * @return real suggestions
@@ -324,14 +324,14 @@
 
       // Create strong search string.
       SafeHtmlBuilder accum = new SafeHtmlBuilder();
-      
+
       String[] searchWords = query.split(WHITESPACE_STRING);
       while (true) {
         WordBounds wordBounds = findNextWord(candidate, searchWords, index);
         if (wordBounds == null) {
           break;
         }
-        if (wordBounds.startIndex == 0 || 
+        if (wordBounds.startIndex == 0 ||
             WHITESPACE_CHAR == candidate.charAt(wordBounds.startIndex - 1)) {
           String part1 = formattedSuggestion.substring(cursor, wordBounds.startIndex);
           String part2 = formattedSuggestion.substring(wordBounds.startIndex,
@@ -344,12 +344,12 @@
         }
         index = wordBounds.endIndex;
       }
-      
+
       // Check to make sure the search was found in the string.
       if (cursor == 0) {
         continue;
       }
-      
+
       accum.appendEscaped(formattedSuggestion.substring(cursor));
       MultiWordSuggestion suggestion = createSuggestion(formattedSuggestion,
           accum.toSafeHtml().asString());
@@ -404,7 +404,7 @@
 
   /**
    * Creates a set of potential candidates that match the given query.
-   * 
+   *
    * @param query query string
    * @return possible candidates
    */
@@ -423,11 +423,11 @@
     }
     return candidateSet;
   }
-  
+
   /**
-   * @return a {@link WordBounds} representing the first word in 
-   *     {@code searchWords} that is found in candidate starting at 
-   *     {@code indexToStartAt} or {@code null} if no words could be found.
+   * Returns a {@link WordBounds} representing the first word in {@code
+   * searchWords} that is found in candidate starting at {@code indexToStartAt}
+   * or {@code null} if no words could be found.
    */
   private WordBounds findNextWord(String candidate, String[] searchWords, int indexToStartAt) {
     WordBounds firstWord = null;
@@ -442,7 +442,7 @@
     }
     return firstWord;
   }
-  
+
   /**
    * Normalize the search key by making it lower case, removing multiple spaces,
    * apply whitespace masks, and make it lower case.
diff --git a/user/src/com/google/gwt/user/client/ui/NotificationMole.java b/user/src/com/google/gwt/user/client/ui/NotificationMole.java
index 47a726f..85c1449 100644
--- a/user/src/com/google/gwt/user/client/ui/NotificationMole.java
+++ b/user/src/com/google/gwt/user/client/ui/NotificationMole.java
@@ -27,11 +27,6 @@
 import com.google.gwt.user.client.Timer;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Simple widget for providing notification feedback.
  */
 public class NotificationMole extends Composite {
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 6aa07c8..42515a7 100644
--- a/user/src/com/google/gwt/user/client/ui/Panel.java
+++ b/user/src/com/google/gwt/user/client/ui/Panel.java
@@ -176,26 +176,6 @@
   }
 
   /**
-   * A Panel's onLoad method will be called after all of its children are
-   * attached.
-   * 
-   * @see Widget#onLoad()
-   */
-  @Override
-  protected void onLoad() {
-  }
-
-  /**
-   * A Panel's onUnload method will be called before its children become
-   * detached themselves.
-   * 
-   * @see Widget#onLoad()
-   */
-  @Override
-  protected void onUnload() {
-  }
-
-  /**
    * <p>
    * This method must be called as part of the remove method of any Panel. It
    * ensures that the Widget's parent is cleared. This method should be called
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 9d1cd74..19e7931 100644
--- a/user/src/com/google/gwt/user/client/ui/PopupPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/PopupPanel.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -50,7 +50,7 @@
 /**
  * A panel that can "pop up" over other widgets. It overlays the browser's
  * client area (and any previously-created popups).
- * 
+ *
  * <p>
  * A PopupPanel should not generally be added to other panels; rather, it should
  * be shown and hidden using the {@link #show()} and {@link #hide()} methods.
@@ -64,7 +64,7 @@
  * <p>
  * <img class='gallery' src='doc-files/PopupPanel.png'/>
  * </p>
- * 
+ *
  * <p>
  * The PopupPanel can be optionally displayed with a "glass" element behind it,
  * which is commonly used to gray out the widgets behind it. It can be enabled
@@ -72,7 +72,7 @@
  * "gwt-PopupPanelGlass", which can be changed using
  * {@link #setGlassStyleName(String)}.
  * </p>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.PopupPanelExample}
@@ -102,7 +102,7 @@
      * before the PopupPanel is shown. The offsetWidth and offsetHeight values
      * of the PopupPanel are made available to allow for positioning based on
      * its size.
-     * 
+     *
      * @param offsetWidth the offsetWidth of the PopupPanel
      * @param offsetHeight the offsetHeight of the PopupPanel
      * @see PopupPanel#setPopupPositionAndShow(PositionCallback)
@@ -112,7 +112,7 @@
 
   /**
    * The type of animation to use when opening the popup.
-   * 
+   *
    * <ul>
    * <li>CENTER - Expand from the center of the popup</li>
    * <li>ONE_WAY_CORNER - Expand from the top left corner, do not animate hiding
@@ -163,7 +163,7 @@
 
     /**
      * Create a new {@link ResizeAnimation}.
-     * 
+     *
      * @param panel the panel to affect
      */
     public ResizeAnimation(PopupPanel panel) {
@@ -174,7 +174,7 @@
      * Open or close the content. This method always called immediately after
      * the PopupPanel showing state has changed, so we base the animation on the
      * current state.
-     * 
+     *
      * @param showing true if the popup is showing, false if not
      */
     public void setState(boolean showing, boolean isUnloading) {
@@ -299,7 +299,7 @@
     }
 
     /**
-     * @return a rect string
+     * Returns a rect string.
      */
     private String getRectString(int top, int right, int bottom, int left) {
       return "rect(" + top + "px, " + right + "px, " + bottom + "px, " + left
@@ -457,7 +457,7 @@
 
   /**
    * Creates an empty popup panel, specifying its "auto-hide" property.
-   * 
+   *
    * @param autoHide <code>true</code> if the popup should be automatically
    *          hidden when the user clicks outside of it or the history token
    *          changes.
@@ -471,7 +471,7 @@
   /**
    * Creates an empty popup panel, specifying its "auto-hide" and "modal"
    * properties.
-   * 
+   *
    * @param autoHide <code>true</code> if the popup should be automatically
    *          hidden when the user clicks outside of it or the history token
    *          changes.
@@ -486,7 +486,7 @@
   /**
    * Mouse events that occur within an autoHide partner will not hide a panel
    * set to autoHide.
-   * 
+   *
    * @param partner the auto hide partner to add
    */
   public void addAutoHidePartner(Element partner) {
@@ -545,7 +545,7 @@
   /**
    * Gets the style name to be used on the glass element. By default, this is
    * "gwt-PopupPanelGlass".
-   * 
+   *
    * @return the glass element's style name
    */
   public String getGlassStyleName() {
@@ -556,7 +556,7 @@
    * Gets the panel's offset height in pixels. Calls to
    * {@link #setHeight(String)} before the panel's child widget is set will not
    * influence the offset height.
-   * 
+   *
    * @return the object's offset height
    */
   @Override
@@ -567,7 +567,7 @@
   /**
    * Gets the panel's offset width in pixels. Calls to {@link #setWidth(String)}
    * before the panel's child widget is set will not influence the offset width.
-   * 
+   *
    * @return the object's offset width
    */
   @Override
@@ -577,7 +577,7 @@
 
   /**
    * Gets the popup's left position relative to the browser's client area.
-   * 
+   *
    * @return the popup's left position
    */
   public int getPopupLeft() {
@@ -586,7 +586,7 @@
 
   /**
    * Gets the popup's top position relative to the browser's client area.
-   * 
+   *
    * @return the popup's top position
    */
   public int getPopupTop() {
@@ -609,7 +609,7 @@
   /**
    * Hides the popup and detaches it from the page. This has no effect if it is
    * not currently showing.
-   * 
+   *
    * @param autoClosed the value that will be passed to
    *          {@link CloseHandler#onClose(CloseEvent)} when the popup is closed
    */
@@ -628,7 +628,7 @@
   /**
    * Returns <code>true</code> if the popup should be automatically hidden when
    * the user clicks outside of it.
-   * 
+   *
    * @return true if autoHide is enabled, false if disabled
    */
   public boolean isAutoHideEnabled() {
@@ -639,7 +639,7 @@
    * Returns <code>true</code> if the popup should be automatically hidden when
    * the history token changes, such as when the user presses the browser's back
    * button.
-   * 
+   *
    * @return true if enabled, false if disabled
    */
   public boolean isAutoHideOnHistoryEventsEnabled() {
@@ -649,7 +649,7 @@
   /**
    * Returns <code>true</code> if a glass element will be displayed under the
    * {@link PopupPanel}.
-   * 
+   *
    * @return true if enabled
    */
   public boolean isGlassEnabled() {
@@ -659,7 +659,7 @@
   /**
    * Returns <code>true</code> if keyboard or mouse events that do not target
    * the PopupPanel or its children should be ignored.
-   * 
+   *
    * @return true if popup is modal, false if not
    */
   public boolean isModal() {
@@ -669,7 +669,7 @@
   /**
    * Returns <code>true</code> if the popup should preview all native events,
    * even if the event has already been consumed by another popup.
-   * 
+   *
    * @return true if previewAllNativeEvents is enabled, false if disabled
    */
   public boolean isPreviewingAllNativeEvents() {
@@ -678,7 +678,7 @@
 
   /**
    * Determines whether or not this popup is showing.
-   * 
+   *
    * @return <code>true</code> if the popup is showing
    * @see #show()
    * @see #hide()
@@ -692,7 +692,7 @@
    * the <code>visibility</code> style attribute, which is set in the
    * {@link #setVisible(boolean)} method. If you want to know if the popup is
    * attached to the page, use {@link #isShowing()} instead.
-   * 
+   *
    * @return <code>true</code> if the object is visible
    * @see #setVisible(boolean)
    */
@@ -712,7 +712,7 @@
   /**
    * Popups get an opportunity to preview keyboard events before they are passed
    * to a widget contained by the Popup.
-   * 
+   *
    * @param key the key code of the depressed key
    * @param modifiers keyboard modifiers, as specified in
    *          {@link com.google.gwt.event.dom.client.KeyCodes}.
@@ -727,7 +727,7 @@
   /**
    * Popups get an opportunity to preview keyboard events before they are passed
    * to a widget contained by the Popup.
-   * 
+   *
    * @param key the unicode character pressed
    * @param modifiers keyboard modifiers, as specified in
    *          {@link com.google.gwt.event.dom.client.KeyCodes}.
@@ -742,7 +742,7 @@
   /**
    * Popups get an opportunity to preview keyboard events before they are passed
    * to a widget contained by the Popup.
-   * 
+   *
    * @param key the key code of the released key
    * @param modifiers keyboard modifiers, as specified in
    *          {@link com.google.gwt.event.dom.client.KeyCodes}.
@@ -756,7 +756,7 @@
 
   /**
    * Remove an autoHide partner.
-   * 
+   *
    * @param partner the auto hide partner to remove
    */
   public void removeAutoHidePartner(Element partner) {
@@ -782,7 +782,7 @@
   /**
    * Enable or disable the autoHide feature. When enabled, the popup will be
    * automatically hidden when the user clicks outside of it.
-   * 
+   *
    * @param autoHide true to enable autoHide, false to disable
    */
   public void setAutoHideEnabled(boolean autoHide) {
@@ -793,7 +793,7 @@
    * Enable or disable autoHide on history change events. When enabled, the
    * popup will be automatically hidden when the history token changes, such as
    * when the user presses the browser's back button. Disabled by default.
-   * 
+   *
    * @param enabled true to enable, false to disable
    */
   public void setAutoHideOnHistoryEventsEnabled(boolean enabled) {
@@ -804,7 +804,7 @@
    * When enabled, the background will be blocked with a semi-transparent pane
    * the next time it is shown. If the PopupPanel is already visible, the glass
    * will not be displayed until it is hidden and shown again.
-   * 
+   *
    * @param enabled true to enable, false to disable
    */
   public void setGlassEnabled(boolean enabled) {
@@ -822,7 +822,7 @@
   /**
    * Sets the style name to be used on the glass element. By default, this is
    * "gwt-PopupPanelGlass".
-   * 
+   *
    * @param glassStyleName the glass element's style name
    */
   public void setGlassStyleName(String glassStyleName) {
@@ -836,14 +836,14 @@
    * Sets the height of the panel's child widget. If the panel's child widget
    * has not been set, the height passed in will be cached and used to set the
    * height immediately after the child widget is set.
-   * 
+   *
    * <p>
    * Note that subclasses may have a different behavior. A subclass may decide
    * not to change the height of the child widget. It may instead decide to
    * change the height of an internal panel widget, which contains the child
    * widget.
    * </p>
-   * 
+   *
    * @param height the object's new height, in CSS units (e.g. "10px", "1em")
    */
   @Override
@@ -859,7 +859,7 @@
   /**
    * When the popup is modal, keyboard or mouse events that do not target the
    * PopupPanel or its children will be ignored.
-   * 
+   *
    * @param modal true to make the popup modal
    */
   public void setModal(boolean modal) {
@@ -869,7 +869,7 @@
   /**
    * Sets the popup's position relative to the browser's client area. The
    * popup's position may be set before calling {@link #show()}.
-   * 
+   *
    * @param left the left position, in pixels
    * @param top the top position, in pixels
    */
@@ -897,7 +897,7 @@
    * offsetWidth and offsetHeight of the popup, which are normally not available
    * until the popup is showing. By positioning the popup before it is shown,
    * the the popup will not jump from its original position to the new position.
-   * 
+   *
    * @param callback the callback to set the position of the popup
    * @see PositionCallback#setPosition(int offsetWidth, int offsetHeight)
    */
@@ -919,7 +919,7 @@
    * feature is disabled, the popup will only autoHide if it was the last popup
    * opened.
    * </p>
-   * 
+   *
    * @param previewAllNativeEvents true to enable, false to disable
    */
   public void setPreviewingAllNativeEvents(boolean previewAllNativeEvents) {
@@ -940,7 +940,7 @@
    * Sets whether this object is visible. This method just sets the
    * <code>visibility</code> style attribute. You need to call {@link #show()}
    * to actually attached/detach the {@link PopupPanel} to the page.
-   * 
+   *
    * @param visible <code>true</code> to show the object, <code>false</code> to
    *          hide it
    * @see #show()
@@ -974,14 +974,14 @@
    * Sets the width of the panel's child widget. If the panel's child widget has
    * not been set, the width passed in will be cached and used to set the width
    * immediately after the child widget is set.
-   * 
+   *
    * <p>
    * Note that subclasses may have a different behavior. A subclass may decide
    * not to change the width of the child widget. It may instead decide to
    * change the width of an internal panel widget, which contains the child
    * widget.
    * </p>
-   * 
+   *
    * @param width the object's new width, in CSS units (e.g. "10px", "1em")
    */
   @Override
@@ -1017,7 +1017,7 @@
    * bottom and right edges of the window, the popup may be displayed directly
    * above the target, and/or its right edge may be aligned with the right edge
    * of the target.
-   * 
+   *
    * @param target the target to show the popup below
    */
   public final void showRelativeTo(final UIObject target) {
@@ -1037,7 +1037,7 @@
   /**
    * Get the glass element used by this {@link PopupPanel}. The element is not
    * created until it is enabled via {@link #setGlassEnabled(boolean)}.
-   * 
+   *
    * @return the glass element, or null if not created
    */
   protected Element getGlassElement() {
@@ -1099,7 +1099,7 @@
    * Sets the animation used to animate this popup. Used by gwt-incubator to
    * allow DropDownPanel to override the default popup animation. Not protected
    * because the exact API may change in gwt 1.6.
-   * 
+   *
    * @param animation the animation to use for this popup
    */
   void setAnimation(ResizeAnimation animation) {
@@ -1108,7 +1108,7 @@
 
   /**
    * Enable or disable animation of the {@link PopupPanel}.
-   * 
+   *
    * @param type the type of animation to use
    */
   void setAnimationType(AnimationType type) {
@@ -1117,7 +1117,7 @@
 
   /**
    * Remove focus from an Element.
-   * 
+   *
    * @param elt The Element on which <code>blur()</code> will be invoked
    */
   private native void blur(Element elt) /*-{
@@ -1129,7 +1129,7 @@
 
   /**
    * Does the event target one of the partner elements?
-   * 
+   *
    * @param event the native event
    * @return true if the event targets a partner
    */
@@ -1151,7 +1151,7 @@
 
   /**
    * Does the event target this popup?
-   * 
+   *
    * @param event the native event
    * @return true if the event targets the popup
    */
@@ -1168,7 +1168,7 @@
    * that goes inside of the outer element, so all methods in PopupImpl are
    * relative to the first child of the outer element, not the outer element
    * itself.
-   * 
+   *
    * @return the Element that {@link PopupImpl} creates and expects
    */
   private com.google.gwt.user.client.Element getPopupImplElement() {
@@ -1178,7 +1178,7 @@
   /**
    * Positions the popup, called after the offset width and height of the popup
    * are known.
-   * 
+   *
    * @param relativeObject the ui object to position relative to
    * @param offsetWidth the drop down's offset width
    * @param offsetHeight the drop down's offset height
@@ -1307,7 +1307,7 @@
 
   /**
    * Preview the {@link NativePreviewEvent}.
-   * 
+   *
    * @param event the {@link NativePreviewEvent}
    */
   private void previewNativeEvent(NativePreviewEvent event) {
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 727e2e0..c7a8898 100644
--- a/user/src/com/google/gwt/user/client/ui/StackPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/StackPanel.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,12 +23,12 @@
 /**
  * A panel that stacks its children vertically, displaying only one at a time,
  * with a header for each child which the user can click to display.
- * 
+ *
  * <p>
  * This widget will <em>only</em> work in quirks mode. If your application is in
  * Standards Mode, use {@link StackLayoutPanel} instead.
  * </p>
- * 
+ *
  * <p>
  * <img class='gallery' src='doc-files/StackPanel.png'/>
  * </p>
@@ -44,7 +44,7 @@
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.StackPanelExample}
  * </p>
- * 
+ *
  * @see StackLayoutPanel
  */
 public class StackPanel extends ComplexPanel implements InsertPanel.ForIsWidget {
@@ -79,7 +79,7 @@
 
   /**
    * Adds a new child with the given widget and header.
-   * 
+   *
    * @param w the widget to be added
    * @param stackText the header text associated with this widget
    */
@@ -113,7 +113,7 @@
 
   /**
    * Gets the currently selected child index.
-   * 
+   *
    * @return selected child
    */
   public int getSelectedIndex() {
@@ -198,7 +198,7 @@
 
   /**
    * Sets the text associated with a child by its index.
-   * 
+   *
    * @param index the index of the child whose text is to be set
    * @param text the text to be associated with it
    */
@@ -239,14 +239,14 @@
 
   /**
    * Shows the widget at the specified child index.
-   * 
+   *
    * @param index the index of the child to be shown
    */
   public void showStack(int index) {
     if ((index >= getWidgetCount()) || (index < 0) || (index == visibleStack)) {
       return;
     }
- 
+
     if (visibleStack >= 0) {
       setStackVisible(visibleStack, false);
     }
@@ -262,7 +262,7 @@
    * <li>-text-wrapper# = The element around the header at the specified index.</li>
    * <li>-content# = The element around the body at the specified index.</li>
    * </ul>
-   * 
+   *
    * @see UIObject#onEnsureDebugId(String)
    */
   @Override
@@ -281,7 +281,7 @@
   }
 
   /**
-   * @return a header element
+   * Returns a header element.
    */
   Element createHeaderElem() {
     return DOM.createDiv();
@@ -290,7 +290,7 @@
   /**
    * Get the element that holds the header text given the header element created
    * by #createHeaderElement.
-   * 
+   *
    * @param headerElem the header element
    * @return the element around the header text
    */
diff --git a/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java b/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
index 378a93b..4e154d5 100644
--- a/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
+++ b/user/src/com/google/gwt/user/client/ui/TabLayoutPanel.java
@@ -307,7 +307,7 @@
   }
 
   /**
-   * @return the widget at the given index.
+   * Returns the widget at the given index.
    */
   public Widget getWidget(int index) {
     checkIndex(index);
@@ -315,7 +315,7 @@
   }
 
   /**
-   * @return the number of tabs and widgets
+   * Returns the number of tabs and widgets.
    */
   public int getWidgetCount() {
     return children.size();
@@ -329,7 +329,7 @@
   }
 
   /**
-   * @return the index of the given child, or -1 if it is not a child
+   * Returns the index of the given child, or -1 if it is not a child.
    */
   public int getWidgetIndex(Widget child) {
     return children.indexOf(child);
@@ -557,7 +557,7 @@
    *
    * Use care when setting an object's HTML; it is an easy way to expose
    * script-based security problems. Consider using
-   * {@link #setTabHTML(int, SafeHtml)} or 
+   * {@link #setTabHTML(int, SafeHtml)} or
    * {@link #setTabText(int, String)} whenever possible.
    *
    * @param index the index of the tab whose HTML is to be set
diff --git a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
index 9a710b2..79caf7c 100644
--- a/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
+++ b/user/src/com/google/gwt/user/client/ui/TextBoxBase.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,7 +21,7 @@
 
 /**
  * Abstract base class for most text entry widgets.
- * 
+ *
  * <p>
  * The names of the static members of {@link TextBoxBase}, as well as simple
  * alignment names (<code>left</code>, <code>center</code>, <code>right</code>,
@@ -29,7 +29,7 @@
  * attribute.
  * <p>
  * For example,
- * 
+ *
  * <pre>
  * &lt;g:TextBox textAlignment='ALIGN_RIGHT'/&gt;
  * &lt;g:TextBox textAlignment='right'/&gt;
@@ -39,8 +39,8 @@
     SourcesChangeEvents {
 
   /**
-   * Legacy wrapper for {@link TextAlignment}, soon to be deprecated.
-   * @deprecated use {@link #setAlignment(TextAlignment)}
+   * Legacy wrapper for {@link ValueBoxBase.TextAlignment}, soon to be deprecated.
+   * @deprecated use {@link #setAlignment(ValueBoxBase.TextAlignment)}
    */
   @Deprecated
   public static class TextAlignConstant {
@@ -82,7 +82,7 @@
   /**
    * Creates a text box that wraps the given browser element handle. This is
    * only used by subclasses.
-   * 
+   *
    * @param elem the browser element to wrap
    */
   protected TextBoxBase(Element elem) {
@@ -108,7 +108,7 @@
 
   /**
    * Legacy wrapper for {@link #setAlignment(TextAlignment)}.
-   * 
+   *
    * @deprecated use {@link #setAlignment(TextAlignment)}
    */
   @Deprecated
diff --git a/user/src/com/google/gwt/user/client/ui/ValueBox.java b/user/src/com/google/gwt/user/client/ui/ValueBox.java
index 87721ec..33b75e8 100644
--- a/user/src/com/google/gwt/user/client/ui/ValueBox.java
+++ b/user/src/com/google/gwt/user/client/ui/ValueBox.java
@@ -23,10 +23,6 @@
 import com.google.gwt.text.shared.Renderer;
 
 /**
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * <p>
  * A text box able to parse its displayed value.
  * 
  * @param <T> the value type
diff --git a/user/src/com/google/gwt/user/client/ui/ValuePicker.java b/user/src/com/google/gwt/user/client/ui/ValuePicker.java
index 8115023..8003cec 100644
--- a/user/src/com/google/gwt/user/client/ui/ValuePicker.java
+++ b/user/src/com/google/gwt/user/client/ui/ValuePicker.java
@@ -32,11 +32,6 @@
 import java.util.Collection;
 
 /**
- * <p>
- * <span style="color:red">Experimental API: This class is still under rapid
- * development, and is very likely to be deleted. Use it at your own risk.
- * </span>
- * </p>
  * Allows the user to pick a single value from a list.
  *
  * @param <T> the type of value
@@ -89,7 +84,7 @@
   }
 
   /**
-   * @return this view
+   * Returns this view.
    */
   @Override
   public ValuePicker<T> asWidget() {
diff --git a/user/src/com/google/gwt/user/client/ui/Widget.java b/user/src/com/google/gwt/user/client/ui/Widget.java
index c80a25a..e0138a0 100644
--- a/user/src/com/google/gwt/user/client/ui/Widget.java
+++ b/user/src/com/google/gwt/user/client/ui/Widget.java
@@ -290,7 +290,7 @@
    * <p>
    * This method is called when a widget is attached to the browser's document.
    * To receive notification after a Widget has been added to the document,
-   * override the {@link #onLoad} method.
+   * override the {@link #onLoad} method or use {@link #addAttachHandler}.
    * </p>
    * <p>
    * It is strongly recommended that you override {@link #onLoad()} or
@@ -328,13 +328,14 @@
     // the attached flag is set. This allows widgets to be notified when they
     // are fully attached, and panels when all of their children are attached.
     onLoad();
+    AttachEvent.fire(this, true);
   }
 
   /**
    * <p>
    * This method is called when a widget is detached from the browser's
    * document. To receive notification before a Widget is removed from the
-   * document, override the {@link #onUnload} method.
+   * document, override the {@link #onUnload} method or use {@link #addAttachHandler}.
    * </p>
    * <p>
    * It is strongly recommended that you override {@link #onUnload()} or
@@ -363,6 +364,7 @@
       // onUnload() gets called *before* everything else (the opposite of
       // onLoad()).
       onUnload();
+      AttachEvent.fire(this, false);
     } finally {
       // Put this in a finally, just in case onUnload throws an exception.
       try {
@@ -377,22 +379,16 @@
 
   /**
    * This method is called immediately after a widget becomes attached to the
-   * browser's document. This default implementation notifies the widgets
-   * {@link com.google.gwt.event.logical.shared.AttachEvent.Handler
-   * AttachEvent.Handler}s.
+   * browser's document.
    */
   protected void onLoad() {
-    AttachEvent.fire(this, true);
   }
 
   /**
    * This method is called immediately before a widget will be detached from the
-   * browser's document. This default implementation notifies the widget's
-   * {@link com.google.gwt.event.logical.shared.AttachEvent.Handler
-   * AttachEvent.Handler}s.
+   * browser's document.
    */
   protected void onUnload() {
-    AttachEvent.fire(this, false);
   }
 
   /**
diff --git a/user/src/com/google/gwt/user/datepicker/client/DateBox.java b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
index a5edd54..c9ebf25 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DateBox.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -46,9 +46,9 @@
 
 /**
  * A text box that shows a {@link DatePicker} when the user focuses on it.
- * 
+ *
  * <h3>CSS Style Rules</h3>
- * 
+ *
  * <dl>
  * <dt>.gwt-DateBox</dt>
  * <dd>default style name</dd>
@@ -59,7 +59,7 @@
  * {@link DateBox.DefaultFormat} when the text does not represent a date that
  * can be parsed</dd>
  * </dl>
- * 
+ *
  * <p>
  * <h3>Example</h3>
  * {@example com.google.gwt.examples.DateBoxExample}
@@ -97,7 +97,7 @@
 
     /**
      * Creates a new default format instance.
-     * 
+     *
      * @param dateTimeFormat the {@link DateTimeFormat} to use with this
      *          {@link Format}.
      */
@@ -115,7 +115,7 @@
 
     /**
      * Gets the date time format.
-     * 
+     *
      * @return the date time format
      */
     public DateTimeFormat getDateTimeFormat() {
@@ -156,7 +156,7 @@
 
     /**
      * Formats the provided date. Note, a null date is a possible input.
-     * 
+     *
      * @param dateBox the date box you are formatting
      * @param date the date to format
      * @return the formatted date as a string
@@ -165,7 +165,7 @@
 
     /**
      * Parses the provided string as a date.
-     * 
+     *
      * @param dateBox the date box
      * @param text the string representing a date
      * @param reportError should the formatter indicate a parse error to the
@@ -177,7 +177,7 @@
     /**
      * If the format did any modifications to the date box's styling, reset them
      * now.
-     * 
+     *
      * @param abandon true when the current format is being replaced by another
      * @param dateBox the date box
      */
@@ -261,7 +261,7 @@
 
   /**
    * Create a new date box.
-   * 
+   *
    * @param date the default date.
    * @param picker the picker to drop down from the date box
    * @param format to use to parse and format dates
@@ -303,9 +303,9 @@
 
   /**
    * Gets the current cursor position in the date box.
-   * 
+   *
    * @return the cursor position
-   * 
+   *
    */
   public int getCursorPos() {
     return box.getCursorPos();
@@ -313,7 +313,7 @@
 
   /**
    * Gets the date picker.
-   * 
+   *
    * @return the date picker
    */
   public DatePicker getDatePicker() {
@@ -323,7 +323,7 @@
   /**
    * Gets the format instance used to control formatting and parsing of this
    * {@link DateBox}.
-   * 
+   *
    * @return the format
    */
   public Format getFormat() {
@@ -332,7 +332,7 @@
 
   /**
    * Gets the date box's position in the tab index.
-   * 
+   *
    * @return the date box's tab index
    */
   public int getTabIndex() {
@@ -341,7 +341,7 @@
 
   /**
    * Get text box.
-   * 
+   *
    * @return the text box used to enter the formatted date
    */
   public TextBox getTextBox() {
@@ -351,7 +351,7 @@
   /**
    * Get the date displayed, or null if the text box is empty, or cannot be
    * interpreted.
-   * 
+   *
    * @return the current date value
    */
   public Date getValue() {
@@ -366,7 +366,7 @@
   }
 
   /**
-   * @return true if date picker is currently showing, false if not
+   * Returns true if date picker is currently showing, false if not.
    */
   public boolean isDatePickerShowing() {
     return popup.isShowing();
@@ -375,7 +375,7 @@
   /**
    * Sets the date box's 'access key'. This key is used (in conjunction with a
    * browser-specific modifier key) to automatically focus the widget.
-   * 
+   *
    * @param key the date box's access key
    */
   public void setAccessKey(char key) {
@@ -384,7 +384,7 @@
 
   /**
    * Sets whether the date box is enabled.
-   * 
+   *
    * @param enabled is the box enabled
    */
   public void setEnabled(boolean enabled) {
@@ -394,7 +394,7 @@
   /**
    * Explicitly focus/unfocus this widget. Only one widget can have focus at a
    * time, and the widget that does will receive all keyboard events.
-   * 
+   *
    * @param focused whether this widget should take focus or release it
    */
   public void setFocus(boolean focused) {
@@ -405,7 +405,7 @@
    * Sets the format used to control formatting and parsing of dates in this
    * {@link DateBox}. If this {@link DateBox} is not empty, the contents of date
    * box will be replaced with current contents in the new format.
-   * 
+   *
    * @param format the new date format
    */
   public void setFormat(Format format) {
@@ -429,7 +429,7 @@
    * the same tab index, each such widget will receive focus in an arbitrary
    * order. Setting the tab index to <code>-1</code> will cause this widget to
    * be removed from the tab order.
-   * 
+   *
    * @param index the date box's tab index
    */
   public void setTabIndex(int index) {
diff --git a/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java b/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java
index d8a82f4..ef76913 100644
--- a/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java
+++ b/user/src/com/google/gwt/user/rebind/rpc/ProblemReport.java
@@ -111,7 +111,7 @@
    * @param extraLines additional continuation lines for the message, usually
    *    for additional explanations.
    */
-  public Problem add(JClassType type, String message, Priority priority, 
+  public Problem add(JClassType type, String message, Priority priority,
       String... extraLines) {
     String contextString = "";
     if (contextType != null) {
@@ -186,7 +186,7 @@
   /**
    * Sets the context type currently being analyzed.  Problems found will
    * include reference to this context, until reset with another call to this
-   * method.  Context may be cancelled with a {@code null} value here.
+   * method.  Context may be canceled with a {@code null} value here.
    *
    * @param newContext the type under analysis
    */
diff --git a/user/src/com/google/gwt/user/server/rpc/impl/SerializedInstanceReference.java b/user/src/com/google/gwt/user/server/rpc/impl/SerializedInstanceReference.java
index d0133a6..26ffad5 100644
--- a/user/src/com/google/gwt/user/server/rpc/impl/SerializedInstanceReference.java
+++ b/user/src/com/google/gwt/user/server/rpc/impl/SerializedInstanceReference.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,12 +22,12 @@
   String SERIALIZED_REFERENCE_SEPARATOR = "/";
 
   /**
-   * @return name of the type
+   * Returns the name of the type.
    */
   String getName();
 
   /**
-   * @return signature of the instance reference
+   * Returns the signature of the instance reference.
    */
   String getSignature();
-}
\ No newline at end of file
+}
diff --git a/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java b/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java
new file mode 100644
index 0000000..c1a2949
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/constraints/NotGwtCompatibleValidator.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client.constraints;
+
+import java.lang.annotation.Annotation;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
+
+/**
+ * Masks a {@link ConstraintValidator} that is not GWT compatible. This
+ * validator always fails.
+ * <p>
+ * Extend this class and implement it as GWT super class. Use validation groups
+ * to keep this constraint from being validated on the client.
+ *
+ * <p>
+ * In a super source directory override your validator like this:
+ *
+ * <pre>
+ * public class MyValidator extends
+ *     NotGwtCompatibleValidator &lt;MyConstraint, MyType&gt;{
+ * }
+ * </pre>
+ *
+ * @param <A> the constraint to validate
+ * @param <T> the type to validate
+ */
+public abstract class NotGwtCompatibleValidator<A extends Annotation, T>
+    implements ConstraintValidator<A, T> {
+
+  public final void initialize(A constraintAnnotation) {
+  }
+
+  /**
+   * Always fails.
+   */
+  public final boolean isValid(T value, ConstraintValidatorContext context) {
+    // TODO (nchalko) add a custom message
+    return false;
+  }
+
+}
diff --git a/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java b/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java
new file mode 100644
index 0000000..f5703d9
--- /dev/null
+++ b/user/src/com/google/gwt/validation/client/impl/ConstraintDescriptorImpl.java
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2010 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.validation.client.impl;
+
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.validation.ConstraintValidator;
+import javax.validation.Payload;
+import javax.validation.metadata.ConstraintDescriptor;
+
+/**
+ * A immutable GWT implementation of {@link ConstraintDescriptor}.
+ *
+ * @param <T> the constraint annotation to describe.
+ */
+public class ConstraintDescriptorImpl<T extends Annotation> implements
+    ConstraintDescriptor<T> {
+
+  /**
+   * Builder for {@link ConstraintDescriptorImpl}.
+   *
+   * @param <T> the constraint annotation to describe.
+   */
+  public static class Builder<T extends Annotation> {
+    private T annotation;
+    private Set<Class<?>> groups;
+    private Set<Class<? extends Payload>> payload;
+    private List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses;
+    private Map<String, Object> attributes;
+    private Set<ConstraintDescriptor<?>> composingConstraints;
+    private boolean reportAsSingleViolation;
+
+    public ConstraintDescriptorImpl<T> build() {
+      return new ConstraintDescriptorImpl<T>(//
+          annotation, //
+          groups, //
+          payload, //
+          constraintValidatorClasses, //
+          attributes, //
+          composingConstraints, //
+          reportAsSingleViolation);
+    }
+
+    public Builder<T> setAnnotation(T annotation) {
+      this.annotation = annotation;
+      return this;
+    }
+
+    public Builder<T> setAttributes(Map<String, Object> attributes) {
+      this.attributes = attributes;
+      return this;
+    }
+
+    public Builder<T> setComposingConstraints(
+        Set<ConstraintDescriptor<?>> composingConstraints) {
+      this.composingConstraints = composingConstraints;
+      return this;
+    }
+
+    public Builder<T> setConstraintValidatorClasses(
+        List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses) {
+      this.constraintValidatorClasses = constraintValidatorClasses;
+      return this;
+    }
+
+    /**
+     * @param classes
+     * @return
+     */
+    public Builder<T> setConstraintValidatorClasses(
+        Class<? extends ConstraintValidator<T, ?>>[] constraintValidatorClasses) {
+      List<Class<? extends ConstraintValidator<T, ?>>> list = Arrays.asList(constraintValidatorClasses);
+      setConstraintValidatorClasses(list);
+      return this;
+    }
+
+    public Builder<T> setGroups(Set<Class<?>> groups) {
+      this.groups = groups;
+      return this;
+    }
+
+    public Builder<T> setGroups(Class<?>[] classes) {
+      setGroups(new HashSet<Class<?>>(Arrays.asList(classes)));
+      return this;
+    }
+
+    public Builder<T> setPayload(Set<Class<? extends Payload>> payload) {
+      this.payload = payload;
+      return this;
+    }
+
+    public Builder<T> setPayload(Class<? extends Payload>[] classes) {
+      setPayload(new HashSet<Class<? extends Payload>>(Arrays.asList(classes)));
+      return this;
+    }
+
+    public Builder<T> setReportAsSingleViolation(boolean reportAsSingleViolation) {
+      this.reportAsSingleViolation = reportAsSingleViolation;
+      return this;
+    }
+  }
+
+  public static <T extends Annotation> Builder<T> builder() {
+    return new Builder<T>();
+  }
+
+  private final T annotation;
+  private final Set<Class<?>> groups;
+  private final Set<Class<? extends Payload>> payload;
+  private final List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses;
+  private final Map<String, Object> attributes;
+  private final Set<ConstraintDescriptor<?>> composingConstraints;
+  private final boolean reportAsSingleViolation;
+
+  private ConstraintDescriptorImpl(
+      T annotation,
+      Set<Class<?>> groups,
+      Set<Class<? extends Payload>> payload,
+      List<Class<? extends ConstraintValidator<T, ?>>> constraintValidatorClasses,
+      Map<String, Object> attributes,
+      Set<ConstraintDescriptor<?>> composingConstraints,
+      boolean reportAsSingleViolation) {
+    super();
+    this.annotation = annotation;
+    this.groups = groups;
+    this.payload = payload;
+    this.constraintValidatorClasses = constraintValidatorClasses;
+    this.attributes = attributes;
+    this.composingConstraints = composingConstraints;
+    this.reportAsSingleViolation = reportAsSingleViolation;
+  }
+
+  public T getAnnotation() {
+    return annotation;
+  }
+
+  public Map<String, Object> getAttributes() {
+    return attributes;
+  }
+
+  public Set<ConstraintDescriptor<?>> getComposingConstraints() {
+    return composingConstraints;
+  }
+
+  public List<Class<? extends ConstraintValidator<T, ?>>> getConstraintValidatorClasses() {
+    return constraintValidatorClasses;
+  }
+
+  public Set<Class<?>> getGroups() {
+    return groups;
+  }
+
+  public Set<Class<? extends Payload>> getPayload() {
+    return payload;
+  }
+
+  public boolean isReportAsSingleViolation() {
+    return reportAsSingleViolation;
+  }
+}
diff --git a/user/super/com/google/gwt/emul/java/math/Conversion.java b/user/super/com/google/gwt/emul/java/math/Conversion.java
index 28b8a95..14cc0bb 100644
--- a/user/super/com/google/gwt/emul/java/math/Conversion.java
+++ b/user/super/com/google/gwt/emul/java/math/Conversion.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,22 +21,22 @@
  * licenses this file to You under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations under
  * the License.
- * 
+ *
  * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
  */
 package java.math;
 
 /**
  * Static library that provides {@link BigInteger} base conversion from/to any
- * integer represented in an {@link java.lang.String} Object.
+ * integer represented in a {@link java.lang.String} Object.
  */
 class Conversion {
 
@@ -168,7 +168,7 @@
   /**
    * Builds the correspondent {@code String} representation of {@code val} being
    * scaled by {@code scale}.
-   * 
+   *
    * @see BigInteger#toString()
    * @see BigDecimal#toString()
    */
diff --git a/user/super/com/google/gwt/emul/java/math/Division.java b/user/super/com/google/gwt/emul/java/math/Division.java
index 4179a82..9b676e3 100644
--- a/user/super/com/google/gwt/emul/java/math/Division.java
+++ b/user/super/com/google/gwt/emul/java/math/Division.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,15 +21,15 @@
  * licenses this file to You under the Apache License, Version 2.0 (the
  * "License"); you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations under
  * the License.
- * 
+ *
  * INCLUDES MODIFICATIONS BY RICHARD ZSCHECH AS WELL AS GOOGLE.
  */
 package java.math;
@@ -38,7 +38,7 @@
  * Static library that provides all operations related with division and modular
  * arithmetic to {@link BigInteger}. Some methods are provided in both mutable
  * and immutable way. There are several variants provided listed below:
- * 
+ *
  * <ul type="circle"> <li><b>Division</b> <ul type="circle"> <li>
  * {@link BigInteger} division and remainder by {@link BigInteger}.</li> <li>
  * {@link BigInteger} division and remainder by {@code int}.</li> <li><i>gcd</i>
@@ -54,7 +54,7 @@
    * remainder. Implements the Knuth's division algorithm. See D. Knuth, The Art
    * of Computer Programming, vol. 2. Steps D1-D8 correspond the steps in the
    * algorithm description.
-   * 
+   *
    * @param quot the quotient
    * @param quotLength the quotient's length
    * @param a the dividend
@@ -173,7 +173,7 @@
   /**
    * Computes the quotient and the remainder after a division by an {@code int}
    * number.
-   * 
+   *
    * @return an array of the form {@code [quotient, remainder]}.
    */
   static BigInteger[] divideAndRemainderByInteger(BigInteger val, int divisor,
@@ -212,7 +212,7 @@
   /**
    * Divides an array by an integer value. Implements the Knuth's division
    * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2.
-   * 
+   *
    * @param dest the quotient
    * @param src the dividend
    * @param srcLength the length of the dividend
@@ -265,7 +265,7 @@
   /**
    * Divides an unsigned long a by an unsigned int b. It is supposed that the
    * most significant bit of b is set to 1, i.e. b < 0
-   * 
+   *
    * @param a the dividend
    * @param b the divisor
    * @return the long value containing the unsigned integer remainder in the
@@ -313,7 +313,7 @@
    * square and multiply algorithm and the Montgomery Reduction C. K. Koc -
    * Montgomery Reduction with Even Modulus</i>. The square and multiply
    * algorithm and the Montgomery Reduction.
-   * 
+   *
    * @ar.org.fitc.ref "C. K. Koc - Montgomery Reduction with Even Modulus"
    * @see BigInteger#modPow(BigInteger, BigInteger)
    */
@@ -343,7 +343,7 @@
 
   /**
    * Performs the final reduction of the Montgomery algorithm.
-   * 
+   *
    * @see #monPro(BigInteger, BigInteger, BigInteger, long)
    * @see #monSquare(BigInteger, BigInteger, long)
    */
@@ -378,7 +378,7 @@
   /**
    * @param m a positive modulus Return the greatest common divisor of op1 and
    *          op2,
-   * 
+   *
    * @param op1 must be greater than zero
    * @param op2 must be greater than zero
    * @see BigInteger#gcd(BigInteger)
@@ -443,7 +443,7 @@
   /**
    * Performs the same as {@link #gcdBinary(BigInteger, BigInteger)}, but with
    * numbers of 63 bits, represented in positives values of {@code long} type.
-   * 
+   *
    * @param op1 a positive number
    * @param op2 a positive number
    * @see #gcdBinary(BigInteger, BigInteger)
@@ -475,7 +475,7 @@
 
   /**
    * Performs {@code x = x mod (2<sup>n</sup>)}.
-   * 
+   *
    * @param x a positive number, it will store the result.
    * @param n a positive exponent of {@code 2}.
    */
@@ -494,10 +494,10 @@
   }
 
   /**
-   * 
+   *
    * Based on "New Algorithm for Classical Modular Inverse" Róbert Lórencz. LNCS
    * 2523 (2002)
-   * 
+   *
    * @return a^(-1) mod m
    */
   static BigInteger modInverseLorencz(BigInteger a, BigInteger modulo) {
@@ -714,7 +714,7 @@
   /**
    * Implements the Montgomery Product of two integers represented by {@code
    * int} arrays. The arrays are supposed in <i>little endian</i> notation.
-   * 
+   *
    * @param a The first factor of the product.
    * @param b The second factor of the product.
    * @param modulus The modulus of the operations. Z<sub>modulus</sub>.
@@ -737,7 +737,7 @@
   /**
    * Multiplies an array by int and subtracts it from a subarray of another
    * array.
-   * 
+   *
    * @param a the array to subtract from
    * @param start the start element of the subarray of a
    * @param b the array to be multiplied and subtracted
@@ -765,7 +765,7 @@
   /**
    * Performs modular exponentiation using the Montgomery Reduction. It requires
    * that all parameters be positive and the modulus be odd. >
-   * 
+   *
    * @see BigInteger#modPow(BigInteger, BigInteger)
    * @see #monPro(BigInteger, BigInteger, BigInteger, int)
    * @see #slidingWindow(BigInteger, BigInteger, BigInteger, BigInteger, int)
@@ -795,7 +795,7 @@
 
   /**
    * It requires that all parameters be positive.
-   * 
+   *
    * @return {@code base<sup>exponent</sup> mod (2<sup>j</sup>)}.
    * @see BigInteger#modPow(BigInteger, BigInteger)
    */
@@ -830,7 +830,7 @@
   /**
    * Divides a <code>BigInteger</code> by a signed <code>int</code> and returns
    * the remainder.
-   * 
+   *
    * @param dividend the BigInteger to be divided. Must be non-negative.
    * @param divisor a signed int
    * @return divide % divisor
@@ -842,7 +842,7 @@
   /**
    * Divides an array by an integer value. Implements the Knuth's division
    * algorithm. See D. Knuth, The Art of Computer Programming, vol. 2.
-   * 
+   *
    * @param src the dividend
    * @param srcLength the length of the dividend
    * @param divisor the divisor
@@ -864,11 +864,11 @@
   /*
    * Implements the Montgomery modular exponentiation based in <i>The sliding
    * windows algorithm and the MongomeryReduction</i>.
-   * 
+   *
    * @ar.org.fitc.ref
    * "A. Menezes,P. van Oorschot, S. Vanstone - Handbook of Applied Cryptography"
    * ;
-   * 
+   *
    * @see #oddModPow(BigInteger, BigInteger, BigInteger)
    */
   static BigInteger slidingWindow(BigInteger x2, BigInteger a2,
@@ -946,7 +946,7 @@
   /**
    * Calculate how many iteration of Lorencz's algorithm would perform the same
    * operation.
-   * 
+   *
    * @param bi
    * @param n
    * @return
@@ -967,7 +967,7 @@
   }
 
   /**
-   * @return bi == abs(2^exp)
+   * Returns {@code bi == abs(2^exp)}.
    */
   private static boolean isPowerOfTwo(BigInteger bi, int exp) {
     boolean result = false;
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractCollection.java b/user/super/com/google/gwt/emul/java/util/AbstractCollection.java
index 8f123d8..eac8574 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractCollection.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractCollection.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -21,9 +21,9 @@
  * Skeletal implementation of the Collection interface. <a
  * href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/AbstractCollection.html">[Sun
  * docs]</a>
- * 
+ *
  * @param <E> the element type.
- * 
+ *
  */
 public abstract class AbstractCollection<E> implements Collection<E> {
 
diff --git a/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java b/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
index 3690fc7..9ffcf40 100644
--- a/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/MapEntryImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,7 +16,7 @@
 package java.util;
 
 /**
- * An {@link Map.Entry} shared by several {@link Map} implementations.
+ * A {@link Map.Entry} shared by several {@link Map} implementations.
  */
 class MapEntryImpl<K, V> extends AbstractMapEntry<K, V> {
 
diff --git a/user/super/com/google/gwt/emul/java/util/TreeMap.java b/user/super/com/google/gwt/emul/java/util/TreeMap.java
index dd8a12f..0761e75 100644
--- a/user/super/com/google/gwt/emul/java/util/TreeMap.java
+++ b/user/super/com/google/gwt/emul/java/util/TreeMap.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -22,7 +22,7 @@
  * performance on lookups, inserts, and deletes while maintaining linear
  * in-order traversal time. Null keys and values are fully supported if the
  * comparator supports them (the default comparator does not).
- * 
+ *
  * @param <K> key type
  * @param <V> value type
  */
@@ -33,7 +33,7 @@
    * September 2007 at:
    * http://eternallyconfuzzled.com/tuts/datastructures/jsw_tut_rbtree.aspx
    * written by Julienne Walker.
-   * 
+   *
    * This version does not require a parent pointer kept in each node.
    */
 
@@ -53,7 +53,7 @@
 
     /**
      * Create an iterator which may return only a restricted range.
-     * 
+     *
      * @param fromKey the first key to return in the iterator.
      * @param toKey the upper bound of keys to return.
      */
@@ -159,7 +159,7 @@
 
   /**
    * Tree node.
-   * 
+   *
    * @param <K> key type
    * @param <V> value type
    */
@@ -175,7 +175,7 @@
 
     /**
      * Create a red node.
-     * 
+     *
      * @param key
      * @param value
      */
@@ -185,7 +185,7 @@
 
     /**
      * Create a node of the specified color.
-     * 
+     *
      * @param key
      * @param value
      * @param isRed true if this should be a red node, false for black
@@ -247,7 +247,7 @@
    * removed node as well as to pass in a value which must match (used for
    * entrySet().remove(entry)), and the matchValue flag is used to request this
    * behavior.
-   * 
+   *
    * @param <V> value type
    */
   private static class State<V> {
@@ -526,14 +526,14 @@
     };
 
     /**
-     * @return true if this submap type uses a from-key.
+     * Returns true if this submap type uses a from-key.
      */
     public boolean fromKeyValid() {
       return false;
     }
 
     /**
-     * @return true if this submap type uses a to-key.
+     * Returns true if this submap type uses a to-key.
      */
     public boolean toKeyValid() {
       return false;
@@ -565,9 +565,9 @@
 
   /**
    * Throw a NoSuchElementException if the specified node is null.
-   * 
+   *
    * Used to clean up error checking at use sites.
-   * 
+   *
    * @param node node to check
    * @param <NK> key type
    * @param <NV> value type
@@ -708,9 +708,9 @@
   }
 
   /**
-   * Return the first node which compares equal to or greater than the given
+   * Returns the first node which compares equal to or greater than the given
    * key.
-   * 
+   *
    * @param key the key to search for
    * @return the next node, or null if there is none
    */
@@ -732,8 +732,8 @@
   }
 
   /**
-   * Return the last node which is strictly less than the given key.
-   * 
+   * Returns the last node which is strictly less than the given key.
+   *
    * @param key the key to search for
    * @return the previous node, or null if there is none
    */
@@ -755,13 +755,13 @@
   /**
    * Used for testing. Validate that the tree meets all red-black correctness
    * requirements. These include:
-   * 
+   *
    * <pre>
    *  - root is black
    *  - no children of a red node may be red
    *  - the black height of every path through the three to a leaf is exactly the same
    * </pre>
-   * 
+   *
    * @throws RuntimeException if any correctness errors are detected.
    */
   void assertCorrectness() {
@@ -770,7 +770,7 @@
 
   /**
    * Internal helper function for public {@link #assertCorrectness()}.
-   * 
+   *
    * @param tree the subtree to validate.
    * @param isRed true if the parent of this node is red.
    * @return the black height of this subtree.
@@ -805,7 +805,7 @@
 
   /**
    * Finds an entry given a key and returns the node.
-   * 
+   *
    * @param key the search key
    * @return the node matching the key or null
    */
@@ -826,7 +826,7 @@
   }
 
   /**
-   * @return the left-most node of the tree, or null if empty
+   * Returns the left-most node of the tree, or null if empty.
    */
   private Node<K, V> getFirstNode() {
     if (root == null) {
@@ -840,7 +840,7 @@
   }
 
   /**
-   * @return the right-most node of the tree, or null if empty
+   * Returns the right-most node of the tree, or null if empty.
    */
   private Node<K, V> getLastNode() {
     if (root == null) {
@@ -855,10 +855,10 @@
 
   /**
    * Insert a node into a subtree, collecting state about the insertion.
-   * 
+   *
    * If the same key already exists, the value of the node is overwritten with
    * the value from the new node instead.
-   * 
+   *
    * @param tree subtree to insert into
    * @param newNode new node to insert
    * @param state result of the insertion: state.found true if the key already
@@ -885,7 +885,7 @@
           tree.child[LEFT].isRed = false;
           tree.child[RIGHT].isRed = false;
         } else {
-          // 
+          //
           if (isRed(tree.child[childNum].child[childNum])) {
             tree = rotateSingle(tree, otherChild(childNum));
           } else if (isRed(tree.child[childNum].child[otherChild(childNum)])) {
@@ -898,7 +898,7 @@
   }
 
   /**
-   * Return true if <code>node</code> is red. Note that null pointers are
+   * Returns true if <code>node</code> is red. Note that null pointers are
    * considered black.
    */
   private boolean isRed(Node<K, V> node) {
@@ -907,7 +907,7 @@
 
   /**
    * Remove a key from the tree, returning whether it was found and its value.
-   * 
+   *
    * @param key key to remove
    * @param state return state, not null
    * @return true if the value was found
@@ -971,7 +971,7 @@
        * put the "node" values in "found" (the node with key K) and cut "node"
        * out. However, we do not want to corrupt "found" -- issue 3423. So
        * create a new node "newNode" to replace the "found" node.
-       * 
+       *
        * TODO: (jat's suggestion) Consider using rebalance to move the deleted
        * node to a leaf to avoid the extra traversal in replaceNode.
        */
@@ -1022,14 +1022,14 @@
    * Perform a double rotation, first rotating the child which will become the
    * root in the opposite direction, then rotating the root in the specified
    * direction.
-   * 
+   *
    * <pre>
    *           A                                               F
    *         B   C    becomes (with rotateDirection=0)       A   C
    *        D E F G                                         B E   G
    *                                                       D
    * </pre>
-   * 
+   *
    * @param tree root of the subtree to rotate
    * @param rotateDirection the direction to rotate: 0=left, 1=right
    * @return the new root of the rotated subtree
@@ -1044,13 +1044,13 @@
   /**
    * Perform a single rotation, pushing the root of the subtree to the specified
    * direction.
-   * 
+   *
    * <pre>
    *      A                                              B
    *    B   C     becomes (with rotateDirection=1)     D   A
    *   D E                                              E   C
    * </pre>
-   * 
+   *
    * @param tree the root of the subtree to rotate
    * @param rotateDirection the direction to rotate: 0=left rotation, 1=right
    * @return the new root of the rotated subtree
diff --git a/user/test/com/google/gwt/animation/client/AnimationTest.java b/user/test/com/google/gwt/animation/client/AnimationTest.java
index 1249dfc..2aebc0a 100644
--- a/user/test/com/google/gwt/animation/client/AnimationTest.java
+++ b/user/test/com/google/gwt/animation/client/AnimationTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -33,7 +33,7 @@
    * A default implementation of {@link Animation} used for testing.
    */
   private static class DefaultAnimation extends Animation {
-    protected boolean cancelled = false;
+    protected boolean canceled = false;
     protected boolean completed = false;
     protected boolean started = false;
     protected double curProgress = -1.0;
@@ -42,7 +42,7 @@
      * Assert the value of canceled.
      */
     public void assertCancelled(boolean expected) {
-      assertEquals(expected, cancelled);
+      assertEquals(expected, canceled);
     }
 
     /**
@@ -74,7 +74,7 @@
     }
 
     public void reset() {
-      cancelled = false;
+      canceled = false;
       completed = false;
       started = false;
       curProgress = -1.0;
@@ -88,7 +88,7 @@
     @Override
     protected void onCancel() {
       super.onCancel();
-      cancelled = true;
+      canceled = true;
     }
 
     @Override
@@ -116,7 +116,7 @@
 
     @Override
     protected void onCancel() {
-      cancelled = true;
+      canceled = true;
     }
 
     @Override
diff --git a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
index b5a9beb..1f15edb 100644
--- a/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
+++ b/user/test/com/google/gwt/editor/client/SimpleBeanEditorTest.java
@@ -42,6 +42,14 @@
     }
   }
 
+  class AddressEditorPartOne implements Editor<Address> {
+    SimpleEditor<String> city = SimpleEditor.of(UNINITIALIZED);
+  }
+
+  class AddressEditorPartTwo implements Editor<Address> {
+    SimpleEditor<String> street = SimpleEditor.of(UNINITIALIZED);
+  }
+
   class AddressEditorView implements IsEditor<LeafAddressEditor> {
     LeafAddressEditor addressEditor = new LeafAddressEditor();
 
@@ -105,6 +113,18 @@
       SimpleBeanEditorDriver<Person, PersonEditorWithLeafAddressEditor> {
   }
 
+  class PersonEditorWithMultipleBindings implements Editor<Person> {
+    @Editor.Path("address")
+    AddressEditorPartOne one = new AddressEditorPartOne();
+
+    @Editor.Path("address")
+    AddressEditorPartTwo two = new AddressEditorPartTwo();
+  }
+
+  interface PersonEditorWithMultipleBindingsDriver extends
+      SimpleBeanEditorDriver<Person, PersonEditorWithMultipleBindings> {
+  }
+
   interface PersonEditorWithOptionalAddressDriver extends
       SimpleBeanEditorDriver<Person, PersonEditorWithOptionalAddressEditor> {
   }
@@ -361,10 +381,10 @@
 
     List<SimpleEditor<String>> editors = editor.getEditors();
     assertEquals(rawData.size(), editors.size());
-    assertEquals(rawData, Arrays.asList(editors.get(0).getValue(), editors.get(
-        1).getValue(), editors.get(2).getValue()));
-    assertEquals(editors, new ArrayList<SimpleEditor<String>>(
-        positionMap.values()));
+    assertEquals(rawData, Arrays.asList(editors.get(0).getValue(),
+        editors.get(1).getValue(), editors.get(2).getValue()));
+    assertEquals(editors,
+        new ArrayList<SimpleEditor<String>>(positionMap.values()));
 
     List<String> mutableList = editor.getList();
     assertEquals(rawData, mutableList);
@@ -383,8 +403,8 @@
     mutableList.add("quux");
     assertEquals(4, editors.size());
     assertEquals("quux", editors.get(3).getValue());
-    assertEquals(editors, new ArrayList<SimpleEditor<String>>(
-        positionMap.values()));
+    assertEquals(editors,
+        new ArrayList<SimpleEditor<String>>(positionMap.values()));
 
     // Delete an element
     SimpleEditor<String> expectedDisposed = editors.get(0);
@@ -392,8 +412,8 @@
     assertSame(expectedDisposed, disposed[0]);
     assertEquals(3, editors.size());
     assertEquals("quux", editors.get(2).getValue());
-    assertEquals(editors, new ArrayList<SimpleEditor<String>>(
-        positionMap.values()));
+    assertEquals(editors,
+        new ArrayList<SimpleEditor<String>>(positionMap.values()));
   }
 
   /**
@@ -434,6 +454,23 @@
     assertEquals("edited", person.addresses.get(1).getCity());
   }
 
+  public void testMultipleBinding() {
+    PersonEditorWithMultipleBindingsDriver driver = GWT.create(PersonEditorWithMultipleBindingsDriver.class);
+    PersonEditorWithMultipleBindings editor = new PersonEditorWithMultipleBindings();
+
+    driver.initialize(editor);
+    driver.edit(person);
+    assertEquals("City", editor.one.city.getValue());
+    assertEquals("Street", editor.two.street.getValue());
+
+    editor.one.city.setValue("Foo");
+    editor.two.street.setValue("Bar");
+    driver.flush();
+
+    assertEquals("Foo", person.getAddress().getCity());
+    assertEquals("Bar", person.getAddress().getStreet());
+  }
+
   public void testOptionalField() {
     PersonEditorWithOptionalAddressDriver driver = GWT.create(PersonEditorWithOptionalAddressDriver.class);
     person.address = null;
diff --git a/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java b/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java
index ae4da68..8ff9e10 100644
--- a/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java
+++ b/user/test/com/google/gwt/i18n/client/DateTimeFormatTestBase.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -36,19 +36,19 @@
   public interface MyFormats extends CustomDateTimeFormat {
 
     /**
-     * @return a pattern for abbreviated year, month, and date.
+     * Returns a pattern for abbreviated year, month, and date.
      */
     @Pattern("yMMMd")
     DateTimeFormat yearMonthDayAbbrev();
 
     /**
-     * @return a pattern for full year, month, and date.
+     * Returns a pattern for full year, month, and date.
      */
     @Pattern("yyyyMMMMd")
     DateTimeFormat yearMonthDayFull();
 
     /**
-     * @return a pattern for full year, month, and date.
+     * Returns a pattern for full year, month, and date.
      */
     @Pattern("MMMM d, yyyy")
     DateTimeFormat yearMonthDayFull2();
@@ -77,4 +77,4 @@
     String str = dtf.format(date, TEST_TIMEZONE);
     assertEquals("Thu, 27 Jul 2006 08:10:10 -0500", str);
   }
-}
\ No newline at end of file
+}
diff --git a/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java b/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java
index bef8b4a..6c53ac3 100644
--- a/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/requestfactory/server/SimpleFoo.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -374,14 +374,14 @@
   }
 
   /**
-   * @return the bigDecimalField
+   * Returns the bigDecimalField.
    */
   public BigDecimal getBigDecimalField() {
     return bigDecimalField;
   }
 
   /**
-   * @return the bigIntegerField
+   * Returns the bigIntegerField.
    */
   public BigInteger getBigIntField() {
     return bigIntField;
@@ -392,14 +392,14 @@
   }
 
   /**
-   * @return the byteField
+   * Returns the byteField.
    */
   public Byte getByteField() {
     return byteField;
   }
 
   /**
-   * @return the charField
+   * Returns the charField.
    */
   public Character getCharField() {
     return charField;
@@ -410,7 +410,7 @@
   }
 
   /**
-   * @return the doubleField
+   * Returns the doubleField.
    */
   public Double getDoubleField() {
     return doubleField;
@@ -421,7 +421,7 @@
   }
 
   /**
-   * @return the floatField
+   * Returns the floatField.
    */
   public Float getFloatField() {
     return floatField;
@@ -460,7 +460,7 @@
   }
 
   /**
-   * @return the otherBoolField
+   * Returns the otherBoolField.
    */
   public Boolean getOtherBoolField() {
     return otherBoolField;
@@ -479,7 +479,7 @@
   }
 
   /**
-   * @return the shortField
+   * Returns the shortField.
    */
   public Short getShortField() {
     return shortField;
@@ -685,7 +685,7 @@
 
   /**
    * Persist this entity and all child entities. This method can handle loops.
-   * 
+   *
    * @param processed the entities that have been processed
    */
   private void persistCascadingAndReturnSelfImpl(Set<SimpleFoo> processed) {
diff --git a/user/test/com/google/gwt/requestfactory/server/SimpleFooString.java b/user/test/com/google/gwt/requestfactory/server/SimpleFooString.java
index d4d3eb6..aaa4870 100644
--- a/user/test/com/google/gwt/requestfactory/server/SimpleFooString.java
+++ b/user/test/com/google/gwt/requestfactory/server/SimpleFooString.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -160,7 +160,7 @@
   private List<SimpleBar> oneToManyField;
   private List<SimpleFooString> selfOneToManyField;
   private Set<SimpleBar> oneToManySetField;
-  
+
   private List<Integer> numberListField;
 
   public SimpleFooString() {
@@ -202,14 +202,14 @@
   }
 
   /**
-   * @return the bigDecimalField
+   * Returns the bigDecimalField.
    */
   public BigDecimal getBigDecimalField() {
     return bigDecimalField;
   }
 
   /**
-   * @return the bigIntegerField
+   * Returns the bigIntegerField.
    */
   public BigInteger getBigIntField() {
     return bigIntField;
@@ -220,14 +220,14 @@
   }
 
   /**
-   * @return the byteField
+   * Returns the byteField.
    */
   public Byte getByteField() {
     return byteField;
   }
 
   /**
-   * @return the charField
+   * Returns the charField.
    */
   public Character getCharField() {
     return charField;
@@ -238,7 +238,7 @@
   }
 
   /**
-   * @return the doubleField
+   * Returns the doubleField.
    */
   public Double getDoubleField() {
     return doubleField;
@@ -249,7 +249,7 @@
   }
 
   /**
-   * @return the floatField
+   * Returns the floatField.
    */
   public Float getFloatField() {
     return floatField;
@@ -270,7 +270,7 @@
   public Long getLongField() {
     return longField;
   }
-  
+
   public List<Integer> getNumberListField() {
     return numberListField;
   }
@@ -288,7 +288,7 @@
   }
 
   /**
-   * @return the otherBoolField
+   * Returns the otherBoolField.
    */
   public Boolean getOtherBoolField() {
     return otherBoolField;
@@ -307,7 +307,7 @@
   }
 
   /**
-   * @return the shortField
+   * Returns the shortField.
    */
   public Short getShortField() {
     return shortField;
diff --git a/user/test/com/google/gwt/uibinder/All.java b/user/test/com/google/gwt/uibinder/All.java
index 59669af..ab7152f 100644
--- a/user/test/com/google/gwt/uibinder/All.java
+++ b/user/test/com/google/gwt/uibinder/All.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,7 +26,7 @@
 public class All {
 
   /**
-   * @return a test suite containing all the UiBinder tests.
+   * Returns a test suite containing all the UiBinder tests.
    */
   public static Test suite() {
     GWTTestSuite suite = new GWTTestSuite("All UiBinder tests");
@@ -39,4 +39,4 @@
 
   private All() {
   }
-}
\ No newline at end of file
+}
diff --git a/user/test/com/google/gwt/uibinder/rebind/DesignTimeUtilsTest.java b/user/test/com/google/gwt/uibinder/rebind/DesignTimeUtilsTest.java
index ef5eacb..f4d45d2 100644
--- a/user/test/com/google/gwt/uibinder/rebind/DesignTimeUtilsTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/DesignTimeUtilsTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -327,7 +327,7 @@
   }
 
   /**
-   * @return the only child {@link Element} with given tag name.
+   * Returns the only child {@link Element} with given tag name.
    */
   private static Element getChildElement(Element parent, String name) {
     NodeList elements = parent.getElementsByTagName(name);
@@ -336,7 +336,7 @@
   }
 
   /**
-   * @return the {@link XMLElement} wrapper for given {@link Element}.
+   * Returns the {@link XMLElement} wrapper for given {@link Element}.
    */
   private static XMLElement createXMLElement(Element elem,
       DesignTimeUtils designTime) {
diff --git a/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java b/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java
index 2ee6790..4e55392 100644
--- a/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java
+++ b/user/test/com/google/gwt/uibinder/rebind/model/OwnerFieldClassTest.java
@@ -343,7 +343,7 @@
   }
 
   /**
-   * Class with a {@link UiChild}-annotated methods.
+   * Class with {@link UiChild}-annotated methods.
    */
   @SuppressWarnings("unused")
   // We know these methods are unused
@@ -430,7 +430,7 @@
 
   /**
    * Asserts that the given method has the proper name and parameters.
-   * 
+   *
    * @param method the actual method
    * @param methodName the expected method name
    * @param parameterTypes the expected parameter types
diff --git a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
index 6e4c0a8..91852ee 100644
--- a/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
+++ b/user/test/com/google/gwt/uibinder/test/UiJavaResources.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -480,8 +480,8 @@
   };
 
   /**
-   * @return a pale reflection of com.google.gwt.user.ui, plus
-   *         {@link JavaResourceBase#getStandardResources}
+   * Returns a pale reflection of com.google.gwt.user.ui, plus
+   * {@link JavaResourceBase#getStandardResources}.
    */
   public static Set<Resource> getUiResources() {
     Set<Resource> rtn = new HashSet<Resource>(
diff --git a/user/test/com/google/gwt/uibinder/test/client/FooLabel.java b/user/test/com/google/gwt/uibinder/test/client/FooLabel.java
index afbb5ea..492f224 100644
--- a/user/test/com/google/gwt/uibinder/test/client/FooLabel.java
+++ b/user/test/com/google/gwt/uibinder/test/client/FooLabel.java
@@ -26,7 +26,7 @@
 public class FooLabel extends Composite {
   int rawInt;
   Integer objectInteger;
-  
+
   boolean rawBoolean;
   Boolean objectBoolean;
 
@@ -53,7 +53,7 @@
   }
 
   /**
-   * @return the text
+   * Returns the text.
    */
   public String getText() {
     return getLabel().getText();
diff --git a/user/test/com/google/gwt/user/client/ui/CompositeTest.java b/user/test/com/google/gwt/user/client/ui/CompositeTest.java
index 37abcf8..902c56c 100644
--- a/user/test/com/google/gwt/user/client/ui/CompositeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/CompositeTest.java
@@ -19,6 +19,7 @@
 import com.google.gwt.event.dom.client.BlurHandler;
 import com.google.gwt.event.dom.client.FocusEvent;
 import com.google.gwt.event.dom.client.FocusHandler;
+import com.google.gwt.event.logical.shared.AttachEvent;
 import com.google.gwt.junit.client.GWTTestCase;
 import com.google.gwt.user.client.Command;
 import com.google.gwt.user.client.DOM;
@@ -30,6 +31,8 @@
  */
 public class CompositeTest extends GWTTestCase {
 
+  static int orderIndex;
+
   @Override
   public String getModuleName() {
     return "com.google.gwt.user.User";
@@ -132,4 +135,43 @@
    */
   public void testNothing() {
   }
+
+  public void testAttachAndDetachOrder() {
+    class TestAttachHandler implements AttachEvent.Handler {
+      int delegateAttachOrder;
+      int delegateDetachOrder;
+
+      public void onAttachOrDetach(AttachEvent event) {
+        if (event.isAttached()) {
+          delegateAttachOrder = ++orderIndex;
+        } else {
+          delegateDetachOrder = ++orderIndex;
+        }
+      }
+    }
+
+    class TestComposite extends Composite {
+      TextBox tb = new TextBox();
+
+      public TestComposite() {
+        initWidget(tb);
+      }
+    }
+
+    TestComposite c = new TestComposite();
+    TestAttachHandler ca = new TestAttachHandler();
+    TestAttachHandler wa = new TestAttachHandler();
+
+    c.addAttachHandler(ca);
+    c.tb.addAttachHandler(wa);
+
+    RootPanel.get().add(c);
+    RootPanel.get().remove(c);
+
+    assertTrue(ca.delegateAttachOrder > 0);
+    assertTrue(ca.delegateDetachOrder > 0);
+    assertTrue(ca.delegateAttachOrder > wa.delegateAttachOrder);
+    assertTrue(ca.delegateDetachOrder < wa.delegateDetachOrder);
+  }
+
 }
diff --git a/user/test/com/google/gwt/user/client/ui/FormPanelTest.java b/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
index 3e9bee0..5743726 100644
--- a/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
+++ b/user/test/com/google/gwt/user/client/ui/FormPanelTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -29,16 +29,16 @@
 
 /**
  * Tests the FormPanel.
- * 
+ *
  * @see com.google.gwt.user.server.ui.FormPanelTestServlet
  */
 public class FormPanelTest extends SimplePanelTestBase<FormPanel> {
-  
+
   /**
    * The maximum amount of time to wait for a test to finish.
    */
   private static final int TEST_DELAY = 15000;
-  
+
   public static boolean clicked = false;
 
   @Override
@@ -61,7 +61,7 @@
     });
     form.addSubmitCompleteHandler(new SubmitCompleteHandler() {
       public void onSubmitComplete(SubmitCompleteEvent event) {
-        fail("Form was cancelled and should not have been submitted");
+        fail("Form was canceled and should not have been submitted");
       }
     });
 
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 e3d6fbd..d32d411 100644
--- a/user/test/com/google/gwt/user/client/ui/ImageTest.java
+++ b/user/test/com/google/gwt/user/client/ui/ImageTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -61,7 +61,7 @@
     }
 
     /**
-     * @return true if the test has finished
+     * Returns true if the test has finished.
      */
     public boolean isFinished() {
       return finished;
@@ -85,7 +85,7 @@
     }
 
     /**
-     * @return true if the test has finished
+     * Returns true if the test has finished.
      */
     public boolean isFinished() {
       return finished;
@@ -100,7 +100,7 @@
    * Helper method that allows us to 'peek' at the private <code>state</code>
    * field in the Image object, and call the <code>state.getStateName()</code>
    * method.
-   * 
+   *
    * @param image The image instance
    * @return "unclipped" if image is in the unclipped state, or "clipped" if the
    *         image is in the clipped state
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 51293de..dc6170f 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetOnLoadTest.java
@@ -108,50 +108,68 @@
 
   public void testOnLoadAndUnloadOrder() {
     class TestAttachHandler implements AttachEvent.Handler {
-      int delegateAttachOrder;
-      int delegateDetachOrder;
+      int handleAttachOrder;
+      int handleDetachOrder;
 
       public void onAttachOrDetach(AttachEvent event) {
         if (event.isAttached()) {
-          delegateAttachOrder = ++orderIndex;
+          handleAttachOrder = ++orderIndex;
         } else {
-          delegateDetachOrder = ++orderIndex;
+          handleDetachOrder = ++orderIndex;
         }
       }
     }
 
     TestPanel tp = new TestPanel();
+    TestAttachHandler tpa = new TestAttachHandler();
+    tp.addAttachHandler(tpa);
+
     TestWidget tw = new TestWidget();
-    TestAttachHandler ta = new TestAttachHandler();
-    tw.addAttachHandler(ta);
+    TestAttachHandler twa = new TestAttachHandler();
+    tw.addAttachHandler(twa);
 
     tp.add(tw);
     RootPanel.get().add(tp);
     RootPanel.get().remove(tp);
 
-    // Trivial tests. Ensure that each panel/widget's onAttach/onDetach are
-    // called before their associated onLoad/onUnload.
+    /*
+     * Ensure that each panel/widget's onAttach/onDetach are called before their
+     * associated onLoad/onUnload, and before attach events are fired
+     */
     assertTrue(tp.onAttachOrder < tp.onLoadOrder);
     assertTrue(tp.onDetachOrder < tp.onUnloadOrder);
     assertTrue(tw.onAttachOrder < tw.onLoadOrder);
-    assertTrue(tw.onLoadOrder < ta.delegateAttachOrder);
+    assertTrue(tw.onLoadOrder < twa.handleAttachOrder);
+    assertTrue(tp.onLoadOrder < tpa.handleAttachOrder);
     assertTrue(tw.onDetachOrder < tw.onUnloadOrder);
-    assertTrue(tw.onUnloadOrder < ta.delegateDetachOrder);
+    assertTrue(tw.onUnloadOrder < twa.handleDetachOrder);
+    assertTrue(tp.onUnloadOrder < tpa.handleDetachOrder);
 
-    // Also trivial. Ensure that the panel's onAttach/onDetach is called before
-    // its child's onAttach/onDetach.
+    /*
+     * Ensure that the panel's onAttach/onDetach is called before its child's
+     * onAttach/onDetach.
+     */
     assertTrue(tp.onAttachOrder < tw.onAttachOrder);
+    assertTrue(tp.onDetachOrder < tw.onDetachOrder);
 
-    // Ensure that the panel's onLoad is only called after its widgets are
-    // attached/loaded.
+    /*
+     * Ensure that the panel's onLoad is only called after its widgets are
+     * attached/loaded, and likewise for the attach event listeners
+     */
     assertTrue(tp.onLoadOrder > tw.onLoadOrder);
+    assertTrue(tpa.handleAttachOrder > twa.handleAttachOrder);
 
-    // Ensure that the panel's onUnload is called before its widgets are
-    // detached/unloaded.
+    /*
+     * Ensure that the panel's onUnload is called before its widgets are
+     * detached/unloaded.
+     */
     assertTrue(tp.onUnloadOrder < tw.onUnloadOrder);
+    assertTrue(tpa.handleDetachOrder < twa.handleDetachOrder);
 
-    // Make sure each widget/panel's elements are actually still attached to the
-    // DOM during onLoad/onUnload.
+    /*
+     * Make sure each widget/panel's elements are actually still attached to the
+     * DOM during onLoad/onUnload.
+     */
     assertTrue(tp.domAttachedOnLoad);
     assertTrue(tp.domAttachedOnUnload);
     assertTrue(tw.domAttachedOnLoad);
diff --git a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
index 35db57f..0745240 100644
--- a/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
+++ b/user/test/com/google/gwt/valuestore/server/SimpleFoo.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -76,31 +76,31 @@
   private String userName;
 
   private Character charField;
-  
+
   private Long longField;
 
   private BigDecimal bigDecimalField;
-  
+
   private BigInteger bigIntField;
-  
+
   private Short shortField;
-  
+
   private Byte byteField;
-  
+
   private Date created;
-  
+
   private Double doubleField;
-  
+
   private Float floatField;
-  
+
   private SimpleEnum enumField;
-  
+
   private Boolean boolField;
 
   private Boolean otherBoolField;
 
   private SimpleBar barField;
-  
+
   private SimpleFoo fooField;
 
   public SimpleFoo() {
@@ -124,14 +124,14 @@
   }
 
   /**
-   * @return the bigDecimalField
+   * Returns the bigDecimalField.
    */
   public BigDecimal getBigDecimalField() {
     return bigDecimalField;
   }
 
   /**
-   * @return the bigIntField
+   * Returns the bigIntField.
    */
   public BigInteger getBigIntField() {
     return bigIntField;
@@ -142,14 +142,14 @@
   }
 
   /**
-   * @return the byteField
+   * Returns the byteField.
    */
   public Byte getByteField() {
     return byteField;
   }
 
   /**
-   * @return the charField
+   * Returns the charField.
    */
   public Character getCharField() {
     return charField;
@@ -160,7 +160,7 @@
   }
 
   /**
-   * @return the doubleField
+   * Returns the doubleField.
    */
   public Double getDoubleField() {
     return doubleField;
@@ -171,7 +171,7 @@
   }
 
   /**
-   * @return the floatField
+   * Returns the floatField.
    */
   public Float getFloatField() {
     return floatField;
@@ -192,9 +192,9 @@
   public Long getLongField() {
     return longField;
   }
-  
+
   /**
-   * @return the otherBoolField
+   * Returns the otherBoolField.
    */
   public Boolean getOtherBoolField() {
     return otherBoolField;
@@ -205,7 +205,7 @@
   }
 
   /**
-   * @return the shortField
+   * Returns the shortField.
    */
   public Short getShortField() {
     return shortField;
@@ -220,7 +220,7 @@
   }
 
   public String hello(SimpleBar bar) {
-    return "Greetings " + bar.getUserName() + " from " + getUserName();  
+    return "Greetings " + bar.getUserName() + " from " + getUserName();
   }
 
   public void persist() {
@@ -289,7 +289,7 @@
   public void setFloatField(Float floatField) {
     this.floatField = floatField;
   }
-  
+
   public void setFooField(SimpleFoo fooField) {
     this.fooField = fooField;
   }
diff --git a/user/test/org/apache/commons/collections/LocalTestNode.java b/user/test/org/apache/commons/collections/LocalTestNode.java
index 64e22d8..5608b62 100644
--- a/user/test/org/apache/commons/collections/LocalTestNode.java
+++ b/user/test/org/apache/commons/collections/LocalTestNode.java
@@ -45,7 +45,7 @@
     }
 
     /**
-     * @return the unique key associated with the current node
+     * Returns the unique key associated with the current node.
      */
     Comparable getKey() {
         return key;
@@ -59,7 +59,7 @@
     }
 
     /**
-     * @return the unique value associated with the current node
+     * Returns the unique value associated with the current node.
      */
     Comparable getValue() {
         return value;
@@ -97,7 +97,7 @@
             return false;
         }
 
-         
+
         if(!(getClass().getName().equals(o.getClass().getName()))){
             return false;
         }
diff --git a/user/test/org/apache/commons/collections/TestCollection.java b/user/test/org/apache/commons/collections/TestCollection.java
index 7c148a8..e3aac53 100644
--- a/user/test/org/apache/commons/collections/TestCollection.java
+++ b/user/test/org/apache/commons/collections/TestCollection.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 package org.apache.commons.collections;
- 
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,12 +30,12 @@
  * Tests base {@link java.util.Collection} methods and contracts.
  * <p>
  * You should create a concrete subclass of this class to test any custom
- * {@link Collection} implementation.  At minimum, you'll have to 
- * implement the {@link #makeCollection()} method.  You might want to 
+ * {@link Collection} implementation.  At minimum, you'll have to
+ * implement the {@link #makeCollection()} method.  You might want to
  * override some of the additional protected methods as well:<P>
  *
  * <B>Element Population Methods</B><P>
- * 
+ *
  * Override these if your collection restricts what kind of elements are
  * allowed (for instance, if <Code>null</Code> is not permitted):
  * <UL>
@@ -69,7 +69,7 @@
  *
  * The {@link #collection} field holds an instance of your collection
  * implementation; the {@link #confirmed} field holds an instance of the
- * confirmed collection implementation.  The {@link #resetEmpty()} and 
+ * confirmed collection implementation.  The {@link #resetEmpty()} and
  * {@link #resetFull()} methods set these fields to empty or full collections,
  * so that tests can proceed from a known state.<P>
  *
@@ -80,14 +80,14 @@
  * views of a map, {@link TestMap} would override {@link #verify()} to make
  * sure the map is changed after the collection view is changed.
  *
- * If you're extending this class directly, you will have to provide 
+ * If you're extending this class directly, you will have to provide
  * implementations for the following:
  * <UL>
  * <LI>{@link #makeConfirmedCollection()}
  * <LI>{@link #makeConfirmedFullCollection()}
  * </UL>
  *
- * Those methods should provide a confirmed collection implementation 
+ * Those methods should provide a confirmed collection implementation
  * that's compatible with your collection implementation.<P>
  *
  * If you're extending {@link TestList}, {@link TestSet},
@@ -102,7 +102,7 @@
  * test case (method) your {@link Collection} fails.  For instance, the
  * {@link #testIteratorFailFast()} method is provided since most collections
  * have fail-fast iterators; however, that's not strictly required by the
- * collection contract, so you may want to override that method to do 
+ * collection contract, so you may want to override that method to do
  * nothing.<P>
  *
  * @author Rodney Waldhoff
@@ -113,7 +113,7 @@
 public abstract class TestCollection extends TestObject {
 
     //
-    // NOTE: 
+    // NOTE:
     //
     // Collection doesn't define any semantics for equals, and recommends you
     // use reference-based default behavior of Object.equals.  (And a test for
@@ -126,21 +126,21 @@
     // These fields are used by reset() and verify(), and any test
     // method that tests a modification.
 
-    /** 
+    /**
      *  A collection instance that will be used for testing.
      */
     protected Collection collection;
 
-    /** 
+    /**
      *  Confirmed collection.  This is an instance of a collection that is
      *  confirmed to conform exactly to the java.util.Collection contract.
-     *  Modification operations are tested by performing a mod on your 
+     *  Modification operations are tested by performing a mod on your
      *  collection, performing the exact same mod on an equivalent confirmed
      *  collection, and then calling verify() to make sure your collection
      *  still matches the confirmed collection.
      */
     protected Collection confirmed;
- 
+
 
 
     /**
@@ -169,7 +169,7 @@
      *  distinguishable with information not readily available.  That is, if a
      *  particular value is to be removed from the collection, then there is
      *  one and only one value that can be removed, even if there are other
-     *  elements which are equal to it.  
+     *  elements which are equal to it.
      *
      *  <P>In most collection cases, elements are not distinguishable (equal is
      *  equal), thus this method defaults to return false.  In some cases,
@@ -191,7 +191,7 @@
     }
 
     /**
-     *  Verifies that {@link #collection} and {@link #confirmed} have 
+     *  Verifies that {@link #collection} and {@link #confirmed} have
      *  identical state.
      */
     protected void verify() {
@@ -199,7 +199,7 @@
         assertEquals("Collection size should match confirmed collection's",
                      confirmedSize, collection.size());
         assertEquals("Collection isEmpty() result should match confirmed " +
-                     " collection's", 
+                     " collection's",
                      confirmed.isEmpty(), collection.isEmpty());
 
         // verify the collections are the same by attempting to match each
@@ -216,7 +216,7 @@
 
         Iterator iter;
 
-        iter = confirmed.iterator(); 
+        iter = confirmed.iterator();
         int pos = 0;
         while(iter.hasNext()) {
             confirmedValues[pos++] = iter.next();
@@ -225,7 +225,7 @@
         // allocate an array of boolean flags for tracking values that have
         // been matched once and only once.
         boolean[] matched = new boolean[confirmedSize];
-        
+
         // now iterate through the values of the collection and try to match
         // the value with one in the confirmed array.
         iter = collection.iterator();
@@ -251,7 +251,7 @@
                      "confirmed collection does not have.");
             }
         }
-        
+
         // make sure there aren't any unmatched values
         for(int i = 0; i < confirmedSize; i++) {
             if(!matched[i]) {
@@ -261,11 +261,11 @@
             }
         }
     }
-    
-    
+
+
     /**
      *  Returns a confirmed empty collection.
-     *  For instance, an {@link java.util.ArrayList} for lists or a
+     *  For instance, a {@link java.util.ArrayList} for lists or a
      *  {@link java.util.HashSet} for sets.
      *
      *  @return a confirmed empty collection
@@ -276,7 +276,7 @@
 
     /**
      *  Returns a confirmed full collection.
-     *  For instance, an {@link java.util.ArrayList} for lists or a
+     *  For instance, a {@link java.util.ArrayList} for lists or a
      *  {@link java.util.HashSet} for sets.  The returned collection
      *  should contain the elements returned by {@link #getFullElements()}.
      *
@@ -286,7 +286,7 @@
 
 
     /**
-     *  Returns true if the collections produced by 
+     *  Returns true if the collections produced by
      *  {@link #makeCollection()} and {@link #makeFullCollection()}
      *  support the <Code>add</Code> and <Code>addAll</Code>
      *  operations.<P>
@@ -299,7 +299,7 @@
 
 
     /**
-     *  Returns true if the collections produced by 
+     *  Returns true if the collections produced by
      *  {@link #makeCollection()} and {@link #makeFullCollection()}
      *  support the <Code>remove</Code>, <Code>removeAll</Code>,
      *  <Code>retainAll</Code>, <Code>clear</Code> and
@@ -316,15 +316,15 @@
      *  Returns an array of objects that are contained in a collection
      *  produced by {@link #makeFullCollection()}.  Every element in the
      *  returned array <I>must</I> be an element in a full collection.<P>
-     *  The default implementation returns a heterogenous array of 
-     *  objects with some duplicates and with the null element.  
+     *  The default implementation returns a heterogenous array of
+     *  objects with some duplicates and with the null element.
      *  Override if you require specific testing elements.  Note that if you
      *  override {@link #makeFullCollection()}, you <I>must</I> override
      *  this method to reflect the contents of a full collection.
      */
     protected Object[] getFullElements() {
         ArrayList list = new ArrayList();
-        
+
         list.addAll(Arrays.asList(getFullNonNullElements()));
         list.add(4, null);
         return list.toArray();
@@ -333,7 +333,7 @@
 
     /**
      *  Returns an array of elements that are <I>not</I> contained in a
-     *  full collection.  Every element in the returned array must 
+     *  full collection.  Every element in the returned array must
      *  not exist in a collection returned by {@link #makeFullCollection()}.
      *  The default implementation returns a heterogenous array of elements
      *  without null.  Note that some of the tests add these elements
@@ -343,10 +343,10 @@
     protected Object[] getOtherElements() {
         return getOtherNonNullElements();
     }
-    
+
 
     /**
-     * Return a new, empty {@link Collection} to be used for testing.
+     * Returns a new, empty {@link Collection} to be used for testing.
      */
     protected abstract Collection makeCollection();
 
@@ -379,7 +379,7 @@
      */
     public void testCollectionAdd() {
         if (!isAddSupported()) return;
-        
+
         Object[] elements = getFullElements();
         for (int i = 0; i < elements.length; i++) {
             resetEmpty();
@@ -387,10 +387,10 @@
             confirmed.add(elements[i]);
             verify();
             assertTrue("Empty collection changed after add", r);
-            assertTrue("Collection size is 1 after first add", 
+            assertTrue("Collection size is 1 after first add",
                        collection.size() == 1);
         }
-        
+
         resetEmpty();
         int size = 0;
         for (int i = 0; i < elements.length; i++) {
@@ -398,14 +398,14 @@
             confirmed.add(elements[i]);
             verify();
             if (r) size++;
-            assertEquals("Collection size should grow after add", 
+            assertEquals("Collection size should grow after add",
                          size, collection.size());
             assertTrue("Collection should contain added element",
                        collection.contains(elements[i]));
         }
     }
-    
-    
+
+
     /**
      *  Tests {@link Collection#addAll(Collection)}.
      */
@@ -434,21 +434,21 @@
             assertTrue("Full collection should contain added element",
                        collection.contains(elements[i]));
         }
-        assertEquals("Size should increase after addAll", 
+        assertEquals("Size should increase after addAll",
                      size + elements.length, collection.size());
-        
+
         resetFull();
         size = collection.size();
         r = collection.addAll(Arrays.asList(getFullElements()));
         confirmed.addAll(Arrays.asList(getFullElements()));
         verify();
         if (r) {
-            assertTrue("Size should increase if addAll returns true", 
+            assertTrue("Size should increase if addAll returns true",
                        size < collection.size());
         } else {
             assertEquals("Size should not change if addAll returns false",
                          size, collection.size());
-        } 
+        }
     }
 
 
@@ -458,7 +458,7 @@
      */
     public void testUnsupportedAdd() {
         if (isAddSupported()) return;
-        
+
         resetEmpty();
         try {
             collection.add(new Object());
@@ -490,7 +490,7 @@
         // make sure things didn't change even if the expected exception was
         // thrown.
         verify();
-        
+
         try {
             collection.addAll(Arrays.asList(getOtherElements()));
             fail("Full collection should not support addAll.");
@@ -517,9 +517,9 @@
         collection.clear();
         confirmed.clear();
         verify();
-    }    
+    }
 
-    
+
     /**
      *  Tests {@link Collection#contains(Object)}.
      */
@@ -546,7 +546,7 @@
         resetFull();
         elements = getFullElements();
         for(int i = 0; i < elements.length; i++) {
-            assertTrue("Full collection should contain element.", 
+            assertTrue("Full collection should contain element.",
                        collection.contains(elements[i]));
         }
         // make sure calls to "contains" don't change anything
@@ -555,7 +555,7 @@
         resetFull();
         elements = getOtherElements();
         for(int i = 0; i < elements.length; i++) {
-            assertTrue("Full collection shouldn't contain element", 
+            assertTrue("Full collection shouldn't contain element",
                        !collection.contains(elements[i]));
         }
     }
@@ -576,9 +576,9 @@
         verify();
 
         resetFull();
-        assertTrue("Full collection shouldn't contain other elements", 
+        assertTrue("Full collection shouldn't contain other elements",
                    !collection.containsAll(col));
-        
+
         col.clear();
         col.addAll(Arrays.asList(getFullElements()));
         assertTrue("Full collection should containAll full elements",
@@ -586,13 +586,13 @@
         // make sure calls to "containsAll" don't change anything
         verify();
 
-         
-        assertTrue("Full collection should containAll itself", 
+
+        assertTrue("Full collection should containAll itself",
                    collection.containsAll(collection));
 
         // make sure calls to "containsAll" don't change anything
         verify();
-        
+
         col = new ArrayList();
         col.addAll(Arrays.asList(getFullElements()));
         col.addAll(Arrays.asList(getFullElements()));
@@ -608,13 +608,13 @@
      */
     public void testCollectionIsEmpty() {
         resetEmpty();
-        assertEquals("New Collection should be empty.", 
+        assertEquals("New Collection should be empty.",
                      true, collection.isEmpty());
         // make sure calls to "isEmpty() don't change anything
         verify();
 
         resetFull();
-        assertEquals("Full collection shouldn't be empty", 
+        assertEquals("Full collection shouldn't be empty",
                      false, collection.isEmpty());
         // make sure calls to "isEmpty() don't change anything
         verify();
@@ -635,19 +635,19 @@
                  "NoSuchElementException when next is called.");
         } catch(NoSuchElementException e) {
             // expected
-        } 
+        }
         // make sure nothing has changed after non-modification
         verify();
 
         resetFull();
         it1 = collection.iterator();
         for (int i = 0; i < collection.size(); i++) {
-            assertTrue("Iterator for full collection should haveNext", 
+            assertTrue("Iterator for full collection should haveNext",
                        it1.hasNext());
             it1.next();
         }
         assertTrue("Iterator should be finished", !it1.hasNext());
-        
+
         ArrayList list = new ArrayList();
         it1 = collection.iterator();
         for (int i = 0; i < collection.size(); i++) {
@@ -706,7 +706,7 @@
             // contents are still the same.  Otherwise, we don't have the
             // ability to distinguish the elements and determine which to
             // remove from the confirmed collection (in which case, we don't
-            // verify because we don't know how). 
+            // verify because we don't know how).
             //
             // see areEqualElementsDistinguishable()
             if(!areEqualElementsDistinguishable()) {
@@ -720,7 +720,7 @@
         }
         assertTrue("Collection should be empty after iterator purge",
                    collection.isEmpty());
-        
+
         resetFull();
         iter = collection.iterator();
         iter.next();
@@ -743,20 +743,20 @@
         resetEmpty();
         Object[] elements = getFullElements();
         for (int i = 0; i < elements.length; i++) {
-            assertTrue("Shouldn't remove nonexistent element", 
+            assertTrue("Shouldn't remove nonexistent element",
                        !collection.remove(elements[i]));
             verify();
         }
-        
+
         Object[] other = getOtherElements();
-        
+
         resetFull();
         for (int i = 0; i < other.length; i++) {
-            assertTrue("Shouldn't remove nonexistent other element", 
+            assertTrue("Shouldn't remove nonexistent other element",
                        !collection.remove(other[i]));
             verify();
         }
-        
+
         int size = collection.size();
         for (int i = 0; i < elements.length; i++) {
             resetFull();
@@ -768,7 +768,7 @@
             // contents are still the same.  Otherwise, we don't have the
             // ability to distinguish the elements and determine which to
             // remove from the confirmed collection (in which case, we don't
-            // verify because we don't know how). 
+            // verify because we don't know how).
             //
             // see areEqualElementsDistinguishable()
             if(!areEqualElementsDistinguishable()) {
@@ -776,11 +776,11 @@
                 verify();
             }
 
-            assertEquals("Collection should shrink after remove", 
+            assertEquals("Collection should shrink after remove",
                          size - 1, collection.size());
         }
     }
-    
+
 
     /**
      *  Tests {@link Collection#removeAll(Collection)}.
@@ -790,45 +790,45 @@
 
         resetEmpty();
         assertTrue("Emtpy collection removeAll should return false for " +
-                   "empty input", 
+                   "empty input",
                    !collection.removeAll(Collections.EMPTY_SET));
         verify();
-        
+
         assertTrue("Emtpy collection removeAll should return false for " +
-                   "nonempty input", 
+                   "nonempty input",
                    !collection.removeAll(new ArrayList(collection)));
         verify();
-        
+
         resetFull();
-        assertTrue("Full collection removeAll should return false for " + 
-                   "empty input", 
+        assertTrue("Full collection removeAll should return false for " +
+                   "empty input",
                    !collection.removeAll(Collections.EMPTY_SET));
         verify();
-        
+
         assertTrue("Full collection removeAll should return false for " +
-                   "other elements", 
+                   "other elements",
                    !collection.removeAll(Arrays.asList(getOtherElements())));
         verify();
-        
+
         assertTrue("Full collection removeAll should return true for " +
-                   "full elements", 
+                   "full elements",
                    collection.removeAll(new HashSet(collection)));
         confirmed.removeAll(new HashSet(confirmed));
         verify();
-        
+
         resetFull();
 
         int size = collection.size();
         Object[] s = getFullElements();
         List l = new ArrayList();
         l.add(s[2]); l.add(s[3]); l.add(s[3]);
-        
-        assertTrue("Full collection removeAll should work", 
+
+        assertTrue("Full collection removeAll should work",
                    collection.removeAll(l));
         confirmed.removeAll(l);
         verify();
-        
-        assertTrue("Collection should shrink after removeAll", 
+
+        assertTrue("Collection should shrink after removeAll",
                    collection.size() < size);
         Iterator iter = l.iterator();
         while (iter.hasNext()) {
@@ -848,36 +848,36 @@
         List elements = Arrays.asList(getFullElements());
         List other = Arrays.asList(getOtherElements());
         Set empty = new HashSet();
-        
-        assertTrue("Empty retainAll() should return false", 
+
+        assertTrue("Empty retainAll() should return false",
                    !collection.retainAll(empty));
         verify();
-        
-        assertTrue("Empty retainAll() should return false", 
+
+        assertTrue("Empty retainAll() should return false",
                    !collection.retainAll(elements));
         verify();
-        
+
         resetFull();
-        assertTrue("Collection should change from retainAll empty", 
+        assertTrue("Collection should change from retainAll empty",
                    collection.retainAll(empty));
         confirmed.retainAll(empty);
         verify();
-        
+
         resetFull();
-        assertTrue("Collection changed from retainAll other", 
+        assertTrue("Collection changed from retainAll other",
                    collection.retainAll(other));
         confirmed.retainAll(other);
         verify();
-        
+
         resetFull();
         int size = collection.size();
         assertTrue("Collection shouldn't change from retainAll elements",
                    !collection.retainAll(elements));
         verify();
-        assertEquals("Collection size shouldn't change", size, 
+        assertEquals("Collection size shouldn't change", size,
                      collection.size());
-        
-        
+
+
         resetFull();
         HashSet set = new HashSet(elements);
         size = collection.size();
@@ -887,8 +887,8 @@
         assertEquals("Collection size didn't change from nonduplicate " +
                      "retainAll", size, collection.size());
     }
-    
-    
+
+
     /**
      *  Tests {@link Collection#size()}.
      */
@@ -897,23 +897,23 @@
         assertEquals("Size of new Collection is 0.", 0, collection.size());
 
         resetFull();
-        assertTrue("Size of full collection should be greater than zero", 
+        assertTrue("Size of full collection should be greater than zero",
                    collection.size() > 0);
     }
 
 
-  
+
 
     /**
      *  Tests <Code>toString</Code> on a collection.
      */
     public void testCollectionToString() {
         resetEmpty();
-        assertTrue("toString shouldn't return null", 
+        assertTrue("toString shouldn't return null",
                    collection.toString() != null);
 
         resetFull();
-        assertTrue("toString shouldn't return null", 
+        assertTrue("toString shouldn't return null",
                    collection.toString() != null);
     }
 
@@ -971,12 +971,12 @@
 
     }
 
- 
+
 
     /**
      *  Returns a list of elements suitable for return by
      *  {@link #getFullElements()}.  The array returned by this method
-     *  does not include null, but does include a variety of objects 
+     *  does not include null, but does include a variety of objects
      *  of different types.  Override getFullElements to return
      *  the results of this method if your collection does not support
      *  the null element.
@@ -1006,7 +1006,7 @@
 
 
     /**
-     *  Returns the default list of objects returned by 
+     *  Returns the default list of objects returned by
      *  {@link #getOtherElements()}.  Includes many objects
      *  of different types.
      */
