diff --git a/samples/expenses/pom.xml b/samples/expenses/pom.xml
index 7e45bb9..b45c4d4 100644
--- a/samples/expenses/pom.xml
+++ b/samples/expenses/pom.xml
@@ -10,12 +10,25 @@
 		<roo.version>1.1.0.M2</roo.version>
 		<spring.version>3.0.3.RELEASE</spring.version>
 		<slf4j.version>1.6.1</slf4j.version>
-	<gae.version>1.3.4</gae.version>
-    <gae-test.version>1.3.4</gae-test.version>
+	<gae.version>1.3.7</gae.version>
+    <gae-test.version>1.3.7</gae-test.version>
     <gae.home>${user.home}/.m2/repository/com/google/appengine/appengine-java-sdk/${gae.version}/appengine-java-sdk-${gae.version}</gae.home>
-    <datanucleus.version>1.1.6</datanucleus.version>
+    <datanucleus.version>1.1.5</datanucleus.version>
     </properties>
 	<repositories>
+		<repository>
+			<id>google-maven-snapshot-repository</id>
+			<name>Google Maven Snapshot Repository</name>
+			<url>https://oss.sonatype.org/content/repositories/google-snapshots/</url>
+			<snapshots>
+				<enabled>true</enabled>
+			</snapshots>
+		</repository>
+	<repository>
+            <id>maven-gae-plugin-repo</id>
+            <url>http://maven-gae-plugin.googlecode.com/svn/repository</url>
+            <name>maven-gae-plugin repository</name>
+        </repository>
         <repository>
             <id>spring-maven-release</id>
             <name>Spring Maven Release Repository</name>
@@ -31,11 +44,6 @@
             <name>Spring Roo Repository</name>
             <url>http://spring-roo-repository.springsource.org/release</url>
         </repository>
-	<repository>
-            <id>maven-gae-plugin-repo</id>
-            <url>http://maven-gae-plugin.googlecode.com/svn/repository</url>
-            <name>maven-gae-plugin repository</name>
-        </repository>
     <repository>
             <id>DataNucleus_2</id>
             <url>http://www.datanucleus.org/downloads/maven2/</url>
@@ -46,18 +54,15 @@
             <url>https://repository.jboss.org/nexus/content/repositories/releases</url>
             <name>JBoss Repo</name>
         </repository>
+<!--
     <repository>
             <id>gwt-repo</id>
             <url>http://google-web-toolkit.googlecode.com/svn/2.1.0.M3/gwt/maven</url>
             <name>Google Web Toolkit Repository</name>
         </repository>
+-->
     </repositories>
     <pluginRepositories>
-        <pluginRepository>
-            <id>maven-gae-plugin-repo</id>
-            <url>http://maven-gae-plugin.googlecode.com/svn/repository</url>
-            <name>maven-gae-plugin repository</name>
-        </pluginRepository>
     <pluginRepository>
             <id>DataNucleus_2</id>
             <url>http://www.datanucleus.org/downloads/maven2/</url>
@@ -437,6 +442,11 @@
     	<type>jar</type>
     	<scope>compile</scope>
     </dependency>
+    <dependency>
+        <groupId>xalan</groupId>
+        <artifactId>xalan</artifactId>
+        <version>2.7.1</version>
+    </dependency>
 	</dependencies>
 	<build>
 		<plugins>
@@ -549,7 +559,7 @@
 		<plugin>
                 <groupId>net.kindleit</groupId>
                 <artifactId>maven-gae-plugin</artifactId>
-                <version>0.5.7</version>
+                <version>0.7.2</version>
                 <configuration>
 						<unpackVersion>${gae.version}</unpackVersion>
 					</configuration>
@@ -611,7 +621,7 @@
         <plugin>
                 <groupId>org.codehaus.mojo</groupId>
                 <artifactId>gwt-maven-plugin</artifactId>
-                <version>1.3.1.google</version>
+                <version>1.3.2.google</version>
                 <configuration>
 				<logLevel>INFO</logLevel>
 				<style>PRETTY</style>
diff --git a/user/src/com/google/gwt/cell/client/AbstractEditableCell.java b/user/src/com/google/gwt/cell/client/AbstractEditableCell.java
index 2bac676..a99eb8f 100644
--- a/user/src/com/google/gwt/cell/client/AbstractEditableCell.java
+++ b/user/src/com/google/gwt/cell/client/AbstractEditableCell.java
@@ -76,6 +76,7 @@
    *
    * @param key the key identifying the row object
    * @return the view data, or null if none has been set
