diff --git a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java
index 132d0f8..e9cab6e 100644
--- a/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java
+++ b/reference/code-museum/src/com/google/gwt/museum/client/defaultmuseum/VisualsForDateBox.java
@@ -24,6 +24,7 @@
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
 import com.google.gwt.i18n.client.DateTimeFormat;
 import com.google.gwt.museum.client.common.AbstractIssue;
+import com.google.gwt.museum.client.common.EventReporter;
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.HTML;
 import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -176,6 +177,12 @@
             + "\" End: \"" + (d2 == null ? "null" : f.format(d2)) + "\"");
       }
     }));
+
+    EventReporter<Date, DateBox> reporter = new EventReporter<Date, DateBox>();
+    start.addValueChangeHandler(reporter);
+    end.addValueChangeHandler(reporter);
+    reporter.report("Events are logged here");
+    v.add(reporter);
     return v;
   }
 
diff --git a/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java b/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
index e5d8368..4b5513e 100644
--- a/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
+++ b/user/src/com/google/gwt/event/logical/shared/ValueChangeEvent.java
@@ -117,6 +117,11 @@
   public I getValue() {
     return value;
   }
+ 
+  @Override
+  public String toDebugString() {
+    return super.toDebugString() + getValue();
+  }
 
   @Override
   protected void dispatch(ValueChangeHandler<I> handler) {
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 1332561..334a7a0 100644
--- a/user/src/com/google/gwt/user/datepicker/client/DateBox.java
+++ b/user/src/com/google/gwt/user/datepicker/client/DateBox.java
@@ -223,7 +223,7 @@
     }
 
     public void onValueChange(ValueChangeEvent<Date> event) {
-      setValue(event.getValue());
+      setValue(parseDate(false), event.getValue(),true);
       hideDatePicker();
       preventDatePickerPopup();
       box.setFocus(true);
@@ -432,16 +432,7 @@
   }
 
   public void setValue(Date date, boolean fireEvents) {
-    Date oldDate = parseDate(false);
-    if (date != null) {
-      picker.setCurrentMonth(date);
-    }
-    picker.setValue(date, false);
-    setDate(date);
-
-    if (fireEvents) {
-      DateChangeEvent.fireIfNotEqualDates(this, oldDate, date);
-    }
+    setValue(picker.getValue(), date, fireEvents);
   }
 
   /**
@@ -473,19 +464,23 @@
     });
   }
 
-  /**
-   * Does the actual work of setting the date. Performs no validation, fires no
-   * events.
-   */
-  private void setDate(Date value) {
+  private void setValue(Date oldDate, Date date, boolean fireEvents) {
+    if (date != null) {
+      picker.setCurrentMonth(date);
+    }
+    picker.setValue(date, false);
     format.reset(this, false);
-    box.setText(getFormat().format(this, value));
+    box.setText(getFormat().format(this, date));
+
+    if (fireEvents) {
+      DateChangeEvent.fireIfNotEqualDates(this, oldDate, date);
+    }
   }
 
   private void updateDateFromTextBox() {
     Date parsedDate = parseDate(true);
     if (parsedDate != null) {
-      setValue(parsedDate);
+      setValue(picker.getValue(), parsedDate,true);
     }
   }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
index f8ee4a7..624b0b9 100644
--- a/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
+++ b/user/test/com/google/gwt/user/client/ui/DateBoxTest.java
@@ -15,13 +15,14 @@
  */
 package com.google.gwt.user.client.ui;
 
-import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.dom.client.Document;
+import com.google.gwt.dom.client.NativeEvent;
 import com.google.gwt.user.datepicker.client.DateBox;
 
 /**
- * Tests DateBox.
+ * Tests {@link DateBox}.
  */
-public class DateBoxTest extends GWTTestCase {
+public class DateBoxTest extends WidgetTestBase {
   @Override
   public String getModuleName() {
     return "com.google.gwt.user.User";
@@ -37,8 +38,32 @@
   }
 
   public void testValueChangeEvent() {
+
+    // Checks setValue(date, true);
     DateBox db = new DateBox();
     RootPanel.get().add(db);
     new DateValueChangeTester(db).run();
+
+    // Check setting the text directly in the text box.
+    final DateBox db2 = new DateBox();
+    RootPanel.get().add(db2);
+    new DateValueChangeTester(db2) {
+      @Override
+      protected void fire(java.util.Date d) {
+        db2.getTextBox().setText(d.toString());
+        NativeEvent e = Document.get().createBlurEvent();
+        db2.getTextBox().getElement().dispatchEvent(e);
+      };
+    }.run();
+
+    // Checks that setting the date picker's date works correctly.
+    final DateBox db3 = new DateBox();
+    RootPanel.get().add(db3);
+    new DateValueChangeTester(db3) {
+      @Override
+      protected void fire(java.util.Date d) {
+        db3.getDatePicker().setValue(d, true);
+      };
+    }.run();
   }
 }
diff --git a/user/test/com/google/gwt/user/client/ui/DateValueChangeTester.java b/user/test/com/google/gwt/user/client/ui/DateValueChangeTester.java
index 0e9636f..5a42bac 100644
--- a/user/test/com/google/gwt/user/client/ui/DateValueChangeTester.java
+++ b/user/test/com/google/gwt/user/client/ui/DateValueChangeTester.java
@@ -23,7 +23,8 @@
 import java.util.Date;
 
 /**
- * Handy tool for testing classes that implement {@link HasValue<Date>}.
+ * Handy tool for testing classes that implement {@link HasValue} of
+ * {@link Date}.
  */
 public class DateValueChangeTester {
   static class Handler implements ValueChangeHandler<Date> {
@@ -34,7 +35,7 @@
     }
   }
 
-  private final HasValue<Date> subject;
+  protected final HasValue<Date> subject;
 
   /**
    * The HasValue<Date> to be tested. It should have been freshly created before
@@ -51,6 +52,8 @@
    */
   @SuppressWarnings("deprecation")
   public void run() {
+
+    // Negative test cases.
     TestCase.assertNull(subject.getValue());
 
     DateValueChangeTester.Handler h = new Handler();
@@ -72,16 +75,17 @@
     subject.setValue(baker);
     TestCase.assertNull(h.received);
 
+    // Positive test cases.
+
     // Value has not changed, so should not fire a change event even though
     // fire event is true.
-    subject.setValue(baker, true);
+    fire(baker);
     TestCase.assertNull(h.received);
-
-    subject.setValue(able, true);
+    fire(able);
     TestCase.assertEquals(able, h.received);
     TestCase.assertNotSame(able, h.received);
 
-    subject.setValue(baker, true);
+    fire(baker);
     TestCase.assertEquals(baker, h.received);
     TestCase.assertNotSame(baker, h.received);
     
@@ -90,4 +94,9 @@
     subject.setValue(baker, false);
     TestCase.assertNull(h.received);
   }
-}
\ No newline at end of file
+
+  protected void fire(Date d) {
+    subject.setValue(d, true);
+  }
+
+}
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetTestBase.java b/user/test/com/google/gwt/user/client/ui/WidgetTestBase.java
new file mode 100644
index 0000000..6204ef4
--- /dev/null
+++ b/user/test/com/google/gwt/user/client/ui/WidgetTestBase.java
@@ -0,0 +1,40 @@
+/*
+ * 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
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.user.client.ui;
+
+import com.google.gwt.junit.client.GWTTestCase;
+
+/**
+ * Convenience class to use user module and a default tear down code for widget
+ * tests.
+ */
+public class WidgetTestBase extends GWTTestCase {
+  @Override
+  public String getModuleName() {
+    return "com.google.gwt.user.User";
+  }
+
+  /**
+   * A replacement for JUnit's {@link #tearDown()} method. This method runs once
+   * per test method in your subclass, just after your each test method runs and
+   * can be used to perform cleanup. Override this method instead of
+   * {@link #tearDown()}.
+   */
+  @Override
+  protected void gwtTearDown() throws Exception {
+    RootPanel.get().clear();
+  }
+}