+   * @see #setViewData(Object, Object)V
    */
   public V getViewData(Object key) {
     return (key == null) ? null : viewDataMap.get(key);
@@ -90,6 +91,7 @@
    * @param parent the parent Element
    * @param value the value associated with the cell
    * @param key the unique key associated with the row object
+   * @return true if the cell is in edit mode
    */
   @Override
   public abstract boolean isEditing(Element parent, C value, Object key);
@@ -100,6 +102,7 @@
    *
    * @param key the key of the view data
    * @param viewData the view data to associate
+   * @see #getViewData(Object)
    */
   public void setViewData(Object key, V viewData) {
     if (key == null) {
diff --git a/user/src/com/google/gwt/cell/client/AbstractSafeHtmlCell.java b/user/src/com/google/gwt/cell/client/AbstractSafeHtmlCell.java
index 0e2bbfd..4d7bc32 100644
--- a/user/src/com/google/gwt/cell/client/AbstractSafeHtmlCell.java
+++ b/user/src/com/google/gwt/cell/client/AbstractSafeHtmlCell.java
@@ -65,6 +65,8 @@
 
   /**
    * Return the {@link SafeHtmlRenderer} used by this cell.
+   *
+   * @return a {@link SafeHtmlRenderer} instance
    */
   public SafeHtmlRenderer<C> getRenderer() {
     return renderer;
diff --git a/user/src/com/google/gwt/cell/client/ActionCell.java b/user/src/com/google/gwt/cell/client/ActionCell.java
index 8e06066..0003118 100644
--- a/user/src/com/google/gwt/cell/client/ActionCell.java
+++ b/user/src/com/google/gwt/cell/client/ActionCell.java
@@ -37,6 +37,8 @@
   public static interface Delegate<T> {
     /**
      * Perform the desired action on the given object.
+     *
+     * @param object the object to be acted upon
      */
     void execute(T object);
   }
diff --git a/user/src/com/google/gwt/cell/client/ButtonCell.java b/user/src/com/google/gwt/cell/client/ButtonCell.java
index e819440..d8caa83 100644
--- a/user/src/com/google/gwt/cell/client/ButtonCell.java
+++ b/user/src/com/google/gwt/cell/client/ButtonCell.java
@@ -36,6 +36,8 @@
 
   /**
    * Construct a new ButtonCell that will use a given {@link SafeHtmlRenderer}.
+   * 
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public ButtonCell(SafeHtmlRenderer<String> renderer) {
     super(renderer, "click", "keydown");
diff --git a/user/src/com/google/gwt/cell/client/Cell.java b/user/src/com/google/gwt/cell/client/Cell.java
index 85bb507..217217f 100644
--- a/user/src/com/google/gwt/cell/client/Cell.java
+++ b/user/src/com/google/gwt/cell/client/Cell.java
@@ -41,12 +41,10 @@
   boolean dependsOnSelection();
 
   /**
-   * <p>
    * Get the set of events that this cell consumes. The container that uses this
    * cell should only pass these events to
-   * {@link #onBrowserEvent(Element, Object, Object, NativeEvent, ValueUpdater)}
-   * .
-   * </p>
+   * {@link #onBrowserEvent(Element, Object, Object, NativeEvent, ValueUpdater)}.
+   *
    * <p>
    * The returned value should not be modified, and may be an unmodifiable set.
    * Changes to the return value may not be reflected in the cell.
@@ -73,6 +71,7 @@
    * @param parent the parent Element
    * @param value the value associated with the cell
    * @param key the unique key associated with the row object
+   * @return true if the cell is in edit mode
    */
   boolean isEditing(Element parent, C value, Object key);
 
@@ -109,6 +108,10 @@
    * Reset focus on the Cell. This method is called if the cell has focus when
    * it is refreshed.
    *
+   * @param parent the parent Element
+   * @param value the value associated with the cell
+   * @param key the unique key associated with the row object
+   *
    * @return true if focus is taken, false if not
    */
   boolean resetFocus(Element parent, C value, Object key);
diff --git a/user/src/com/google/gwt/cell/client/ClickableTextCell.java b/user/src/com/google/gwt/cell/client/ClickableTextCell.java
index 2c57c59..16fbe38 100644
--- a/user/src/com/google/gwt/cell/client/ClickableTextCell.java
+++ b/user/src/com/google/gwt/cell/client/ClickableTextCell.java
@@ -39,6 +39,8 @@
   /**
    * Construct a new ClickableTextCell that will use a given
    * {@link SafeHtmlRenderer}.
+   * 
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public ClickableTextCell(SafeHtmlRenderer<String> renderer) {
     super(renderer, "click", "keydown");
diff --git a/user/src/com/google/gwt/cell/client/DatePickerCell.java b/user/src/com/google/gwt/cell/client/DatePickerCell.java
index 236fb03..49df900 100644
--- a/user/src/com/google/gwt/cell/client/DatePickerCell.java
+++ b/user/src/com/google/gwt/cell/client/DatePickerCell.java
@@ -79,6 +79,8 @@
   /**
    * Constructs a new DatePickerCell that uses the given date/time format and a
    * {@link SimpleSafeHtmlRenderer}.
+   *
+   * @param format a {@link DateTimeFormat} instance
    */
   public DatePickerCell(DateTimeFormat format) {
     this(format, SimpleSafeHtmlRenderer.getInstance());
@@ -88,6 +90,8 @@
    * Constructs a new DatePickerCell that uses the date/time format given by
    * {@link DateTimeFormat#getFullDateFormat} and the given
    * {@link SafeHtmlRenderer}.
+   * 
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public DatePickerCell(SafeHtmlRenderer<String> renderer) {
     this(DateTimeFormat.getFormat(PredefinedFormat.DATE_FULL), renderer);
@@ -96,6 +100,9 @@
   /**
    * Constructs a new DatePickerCell that uses the given date/time format and
    * {@link SafeHtmlRenderer}.
+   *
+   * @param format a {@link DateTimeFormat} instance
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public DatePickerCell(DateTimeFormat format, SafeHtmlRenderer<String> renderer) {
     super("click", "keydown");
diff --git a/user/src/com/google/gwt/cell/client/EditTextCell.java b/user/src/com/google/gwt/cell/client/EditTextCell.java
index 07d5ef8..004967b 100644
--- a/user/src/com/google/gwt/cell/client/EditTextCell.java
+++ b/user/src/com/google/gwt/cell/client/EditTextCell.java
@@ -145,8 +145,9 @@
   }
 
   /**
-   * Construct a new EditTextCell that will use a given {@link SafeHtmlRenderer}
-   * .
+   * Construct a new EditTextCell that will use a given {@link SafeHtmlRenderer}.
+   * 
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public EditTextCell(SafeHtmlRenderer<String> renderer) {
     super("click", "keyup", "keydown", "blur");
diff --git a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
index 10c1a24..67a3e23 100644
--- a/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
+++ b/user/src/com/google/gwt/cell/client/ImageLoadingCell.java
@@ -108,15 +108,30 @@
       }
     }
 
+    /**
+     * Returns the renderer for a broken image.
+     *
+     * @return a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
+     */
     public SafeHtmlRenderer<String> getErrorRenderer() {
       // Show the broken image on error.
       return getImageRenderer();
     }
 
+    /**
+     * Returns the renderer for an image.
+     *
+     * @return a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
+     */
     public SafeHtmlRenderer<String> getImageRenderer() {
       return IMAGE_RENDERER;
     }
 
+    /**
+     * Returns the renderer for a loading image.
+     *
+     * @return a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
+     */
     public SafeHtmlRenderer<String> getLoadingRenderer() {
       return LOADING_RENDERER;
     }
@@ -150,7 +165,8 @@
   /**
    * Construct an {@link ImageResourceCell} using the specified
    * {@link SafeHtmlRenderer SafeHtmlRenderers}.
-   *
+   * 
+   * @param renderers an instance of {@link ImageLoadingCell.Renderers Renderers}
    */
   public ImageLoadingCell(Renderers renderers) {
     super("load", "error");
diff --git a/user/src/com/google/gwt/cell/client/TextCell.java b/user/src/com/google/gwt/cell/client/TextCell.java
index 0a6fbeb..48db9eb 100644
--- a/user/src/com/google/gwt/cell/client/TextCell.java
+++ b/user/src/com/google/gwt/cell/client/TextCell.java
@@ -36,6 +36,8 @@
   /**
    * Constructs a TextCell that uses the provided {@link SafeHtmlRenderer} to
    * render its text.
+   * 
+   * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>} instance
    */
   public TextCell(SafeHtmlRenderer<String> renderer) {
     super(renderer);
diff --git a/user/src/com/google/gwt/cell/client/TextInputCell.java b/user/src/com/google/gwt/cell/client/TextInputCell.java
index ca932e5..be1f7d5 100644
--- a/user/src/com/google/gwt/cell/client/TextInputCell.java
+++ b/user/src/com/google/gwt/cell/client/TextInputCell.java
@@ -52,6 +52,8 @@
 
     /**
      * Construct a ViewData instance containing a given value.
+     *
+     * @param value a String value
      */
     public ViewData(String value) {
       this.lastValue = value;
@@ -74,6 +76,9 @@
 
     /**
      * Return the current value of the input element.
+     * 
+     * @return the current value String
+     * @see #setCurrentValue(String)
      */
     public String getCurrentValue() {
       return curValue;
@@ -81,6 +86,9 @@
 
     /**
      * Return the last value sent to the {@link ValueUpdater}.
+     * 
+     * @return the last value String
+     * @see #setLastValue(String)
      */
     public String getLastValue() {
       return lastValue;
@@ -98,6 +106,7 @@
      * Set the current value.
      * 
      * @param curValue the current value
+     * @see #getCurrentValue()
      */
     protected void setCurrentValue(String curValue) {
       this.curValue = curValue;
@@ -107,6 +116,7 @@
      * Set the last value.
      * 
      * @param lastValue the last value
+     * @see #getLastValue()
      */
     protected void setLastValue(String lastValue) {
       this.lastValue = lastValue;
diff --git a/user/src/com/google/gwt/cell/client/package.html b/user/src/com/google/gwt/cell/client/package.html
index 2ad25ad..9e1d211 100644
--- a/user/src/com/google/gwt/cell/client/package.html
+++ b/user/src/com/google/gwt/cell/client/package.html
@@ -23,7 +23,7 @@
 <li>{@link com.google.gwt.cell.client.SelectionCell SelectionCell} - a cell that displays a drop-down list</li>
 <li>{@link com.google.gwt.cell.client.TextCell TextCell} - a cell that displays HTML text</li>
 <li>{@link com.google.gwt.cell.client.TextInputCell TextInputCell} - a cell that provides text input</li>
-<ul>
+</ul>
 </p>
 
 <p>In addition to cells, this package provides the following interfaces:
@@ -33,5 +33,7 @@
 <li>{@link com.google.gwt.cell.client.FieldUpdater FieldUpdater}</li>
 </ul>
 </p>
+
+@since GWT 2.1
 </body>
 </html>
diff --git a/user/src/com/google/gwt/editor/client/AutoBean.java b/user/src/com/google/gwt/editor/client/AutoBean.java
index 8e20ef4..f90e621 100644
--- a/user/src/com/google/gwt/editor/client/AutoBean.java
+++ b/user/src/com/google/gwt/editor/client/AutoBean.java
@@ -23,12 +23,16 @@
 public interface AutoBean<T> {
   /**
    * Accept an AutoBeanVisitor.
+   *
+   * @param visitor an {@link AutoBeanVisitor}
    */
   void accept(AutoBeanVisitor visitor);
 
   /**
    * Returns a proxy implementation of the <code>T</code> interface which will
    * delegate to the underlying wrapped object, if any.
+   *
+   * @return a proxy that delegates to the wrapped object
    */
   T as();
 
@@ -40,6 +44,7 @@
    * of the value of <code>deep</code>.
    * 
    * @param deep indicates if all referenced AutoBeans should be cloned
+   * @return a copy of this {@link AutoBean}
    * @throws IllegalStateException if the AutoBean is a wrapper type
    */
   AutoBean<T> clone(boolean deep);
@@ -47,36 +52,52 @@
   /**
    * Retrieve a tag value that was previously provided to
    * {@link #setTag(String, Object)}.
+   * 
+   * @param tagName the tag name
+   * @return the tag value
+   * @see #setTag(String, Object)
    */
   <Q> Q getTag(String tagName);
 
   /**
-   * Returns the value most recently passed to {@link #setFrozen}, or false
-   * if it has never been called.
+   * Returns the value most recently passed to {@link #setFrozen}, or {@code
+   * false} if it has never been called.
+   * 
+   * @return {@code true} if this instance is frozen
    */
   boolean isFrozen();
 
   /**
-   * Returns <code>true</code> if the AutoBean was provided with an external
+   * Returns {@code true} if the AutoBean was provided with an external
    * object.
+   *
+   * @return {@code true} if this instance is a wrapper
    */
   boolean isWrapper();
 
   /**
    * Disallows any method calls other than getters. All setter and call
    * operations will throw an {@link UnsupportedOperationException}.
+   * 
+   * @param frozen if {@code true}, freeze this instance
    */
   void setFrozen(boolean frozen);
 
   /**
    * A tag is an arbitrary piece of external metadata to be associated with the
    * wrapped value.
+   *
+   * @param tagName the tag name
+   * @param value the wrapped value
+   * @see #getTag(String)
    */
   void setTag(String tagName, Object value);
 
   /**
    * If the AutoBean wraps an object, return the underlying object.
-   * 
+   * The AutoBean will no longer function once unwrapped.
+   *
+   * @return the previously-wrapped object
    * @throws IllegalStateException if the AutoBean is not a wrapper
    */
   T unwrap();
diff --git a/user/src/com/google/gwt/editor/client/AutoBeanFactory.java b/user/src/com/google/gwt/editor/client/AutoBeanFactory.java
index 3f7dc88..872e1b5 100644
--- a/user/src/com/google/gwt/editor/client/AutoBeanFactory.java
+++ b/user/src/com/google/gwt/editor/client/AutoBeanFactory.java
@@ -93,12 +93,24 @@
   /**
    * Allows dynamic creation of AutoBean instances based on declared
    * parameterizations.
+   * 
+   * @param <T> the parameterization of the created {@link AutoBean}
+   * @param clazz the Class of type T of the new instance
+   * @return an {@link AutoBean} of type T or {@code null} if the interface type
+   *         is unknown to the factory
    */
   <T> AutoBean<T> create(Class<T> clazz);
 
   /**
    * Allows dynamic creation of wrapped AutoBean instances based on declared
    * parameterizations.
+   * 
+   * @param <T> the parameterization of the created {@link AutoBean}
+   * @param <U> the delegate's type, a subtype of T
+   * @param clazz the Class of type T of the new instance
+   * @param delegate a delegate that extends type T
+   * @return an {@link AutoBean} of type T or {@code null} if the interface type
+   *         is unknown to the factory
    */
   <T, U extends T> AutoBean<T> create(Class<T> clazz, U delegate);
 }
diff --git a/user/src/com/google/gwt/editor/client/AutoBeanUtils.java b/user/src/com/google/gwt/editor/client/AutoBeanUtils.java
index 67d346a..2299b9f 100644
--- a/user/src/com/google/gwt/editor/client/AutoBeanUtils.java
+++ b/user/src/com/google/gwt/editor/client/AutoBeanUtils.java
@@ -35,6 +35,10 @@
    * although the diff produced is likely meaningless.
    * <p>
    * This will work for both simple and wrapper AutoBeans.
+   *
+   * @param a an {@link AutoBean}
+   * @param b an {@link AutoBean}
+   * @return a {@link Map} of differing properties
    */
   public static Map<String, Object> diff(AutoBean<?> a, AutoBean<?> b) {
     // Fast check for comparing an object to itself
@@ -93,6 +97,9 @@
    * Returns a map that is a copy of the properties contained in an AutoBean.
    * The returned map is mutable, but editing it will not have any effect on the
    * bean that produced it.
+   *
+   * @param bean an {@link AutoBean}
+   * @return a {@link Map} of the bean's properties
    */
   public static Map<String, Object> getAllProperties(AutoBean<?> bean) {
     final Map<String, Object> toReturn = new LinkedHashMap<String, Object>();
@@ -118,8 +125,11 @@
 
   /**
    * Return the single AutoBean wrapper that is observing the delegate object or
-   * <code>null</code> if the parameter is <code>null</code> or not wrapped by
+   * {@code null} if the parameter is {@code null}or not wrapped by
    * an AutoBean.
+   * 
+   * @param delegate a delegate object, or {@code null}
+   * @return the {@link AutoBean} wrapper for the delegate, or {@code null}
    */
   @SuppressWarnings("unchecked")
   public static <T, U extends T> AutoBean<T> getAutoBean(U delegate) {
diff --git a/user/src/com/google/gwt/editor/client/AutoBeanVisitor.java b/user/src/com/google/gwt/editor/client/AutoBeanVisitor.java
index 305d481..40c14d1 100644
--- a/user/src/com/google/gwt/editor/client/AutoBeanVisitor.java
+++ b/user/src/com/google/gwt/editor/client/AutoBeanVisitor.java
@@ -31,37 +31,49 @@
   public interface PropertyContext {
     /**
      * Indicates if the {@link #set} method will succeed.
+     *
+     * @return {@code true} if the property can be set
      */
     boolean canSet();
 
     /**
      * If the reference property is a collection, returns the collection's
      * element type.
+     * 
+     * @return a Class object representing the element type or {@code null} if
+     *         the property is not a collection type
      */
     Class<?> getElementType();
 
     /**
      * Returns the expected type of the property.
+     *
+     * @return a Class object representing the property type
      */
     Class<?> getType();
 
+    /**
+     * Sets a property value.
+     *
+     * @param value the new value
+     */
     void set(Object value);
   }
 
   /**
-   * TODO: document.
+   * Called after visiting an {@link AutoBean}.
    * 
-   * @param bean
+   * @param bean an {@link AutoBean}
    * @param ctx a Context
    */
   public void endVisit(AutoBean<?> bean, Context ctx) {
   }
 
   /**
-   * TODO: document.
+   * Called after visiting a reference property.
    * 
-   * @param propertyName
-   * @param value
+   * @param propertyName the property name, as a String
+   * @param value the property value
    * @param ctx a PropertyContext
    */
   public void endVisitReferenceProperty(String propertyName, AutoBean<?> value,
@@ -69,10 +81,10 @@
   }
 
   /**
-   * TODO: document.
+   * Called after visiting a value property.
    * 
-   * @param propertyName
-   * @param value
+   * @param propertyName the property name, as a String
+   * @param value the property value
    * @param ctx a PropertyContext
    */
   public void endVisitValueProperty(String propertyName, Object value,
@@ -80,9 +92,9 @@
   }
 
   /**
-   * TODO: document.
+   * Called when visiting an {@link AutoBean}.
    * 
-   * @param bean
+   * @param bean an {@link AutoBean}
    * @param ctx a Context
    */
   public boolean visit(AutoBean<?> bean, Context ctx) {
@@ -93,8 +105,8 @@
    * Called every time, but {@link #visit(AutoBean, Context)} will be called for
    * the value only the first time it is encountered.
    * 
-   * @param propertyName
-   * @param value
+   * @param propertyName the property name, as a String
+   * @param value the property value
    * @param ctx a PropertyContext
    */
   public boolean visitReferenceProperty(String propertyName, AutoBean<?> value,
@@ -105,8 +117,8 @@
   /**
    * TODO: document.
    * 
-   * @param propertyName
-   * @param value
+   * @param propertyName the property name, as a String
+   * @param value the property value
    * @param ctx a PropertyContext
    */
   public boolean visitValueProperty(String propertyName, Object value,
diff --git a/user/src/com/google/gwt/editor/client/CompositeEditor.java b/user/src/com/google/gwt/editor/client/CompositeEditor.java
index 95d48a6..48d458d 100644
--- a/user/src/com/google/gwt/editor/client/CompositeEditor.java
+++ b/user/src/com/google/gwt/editor/client/CompositeEditor.java
@@ -84,13 +84,25 @@
   /**
    * Returns an canonical sub-editor instance that will be used by the driver
    * for computing all edited paths.
+   *
+   * @return an instance of the Editor type
    */
   E createEditorForTraversal();
 
   /**
-   * Used to implement {@link EditorDelegate#getPath()}.
+   * Used to implement {@link EditorDelegate#getPath()} for the component
+   * Editors.
+   * 
+   * @param subEditor an instance of the Editor type previously passed into
+   *          {@link EditorChain#attach}
+   * @return the path element as a String
    */
   String getPathElement(E subEditor);
 
+  /**
+   * Called by the Editor framework to provide the {@link EditorChain}.
+   *
+   * @param chain an {@link EditorChain} instance
+   */
   void setEditorChain(EditorChain<C, E> chain);
 }
diff --git a/user/src/com/google/gwt/editor/client/EditorDelegate.java b/user/src/com/google/gwt/editor/client/EditorDelegate.java
index b77dbde..87abeb3 100644
--- a/user/src/com/google/gwt/editor/client/EditorDelegate.java
+++ b/user/src/com/google/gwt/editor/client/EditorDelegate.java
@@ -29,6 +29,8 @@
 public interface EditorDelegate<T> {
   /**
    * Returns the Editor's path, relative to the root object.
+   *
+   * @return the path as a String
    */
   String getPath();
 
diff --git a/user/src/com/google/gwt/editor/client/EditorError.java b/user/src/com/google/gwt/editor/client/EditorError.java
index 1a9c0f3..6f62751 100644
--- a/user/src/com/google/gwt/editor/client/EditorError.java
+++ b/user/src/com/google/gwt/editor/client/EditorError.java
@@ -26,16 +26,22 @@
   /**
    * Returns the absolute path location of the error, relative to the object
    * that was passed into the EditorDriver.
+   * 
+   * @return the absolute path as a String
    */
   String getAbsolutePath();
 
   /**
    * Returns the Editor that holds the invalid value.
+   * 
+   * @return the Editor instance
    */
   Editor<?> getEditor();
 
   /**
    * Returns a message associated with the error.
+   * 
+   * @return the error message as a String
    */
   String getMessage();
 
@@ -43,28 +49,40 @@
    * Returns the path of the error relative to the Editor receiving the error.
    * If the error concerns the Editor that is receiving the error, this method
    * will return an empty string.
+   * 
+   * @return the error path as a String
    */
   String getPath();
 
   /**
    * Returns the object passed into {@link EditorDelegate#recordError}.
+   * 
+   * @return the user data Object
    */
   Object getUserData();
 
   /**
    * Returns the value that triggered the error.
+   * 
+   * @return the error value Object
    */
   Object getValue();
 
   /**
    * Indicates whether or not the EditorError will be propagated to the
    * enclosing Editor.
+   * 
+   * @return {@code true} if the error will not be propagated
+   * @see #setConsumed(boolean)
    */
   boolean isConsumed();
 
   /**
    * Indicates whether or not the EditorError will be propagated to the
    * enclosing Editor.
+   * 
+   * @param consumed {@code true} if the error will not be propagated
+   * @see #isConsumed()
    */
   void setConsumed(boolean consumed);
 }
diff --git a/user/src/com/google/gwt/editor/client/HasEditorDelegate.java b/user/src/com/google/gwt/editor/client/HasEditorDelegate.java
index 641bc81..9821cde 100644
--- a/user/src/com/google/gwt/editor/client/HasEditorDelegate.java
+++ b/user/src/com/google/gwt/editor/client/HasEditorDelegate.java
@@ -25,6 +25,8 @@
   /**
    * Called by the EditorDriver to provide access to the EditorDelegate the
    * Editor is peered with.
+   *
+   * @param delegate an {@link EditorDelegate} of type T
    */
   void setDelegate(EditorDelegate<T> delegate);
 
diff --git a/user/src/com/google/gwt/editor/client/IsEditor.java b/user/src/com/google/gwt/editor/client/IsEditor.java
index f787df2..fe5f282 100644
--- a/user/src/com/google/gwt/editor/client/IsEditor.java
+++ b/user/src/com/google/gwt/editor/client/IsEditor.java
@@ -50,6 +50,8 @@
 public interface IsEditor<E extends Editor<?>> {
   /**
    * Returns the Editor encapsulated by the view object.
+   * 
+   * @return an {@link Editor} of type E
    */
   E asEditor();
 }
diff --git a/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java b/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
index 6d08afd..7ea8245 100644
--- a/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
+++ b/user/src/com/google/gwt/editor/client/SimpleBeanEditorDriver.java
@@ -59,11 +59,15 @@
 
   /**
    * Returns any unconsumed EditorErrors from the last call to {@link #flush()}.
+   * 
+   * @return a List of {@link EditorError} instances
    */
   List<EditorError> getErrors();
 
   /**
    * Indicates if the last call to {@link #flush()} resulted in any errors.
+   * 
+   * @return {@code true} if errors are present
    */
   boolean hasErrors();
 
diff --git a/user/src/com/google/gwt/editor/client/ValueAwareEditor.java b/user/src/com/google/gwt/editor/client/ValueAwareEditor.java
index 84da806..4dc7019 100644
--- a/user/src/com/google/gwt/editor/client/ValueAwareEditor.java
+++ b/user/src/com/google/gwt/editor/client/ValueAwareEditor.java
@@ -32,6 +32,8 @@
   /**
    * Notifies the Editor that one or more value properties have changed. Not all
    * backing services support property-based notifications.
+   * 
+   * @param paths a list of String paths
    */
   void onPropertyChange(String... paths);
 
@@ -40,6 +42,8 @@
    * <p>
    * ValueAwareEditors should preferentially use sub-editors to alter the
    * properties of the object being edited.
+   * 
+   * @param value a value of type T
    */
   void setValue(T value);
 }
diff --git a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
index 27731fe..6a1d779 100644
--- a/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
+++ b/user/src/com/google/gwt/editor/client/adapters/EditorSource.java
@@ -32,6 +32,7 @@
    * Create a new Editor.
    * 
    * @param index the position at which the new Editor should be displayed
+   * @return an {@link Editor} of type E
    */
   public abstract E create(int index);
 
@@ -41,6 +42,7 @@
    * 
    * @param count the number of Editors desired
    * @param index the position at which the new Editors should be displayed
+   * @return a List of {@link Editor}s of type E
    */
   public List<E> create(int count, int index) {
     List<E> toReturn = new ArrayList<E>(count);
@@ -54,7 +56,7 @@
    * Called when an Editor no longer requires a sub-Editor. The default
    * implementation is a no-op.
    *
-   * @param subEditor
+   * @param subEditor an {@link Editor} of type E
    */
   public void dispose(E subEditor) {
   }
@@ -62,8 +64,8 @@
   /**
    * Re-order a sub-Editor. The default implementation is a no-op.
    *
-   * @param editor
-   * @param index
+   * @param editor an {@link Editor} of type E
+   * @param index the index of the Editor
    */
   public void setIndex(E editor, int index) {
   }
diff --git a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
index 988aaa2..5a6373e 100644
--- a/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/ListEditor.java
@@ -48,10 +48,20 @@
   private EditorSource<E> editorSource;
   private ListEditorWrapper<T, E> list;
 
+  /**
+   * Create a ListEditor backed by an EditorSource.
+   * 
+   * @param source the EditorSource which will create sub-Editors
+   */
   protected ListEditor(EditorSource<E> source) {
     this.editorSource = source;
   }
 
+  /**
+   * Creates a temporary sub-Editor to use for traversal.
+   * 
+   * @return an {@link Editor} of type E
+   */
   public E createEditorForTraversal() {
     E toReturn = editorSource.create(0);
     editorSource.dispose(toReturn);
@@ -65,6 +75,8 @@
   /**
    * Returns an unmodifiable, live view of the Editors managed by the
    * ListEditor.
+   * 
+   * @return a List of {@link Editor Editors} of type E
    */
   public List<E> getEditors() {
     if (list == null) {
@@ -85,6 +97,8 @@
    * listEditor.getList().set(1, new Foo());
    * listEditor.getEditors().get(1).getFooFieldEditor().setValue(....);
    * </pre>
+   * 
+   * @return a live view of the ListEditor's backing data
    */
   public List<T> getList() {
     return list;
@@ -104,6 +118,11 @@
     this.chain = chain;
   }
 
+  /**
+   * Sets the ListEditor's backing data.
+   * 
+   * @param value a List of data objects of type T
+   */
   public void setValue(List<T> value) {
     if (list != null) {
       // Having entire value reset, so dump the wrapper gracefully
diff --git a/user/src/com/google/gwt/editor/client/adapters/OptionalFieldEditor.java b/user/src/com/google/gwt/editor/client/adapters/OptionalFieldEditor.java
index 0373e16..6c7d7b2 100644
--- a/user/src/com/google/gwt/editor/client/adapters/OptionalFieldEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/OptionalFieldEditor.java
@@ -59,10 +59,22 @@
   private T currentValue;
   private final E subEditor;
 
+  /**
+   * Construct an OptionalFieldEditor backed by the given sub-Editor.
+   *
+   * @param subEditor the sub-Editor that will be attached to the Editor
+   *          hierarchy
+   */
   protected OptionalFieldEditor(E subEditor) {
     this.subEditor = subEditor;
   }
 
+  /**
+   * Returns the sub-Editor that the OptionalFieldEditor was constructed
+   * with.
+   *
+   * @return an {@link Editor} of type E
+   */
   public E createEditorForTraversal() {
     return subEditor;
   }
diff --git a/user/src/com/google/gwt/editor/client/adapters/SimpleEditor.java b/user/src/com/google/gwt/editor/client/adapters/SimpleEditor.java
index d48ee9a..d1e8833 100644
--- a/user/src/com/google/gwt/editor/client/adapters/SimpleEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/SimpleEditor.java
@@ -25,7 +25,9 @@
  */
 public class SimpleEditor<T> implements LeafValueEditor<T> {
   /**
-   * Returns a new ValueEditor that holds a <code>null</code> value.
+   * Returns a new ValueEditor that holds a {@code null} value.
+   *
+   * @return a SimpleEditor instance holding a {@code null} value
    */
   public static <T> SimpleEditor<T> of() {
     return new SimpleEditor<T>(null);
@@ -33,6 +35,9 @@
 
   /**
    * Returns a new ValueEditor that holds the given value.
+   *
+   * @param value a data object of type T
+   * @return a SimpleEditor instance holding the given value
    */
   public static <T> SimpleEditor<T> of(T value) {
     return new SimpleEditor<T>(value);
@@ -40,6 +45,11 @@
 
   private T value;
 
+  /**
+   * Constructs a new SimpleEditor that holds the given value.
+   *
+   * @param value a data object of type T
+   */
   protected SimpleEditor(T value) {
     this.value = value;
   }
diff --git a/user/src/com/google/gwt/editor/client/adapters/TakesValueEditor.java b/user/src/com/google/gwt/editor/client/adapters/TakesValueEditor.java
index 2472e85..6e45531 100644
--- a/user/src/com/google/gwt/editor/client/adapters/TakesValueEditor.java
+++ b/user/src/com/google/gwt/editor/client/adapters/TakesValueEditor.java
@@ -24,13 +24,25 @@
  * @param <T> the type of value to be edited
  */
 public class TakesValueEditor<T> implements LeafValueEditor<T> {
-
+  /**
+   * Returns a new ValueEditor that modifies the given {@link TakesValue} peer
+   * instance.
+   * 
+   * @param peer a {@link TakesValue} instance
+   * @return a TakesValueEditor instance of the same type as its peer
+   */
   public static <T> TakesValueEditor<T> of(TakesValue<T> peer) {
     return new TakesValueEditor<T>(peer);
   }
 
   private final TakesValue<T> peer;
 
+  /**
+   * Returns a new ValueEditor that modifies the given {@link TakesValue} peer
+   * instance.
+   * 
+   * @param peer a {@link TakesValue} instance
+   */
   protected TakesValueEditor(TakesValue<T> peer) {
     this.peer = peer;
   }
diff --git a/user/src/com/google/gwt/editor/client/adapters/package.html b/user/src/com/google/gwt/editor/client/adapters/package.html
new file mode 100644
index 0000000..01c6238
--- /dev/null
+++ b/user/src/com/google/gwt/editor/client/adapters/package.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<p>Adapters for the bean editor framework.</p>
+
+@since GWT 2.1
+</body>
+</html>
diff --git a/user/src/com/google/gwt/editor/client/package.html b/user/src/com/google/gwt/editor/client/package.html
new file mode 100644
index 0000000..8966953
--- /dev/null
+++ b/user/src/com/google/gwt/editor/client/package.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<p>A framework for editing bean-like objects.</p>
+
+@since GWT 2.1
+</body>
+</html>
diff --git a/user/src/com/google/gwt/editor/ui/client/ValueBoxEditorDecorator.java b/user/src/com/google/gwt/editor/ui/client/ValueBoxEditorDecorator.java
index eb8551e..226d912 100644
--- a/user/src/com/google/gwt/editor/ui/client/ValueBoxEditorDecorator.java
+++ b/user/src/com/google/gwt/editor/ui/client/ValueBoxEditorDecorator.java
@@ -44,7 +44,7 @@
  * For example:
  * <pre>
  * &#64;UiField
- * ValueBoxEditorDecorator<String> name;
+ * ValueBoxEditorDecorator&lt;String&gt; name;
  * </pre>
  * <pre>
  * &lt;e:ValueBoxEditorDecorator ui:field='name'>
@@ -70,11 +70,21 @@
 
   private ValueBoxEditor<T> editor;
 
+  /**
+   * Constructs a ValueBoxEditorDecorator.
+   */
   @UiConstructor
   public ValueBoxEditorDecorator() {
     initWidget(Binder.BINDER.createAndBindUi(this));
   }
 
+  /**
+   * Constructs a ValueBoxEditorDecorator using a {@link ValueBoxBase}
+   * widget and a {@link ValueBoxEditor} editor.
+   * 
+   * @param widget the widget
+   * @param editor the editor
+   */
   public ValueBoxEditorDecorator(ValueBoxBase<T> widget,
       ValueBoxEditor<T> editor) {
     this();
@@ -82,10 +92,22 @@
     this.editor = editor;
   }
 
+  /**
+   * Returns the associated {@link ValueBoxEditor}.
+   * 
+   * @return a {@link ValueBoxEditor} instance
+   * @see #setEditor(ValueBoxEditor)
+   */
   public ValueBoxEditor<T> asEditor() {
     return editor;
   }
 
+  /**
+   * Sets the associated {@link ValueBoxEditor}.
+   * 
+   * @param editor a {@link ValueBoxEditor} instance
+   * @see #asEditor()
+   */
   public void setEditor(ValueBoxEditor<T> editor) {
     this.editor = editor;
   }
@@ -93,6 +115,8 @@
   /**
    * Set the widget that the EditorPanel will display. This method will
    * automatically call {@link #setEditor}.
+   * 
+   * @param widget a {@link ValueBoxBase} widget
    */
   @UiChild(limit = 1, tagname = "valuebox")
   public void setValueBox(ValueBoxBase<T> widget) {
@@ -104,6 +128,8 @@
    * The default implementation will display, but not consume, received errors
    * whose {@link EditorError#getEditor() getEditor()} method returns the Editor
    * passed into {@link #setEditor}.
+   * 
+   * @param errors a List of {@link EditorError} instances
    */
   public void showErrors(List<EditorError> errors) {
     StringBuilder sb = new StringBuilder();
diff --git a/user/src/com/google/gwt/editor/ui/client/adapters/HasTextEditor.java b/user/src/com/google/gwt/editor/ui/client/adapters/HasTextEditor.java
index 00f3fe4..a34d724 100644
--- a/user/src/com/google/gwt/editor/ui/client/adapters/HasTextEditor.java
+++ b/user/src/com/google/gwt/editor/ui/client/adapters/HasTextEditor.java
@@ -22,12 +22,25 @@
  * Adapts the HasText interface to the Editor framework.
  */
 public class HasTextEditor implements LeafValueEditor<String> {
+  /**
+   * Returns a new ValueEditor that that modifies the given {@link HasText} peer
+   * instance.
+   * 
+   * @param peer a {@link HasText} instance
+   * @return a HasTextEditor instance
+   */
   public static HasTextEditor of(HasText peer) {
     return new HasTextEditor(peer);
   }
 
   private HasText peer;
 
+  /**
+   * Constructs a new HasTextEditor that that modifies the given {@link HasText}
+   * peer instance.
+   * 
+   * @param peer a {@link HasText} instance
+   */
   protected HasTextEditor(HasText peer) {
     this.peer = peer;
   }
diff --git a/user/src/com/google/gwt/editor/ui/client/adapters/ValueBoxEditor.java b/user/src/com/google/gwt/editor/ui/client/adapters/ValueBoxEditor.java
index 9dc6956..ad18aea 100644
--- a/user/src/com/google/gwt/editor/ui/client/adapters/ValueBoxEditor.java
+++ b/user/src/com/google/gwt/editor/ui/client/adapters/ValueBoxEditor.java
@@ -32,6 +32,14 @@
 public class ValueBoxEditor<T> extends TakesValueEditor<T> implements
     HasEditorDelegate<T> {
 
+  /**
+   * Returns a new TakesValueEditor that adapts a {@link ValueBoxBase}
+   * instance.
+   *
+   * @param valueBox a {@link ValueBoxBase} instance to adapt
+   * @return a ValueBoxEditor instance of the same type as the
+   *   adapted {@link ValueBoxBase} instance
+   */
   public static <T> ValueBoxEditor<T> of(ValueBoxBase<T> valueBox) {
     return new ValueBoxEditor<T>(valueBox);
   }
@@ -40,11 +48,23 @@
   private final ValueBoxBase<T> peer;
   private T value;
 
+  /**
+   * Constructs a new ValueBoxEditor that adapts a {@link ValueBoxBase} peer
+   * instance.
+   *
+   * @param peer a {@link ValueBoxBase} instance of type T
+   */
   protected ValueBoxEditor(ValueBoxBase<T> peer) {
     super(peer);
     this.peer = peer;
   }
 
+  /**
+   * Returns the {@link EditorDelegate} for this instance.
+   *
+   * @return an {@link EditorDelegate}, or {@code null}
+   * @see #setDelegate(EditorDelegate)
+   */
   public EditorDelegate<T> getDelegate() {
     return delegate;
   }
@@ -54,6 +74,9 @@
    * is thrown, it will be available through
    * {@link com.google.gwt.editor.client.EditorError#getUserData()
    * EditorError.getUserData()}.
+   *
+   * @return a value of type T
+   * @see #setValue(Object)
    */
   @Override
   public T getValue() {
@@ -67,6 +90,13 @@
     return value;
   }
 
+  /**
+   * Sets the {@link EditorDelegate} for this instance. This method is only
+   * called by the driver.
+   * 
+   * @param delegate an {@link EditorDelegate}, or {@code null}
+   * @see #getDelegate()
+   */
   public void setDelegate(EditorDelegate<T> delegate) {
     this.delegate = delegate;
   }
diff --git a/user/src/com/google/gwt/editor/ui/client/adapters/package.html b/user/src/com/google/gwt/editor/ui/client/adapters/package.html
new file mode 100644
index 0000000..24bafb4
--- /dev/null
+++ b/user/src/com/google/gwt/editor/ui/client/adapters/package.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<p>User interface adapters for the bean editor framework.</p>
+
+@since GWT 2.1
+</body>
+</html>
diff --git a/user/src/com/google/gwt/editor/ui/client/package.html b/user/src/com/google/gwt/editor/ui/client/package.html
new file mode 100644
index 0000000..4c7efad
--- /dev/null
+++ b/user/src/com/google/gwt/editor/ui/client/package.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<p>User interface components for the bean editor framework.</p>
+
+@since GWT 2.1
+</body>
+</html>
diff --git a/user/src/com/google/gwt/requestfactory/client/DefaultRequestTransport.java b/user/src/com/google/gwt/requestfactory/client/DefaultRequestTransport.java
index 93fac74..0fd2571 100644
--- a/user/src/com/google/gwt/requestfactory/client/DefaultRequestTransport.java
+++ b/user/src/com/google/gwt/requestfactory/client/DefaultRequestTransport.java
@@ -25,9 +25,9 @@
 import com.google.gwt.http.client.RequestException;
 import com.google.gwt.http.client.Response;
 import com.google.gwt.requestfactory.shared.RequestEvent;
+import com.google.gwt.requestfactory.shared.RequestEvent.State;
 import com.google.gwt.requestfactory.shared.RequestFactory;
 import com.google.gwt.requestfactory.shared.RequestTransport;
-import com.google.gwt.requestfactory.shared.RequestEvent.State;
 import com.google.gwt.user.client.Window.Location;
 
 import java.util.logging.Level;
@@ -36,6 +36,18 @@
 /**
  * An implementation of {@link RequestTransport} that uses a
  * {@link RequestBuilder}.
+ * <p>
+ * This implementation will send {@link RequestEvent} objects to the
+ * {@link EventBus} passed into the constructor to provide indication of
+ * transport-level activity. When an HTTP request is sent, an event with a
+ * {@link State#SENT} state and a {@code null} {@link Request} will be posted.
+ * When an HTTP transport completes successfully, an event will be posted with
+ * state {@link State#RECEIVED} and the {@link Request} object provided to the
+ * internal {@link RequestCallback#onResponseReceived()}. If an HTTP transport
+ * fails (e.g. due to network malfunction), an event with state
+ * {@link State#RECEIVED} and a {@code null} {@link Request} will be sent. The
+ * success or failure of the HTTP transport is wholly independent from whether
+ * or not the application payload was successfully executed by the server.
  */
 public class DefaultRequestTransport implements RequestTransport {
 
diff --git a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
index 1b44616..dc88565 100644
--- a/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
+++ b/user/src/com/google/gwt/requestfactory/shared/RequestFactory.java
@@ -19,6 +19,33 @@
 
 /**
  * Marker interface for the RequestFactory code generator.
+ * <p>
+ * A RequestFactory implementation will post {@link EntityProxyChange} events to
+ * the {@link EventBus} passed into the {@link #initialize} method. The events
+ * will have the following {@link WriteOperation} associated with them in the
+ * following circumstances:
+ * <ul>
+ * <li>{@link WriteOperation#PERSIST} when an {@link EntityProxy}
+ * {@link RequestContext#create(Class) created} on the client is successfully
+ * persisted in the server's backing store.</li>
+ * <li>{@link WriteOperation#UPDATE} when changes due to an {@link EntityProxy}
+ * being {@link RequestContext#edit(EntityProxy) edited} on the client are
+ * successfully persisted in the server's backing store.</li>
+ * <li>{@link WriteOperation#UPDATE} when a previously-unseen
+ * {@link EntityProxy} is reachable from the return value for a
+ * successfully-executed {@link Request}.</li>
+ * <li>{@link WriteOperation#UPDATE} when any property of an {@link EntityProxy}
+ * reachable from a {@link Request Request's} arguments is seen to have changed
+ * after executing the service method on the server.</li>
+ * <li>{@link WriteOperation#DELETE} when an {@link EntityProxy} reachable from
+ * a {@link Request Request's} arguments becomes irretrievable after executing
+ * the service method on the server.</li>
+ * </ul>
+ * <p>
+ * Other types of events may be posted to the {@link EventBus} by other services
+ * used by the RequestFactory.
+ * 
+ * @see {@link com.google.gwt.requestfactory.client.DefaultRequestTransport}
  */
 public interface RequestFactory {
   String JSON_CONTENT_TYPE_UTF8 = "application/json; charset=utf-8";
diff --git a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
index 7ab531e..8dcd61d 100644
--- a/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
+++ b/user/src/com/google/gwt/user/cellview/client/CellBrowser.java
@@ -968,7 +968,7 @@
 
   /**
    * Set the open state of a tree node.
-   *
+   * 
    * @param cellList the CellList that changed state.
    * @param value the value to open
    * @param open true to open, false to close
@@ -1029,12 +1029,9 @@
       }
 
       // Close the node.
-      TreeNode closedNode = cellList.isFocusedOpen
+      TreeNode closedNode = (cellList.isFocusedOpen && (treeNodes.size() > cellList.level + 1))
           ? treeNodes.get(cellList.level + 1) : null;
       trimToLevel(cellList.level);
-      cellList.focusedKey = null;
-      cellList.focusedValue = null;
-      cellList.isFocusedOpen = false;
 
       // Refresh the display to update the styles for this node.
       if (redraw) {
@@ -1065,5 +1062,13 @@
       removed.destroy();
       curLevel--;
     }
+
+    // Nullify the focused key at the level.
+    if (level < treeNodes.size()) {
+      TreeNodeImpl<?> node = treeNodes.get(level);
+      node.display.focusedKey = null;
+      node.display.focusedValue = null;
+      node.display.isFocusedOpen = false;
+    }
   }
 }
diff --git a/user/src/com/google/gwt/user/client/TakesValue.java b/user/src/com/google/gwt/user/client/TakesValue.java
index 11fd99e..1e15f8e 100644
--- a/user/src/com/google/gwt/user/client/TakesValue.java
+++ b/user/src/com/google/gwt/user/client/TakesValue.java
@@ -23,11 +23,17 @@
 public interface TakesValue<V> {
   /**
    * Sets the value.
+   *
+   * @param value a value object of type V
+   * @see #getValue()
    */
   void setValue(V value);
 
   /**
    * Returns the current value.
+   * 
+   * @return the value as an object of type V
+   * @see #setValue
    */
   V getValue();
 }
diff --git a/user/src/com/google/gwt/user/client/ui/Tree.java b/user/src/com/google/gwt/user/client/ui/Tree.java
index d5cc644..b468940 100644
--- a/user/src/com/google/gwt/user/client/ui/Tree.java
+++ b/user/src/com/google/gwt/user/client/ui/Tree.java
@@ -55,6 +55,7 @@
 import com.google.gwt.i18n.client.LocaleInfo;
 import com.google.gwt.resources.client.ClientBundle;
 import com.google.gwt.resources.client.ImageResource;
+import com.google.gwt.safehtml.shared.SafeHtml;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 import com.google.gwt.user.client.Event;
@@ -331,6 +332,16 @@
   }
 
   /**
+   * Adds a simple tree item containing the specified html.
+   * 
+   * @param itemHtml the html of the item to be added
+   * @return the item that was added
+   */
+  public TreeItem addItem(SafeHtml itemHtml) {
+    return root.addItem(itemHtml);
+  }
+
+  /**
    * Adds an item to the root level of this tree.
    * 
    * @param item the item to be added
@@ -494,6 +505,19 @@
   }
 
   /**
+   * Inserts a child tree item at the specified index containing the specified
+   * html.
+   * 
+   * @param beforeIndex the index where the item will be inserted
+   * @param itemHtml the html of the item to be added
+   * @return the item that was added
+   * @throws IndexOutOfBoundsException if the index is out of range
+   */
+  public TreeItem insertItem(int beforeIndex, SafeHtml itemHtml) {
+    return root.insertItem(beforeIndex, itemHtml);
+  }
+
+  /**
    * Inserts an item into the root level of this tree.
    * 
    * @param beforeIndex the index where the item will be inserted
diff --git a/user/src/com/google/gwt/user/client/ui/TreeItem.java b/user/src/com/google/gwt/user/client/ui/TreeItem.java
index 6aed8a5..1244015 100644
--- a/user/src/com/google/gwt/user/client/ui/TreeItem.java
+++ b/user/src/com/google/gwt/user/client/ui/TreeItem.java
@@ -338,6 +338,18 @@
   }
 
   /**
+   * Adds a child tree item containing the specified html.
+   * 
+   * @param itemHtml the item's HTML
+   * @return the item that was added
+   */
+  public TreeItem addItem(SafeHtml itemHtml) {
+    TreeItem ret = new TreeItem(itemHtml);
+    addItem(ret);
+    return ret;
+  }
+
+  /**
    * Adds another item as a child to this one.
    * 
    * @param item the item to be added
@@ -473,6 +485,22 @@
   }
 
   /**
+   * Inserts a child tree item at the specified index containing the specified
+   * text.
+   * 
+   * @param beforeIndex the index where the item will be inserted
+   * @param itemHtml the item's HTML
+   * @return the item that was added
+   * @throws IndexOutOfBoundsException if the index is out of range
+   */
+  public TreeItem insertItem(int beforeIndex, SafeHtml itemHtml)
+      throws IndexOutOfBoundsException {
+    TreeItem ret = new TreeItem(itemHtml);
+    insertItem(beforeIndex, ret);
+    return ret;
+  }
+
+  /**
    * Inserts an item as a child to this one.
    * 
    * @param beforeIndex the index where the item will be inserted
diff --git a/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java b/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
index 1f57b59..18bc2cc 100644
--- a/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
+++ b/user/test/com/google/gwt/user/cellview/client/AbstractCellTreeTestBase.java
@@ -387,6 +387,9 @@
 
     // Verify the node is destroyed.
     assertTrue(b.isDestroyed());
+
+    // True to open a new node.
+    assertNotNull(root.setChildOpen(0, true));
   }
 
   /**
diff --git a/user/test/com/google/gwt/user/client/ui/TreeItemTest.java b/user/test/com/google/gwt/user/client/ui/TreeItemTest.java
index df4ebf3..da6a325 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeItemTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeItemTest.java
@@ -47,6 +47,12 @@
     assertEquals(a, item.getChild(1));
   }
 
+  public void testAddItemSafeHtml() {
+    TreeItem item = new TreeItem("foo");
+    TreeItem child = item.addItem(SafeHtmlUtils.fromSafeConstant(html));
+    assertEquals(html, child.getHTML().toLowerCase());
+  }
+
   public void testInsert() {
     TreeItem item = new TreeItem();
     TreeItem b = item.addItem("b");
@@ -124,6 +130,12 @@
     }
   }
 
+  public void testInsertItemSafeHtml() {
+    TreeItem item = new TreeItem("foo");
+    TreeItem child = item.insertItem(0, SafeHtmlUtils.fromSafeConstant(html));
+    assertEquals(html, child.getHTML().toLowerCase());
+  }
+
   public void testSafeHtmlConstructor() {
     TreeItem item = new TreeItem(SafeHtmlUtils.fromSafeConstant(html));
     
diff --git a/user/test/com/google/gwt/user/client/ui/TreeTest.java b/user/test/com/google/gwt/user/client/ui/TreeTest.java
index 0e04aa0..e283fb8 100644
--- a/user/test/com/google/gwt/user/client/ui/TreeTest.java
+++ b/user/test/com/google/gwt/user/client/ui/TreeTest.java
@@ -16,6 +16,7 @@
 package com.google.gwt.user.client.ui;
 
 import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.safehtml.shared.SafeHtmlUtils;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Element;
 
@@ -26,6 +27,8 @@
  */
 public class TreeTest extends GWTTestCase {
 
+  private static final String html = "<b>hello</b><i>world</i>";
+
   static class Adder implements HasWidgetsTester.WidgetAdder {
     public void addChild(HasWidgets container, Widget child) {
       ((Tree) container).addItem(child);
@@ -37,6 +40,12 @@
     return "com.google.gwt.user.DebugTest";
   }
 
+  public void testAddItemSafeHtml() {
+    Tree t = new Tree();
+    TreeItem item = t.addItem(SafeHtmlUtils.fromSafeConstant(html));
+    assertEquals(html, item.getHTML().toLowerCase());
+  }
+
   public void testAttachDetachOrder() {
     HasWidgetsTester.testAll(new Tree(), new Adder(), true);
   }
@@ -111,6 +120,12 @@
     assertEquals(wti, t.getItem(1));
   }
 
+  public void testInsertItemSafeHtml() {
+    Tree t = new Tree();
+    TreeItem item = t.insertItem(0, SafeHtmlUtils.fromSafeConstant(html));
+    assertEquals(html, item.getHTML().toLowerCase());
+  }
+
   public void testIterator() {
     Tree tree = new Tree();
     Iterator<TreeItem> iter = tree.treeItemIterator();
