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 d0e1bc9..3b17927 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
@@ -18,6 +18,8 @@
 import com.google.gwt.core.client.EntryPoint;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.GWT.UncaughtExceptionHandler;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.sample.dynatablerf.client.widgets.DayFilterWidget;
 import com.google.gwt.sample.dynatablerf.client.widgets.FavoritesWidget;
 import com.google.gwt.sample.dynatablerf.client.widgets.SummaryWidget;
@@ -26,8 +28,6 @@
 import com.google.gwt.uibinder.client.UiField;
 import com.google.gwt.user.client.ui.RootLayoutPanel;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryLogHandler;
 import com.google.web.bindery.requestfactory.shared.LoggingRequest;
 
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 ae5879f..de4417e 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
@@ -15,15 +15,15 @@
  */
 package com.google.gwt.sample.dynatablerf.client;
 
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.sample.dynatablerf.client.events.MarkFavoriteEvent;
 import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.user.client.Cookies;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.Window.ClosingEvent;
 import com.google.gwt.user.client.Window.ClosingHandler;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
 
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 3cc27ed..6b9073e 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
@@ -21,6 +21,7 @@
 import com.google.gwt.event.dom.client.KeyUpEvent;
 import com.google.gwt.event.dom.client.KeyUpHandler;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
+import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.sample.dynatablerf.client.events.EditPersonEvent;
 import com.google.gwt.sample.dynatablerf.client.widgets.MentorSelector;
 import com.google.gwt.sample.dynatablerf.client.widgets.PersonEditor;
@@ -35,7 +36,6 @@
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.DialogBox;
 import com.google.gwt.user.client.ui.HTMLPanel;
-import com.google.web.bindery.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;
 import com.google.web.bindery.requestfactory.shared.Receiver;
 import com.google.web.bindery.requestfactory.shared.Request;
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/EditPersonEvent.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/EditPersonEvent.java
index 72e4eba..cf11e14 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/EditPersonEvent.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/EditPersonEvent.java
@@ -15,8 +15,9 @@
  */
 package com.google.gwt.sample.dynatablerf.client.events;
 
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
-import com.google.web.bindery.event.shared.Event;
 import com.google.web.bindery.requestfactory.shared.RequestContext;
 
 /**
@@ -24,13 +25,13 @@
  * 
  * TODO: Make this an Activity.
  */
-public class EditPersonEvent extends Event<EditPersonEvent.Handler> {
-  public static final Event.Type<Handler> TYPE = new Event.Type<Handler>();
+public class EditPersonEvent extends GwtEvent<EditPersonEvent.Handler> {
+  public static final Type<Handler> TYPE = new Type<Handler>();
 
   /**
    * Handles {@link EditPersonEvent}.
    */
-  public interface Handler {
+  public interface Handler extends EventHandler {
     void startEdit(PersonProxy person, RequestContext requestContext);
   }
 
@@ -52,7 +53,7 @@
   }
 
   @Override
-  public Event.Type<Handler> getAssociatedType() {
+  public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
     return TYPE;
   }
 }
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/FilterChangeEvent.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/FilterChangeEvent.java
index d4ed5e1..5cb4864 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/FilterChangeEvent.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/events/FilterChangeEvent.java
@@ -15,22 +15,23 @@
  */
 package com.google.gwt.sample.dynatablerf.client.events;
 
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.event.shared.HandlerRegistration;
 
 /**
  * An event to indicate a change in the filter options.
  */
-public class FilterChangeEvent extends Event<FilterChangeEvent.Handler> {
+public class FilterChangeEvent extends GwtEvent<FilterChangeEvent.Handler> {
   /**
    * Handles {@link FilterChangeEvent}.
    */
-  public interface Handler {
+  public interface Handler extends EventHandler {
     void onFilterChanged(FilterChangeEvent e);
   }
 
-  public static final Event.Type<Handler> TYPE = new Event.Type<Handler>();
+  public static final Type<Handler> TYPE = new Type<Handler>();
 
   public static HandlerRegistration register(EventBus eventBus, Handler handler) {
     return eventBus.addHandler(TYPE, handler);
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 70e643c..c0e442d 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
@@ -15,22 +15,23 @@
  */
 package com.google.gwt.sample.dynatablerf.client.events;
 
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
-import com.google.web.bindery.event.shared.Event;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 
 /**
  * Used client-side to add entries to the favorites list.
  */
-public class MarkFavoriteEvent extends Event<MarkFavoriteEvent.Handler> {
+public class MarkFavoriteEvent extends GwtEvent<MarkFavoriteEvent.Handler> {
   /**
    * Handles {@link MarkFavoriteEvent}.
    */
-  public interface Handler {
+  public interface Handler extends EventHandler {
     void onMarkFavorite(MarkFavoriteEvent event);
   }
 
-  public static final Event.Type<Handler> TYPE = new Event.Type<Handler>();
+  public static final Type<Handler> TYPE = new Type<Handler>();
 
   private final EntityProxyId<PersonProxy> id;
   private final boolean isFavorite;
@@ -41,7 +42,7 @@
   }
 
   @Override
-  public Event.Type<Handler> getAssociatedType() {
+  public Type<Handler> getAssociatedType() {
     return TYPE;
   }
 
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayCheckBox.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayCheckBox.java
index 590215b..79a1fc4 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayCheckBox.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayCheckBox.java
@@ -17,11 +17,11 @@
 
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.sample.dynatablerf.client.events.FilterChangeEvent;
 import com.google.gwt.user.client.ui.CheckBox;
 import com.google.gwt.user.client.ui.Composite;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
 
 /**
  * Used by DayFilterWidget.
diff --git a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.java b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.java
index f0f5942..de62579 100644
--- a/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.java
+++ b/samples/dynatablerf/src/com/google/gwt/sample/dynatablerf/client/widgets/DayFilterWidget.java
@@ -17,6 +17,7 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.dom.client.ClickEvent;
+import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.sample.dynatablerf.client.events.FilterChangeEvent;
 import com.google.gwt.uibinder.client.UiBinder;
 import com.google.gwt.uibinder.client.UiConstructor;
@@ -26,7 +27,6 @@
 import com.google.gwt.user.client.ui.Button;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.web.bindery.event.shared.EventBus;
 
 /**
  * A UI Widget that allows a user to filter the days being displayed in the
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 c7df7b1..f442235 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
@@ -18,6 +18,8 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.editor.client.adapters.EditorSource;
 import com.google.gwt.editor.client.adapters.ListEditor;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.resources.client.CssResource;
 import com.google.gwt.sample.dynatablerf.client.FavoritesManager;
 import com.google.gwt.sample.dynatablerf.client.events.MarkFavoriteEvent;
@@ -27,8 +29,6 @@
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.FlowPanel;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 import com.google.web.bindery.requestfactory.shared.Receiver;
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 852f3ca..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
@@ -19,12 +19,12 @@
 import com.google.gwt.editor.client.ValueAwareEditor;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.sample.dynatablerf.client.events.EditPersonEvent;
 import com.google.gwt.sample.dynatablerf.shared.PersonProxy;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.Label;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
 
 /**
  * This NameLabel uses the EditorDelegate to receive notifications on updates to
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 e2524fc..889594c 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
@@ -22,6 +22,7 @@
 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.resources.client.CssResource;
 import com.google.gwt.sample.dynatablerf.client.events.EditPersonEvent;
 import com.google.gwt.sample.dynatablerf.client.events.FilterChangeEvent;
@@ -45,7 +46,6 @@
 import com.google.gwt.view.client.RangeChangeEvent;
 import com.google.gwt.view.client.SelectionChangeEvent;
 import com.google.gwt.view.client.SingleSelectionModel;
-import com.google.web.bindery.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 import com.google.web.bindery.requestfactory.shared.Receiver;
@@ -255,7 +255,7 @@
   }
 
   private int offsetOf(EntityProxyId<PersonProxy> personId) {
-    List<PersonProxy> displayedItems = table.getVisibleItems();
+    List<PersonProxy> displayedItems = table.getDisplayedItems();
     for (int offset = 0, j = displayedItems.size(); offset < j; offset++) {
       if (personId.equals(displayedItems.get(offset).stableId())) {
         return offset;
diff --git a/tools/api-checker/config/gwt22_23userApi.conf b/tools/api-checker/config/gwt22_23userApi.conf
index d97d277..2501873 100644
--- a/tools/api-checker/config/gwt22_23userApi.conf
+++ b/tools/api-checker/config/gwt22_23userApi.conf
@@ -123,32 +123,6 @@
 # Overloaded SimplePanel constructor to accept a Widget.
 com.google.gwt.user.client.ui.SimplePanel::SimplePanel(Lcom/google/gwt/dom/client/Element;) OVERLOADED_METHOD_CALL
 
-# Overloads for legacy compatibility after introduction of com.google.web.bindery
-#
-
-com.google.gwt.event.shared.EventBus::addHandler(Lcom/google/gwt/event/shared/GwtEvent$Type;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-com.google.gwt.event.shared.EventBus::addHandlerToSource(Lcom/google/gwt/event/shared/GwtEvent$Type;Ljava/lang/Object;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-
-com.google.gwt.event.shared.ResettableEventBus::addHandler(Lcom/google/gwt/event/shared/GwtEvent$Type;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-com.google.gwt.event.shared.ResettableEventBus::addHandlerToSource(Lcom/google/gwt/event/shared/GwtEvent$Type;Ljava/lang/Object;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-
-com.google.gwt.event.shared.SimpleEventBus::addHandler(Lcom/google/gwt/event/shared/GwtEvent$Type;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-com.google.gwt.event.shared.SimpleEventBus::addHandlerToSource(Lcom/google/gwt/event/shared/GwtEvent$Type;Ljava/lang/Object;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-
-com.google.gwt.event.shared.testing.CountingEventBus::addHandler(Lcom/google/gwt/event/shared/GwtEvent$Type;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-com.google.gwt.event.shared.testing.CountingEventBus::addHandlerToSource(Lcom/google/gwt/event/shared/GwtEvent$Type;Ljava/lang/Object;Lcom/google/gwt/event/shared/EventHandler;) OVERLOADED_METHOD_CALL
-
-com.google.gwt.place.shared.PlaceController.DefaultDelegate::addWindowClosingHandler(Lcom/google/gwt/user/client/Window$ClosingHandler;) OVERRIDABLE_METHOD_RETURN_TYPE_CHANGE
-
-com.google.gwt.place.shared.PlaceHistoryHandler.DefaultHistorian::addValueChangeHandler(Lcom/google/gwt/event/logical/shared/ValueChangeHandler;) OVERRIDABLE_METHOD_RETURN_TYPE_CHANGE
-
-com.google.gwt.place.shared.PlaceHistoryHandler::register(Lcom/google/gwt/place/shared/PlaceController;Lcom/google/gwt/event/shared/EventBus;Lcom/google/gwt/place/shared/Place;) OVERRIDABLE_METHOD_ARGUMENT_TYPE_CHANGE
-
-com.google.gwt.place.shared.PlaceHistoryHandler::register(Lcom/google/gwt/place/shared/PlaceController;Lcom/google/gwt/event/shared/EventBus;Lcom/google/gwt/place/shared/Place;) OVERRIDABLE_METHOD_RETURN_TYPE_CHANGE
-
-#
-# end com.google.web.bindery changes
-
 # Renamed CellBasedWidgetImplSafari to CellBasedWidgetImplStandardBase.
 com.google.gwt.user.cellview.client.CellBasedWidgetImplSafari MISSING
 
diff --git a/user/src/com/google/gwt/activity/shared/Activity.java b/user/src/com/google/gwt/activity/shared/Activity.java
index 9635841..f141171 100644
--- a/user/src/com/google/gwt/activity/shared/Activity.java
+++ b/user/src/com/google/gwt/activity/shared/Activity.java
@@ -15,8 +15,8 @@
  */
 package com.google.gwt.activity.shared;
 
+import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.user.client.ui.AcceptsOneWidget;
-import com.google.web.bindery.event.shared.EventBus;
 
 /**
  * Implemented by objects that control a piece of user interface, with a life
@@ -49,7 +49,7 @@
    * 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.
+   * {@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
diff --git a/user/src/com/google/gwt/activity/shared/ActivityManager.java b/user/src/com/google/gwt/activity/shared/ActivityManager.java
index db2d4cc..45f41b5 100644
--- a/user/src/com/google/gwt/activity/shared/ActivityManager.java
+++ b/user/src/com/google/gwt/activity/shared/ActivityManager.java
@@ -15,14 +15,14 @@
  */
 package com.google.gwt.activity.shared;
 
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.ResettableEventBus;
+import com.google.gwt.event.shared.UmbrellaException;
 import com.google.gwt.place.shared.PlaceChangeEvent;
 import com.google.gwt.place.shared.PlaceChangeRequestEvent;
 import com.google.gwt.user.client.ui.AcceptsOneWidget;
 import com.google.gwt.user.client.ui.IsWidget;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
-import com.google.web.bindery.event.shared.ResettableEventBus;
-import com.google.web.bindery.event.shared.UmbrellaException;
 
 import java.util.LinkedHashSet;
 import java.util.Set;
diff --git a/user/src/com/google/gwt/editor/client/EditorDelegate.java b/user/src/com/google/gwt/editor/client/EditorDelegate.java
index 1fc6603..8009ebb 100644
--- a/user/src/com/google/gwt/editor/client/EditorDelegate.java
+++ b/user/src/com/google/gwt/editor/client/EditorDelegate.java
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.editor.client;
 
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.HandlerRegistration;
 
 /**
  * Binds an individual Editor to the backing service. Every Editor has a peer
diff --git a/user/src/com/google/gwt/editor/client/impl/AbstractEditorDelegate.java b/user/src/com/google/gwt/editor/client/impl/AbstractEditorDelegate.java
index 5875e0e..ed1e52b 100644
--- a/user/src/com/google/gwt/editor/client/impl/AbstractEditorDelegate.java
+++ b/user/src/com/google/gwt/editor/client/impl/AbstractEditorDelegate.java
@@ -20,7 +20,7 @@
 import com.google.gwt.editor.client.EditorDelegate;
 import com.google.gwt.editor.client.EditorError;
 import com.google.gwt.editor.client.EditorVisitor;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.HandlerRegistration;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
diff --git a/user/src/com/google/gwt/event/Event.gwt.xml b/user/src/com/google/gwt/event/Event.gwt.xml
index 14f6dab..3dafaf8 100644
--- a/user/src/com/google/gwt/event/Event.gwt.xml
+++ b/user/src/com/google/gwt/event/Event.gwt.xml
@@ -1,20 +1,5 @@
-<!--
-  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
-  License for the specific language governing permissions and limitations under
-  the License.
--->
 <module>
-  <inherits name="com.google.gwt.event.EventBase" />
-  <inherits name="com.google.gwt.event.dom.DomEvent" />
-  <inherits name="com.google.gwt.event.logical.LogicalEvent" />
+	<inherits name="com.google.gwt.event.EventBase" />
+	<inherits name="com.google.gwt.event.dom.DomEvent" />
+	<inherits name="com.google.gwt.event.logical.LogicalEvent" />
 </module>
diff --git a/user/src/com/google/gwt/event/EventBase.gwt.xml b/user/src/com/google/gwt/event/EventBase.gwt.xml
index 895f0ee..9f0de72 100644
--- a/user/src/com/google/gwt/event/EventBase.gwt.xml
+++ b/user/src/com/google/gwt/event/EventBase.gwt.xml
@@ -1,21 +1,5 @@
-<!--
-  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
-  License for the specific language governing permissions and limitations under
-  the License.
--->
 <module>
-  <inherits name="com.google.web.bindery.event.Event" />
-  <inherits name="com.google.gwt.core.Core" />
+	<inherits name="com.google.gwt.core.Core" />
 
-  <source path="shared" />
+	<source path="shared" />
 </module>
diff --git a/user/src/com/google/gwt/event/shared/EventBus.java b/user/src/com/google/gwt/event/shared/EventBus.java
index 84879d3..74460c3 100644
--- a/user/src/com/google/gwt/event/shared/EventBus.java
+++ b/user/src/com/google/gwt/event/shared/EventBus.java
@@ -15,43 +15,81 @@
  */
 package com.google.gwt.event.shared;
 
-import com.google.web.bindery.event.shared.Event;
+import com.google.gwt.event.shared.GwtEvent.Type;
 
 /**
- * Extends {com.google.web.bindery.event.shared.EventBus} for legacy
- * compatibility.
+ * Dispatches {@link GwtEvent}s to interested parties. Eases decoupling by
+ * allowing objects to interact without having direct dependencies upon one
+ * another, and without requiring event sources to deal with maintaining handler
+ * lists. There will typically be one EventBus per application, broadcasting
+ * events that may be of general interest.
  * 
- * @deprecated Replaced by com.google.web.bindery.event.shared.EventBus
+ * @see SimpleEventBus
+ * @see ResettableEventBus
+ * @see com.google.gwt.event.shared.testing.CountingEventBus
  */
-@Deprecated
-public abstract class EventBus extends com.google.web.bindery.event.shared.EventBus implements HasHandlers {
-  
-  public <H extends EventHandler> HandlerRegistration addHandler(GwtEvent.Type<H> type, H handler) {
-    return wrap(addHandler((Event.Type<H>) type, handler));
-  }
+public abstract class EventBus implements HasHandlers {
 
-  public <H extends EventHandler> HandlerRegistration addHandlerToSource(GwtEvent.Type<H> type,
-      Object source, H handler) {
-    return wrap(addHandlerToSource((Event.Type<H>) type, source, handler));
-  }
-  
-  public void fireEvent(GwtEvent<?> event) {
-    try {
-      fireEvent((Event<?>) event);
-    } catch (com.google.web.bindery.event.shared.UmbrellaException e) {
-      throw new UmbrellaException(e.getCauses());
-    }
-  }
+  /**
+   * Adds an unfiltered handler to receive events of this type from all sources.
+   * <p>
+   * It is rare to call this method directly. More typically a {@link GwtEvent}
+   * subclass will provide a static <code>register</code> method, or a widget
+   * will accept handlers directly.
+   * <p>
+   * A tip: to make a handler de-register itself, the following works:
+   * <code><pre>new MyHandler() {
+   *  HandlerRegistration reg = MyEvent.register(eventBus, this);
+   * 
+   *  public void onMyThing(MyEvent event) {
+   *    {@literal /}* do your thing *{@literal /}
+   *    reg.removeHandler();
+   *  }
+   * };
+   * </pre></code>
+   * 
+   * @param <H> The type of handler
+   * @param type the event type associated with this handler
+   * @param handler the handler
+   * @return the handler registration, can be stored in order to remove the
+   *         handler later
+   */
+  public abstract <H extends EventHandler> HandlerRegistration addHandler(
+      Type<H> type, H handler);
 
-  public void fireEventFromSource(GwtEvent<?> event, Object source) {
-    try {
-      fireEventFromSource((Event<?>) event, source);
-    } catch (com.google.web.bindery.event.shared.UmbrellaException e) {
-      throw new UmbrellaException(e.getCauses());
-    }
-  }
+  /**
+   * Adds a handler to receive events of this type from the given source.
+   * <p>
+   * It is rare to call this method directly. More typically a {@link GwtEvent}
+   * subclass will provide a static <code>register</code> method, or a widget
+   * will accept handlers directly.
+   * 
+   * @param <H> The type of handler
+   * @param type the event type associated with this handler
+   * @param source the source associated with this handler
+   * @param handler the handler
+   * @return the handler registration, can be stored in order to remove the
+   *         handler later
+   */
+  public abstract <H extends EventHandler> HandlerRegistration addHandlerToSource(
+      Type<H> type, Object source, H handler);
 
-  protected HandlerRegistration wrap(com.google.web.bindery.event.shared.HandlerRegistration reg) {
-    return new LegacyHandlerWrapper(reg);
-  }
+  /**
+   * Fires the event from no source. Only unfiltered handlers will receive it.
+   * 
+   * @param event the event to fire
+   */
+  public abstract void fireEvent(GwtEvent<?> event);
+
+  /**
+   * Fires the given event to the handlers listening to the event's type.
+   * <p>
+   * Any exceptions thrown by handlers will be bundled into a
+   * {@link UmbrellaException} and then re-thrown after all handlers have
+   * completed. An exception thrown by a handler will not prevent other handlers
+   * from executing.
+   * 
+   * @param event the event to fire
+   */
+  public abstract void fireEventFromSource(GwtEvent<?> event, Object source);
 }
diff --git a/user/src/com/google/gwt/event/shared/EventHandler.java b/user/src/com/google/gwt/event/shared/EventHandler.java
index 7860744..2558629 100644
--- a/user/src/com/google/gwt/event/shared/EventHandler.java
+++ b/user/src/com/google/gwt/event/shared/EventHandler.java
@@ -16,8 +16,8 @@
 package com.google.gwt.event.shared;
 
 /**
- * Marker interface for event handlers. All stock GWT Widget and dom event
- * handlers extend {@link EventHandler}.
+ * Marker interface for event handlers. All GWT event handlers should extend
+ * {@link EventHandler}.
  */
 public interface EventHandler {
 
diff --git a/user/src/com/google/gwt/event/shared/GwtEvent.java b/user/src/com/google/gwt/event/shared/GwtEvent.java
index a4a8465..ef74c39 100644
--- a/user/src/com/google/gwt/event/shared/GwtEvent.java
+++ b/user/src/com/google/gwt/event/shared/GwtEvent.java
@@ -15,20 +15,16 @@
  */
 package com.google.gwt.event.shared;
 
-import com.google.web.bindery.event.shared.Event;
-
 /**
- * Root of all GWT widget and dom events sourced by a {@link HandlerManager}.
- * All GWT events are considered dead and should no longer be accessed once the
- * {@link HandlerManager} which originally fired the event finishes with it.
- * That is, don't hold on to event objects outside of your handler methods.
- * <p>
- * There is no need for an application's custom event types to extend GwtEvent.
- * Prefer {@link Event} instead.
+ * Root of all GWT events. All GWT events are considered dead and should no
+ * longer be accessed once the {@link HandlerManager} which originally fired the
+ * event finishes with it. That is, don't hold on to event objects outside of
+ * your handler methods.
  * 
  * @param <H> handler type
+ * 
  */
-public abstract class GwtEvent<H extends EventHandler> extends Event<H> {
+public abstract class GwtEvent<H extends EventHandler> {
   /**
    * Type class used to register events with the {@link HandlerManager}.
    * <p>
@@ -38,24 +34,79 @@
    * 
    * @param <H> handler type
    */
-  public static class Type<H> extends com.google.web.bindery.event.shared.Event.Type<H> {
+  public static class Type<H> {
+    private static int nextHashCode;
+    private final int index;
+
+    /**
+     * Constructor.
+     */
+    public Type() {
+      index = ++nextHashCode;
+    }
+
+    // We override hash code to make it as efficient as possible.
+    @Override
+    public final int hashCode() {
+      return index;
+    }
+
+    @Override
+    public String toString() {
+      return "Event type";
+    }
   }
 
   private boolean dead;
 
+  private Object source;
+
   /**
    * Constructor.
    */
   protected GwtEvent() {
   }
 
-  @Override
-  public abstract GwtEvent.Type<H> getAssociatedType();
+  /**
+   * Returns the type used to register this event. Used by handler manager to
+   * dispatch events to the correct handlers.
+   * 
+   * @return the type
+   */
+  public abstract Type<H> getAssociatedType();
 
-  @Override
+  /**
+   * Returns the source that last fired this event.
+   * 
+   * @return object representing the source of this event
+   */
   public Object getSource() {
     assertLive();
-    return super.getSource();
+    return source;
+  }
+
+  /**
+   * This is a method used primarily for debugging. It gives a string
+   * representation of the event details. This does not override the toString
+   * method because the compiler cannot always optimize toString out correctly.
+   * Event types should override as desired.
+   * 
+   * @return a string representing the event's specifics.
+   */
+  public String toDebugString() {
+    String name = this.getClass().getName();
+    name = name.substring(name.lastIndexOf(".") + 1);
+    return "event: " + name + ":";
+  }
+
+  /**
+   * The toString() for abstract event is overridden to avoid accidently
+   * including class literals in the the compiled output. Use {@link GwtEvent}
+   * #toDebugString to get more information about the event.
+   */
+  @Override
+  public String toString() {
+    return "An event type";
   }
 
   /**
@@ -90,7 +141,7 @@
    */
   protected void kill() {
     dead = true;
-    setSource(null);
+    source = null;
   }
 
   /**
@@ -98,10 +149,16 @@
    */
   protected void revive() {
     dead = false;
-    setSource(null);
+    source = null;
   }
 
-  void overrideSource(Object source) {
-    super.setSource(source);
+  /**
+   * Set the source that triggered this event.
+   * 
+   * @param source the source of this event, should only be set by a
+   *          {@link HandlerManager}
+   */
+  void setSource(Object source) {
+    this.source = source;
   }
 }
diff --git a/user/src/com/google/gwt/event/shared/HandlerManager.java b/user/src/com/google/gwt/event/shared/HandlerManager.java
index 9f4d350..7b01a51 100644
--- a/user/src/com/google/gwt/event/shared/HandlerManager.java
+++ b/user/src/com/google/gwt/event/shared/HandlerManager.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
@@ -15,7 +15,7 @@
  */
 package com.google.gwt.event.shared;
 
-import com.google.web.bindery.event.shared.Event;
+import com.google.gwt.event.shared.GwtEvent.Type;
 
 /**
  * Manager responsible for adding handlers to event sources and firing those
@@ -25,40 +25,13 @@
  * While widget authors should continue to use
  * {@link com.google.gwt.user.client.ui.Widget#addDomHandler(EventHandler, com.google.gwt.event.dom.client.DomEvent.Type)}
  * and
- * {@link com.google.gwt.user.client.ui.Widget#addHandler(EventHandler, com.google.gwt.event.shared.GwtEvent.Type)}
- * , application developers are strongly discouraged from using a HandlerManager
+ * {@link com.google.gwt.user.client.ui.Widget#addHandler(EventHandler, com.google.gwt.event.shared.GwtEvent.Type)},
+ * application developers are strongly discouraged from using a HandlerManager
  * instance as a global event dispatch mechanism.
  */
 public class HandlerManager implements HasHandlers {
 
-  @SuppressWarnings("deprecation")
-  private static class Bus extends com.google.web.bindery.event.shared.SimpleEventBus {
-    public Bus(boolean fireInReverseOrder) {
-      super(fireInReverseOrder);
-    }
-
-    @Override
-    protected <H> void doRemove(Event.Type<H> type, Object source, H handler) {
-      super.doRemove(type, source, handler);
-    }
-
-    @Override
-    protected <H> H getHandler(Event.Type<H> type, int index) {
-      return super.getHandler(type, index);
-    }
-
-    @Override
-    protected int getHandlerCount(Event.Type<?> eventKey) {
-      return super.getHandlerCount(eventKey);
-    }
-
-    @Override
-    protected boolean isEventHandled(Event.Type<?> eventKey) {
-      return super.isEventHandled(eventKey);
-    }
-  }
-
-  private final Bus eventBus;
+  private final SimpleEventBus eventBus;
 
   // source of the events
   private final Object source;
@@ -67,7 +40,7 @@
    * Creates a handler manager with a source to be set on all events fired via
    * {@link #fireEvent(GwtEvent)}. Handlers will be fired in the order that they
    * are added.
-   * 
+   *
    * @param source the default event source
    */
   public HandlerManager(Object source) {
@@ -77,27 +50,28 @@
   /**
    * Creates a handler manager with the given source, specifying the order in
    * which handlers are fired.
-   * 
+   *
    * @param source the event source
    * @param fireInReverseOrder true to fire handlers in reverse order
    */
+  @SuppressWarnings("deprecation")
   public HandlerManager(Object source, boolean fireInReverseOrder) {
-    eventBus = new Bus(fireInReverseOrder);
+    eventBus = new SimpleEventBus(fireInReverseOrder);
     this.source = source;
   }
 
   /**
    * Adds a handler.
-   * 
+   *
    * @param <H> The type of handler
    * @param type the event type associated with this handler
    * @param handler the handler
    * @return the handler registration, can be stored in order to remove the
    *         handler later
    */
-  public <H extends EventHandler> HandlerRegistration addHandler(GwtEvent.Type<H> type,
-      final H handler) {
-    return new LegacyHandlerWrapper(eventBus.addHandler(type, handler));
+  public <H extends EventHandler> HandlerRegistration addHandler(
+      GwtEvent.Type<H> type, final H handler) {
+    return eventBus.addHandler(type, handler);
   }
 
   /**
@@ -111,7 +85,7 @@
    * Note, any subclass should be very careful about overriding this method, as
    * adds/removes of handlers will not be safe except within this
    * implementation.
-   * 
+   *
    * @param event the event
    */
   public void fireEvent(GwtEvent<?> event) {
@@ -120,65 +94,68 @@
       event.revive();
     }
     Object oldSource = event.getSource();
-    event.overrideSource(source);
+    event.setSource(source);
     try {
 
       // May throw an UmbrellaException.
       eventBus.fireEvent(event);
-    } catch (com.google.web.bindery.event.shared.UmbrellaException e) {
-      throw new UmbrellaException(e.getCauses());
+
     } finally {
       if (oldSource == null) {
         // This was my event, so I should kill it now that I'm done.
         event.kill();
       } else {
         // Restoring the source for the next handler to use.
-        event.overrideSource(oldSource);
+        event.setSource(oldSource);
       }
     }
   }
 
   /**
    * Gets the handler at the given index.
-   * 
+   *
    * @param <H> the event handler type
    * @param index the index
    * @param type the handler's event type
    * @return the given handler
    */
+  @SuppressWarnings("deprecation")
   public <H extends EventHandler> H getHandler(GwtEvent.Type<H> type, int index) {
     return eventBus.getHandler(type, index);
   }
 
   /**
    * Gets the number of handlers listening to the event type.
-   * 
+   *
    * @param type the event type
    * @return the number of registered handlers
    */
-  public int getHandlerCount(GwtEvent.Type<?> type) {
+  @SuppressWarnings("deprecation")
+  public int getHandlerCount(Type<?> type) {
     return eventBus.getHandlerCount(type);
   }
 
   /**
    * Does this handler manager handle the given event type?
-   * 
+   *
    * @param e the event type
    * @return whether the given event type is handled
    */
-  public boolean isEventHandled(GwtEvent.Type<?> e) {
+  @SuppressWarnings("deprecation")
+  public boolean isEventHandled(Type<?> e) {
     return eventBus.isEventHandled(e);
   }
 
   /**
    * Removes the given handler from the specified event type.
-   * 
+   *
    * @param <H> handler type
-   * 
+   *
    * @param type the event type
    * @param handler the handler
    */
-  public <H extends EventHandler> void removeHandler(GwtEvent.Type<H> type, final H handler) {
-    eventBus.doRemove(type, null, handler);
+  public <H extends EventHandler> void removeHandler(GwtEvent.Type<H> type,
+      final H handler) {
+      eventBus.doRemove(type, null, handler);
   }
 }
diff --git a/user/src/com/google/gwt/event/shared/HandlerRegistration.java b/user/src/com/google/gwt/event/shared/HandlerRegistration.java
index 5d04ac9..9031343 100644
--- a/user/src/com/google/gwt/event/shared/HandlerRegistration.java
+++ b/user/src/com/google/gwt/event/shared/HandlerRegistration.java
@@ -17,8 +17,19 @@
 package com.google.gwt.event.shared;
 
 /**
- * Extends {com.google.bindery.event.shared.HandlerRegistration} for legacy
- * compatibility.
+ * Registration returned from a call to
+ * {@link HandlerManager#addHandler(com.google.gwt.event.shared.GwtEvent.Type, EventHandler)}
+ * . Use the handler registration to remove handlers when they are no longer
+ * needed.
+ * 
+ * Note, this interface is under the control of the {@link HandlerManager} class
+ * and may be expanded over time, so extend {@link DefaultHandlerRegistration}
+ * if you do not wish to get compiler errors if we extend the handler registry
+ * functionality.
  */
-public interface HandlerRegistration extends com.google.web.bindery.event.shared.HandlerRegistration {
+public interface HandlerRegistration {
+  /**
+   * Removes the given handler from its manager.
+   */
+  void removeHandler();
 }
diff --git a/user/src/com/google/gwt/event/shared/LegacyHandlerWrapper.java b/user/src/com/google/gwt/event/shared/LegacyHandlerWrapper.java
deleted file mode 100644
index b5396da..0000000
--- a/user/src/com/google/gwt/event/shared/LegacyHandlerWrapper.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright 2011 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.event.shared;
-
-class LegacyHandlerWrapper implements HandlerRegistration {
-  private final com.google.web.bindery.event.shared.HandlerRegistration real;
-  
-  LegacyHandlerWrapper(com.google.web.bindery.event.shared.HandlerRegistration real) {
-    this.real = real;
-  }
-
-  public void removeHandler() {
-    real.removeHandler();
-  }
-}
diff --git a/user/src/com/google/gwt/event/shared/ResettableEventBus.java b/user/src/com/google/gwt/event/shared/ResettableEventBus.java
index 8ea5ace..50055d6 100644
--- a/user/src/com/google/gwt/event/shared/ResettableEventBus.java
+++ b/user/src/com/google/gwt/event/shared/ResettableEventBus.java
@@ -15,67 +15,84 @@
  */
 package com.google.gwt.event.shared;
 
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.Event.Type;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.GwtEvent.Type;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
 
 /**
- * Wraps {com.google.web.bindery.event.shared.ResettableEventBus} for legacy
- * compatibility.
- * 
- * @deprecated Use com.google.web.bindery.event.shared.ResettableEventBus.
+ * Wraps an EventBus to hold on to any HandlerRegistrations, so that they can
+ * easily all be cleared at once.
  */
-@SuppressWarnings("deprecation")
-@Deprecated
 public class ResettableEventBus extends EventBus {
-  private static class TestableResettableEventBus extends com.google.web.bindery.event.shared.ResettableEventBus {
-    /**
-     * @param wrappedBus
-     */
-    public TestableResettableEventBus(EventBus wrappedBus) {
-      super(wrappedBus);
-    }
 
-    @Override
-    public int getRegistrationSize() {
-      return super.getRegistrationSize();
-    }
-  }
-  
-  private final TestableResettableEventBus real;
+  private final EventBus wrapped;
+  private final Set<HandlerRegistration> registrations = new HashSet<HandlerRegistration>();
 
   public ResettableEventBus(EventBus wrappedBus) {
-    real = new TestableResettableEventBus(wrappedBus);
+    this.wrapped = wrappedBus;
   }
 
   @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    return real.addHandler(type, handler);
+  public <H extends EventHandler> HandlerRegistration addHandler(Type<H> type, H handler) {
+    HandlerRegistration rtn = wrapped.addHandler(type, handler);
+    return doRegisterHandler(rtn);
   }
 
   @Override
-  public <H> HandlerRegistration addHandlerToSource(Type<H> type, Object source, H handler) {
-    return real.addHandlerToSource(type, source, handler);
+  public <H extends EventHandler> HandlerRegistration addHandlerToSource(GwtEvent.Type<H> type,
+      Object source, H handler) {
+    HandlerRegistration rtn = wrapped.addHandlerToSource(type, source, handler);
+    return doRegisterHandler(rtn);
   }
 
   @Override
-  public void fireEvent(Event<?> event) {
-    real.fireEvent(event);
+  public void fireEvent(GwtEvent<?> event) {
+    wrapped.fireEvent(event);
   }
 
   @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    real.fireEventFromSource(event, source);
-  }
-
-  public void removeHandlers() {
-    real.removeHandlers();
+  public void fireEventFromSource(GwtEvent<?> event, Object source) {
+    wrapped.fireEventFromSource(event, source);
   }
 
   /**
-   * Visible for testing
+   * Remove all handlers that have been added through this wrapper.
    */
+  public void removeHandlers() {
+    Iterator<HandlerRegistration> it = registrations.iterator();
+    while (it.hasNext()) {
+      HandlerRegistration r = it.next();
+
+      /*
+       * must remove before we call removeHandler. Might have come from nested
+       * ResettableEventBus
+       */
+      it.remove();
+
+      r.removeHandler();
+    }
+  }
+
+  // Visible for testing
   int getRegistrationSize() {
-    return real.getRegistrationSize();
+    return registrations.size();
+  }
+
+  private HandlerRegistration doRegisterHandler(final HandlerRegistration registration) {
+    registrations.add(registration);
+    return new HandlerRegistration() {
+      public void removeHandler() {
+        doUnregisterHandler(registration);
+      }
+    };
+  }
+
+  private void doUnregisterHandler(HandlerRegistration registration) {
+    if (registrations.contains(registration)) {
+      registration.removeHandler();
+      registrations.remove(registration);
+    }
   }
 }
diff --git a/user/src/com/google/gwt/event/shared/SimpleEventBus.java b/user/src/com/google/gwt/event/shared/SimpleEventBus.java
index 94c8207..673d698 100644
--- a/user/src/com/google/gwt/event/shared/SimpleEventBus.java
+++ b/user/src/com/google/gwt/event/shared/SimpleEventBus.java
@@ -15,39 +15,309 @@
  */
 package com.google.gwt.event.shared;
 
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.Event.Type;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.event.shared.GwtEvent.Type;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.Set;
 
 /**
- * Wraps {com.google.web.bindery.event.shared.SimpleEventBus} for legacy
- * compatibility.
- * 
- * @deprecated Use com.google.web.bindery.event.shared.SimpleEventBus
+ * Basic implementation of {@link EventBus}.
  */
-@SuppressWarnings("deprecation")
-@Deprecated
 public class SimpleEventBus extends EventBus {
-  private final com.google.web.bindery.event.shared.SimpleEventBus real =
-      new com.google.web.bindery.event.shared.SimpleEventBus();
+  private final boolean isReverseOrder;
 
-  @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    return real.addHandler(type, handler);
+  private int firingDepth = 0;
+
+  /**
+   * Add and remove operations received during dispatch.
+   */
+  private List<ScheduledCommand> deferredDeltas;
+
+  /**
+   * Map of event type to map of event source to list of their handlers.
+   */
+  private final Map<GwtEvent.Type<?>, Map<Object, List<?>>> map = new HashMap<GwtEvent.Type<?>, Map<Object, List<?>>>();
+
+  public SimpleEventBus() {
+    this(false);
+  }
+
+  /**
+   * Allows creation of an instance that fires its handlers in the reverse of
+   * the order in which they were added, although filtered handlers all fire
+   * before unfiltered handlers.
+   * <p>
+   * 
+   * @deprecated This is a legacy feature, required by HandlerManager. Package
+   *             protected because it is a bad idea to rely upon the order of
+   *             event dispatch, and because fully supporting it (that is, not
+   *             segregating filtered and unfiltered handlers, a distinction not
+   *             used by HandlerManager) is not worth the effort.
+   */
+  @Deprecated
+  SimpleEventBus(boolean fireInReverseOrder) {
+    isReverseOrder = fireInReverseOrder;
   }
 
   @Override
-  public <H> HandlerRegistration addHandlerToSource(Type<H> type, Object source, H handler) {
-    return real.addHandlerToSource(type, source, handler);
+  public <H extends EventHandler> HandlerRegistration addHandler(Type<H> type,
+      H handler) {
+    if (type == null) {
+      throw new NullPointerException("Cannot add a handler with a null type");
+    }
+    if (handler == null) {
+      throw new NullPointerException("Cannot add a null handler");
+    }
+
+    return doAdd(type, null, handler);
   }
 
   @Override
-  public void fireEvent(Event<?> event) {
-    real.fireEvent(event);
+  public <H extends EventHandler> HandlerRegistration addHandlerToSource(
+      final GwtEvent.Type<H> type, final Object source, final H handler) {
+    if (type == null) {
+      throw new NullPointerException("Cannot add a handler with a null type");
+    }
+    if (source == null) {
+      throw new NullPointerException("Cannot add a handler with a null source");
+    }
+    if (handler == null) {
+      throw new NullPointerException("Cannot add a null handler");
+    }
+
+    return doAdd(type, source, handler);
   }
 
   @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    real.fireEventFromSource(event, source);
+  public void fireEvent(GwtEvent<?> event) {
+    if (event == null) {
+      throw new NullPointerException("Cannot fire null event");
+    }
+    doFire(event, null);
   }
-}
+
+  @Override
+  public void fireEventFromSource(GwtEvent<?> event, Object source) {
+    if (event == null) {
+      throw new NullPointerException("Cannot fire null event");
+    }
+    if (source == null) {
+      throw new NullPointerException("Cannot fire from a null source");
+    }
+    doFire(event, source);
+  }
+
+  /**
+   * Package protected to support legacy features in HandlerManager.
+   */
+  <H extends EventHandler> void doRemove(
+      com.google.gwt.event.shared.GwtEvent.Type<H> type, Object source,
+      H handler) {
+    if (firingDepth > 0) {
+      enqueueRemove(type, source, handler);
+    } else {
+      doRemoveNow(type, source, handler);
+    }
+  }
+
+  /**
+   * Package protected to support legacy features in HandlerManager.
+   */
+  @Deprecated
+  <H extends EventHandler> H getHandler(GwtEvent.Type<H> type, int index) {
+    assert index < getHandlerCount(type) : "handlers for " + type.getClass()
+        + " have size: " + getHandlerCount(type)
+        + " so do not have a handler at index: " + index;
+
+    List<H> l = getHandlerList(type, null);
+    return l.get(index);
+  }
+
+  /**
+   * Package protected to support legacy features in HandlerManager.
+   */
+  @Deprecated
+  int getHandlerCount(GwtEvent.Type<?> eventKey) {
+    return getHandlerList(eventKey, null).size();
+  }
+
+  /**
+   * Package protected to support legacy features in HandlerManager.
+   */
+  @Deprecated
+  boolean isEventHandled(GwtEvent.Type<?> eventKey) {
+    return map.containsKey(eventKey);
+  }
+
+  private void defer(ScheduledCommand command) {
+    if (deferredDeltas == null) {
+      deferredDeltas = new ArrayList<ScheduledCommand>();
+    }
+    deferredDeltas.add(command);
+  }
+
+  private <H extends EventHandler> HandlerRegistration doAdd(
+      final GwtEvent.Type<H> type, final Object source, final H handler) {
+    if (firingDepth > 0) {
+      enqueueAdd(type, source, handler);
+    } else {
+      doAddNow(type, source, handler);
+    }
+
+    return new HandlerRegistration() {
+      public void removeHandler() {
+        doRemove(type, source, handler);
+      }
+    };
+  }
+
+  private <H extends EventHandler> void doAddNow(GwtEvent.Type<H> type,
+      Object source, H handler) {
+    List<H> l = ensureHandlerList(type, source);
+    l.add(handler);
+  }
+
+  private <H extends EventHandler> void doFire(GwtEvent<H> event, Object source) {
+    try {
+      firingDepth++;
+
+      if (source != null) {
+        event.setSource(source);
+      }
+
+      List<H> handlers = getDispatchList(event.getAssociatedType(), source);
+      Set<Throwable> causes = null;
+
+      ListIterator<H> it = isReverseOrder
+          ? handlers.listIterator(handlers.size()) : handlers.listIterator();
+      while (isReverseOrder ? it.hasPrevious() : it.hasNext()) {
+        H handler = isReverseOrder ? it.previous() : it.next();
+
+        try {
+          event.dispatch(handler);
+        } catch (Throwable e) {
+          if (causes == null) {
+            causes = new HashSet<Throwable>();
+          }
+          causes.add(e);
+        }
+      }
+
+      if (causes != null) {
+        throw new UmbrellaException(causes);
+      }
+    } finally {
+      firingDepth--;
+      if (firingDepth == 0) {
+        handleQueuedAddsAndRemoves();
+      }
+    }
+  }
+
+  private <H> void doRemoveNow(GwtEvent.Type<H> type, Object source, H handler) {
+    List<H> l = getHandlerList(type, source);
+
+    boolean removed = l.remove(handler);
+    assert removed : "redundant remove call";
+    if (removed && l.isEmpty()) {
+      prune(type, source);
+    }
+  }
+
+  private <H extends EventHandler> void enqueueAdd(final GwtEvent.Type<H> type,
+      final Object source, final H handler) {
+    defer(new ScheduledCommand() {
+      public void execute() {
+        doAddNow(type, source, handler);
+      }
+    });
+  }
+
+  private <H extends EventHandler> void enqueueRemove(
+      final GwtEvent.Type<H> type, final Object source, final H handler) {
+    defer(new ScheduledCommand() {
+      public void execute() {
+        doRemoveNow(type, source, handler);
+      }
+    });
+  }
+
+  private <H> List<H> ensureHandlerList(GwtEvent.Type<H> type, Object source) {
+    Map<Object, List<?>> sourceMap = map.get(type);
+    if (sourceMap == null) {
+      sourceMap = new HashMap<Object, List<?>>();
+      map.put(type, sourceMap);
+    }
+
+    // safe, we control the puts.
+    @SuppressWarnings("unchecked")
+    List<H> handlers = (List<H>) sourceMap.get(source);
+    if (handlers == null) {
+      handlers = new ArrayList<H>();
+      sourceMap.put(source, handlers);
+    }
+
+    return handlers;
+  }
+
+  private <H> List<H> getDispatchList(GwtEvent.Type<H> type, Object source) {
+    List<H> directHandlers = getHandlerList(type, source);
+    if (source == null) {
+      return directHandlers;
+    }
+
+    List<H> globalHandlers = getHandlerList(type, null);
+
+    List<H> rtn = new ArrayList<H>(directHandlers);
+    rtn.addAll(globalHandlers);
+    return rtn;
+  }
+
+  private <H> List<H> getHandlerList(GwtEvent.Type<H> type, Object source) {
+    Map<Object, List<?>> sourceMap = map.get(type);
+    if (sourceMap == null) {
+      return Collections.emptyList();
+    }
+
+    // safe, we control the puts.
+    @SuppressWarnings("unchecked")
+    List<H> handlers = (List<H>) sourceMap.get(source);
+    if (handlers == null) {
+      return Collections.emptyList();
+    }
+
+    return handlers;
+  }
+
+  private void handleQueuedAddsAndRemoves() {
+    if (deferredDeltas != null) {
+      try {
+        for (ScheduledCommand c : deferredDeltas) {
+          c.execute();
+        }
+      } finally {
+        deferredDeltas = null;
+      }
+    }
+  }
+
+  private void prune(GwtEvent.Type<?> type, Object source) {
+    Map<Object, List<?>> sourceMap = map.get(type);
+
+    List<?> pruned = sourceMap.remove(source);
+
+    assert pruned != null : "Can't prune what wasn't there";
+    assert pruned.isEmpty() : "Pruned unempty list!";
+
+    if (sourceMap.isEmpty()) {
+      map.remove(type);
+    }
+  }
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/event/shared/UmbrellaException.java b/user/src/com/google/gwt/event/shared/UmbrellaException.java
index dd34695..134af51 100644
--- a/user/src/com/google/gwt/event/shared/UmbrellaException.java
+++ b/user/src/com/google/gwt/event/shared/UmbrellaException.java
@@ -15,21 +15,43 @@
  */
 package com.google.gwt.event.shared;
 
+import java.util.HashSet;
 import java.util.Set;
 
 /**
- * Wraps {com.google.web.bindery.event.shared.UmbrellaException} for legacy
- * compatibility.
+ * A {@link RuntimeException} that collects a {@link Set} of child
+ * {@link Throwable}s together. Typically thrown after loop, with all of the
+ * exceptions thrown during that loop, but delayed so that the loop finishes
+ * executing.
  */
-public class UmbrellaException extends com.google.web.bindery.event.shared.UmbrellaException {
+public class UmbrellaException extends RuntimeException {
+
+  /**
+   * The causes of the exception.
+   */
+  private Set<Throwable> causes;
+
+  /*
+   * The default constructor enables RPC support.
+   */
+  public UmbrellaException() {
+    this(new HashSet<Throwable>());
+  }
+  
   public UmbrellaException(Set<Throwable> causes) {
-    super(causes);
+    super(
+        "One or more exceptions caught, see full set in UmbrellaException#getCauses",
+        causes.size() == 0 ? null : causes.toArray(new Throwable[0])[0]);
+    this.causes = causes;
   }
 
   /**
-   * Required for GWT RPC serialization.
+   * Get the set of exceptions that caused the failure.
+   * 
+   * @return the set of causes
    */
-  protected UmbrellaException() {
-    super();
+  public Set<Throwable> getCauses() {
+    return causes;
   }
-}
+
+}
\ No newline at end of file
diff --git a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
index 7503966..3c1a121 100644
--- a/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
+++ b/user/src/com/google/gwt/event/shared/testing/CountingEventBus.java
@@ -15,50 +15,87 @@
  */
 package com.google.gwt.event.shared.testing;
 
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.GwtEvent;
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.Event.Type;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.GwtEvent.Type;
+import com.google.gwt.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.SimpleEventBus;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**
- * Legacy compatibility wrapper for
- * {@link com.google.web.bindery.event.shared.testing.CountingEventBus}.
- * @deprecated
+ * Wraps an {@link EventBus} to keep a count of registered handlers. Handy for
+ * tests.
  */
-@SuppressWarnings("deprecation")
-@Deprecated
-public class CountingEventBus extends com.google.gwt.event.shared.EventBus {
-  private final com.google.web.bindery.event.shared.testing.CountingEventBus real;
-
+public class CountingEventBus extends EventBus {
+  private final Map<Type<?>, Integer> counts = new HashMap<GwtEvent.Type<?>, Integer>();
+  private final EventBus wrapped;
+  
   public CountingEventBus() {
-    real = new com.google.web.bindery.event.shared.testing.CountingEventBus();
+    this(new SimpleEventBus());
   }
-
-  public CountingEventBus(com.google.gwt.event.shared.EventBus wrapped) {
-    real = new com.google.web.bindery.event.shared.testing.CountingEventBus(wrapped);
+  
+  public CountingEventBus(EventBus wrapped) {
+    this.wrapped = wrapped;
   }
 
   @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    return real.addHandler(type, handler);
+  public <H extends EventHandler> HandlerRegistration addHandler(Type<H> type,
+      H handler) {
+    increment(type);
+    final HandlerRegistration superReg = wrapped.addHandler(type, handler);
+    return makeReg(type, superReg);
   }
 
   @Override
-  public <H> HandlerRegistration addHandlerToSource(Type<H> type, Object source, H handler) {
-    return real.addHandlerToSource(type, source, handler);
+  public <H extends EventHandler> HandlerRegistration addHandlerToSource(
+      final Type<H> type, Object source, H handler) {
+    increment(type);
+    final HandlerRegistration superReg = wrapped.addHandlerToSource(type,
+        source, handler);
+    return makeReg(type, superReg);
   }
 
   @Override
-  public void fireEvent(Event<?> event) {
-    real.fireEvent(event);
+  public void fireEvent(GwtEvent<?> event) {
+    wrapped.fireEvent(event);
   }
 
   @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    real.fireEventFromSource(event, source);
+  public void fireEventFromSource(GwtEvent<?> event, Object source) {
+    wrapped.fireEventFromSource(event, source);
   }
 
-  public int getCount(GwtEvent.Type<?> type) {
-    return real.getCount(type);
+  public int getCount(Type<?> type) {
+    Integer count = counts.get(type);
+    return count == null ? 0 : count;
+  }
+
+  private void decrement(Type<?> type) {
+    Integer count = counts.get(type);
+    if (count == null) {
+      count = 0;
+    }
+    counts.put(type, count - 1);
+  }
+
+  private <H> void increment(final Type<H> type) {
+    Integer count = counts.get(type);
+    if (count == null) {
+      count = 0;
+    }
+    counts.put(type, count + 1);
+  }
+
+  private <H> HandlerRegistration makeReg(final Type<H> type,
+      final HandlerRegistration superReg) {
+    return new HandlerRegistration() {
+      public void removeHandler() {
+        decrement(type);
+        superReg.removeHandler();
+      }
+    };
   }
 }
diff --git a/user/src/com/google/gwt/place/shared/PlaceController.java b/user/src/com/google/gwt/place/shared/PlaceController.java
index 56efe51..294a963 100644
--- a/user/src/com/google/gwt/place/shared/PlaceController.java
+++ b/user/src/com/google/gwt/place/shared/PlaceController.java
@@ -16,11 +16,11 @@
 package com.google.gwt.place.shared;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.Window;
 import com.google.gwt.user.client.Window.ClosingEvent;
 import com.google.gwt.user.client.Window.ClosingHandler;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
 
 import java.util.logging.Logger;
 
diff --git a/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java b/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
index fc6bb98..7117169 100644
--- a/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
+++ b/user/src/com/google/gwt/place/shared/PlaceHistoryHandler.java
@@ -18,9 +18,9 @@
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.event.logical.shared.ValueChangeEvent;
 import com.google.gwt.event.logical.shared.ValueChangeHandler;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.History;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
 
 import java.util.logging.Logger;
 
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 932aaee..7bc1ba3 100644
--- a/user/src/com/google/gwt/user/client/ui/Widget.java
+++ b/user/src/com/google/gwt/user/client/ui/Widget.java
@@ -23,6 +23,7 @@
 import com.google.gwt.event.shared.EventHandler;
 import com.google.gwt.event.shared.GwtEvent;
 import com.google.gwt.event.shared.HandlerManager;
+import com.google.gwt.event.shared.GwtEvent.Type;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.user.client.DOM;
 import com.google.gwt.user.client.Event;
@@ -245,8 +246,8 @@
    *
    * @return the {@link HandlerManager} you want to use
    */
-  protected HandlerManager createHandlerManager() {
-    return new HandlerManager(this);
+  protected com.google.gwt.event.shared.HandlerManager createHandlerManager() {
+    return new com.google.gwt.event.shared.HandlerManager(this);
   }
 
   /**
@@ -288,7 +289,7 @@
    * @param type the event type
    * @return the number of registered handlers
    */
-  protected int getHandlerCount(GwtEvent.Type<?> type) {
+  protected int getHandlerCount(Type<?> type) {
     return handlerManager == null ? 0 : handlerManager.getHandlerCount(type);
   }
 
@@ -411,12 +412,12 @@
    *
    * @return the handler manager
    * */
-  HandlerManager ensureHandlers() {
+  com.google.gwt.event.shared.HandlerManager ensureHandlers() {
     return handlerManager == null ? handlerManager = createHandlerManager()
         : handlerManager;
   }
 
-  HandlerManager getHandlerManager() {
+  com.google.gwt.event.shared.HandlerManager getHandlerManager() {
     return handlerManager;
   }
 
diff --git a/user/src/com/google/web/bindery/event/Event.gwt.xml b/user/src/com/google/web/bindery/event/Event.gwt.xml
deleted file mode 100644
index 8bafd18..0000000
--- a/user/src/com/google/web/bindery/event/Event.gwt.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<!--
-  Copyright 2011 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.
--->
-<module>
-  <source path="shared" />
-</module>
diff --git a/user/src/com/google/web/bindery/event/shared/Event.java b/user/src/com/google/web/bindery/event/shared/Event.java
deleted file mode 100644
index 487771f..0000000
--- a/user/src/com/google/web/bindery/event/shared/Event.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-/**
- * Base Event object.
- * 
- * @param <H> interface implemented by handlers of this kind of event
- */
-public abstract class Event<H> {
-  /**
-   * Type class used to register events with an {@link EventBus}.
-   * 
-   * @param <H> handler type
-   */
-  public static class Type<H> {
-    private static int nextHashCode;
-    private final int index;
-
-    /**
-     * Constructor.
-     */
-    public Type() {
-      index = ++nextHashCode;
-    }
-
-    @Override
-    public final int hashCode() {
-      return index;
-    }
-
-    @Override
-    public String toString() {
-      return "Event type";
-    }
-  }
-
-  private Object source;
-
-  /**
-   * Constructor.
-   */
-  protected Event() {
-  }
-
-  /**
-   * Returns the {@link Type} used to register this event, allowing an
-   * {@link EventBus} to find handlers of the appropriate class.
-   * 
-   * @return the type
-   */
-  public abstract Type<H> getAssociatedType();
-
-  /**
-   * Returns the source for this event. The type and meaning of the source is
-   * arbitrary, and is most useful as a secondary key for handler registration.
-   * (See {@link EventBus#addHandlerToSource}, which allows a handler to
-   * register for events of a particular type, tied to a particular source.)
-   * <p>
-   * Note that the source is actually set at dispatch time, e.g. via
-   * {@link EventBus#fireEventFromSource(Event, Object)}.
-   * 
-   * @return object representing the source of this event
-   */
-  public Object getSource() {
-    return source;
-  }
-
-  /**
-   * This is a method used primarily for debugging. It gives a string
-   * representation of the event details. This does not override the toString
-   * method because the compiler cannot always optimize toString out correctly.
-   * Event types should override as desired.
-   * 
-   * @return a string representing the event's specifics.
-   */
-  public String toDebugString() {
-    String name = this.getClass().getName();
-    name = name.substring(name.lastIndexOf(".") + 1);
-    return "event: " + name + ":";
-  }
-
-  /**
-   * The toString() for abstract event is overridden to avoid accidently
-   * including class literals in the the compiled output. Use {@link Event}
-   * #toDebugString to get more information about the event.
-   */
-  @Override
-  public String toString() {
-    return "An event type";
-  }
-
-  /**
-   * Implemented by subclasses to to invoke their handlers in a type safe
-   * manner. Intended to be called by {@link EventBus#fireEvent(Event)} or
-   * {@link EventBus#fireEventFromSource(Event, Object)}.
-   * 
-   * @param handler handler
-   */
-  protected abstract void dispatch(H handler);
-
-  /**
-   * Set the source that triggered this event. Intended to be called by the
-   * {@link EventBus} during dispatch.
-   * 
-   * @param source the source of this event.
-   * @see EventBus#fireEventFromSource(Event, Object)
-   */
-  protected void setSource(Object source) {
-    this.source = source;
-  }
-}
diff --git a/user/src/com/google/web/bindery/event/shared/EventBus.java b/user/src/com/google/web/bindery/event/shared/EventBus.java
deleted file mode 100644
index 91ed3dc..0000000
--- a/user/src/com/google/web/bindery/event/shared/EventBus.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import com.google.web.bindery.event.shared.Event.Type;
-
-/**
- * Dispatches {@link Event}s to interested parties. Eases decoupling by allowing
- * objects to interact without having direct dependencies upon one another, and
- * without requiring event sources to deal with maintaining handler lists. There
- * will typically be one EventBus per application, broadcasting events that may
- * be of general interest.
- * 
- * @see SimpleEventBus
- * @see ResettableEventBus
- * @see com.google.web.bindery.event.shared.testing.CountingEventBus
- */
-public abstract class EventBus {
-
-  /**
-   * Adds an unfiltered handler to receive events of this type from all sources.
-   * <p>
-   * It is rare to call this method directly. More typically an {@link Event}
-   * subclass will provide a static <code>register</code> method, or a widget
-   * will accept handlers directly.
-   * 
-   * @param <H> The type of handler
-   * @param type the event type associated with this handler
-   * @param handler the handler
-   * @return the handler registration, can be stored in order to remove the
-   *         handler later
-   */
-  public abstract <H> HandlerRegistration addHandler(Type<H> type, H handler);
-
-  /**
-   * Adds a handler to receive events of this type from the given source.
-   * <p>
-   * It is rare to call this method directly. More typically a {@link Event}
-   * subclass will provide a static <code>register</code> method, or a widget
-   * will accept handlers directly.
-   * 
-   * @param <H> The type of handler
-   * @param type the event type associated with this handler
-   * @param source the source associated with this handler
-   * @param handler the handler
-   * @return the handler registration, can be stored in order to remove the
-   *         handler later
-   */
-  public abstract <H> HandlerRegistration addHandlerToSource(Type<H> type, Object source, H handler);
-
-  /**
-   * Fires the event from no source. Only unfiltered handlers will receive it.
-   * <p>
-   * Any exceptions thrown by handlers will be bundled into a
-   * {@link UmbrellaException} and then re-thrown after all handlers have
-   * completed. An exception thrown by a handler will not prevent other handlers
-   * from executing.
-   * 
-   * @throws UmbrellaException wrapping exceptions thrown by handlers
-   *
-   * @param event the event to fire
-   */
-  public abstract void fireEvent(Event<?> event);
-
-  /**
-   * Fires the given event to the handlers listening to the event's type.
-   * <p>
-   * Any exceptions thrown by handlers will be bundled into a
-   * {@link UmbrellaException} and then re-thrown after all handlers have
-   * completed. An exception thrown by a handler will not prevent other handlers
-   * from executing.
-   * 
-   * @throws UmbrellaException wrapping exceptions thrown by handlers
-   * 
-   * @param event the event to fire
-   */
-  public abstract void fireEventFromSource(Event<?> event, Object source);
-}
diff --git a/user/src/com/google/web/bindery/event/shared/HandlerRegistration.java b/user/src/com/google/web/bindery/event/shared/HandlerRegistration.java
deleted file mode 100644
index ce34e39..0000000
--- a/user/src/com/google/web/bindery/event/shared/HandlerRegistration.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-/**
- * Registration objects returned when an event handler is bound (e.g. via
- * {@link EventBus#addHandler}), used to deregister.
- * <p>
- * A tip: to make a handler deregister itself try something like the following:
- * <code><pre>new MyHandler() {
- *  HandlerRegistration reg = MyEvent.register(eventBus, this);
- * 
- *  public void onMyThing(MyEvent event) {
- *    {@literal /}* do your thing *{@literal /}
- *    reg.removeHandler();
- *  }
- * };
- * </pre></code>
- */
-public interface HandlerRegistration {
-
-  /**
-   * Deregisters the handler associated with this registration object if the
-   * handler is still attached to the event source. If the handler is no longer
-   * attached to the event source, this is a no-op.
-   */
-  void removeHandler();
-}
diff --git a/user/src/com/google/web/bindery/event/shared/ResettableEventBus.java b/user/src/com/google/web/bindery/event/shared/ResettableEventBus.java
deleted file mode 100644
index a1b56ce..0000000
--- a/user/src/com/google/web/bindery/event/shared/ResettableEventBus.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import com.google.web.bindery.event.shared.Event.Type;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * Wraps an EventBus to hold on to any HandlerRegistrations, so that they can
- * easily all be cleared at once.
- */
-public class ResettableEventBus extends EventBus {
-  private final EventBus wrapped;
-  private final Set<HandlerRegistration> registrations = new HashSet<HandlerRegistration>();
-
-  public ResettableEventBus(EventBus wrappedBus) {
-    this.wrapped = wrappedBus;
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    HandlerRegistration rtn = wrapped.addHandler(type, handler);
-    return doRegisterHandler(rtn);
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandlerToSource(Event.Type<H> type, Object source, H handler) {
-    HandlerRegistration rtn = wrapped.addHandlerToSource(type, source, handler);
-    return doRegisterHandler(rtn);
-  }
-
-  @Override
-  public void fireEvent(Event<?> event) {
-    wrapped.fireEvent(event);
-  }
-
-  @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    wrapped.fireEventFromSource(event, source);
-  }
-
-  /**
-   * Remove all handlers that have been added through this wrapper.
-   */
-  public void removeHandlers() {
-    Iterator<HandlerRegistration> it = registrations.iterator();
-    while (it.hasNext()) {
-      HandlerRegistration r = it.next();
-
-      /*
-       * must remove before we call removeHandler. Might have come from nested
-       * ResettableEventBus
-       */
-      it.remove();
-
-      r.removeHandler();
-    }
-  }
-
-  /**
-   *  Visible for testing
-   */
-  protected int getRegistrationSize() {
-    return registrations.size();
-  }
-
-  private HandlerRegistration doRegisterHandler(final HandlerRegistration registration) {
-    registrations.add(registration);
-    return new HandlerRegistration() {
-      public void removeHandler() {
-        doUnregisterHandler(registration);
-      }
-    };
-  }
-
-  private void doUnregisterHandler(HandlerRegistration registration) {
-    if (registrations.contains(registration)) {
-      registration.removeHandler();
-      registrations.remove(registration);
-    }
-  }
-}
diff --git a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java b/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
deleted file mode 100644
index 14a1f3c..0000000
--- a/user/src/com/google/web/bindery/event/shared/SimpleEventBus.java
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import com.google.web.bindery.event.shared.Event.Type;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.ListIterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Basic implementation of {@link EventBus}.
- */
-public class SimpleEventBus extends EventBus {
-  private interface Command {
-    void execute();
-  }
-
-  private final boolean isReverseOrder;
-
-  private int firingDepth = 0;
-
-  /**
-   * Add and remove operations received during dispatch.
-   */
-  private List<Command> deferredDeltas;
-
-  /**
-   * Map of event type to map of event source to list of their handlers.
-   */
-  private final Map<Event.Type<?>, Map<Object, List<?>>> map =
-      new HashMap<Event.Type<?>, Map<Object, List<?>>>();
-
-  public SimpleEventBus() {
-    this(false);
-  }
-
-  /**
-   * Allows creation of an instance that fires its handlers in the reverse of
-   * the order in which they were added, although filtered handlers all fire
-   * before unfiltered handlers.
-   * <p>
-   * 
-   * @deprecated This is a legacy feature, required by GWT's old HandlerManager.
-   *             Reverse order is not honored for handlers tied to a specific
-   *             event source (via {@link #addHandlerToSource}.
-   */
-  @Deprecated
-  protected SimpleEventBus(boolean fireInReverseOrder) {
-    isReverseOrder = fireInReverseOrder;
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    return doAdd(type, null, handler);
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandlerToSource(final Event.Type<H> type, final Object source,
-      final H handler) {
-    if (source == null) {
-      throw new NullPointerException("Cannot add a handler with a null source");
-    }
-
-    return doAdd(type, source, handler);
-  }
-
-  @Override
-  public void fireEvent(Event<?> event) {
-    doFire(event, null);
-  }
-
-  @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    if (source == null) {
-      throw new NullPointerException("Cannot fire from a null source");
-    }
-    doFire(event, source);
-  }
-
-  /**
-   * @deprecated required by legacy features in GWT's old HandlerManager
-   */
-  @Deprecated
-  protected <H> void doRemove(Event.Type<H> type, Object source, H handler) {
-    if (firingDepth > 0) {
-      enqueueRemove(type, source, handler);
-    } else {
-      doRemoveNow(type, source, handler);
-    }
-  }
-
-  /**
-   * @deprecated required by legacy features in GWT's old HandlerManager
-   */
-  @Deprecated
-  protected <H> H getHandler(Event.Type<H> type, int index) {
-    assert index < getHandlerCount(type) : "handlers for " + type.getClass() + " have size: "
-        + getHandlerCount(type) + " so do not have a handler at index: " + index;
-
-    List<H> l = getHandlerList(type, null);
-    return l.get(index);
-  }
-
-  /**
-   * @deprecated required by legacy features in GWT's old HandlerManager
-   */
-  @Deprecated
-  protected int getHandlerCount(Event.Type<?> eventKey) {
-    return getHandlerList(eventKey, null).size();
-  }
-
-  /**
-   * @deprecated required by legacy features in GWT's old HandlerManager
-   */
-  @Deprecated
-  protected boolean isEventHandled(Event.Type<?> eventKey) {
-    return map.containsKey(eventKey);
-  }
-
-  private void defer(Command command) {
-    if (deferredDeltas == null) {
-      deferredDeltas = new ArrayList<Command>();
-    }
-    deferredDeltas.add(command);
-  }
-
-  private <H> HandlerRegistration doAdd(final Event.Type<H> type, final Object source,
-      final H handler) {
-    if (type == null) {
-      throw new NullPointerException("Cannot add a handler with a null type");
-    }
-    if (handler == null) {
-      throw new NullPointerException("Cannot add a null handler");
-    }
-
-    if (firingDepth > 0) {
-      enqueueAdd(type, source, handler);
-    } else {
-      doAddNow(type, source, handler);
-    }
-
-    return new HandlerRegistration() {
-      public void removeHandler() {
-        doRemove(type, source, handler);
-      }
-    };
-  }
-
-  private <H> void doAddNow(Event.Type<H> type, Object source, H handler) {
-    List<H> l = ensureHandlerList(type, source);
-    l.add(handler);
-  }
-
-  private <H> void doFire(Event<H> event, Object source) {
-    if (event == null) {
-      throw new NullPointerException("Cannot fire null event");
-    }
-    try {
-      firingDepth++;
-
-      if (source != null) {
-        event.setSource(source);
-      }
-
-      List<H> handlers = getDispatchList(event.getAssociatedType(), source);
-      Set<Throwable> causes = null;
-
-      ListIterator<H> it =
-          isReverseOrder ? handlers.listIterator(handlers.size()) : handlers.listIterator();
-      while (isReverseOrder ? it.hasPrevious() : it.hasNext()) {
-        H handler = isReverseOrder ? it.previous() : it.next();
-
-        try {
-          event.dispatch(handler);
-        } catch (Throwable e) {
-          if (causes == null) {
-            causes = new HashSet<Throwable>();
-          }
-          causes.add(e);
-        }
-      }
-
-      if (causes != null) {
-        throw new UmbrellaException(causes);
-      }
-    } finally {
-      firingDepth--;
-      if (firingDepth == 0) {
-        handleQueuedAddsAndRemoves();
-      }
-    }
-  }
-
-  private <H> void doRemoveNow(Event.Type<H> type, Object source, H handler) {
-    List<H> l = getHandlerList(type, source);
-
-    boolean removed = l.remove(handler);
-    assert removed : "redundant remove call";
-    if (removed && l.isEmpty()) {
-      prune(type, source);
-    }
-  }
-
-  private <H> void enqueueAdd(final Event.Type<H> type, final Object source, final H handler) {
-    defer(new Command() {
-      public void execute() {
-        doAddNow(type, source, handler);
-      }
-    });
-  }
-
-  private <H> void enqueueRemove(final Event.Type<H> type, final Object source, final H handler) {
-    defer(new Command() {
-      public void execute() {
-        doRemoveNow(type, source, handler);
-      }
-    });
-  }
-
-  private <H> List<H> ensureHandlerList(Event.Type<H> type, Object source) {
-    Map<Object, List<?>> sourceMap = map.get(type);
-    if (sourceMap == null) {
-      sourceMap = new HashMap<Object, List<?>>();
-      map.put(type, sourceMap);
-    }
-
-    // safe, we control the puts.
-    @SuppressWarnings("unchecked")
-    List<H> handlers = (List<H>) sourceMap.get(source);
-    if (handlers == null) {
-      handlers = new ArrayList<H>();
-      sourceMap.put(source, handlers);
-    }
-
-    return handlers;
-  }
-
-  private <H> List<H> getDispatchList(Event.Type<H> type, Object source) {
-    List<H> directHandlers = getHandlerList(type, source);
-    if (source == null) {
-      return directHandlers;
-    }
-
-    List<H> globalHandlers = getHandlerList(type, null);
-
-    List<H> rtn = new ArrayList<H>(directHandlers);
-    rtn.addAll(globalHandlers);
-    return rtn;
-  }
-
-  private <H> List<H> getHandlerList(Event.Type<H> type, Object source) {
-    Map<Object, List<?>> sourceMap = map.get(type);
-    if (sourceMap == null) {
-      return Collections.emptyList();
-    }
-
-    // safe, we control the puts.
-    @SuppressWarnings("unchecked")
-    List<H> handlers = (List<H>) sourceMap.get(source);
-    if (handlers == null) {
-      return Collections.emptyList();
-    }
-
-    return handlers;
-  }
-
-  private void handleQueuedAddsAndRemoves() {
-    if (deferredDeltas != null) {
-      try {
-        for (Command c : deferredDeltas) {
-          c.execute();
-        }
-      } finally {
-        deferredDeltas = null;
-      }
-    }
-  }
-
-  private void prune(Event.Type<?> type, Object source) {
-    Map<Object, List<?>> sourceMap = map.get(type);
-
-    List<?> pruned = sourceMap.remove(source);
-
-    assert pruned != null : "Can't prune what wasn't there";
-    assert pruned.isEmpty() : "Pruned unempty list!";
-
-    if (sourceMap.isEmpty()) {
-      map.remove(type);
-    }
-  }
-}
\ No newline at end of file
diff --git a/user/src/com/google/web/bindery/event/shared/UmbrellaException.java b/user/src/com/google/web/bindery/event/shared/UmbrellaException.java
deleted file mode 100644
index 3ed254b..0000000
--- a/user/src/com/google/web/bindery/event/shared/UmbrellaException.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * A {@link RuntimeException} that collects a {@link Set} of child
- * {@link Throwable}s together. Typically thrown after a loop, with all of the
- * exceptions thrown during that loop, but delayed so that the loop finishes
- * executing.
- */
-public class UmbrellaException extends RuntimeException {
-
-  private static final String MSG =
-      "One or more exceptions caught, see full set in UmbrellaException#getCauses";
-  /**
-   * The causes of the exception.
-   */
-  private Set<Throwable> causes;
-
-  public UmbrellaException(Set<Throwable> causes) {
-    super(MSG, causes.size() == 0 ? null : causes.toArray(new Throwable[0])[0]);
-    this.causes = causes;
-  }
-
-  /**
-   * Required for GWT RPC serialization.
-   */
-  protected UmbrellaException() {
-    // Can't delegate to the other constructor or GWT RPC gets cranky
-    super(MSG);
-    this.causes = Collections.<Throwable> emptySet();
-  }
-
-  /**
-   * Get the set of exceptions that caused the failure.
-   * 
-   * @return the set of causes
-   */
-  public Set<Throwable> getCauses() {
-    return causes;
-  }
-}
diff --git a/user/src/com/google/web/bindery/event/shared/testing/CountingEventBus.java b/user/src/com/google/web/bindery/event/shared/testing/CountingEventBus.java
deleted file mode 100644
index 4b657a4..0000000
--- a/user/src/com/google/web/bindery/event/shared/testing/CountingEventBus.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared.testing;
-
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.Event.Type;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
-import com.google.web.bindery.event.shared.SimpleEventBus;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Wraps an {@link EventBus} to keep a count of registered handlers. Handy for
- * tests.
- */
-public class CountingEventBus extends EventBus {
-  private final Map<Type<?>, Integer> counts = new HashMap<Event.Type<?>, Integer>();
-  private final EventBus wrapped;
-
-  public CountingEventBus() {
-    this(new SimpleEventBus());
-  }
-
-  public CountingEventBus(EventBus wrapped) {
-    this.wrapped = wrapped;
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
-    increment(type);
-    final HandlerRegistration superReg = wrapped.addHandler(type, handler);
-    return makeReg(type, superReg);
-  }
-
-  @Override
-  public <H> HandlerRegistration addHandlerToSource(final Type<H> type, Object source, H handler) {
-    increment(type);
-    final HandlerRegistration superReg = wrapped.addHandlerToSource(type, source, handler);
-    return makeReg(type, superReg);
-  }
-
-  @Override
-  public void fireEvent(Event<?> event) {
-    wrapped.fireEvent(event);
-  }
-
-  @Override
-  public void fireEventFromSource(Event<?> event, Object source) {
-    wrapped.fireEventFromSource(event, source);
-  }
-
-  public int getCount(Type<?> type) {
-    Integer count = counts.get(type);
-    return count == null ? 0 : count;
-  }
-
-  private void decrement(Type<?> type) {
-    counts.put(type, getCount(type) - 1);
-  }
-
-  private <H> void increment(final Type<H> type) {
-    counts.put(type, getCount(type) + 1);
-  }
-
-  private <H> HandlerRegistration makeReg(final Type<H> type, final HandlerRegistration superReg) {
-    return new HandlerRegistration() {
-      public void removeHandler() {
-        decrement(type);
-        superReg.removeHandler();
-      }
-    };
-  }
-}
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryEditorDriver.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryEditorDriver.java
index e5535e2..4b25470 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryEditorDriver.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryEditorDriver.java
@@ -17,7 +17,7 @@
 
 import com.google.gwt.editor.client.Editor;
 import com.google.gwt.editor.client.EditorDriver;
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.shared.RequestContext;
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
 import com.google.web.bindery.requestfactory.shared.Violation;
@@ -87,15 +87,6 @@
   String[] getPaths();
 
   /**
-   * Initializes a driver that will not be able to support subscriptions. Calls
-   * to {@link com.google.gwt.editor.client.EditorDelegate#subscribe()} will do
-   * nothing.
-   * 
-   * @param editor an {@link Editor} of type E
-   */
-  void initialize(E editor);
-
-  /**
    * Overload of {@link #initialize(RequestFactory, Editor)} to allow a modified
    * {@link EventBus} to be monitored for subscription services.
    * 
@@ -120,6 +111,15 @@
   void initialize(RequestFactory requestFactory, E editor);
 
   /**
+   * Initializes a driver that will not be able to support subscriptions. Calls
+   * to {@link com.google.gwt.editor.client.EditorDelegate#subscribe()} will do
+   * nothing.
+   * 
+   * @param editor an {@link Editor} of type E
+   */
+  void initialize(E editor);
+
+  /**
    * Show Violations returned from an attempt to submit a request. The
    * violations will be converted into
    * {@link com.google.gwt.editor.client.EditorError EditorError} objects whose
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractClientRequestFactory.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractClientRequestFactory.java
index b122674..15267b7 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractClientRequestFactory.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractClientRequestFactory.java
@@ -15,7 +15,7 @@
  */
 package com.google.web.bindery.requestfactory.gwt.client.impl;
 
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.gwt.client.DefaultRequestTransport;
 import com.google.web.bindery.requestfactory.shared.impl.AbstractRequestFactory;
 
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
index 94f71ba..df21135 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/AbstractRequestFactoryEditorDriver.java
@@ -25,7 +25,7 @@
 import com.google.gwt.editor.client.impl.DelegateMap;
 import com.google.gwt.editor.client.impl.DelegateMap.KeyMethod;
 import com.google.gwt.editor.client.impl.SimpleViolation;
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.gwt.client.HasRequestContext;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/RequestFactoryEditorDelegate.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/RequestFactoryEditorDelegate.java
index 1acfcd3..7b8b3af 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/RequestFactoryEditorDelegate.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/impl/RequestFactoryEditorDelegate.java
@@ -18,8 +18,8 @@
 import com.google.gwt.editor.client.Editor;
 import com.google.gwt.editor.client.impl.AbstractEditorDelegate;
 import com.google.gwt.editor.client.impl.Refresher;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.web.bindery.requestfactory.shared.BaseProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
diff --git a/user/src/com/google/web/bindery/requestfactory/gwt/client/testing/MockRequestFactoryEditorDriver.java b/user/src/com/google/web/bindery/requestfactory/gwt/client/testing/MockRequestFactoryEditorDriver.java
index 5cc2223..98da89c 100644
--- a/user/src/com/google/web/bindery/requestfactory/gwt/client/testing/MockRequestFactoryEditorDriver.java
+++ b/user/src/com/google/web/bindery/requestfactory/gwt/client/testing/MockRequestFactoryEditorDriver.java
@@ -18,7 +18,7 @@
 import com.google.gwt.editor.client.Editor;
 import com.google.gwt.editor.client.EditorError;
 import com.google.gwt.editor.client.EditorVisitor;
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;
 import com.google.web.bindery.requestfactory.shared.RequestContext;
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
diff --git a/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryJarExtractor.java b/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryJarExtractor.java
index f1e4718..d3d609c 100644
--- a/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryJarExtractor.java
+++ b/user/src/com/google/web/bindery/requestfactory/server/RequestFactoryJarExtractor.java
@@ -30,7 +30,7 @@
 import com.google.gwt.dev.asm.commons.Method;
 import com.google.gwt.dev.util.Name;
 import com.google.gwt.dev.util.Util;
-import com.google.web.bindery.event.shared.SimpleEventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.server.RequestFactoryInterfaceValidator.ClassLoaderLoader;
 import com.google.web.bindery.requestfactory.server.RequestFactoryInterfaceValidator.ErrorContext;
 import com.google.web.bindery.requestfactory.server.RequestFactoryInterfaceValidator.Loader;
@@ -529,7 +529,7 @@
       typeName = type.getClassName();
     }
 
-    public State call() {
+    public State call() throws Exception {
       ClassWriter writer = new ClassWriter(0);
       ClassVisitor cv = writer;
       cv = new ClassProcessor(typeName, cv, state);
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/EntityProxyChange.java b/user/src/com/google/web/bindery/requestfactory/shared/EntityProxyChange.java
index ab013cb..c146efb 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/EntityProxyChange.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/EntityProxyChange.java
@@ -15,9 +15,10 @@
  */
 package com.google.web.bindery.requestfactory.shared;
 
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.event.shared.HandlerRegistration;
 
 /**
  * Event posted by a {@link RequestFactory} when changes to an entity are
@@ -35,14 +36,14 @@
  * @see RequestFactory#find(EntityProxyId)
  */
 public class EntityProxyChange<P extends EntityProxy> extends
-    Event<EntityProxyChange.Handler<P>> {
+    GwtEvent<EntityProxyChange.Handler<P>> {
 
   /**
    * Implemented by methods that handle EntityProxyChange events.
    *
    * @param <P> the proxy type
    */
-  public interface Handler<P extends EntityProxy> {
+  public interface Handler<P extends EntityProxy> extends EventHandler {
     /**
      * Called when an {@link EntityProxyChange} event is fired.
      *
@@ -86,11 +87,11 @@
   /**
    * Returns the type associated with this instance.
    *
-   * @return an instance of {@link Event.Type Type} of type Handler&lt;P&gt
+   * @return an instance of {@link com.google.gwt.event.shared.GwtEvent.Type Type} of type Handler&lt;P&gt
    */
   @SuppressWarnings({"unchecked", "rawtypes"})
   @Override
-  public Event.Type<Handler<P>> getAssociatedType() {
+  public GwtEvent.Type<Handler<P>> getAssociatedType() {
     /*
      * The instance knows its handler is of type P, but the TYPE field itself
      * does not, so we have to do an unsafe cast here.
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java b/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
index c265cd9..7f66954 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/RequestFactory.java
@@ -15,7 +15,7 @@
  */
 package com.google.web.bindery.requestfactory.shared;
 
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 
 /**
  * Marker interface for the RequestFactory code generator.
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
index 0e10a3a..dd61fa2 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestContext.java
@@ -29,7 +29,7 @@
 import com.google.web.bindery.autobean.shared.impl.AbstractAutoBean;
 import com.google.web.bindery.autobean.shared.impl.EnumMap;
 import com.google.web.bindery.autobean.shared.impl.StringQuoter;
-import com.google.web.bindery.event.shared.UmbrellaException;
+import com.google.gwt.event.shared.UmbrellaException;
 import com.google.web.bindery.requestfactory.shared.BaseProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
diff --git a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestFactory.java b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestFactory.java
index 4b3d69e..a13e62d 100644
--- a/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestFactory.java
+++ b/user/src/com/google/web/bindery/requestfactory/shared/impl/AbstractRequestFactory.java
@@ -16,7 +16,7 @@
 package com.google.web.bindery.requestfactory.shared.impl;
 
 import com.google.web.bindery.autobean.shared.AutoBeanFactory;
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 import com.google.web.bindery.requestfactory.shared.ProxySerializer;
diff --git a/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestFactory.java b/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestFactory.java
index d9129c3..3d931ca 100644
--- a/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestFactory.java
+++ b/user/src/com/google/web/bindery/requestfactory/vm/InProcessRequestFactory.java
@@ -19,7 +19,7 @@
 import com.google.web.bindery.autobean.shared.AutoBeanFactory.Category;
 import com.google.web.bindery.autobean.shared.AutoBeanFactory.NoWrap;
 import com.google.web.bindery.autobean.vm.AutoBeanFactorySource;
-import com.google.web.bindery.event.shared.EventBus;
+import com.google.gwt.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.shared.BaseProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
@@ -27,11 +27,11 @@
 import com.google.web.bindery.requestfactory.shared.RequestContext;
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
 import com.google.web.bindery.requestfactory.shared.ValueProxy;
-import com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.Dialect;
 import com.google.web.bindery.requestfactory.shared.impl.AbstractRequestFactory;
 import com.google.web.bindery.requestfactory.shared.impl.BaseProxyCategory;
 import com.google.web.bindery.requestfactory.shared.impl.EntityProxyCategory;
 import com.google.web.bindery.requestfactory.shared.impl.ValueProxyCategory;
+import com.google.web.bindery.requestfactory.shared.impl.AbstractRequestContext.Dialect;
 import com.google.web.bindery.requestfactory.vm.InProcessRequestContext.RequestContextHandler;
 
 import java.lang.reflect.InvocationHandler;
diff --git a/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java b/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
index ea4ba53..7287d92 100644
--- a/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
+++ b/user/test/com/google/gwt/activity/shared/ActivityManagerTest.java
@@ -15,16 +15,17 @@
  */
 package com.google.gwt.activity.shared;
 
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.EventHandler;
+import com.google.gwt.event.shared.GwtEvent;
+import com.google.gwt.event.shared.UmbrellaException;
+import com.google.gwt.event.shared.testing.CountingEventBus;
 import com.google.gwt.place.shared.Place;
 import com.google.gwt.place.shared.PlaceChangeEvent;
 import com.google.gwt.place.shared.PlaceChangeRequestEvent;
 import com.google.gwt.user.client.ui.AcceptsOneWidget;
 import com.google.gwt.user.client.ui.IsWidget;
 import com.google.gwt.user.client.ui.Widget;
-import com.google.web.bindery.event.shared.Event;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.UmbrellaException;
-import com.google.web.bindery.event.shared.testing.CountingEventBus;
 
 import junit.framework.TestCase;
 
@@ -48,11 +49,11 @@
     }
   }
 
-  private static class MyEvent extends Event<Handler> {
-    private static Event.Type<Handler> TYPE = new Event.Type<Handler>();
+  private static class Event extends GwtEvent<Handler> {
+    private static GwtEvent.Type<EventHandler> TYPE = new GwtEvent.Type<EventHandler>();
 
     @Override
-    public Event.Type<Handler> getAssociatedType() {
+    public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
       throw new UnsupportedOperationException("Auto-generated method stub");
     }
 
@@ -62,7 +63,7 @@
     }
   }
 
-  private static class Handler {
+  private static class Handler implements EventHandler {
   };
 
   private static class MyDisplay implements AcceptsOneWidget {
@@ -260,29 +261,29 @@
   public void testDropHandlersOnStop() {
     manager.setDisplay(realDisplay);
 
-    assertEquals(0, eventBus.getCount(MyEvent.TYPE));
+    assertEquals(0, eventBus.getCount(Event.TYPE));
 
     activity1 = new SyncActivity(null) {
       @Override
       public void start(AcceptsOneWidget panel, EventBus eventBus) {
         super.start(panel, eventBus);
-        bus.addHandler(MyEvent.TYPE, new Handler());
+        bus.addHandler(Event.TYPE, new Handler());
       }
 
       @Override
       public void onStop() {
         super.onStop();
-        bus.addHandler(MyEvent.TYPE, new Handler());
+        bus.addHandler(Event.TYPE, new Handler());
       }
     };
 
     PlaceChangeEvent event = new PlaceChangeEvent(place1);
     eventBus.fireEvent(event);
-    assertEquals(1, eventBus.getCount(MyEvent.TYPE));
+    assertEquals(1, eventBus.getCount(Event.TYPE));
 
     event = new PlaceChangeEvent(place2);
     eventBus.fireEvent(event);
-    assertEquals(0, eventBus.getCount(MyEvent.TYPE));
+    assertEquals(0, eventBus.getCount(Event.TYPE));
 
     // Make sure we didn't nuke the ActivityManager's own handlers
     assertEquals(1, eventBus.getCount(PlaceChangeEvent.TYPE));
@@ -309,12 +310,12 @@
       @Override
       public void start(AcceptsOneWidget panel, EventBus eventBus) {
         super.start(panel, eventBus);
-        bus.addHandler(MyEvent.TYPE, new Handler());
+        bus.addHandler(Event.TYPE, new Handler());
       }
       @Override
       public void onStop() {
         super.onStop();
-        bus.addHandler(MyEvent.TYPE, new Handler());
+        bus.addHandler(Event.TYPE, new Handler());
         throw new UnsupportedOperationException("Auto-generated method stub");
       }
     };
@@ -332,7 +333,7 @@
     try {
       PlaceChangeEvent event = new PlaceChangeEvent(place1);
       eventBus.fireEvent(event);
-      assertEquals(1, eventBus.getCount(MyEvent.TYPE));
+      assertEquals(1, eventBus.getCount(Event.TYPE));
 
       event = new PlaceChangeEvent(place2);
       eventBus.fireEvent(event);
@@ -348,7 +349,7 @@
 
     assertTrue(activity1.stopped);
     assertNotNull(activity2.display);
-    assertEquals(0, eventBus.getCount(MyEvent.TYPE));
+    assertEquals(0, eventBus.getCount(Event.TYPE));
   }
   
   /**
diff --git a/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java b/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
index 5746f56..1f1e329 100644
--- a/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
+++ b/user/test/com/google/gwt/editor/rebind/model/EditorModelTest.java
@@ -38,9 +38,9 @@
 import com.google.gwt.editor.client.LeafValueEditor;
 import com.google.gwt.editor.client.ValueAwareEditor;
 import com.google.gwt.editor.client.adapters.SimpleEditor;
+import com.google.gwt.event.shared.EventBus;
 import com.google.gwt.user.client.TakesValue;
 import com.google.gwt.user.client.ui.HasText;
-import com.google.web.bindery.event.shared.EventBus;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryEditorDriver;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
 import com.google.web.bindery.requestfactory.shared.Request;
@@ -503,7 +503,6 @@
     assertNull(editorField.getSetterName());
   }
 
-  @SuppressWarnings("deprecation")
   private Set<Resource> getJavaResources() {
     MockJavaResource[] javaFiles = {new MockJavaResource("t.AddressProxy") {
       @Override
@@ -945,7 +944,6 @@
         new RealJavaResource(EditorError.class),
         new EmptyMockJavaResource(EntityProxy.class),
         new EmptyMockJavaResource(EventBus.class),
-        new EmptyMockJavaResource(com.google.gwt.event.shared.EventBus.class),
         new EmptyMockJavaResource(HasEditorDelegate.class),
         new EmptyMockJavaResource(HasEditorErrors.class),
         new RealJavaResource(HasText.class),
diff --git a/user/test/com/google/gwt/event/shared/HandlerManagerTest.java b/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
index b003e32..7b96e17 100644
--- a/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
+++ b/user/test/com/google/gwt/event/shared/HandlerManagerTest.java
@@ -27,6 +27,7 @@
  * Handler manager test. Very redundant with {@link SimpleEventBusTest}, but
  * preserved to guard against regressions.
  */
+@SuppressWarnings("deprecation")
 public class HandlerManagerTest extends HandlerTestBase {
 
   public void testAddAndRemoveHandlers() {
@@ -351,7 +352,6 @@
     assertFired(mouse1, mouse2, mouse3);
   }
   
-  @SuppressWarnings("deprecation")
   public void testNullSourceOkay() {
     SimpleEventBus reg = new SimpleEventBus();
     
diff --git a/user/test/com/google/gwt/event/shared/ResettableEventBusTest.java b/user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
index 0044a4c..9e14a8d 100644
--- a/user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
+++ b/user/test/com/google/gwt/event/shared/ResettableEventBusTest.java
@@ -24,7 +24,6 @@
  * Eponymous unit test.
  */
 public class ResettableEventBusTest extends HandlerTestBase {
-
   public void testSimple() {
     CountingEventBus wrapped = new CountingEventBus();
     ResettableEventBus subject = new ResettableEventBus(wrapped);
diff --git a/user/test/com/google/gwt/event/shared/SimpleEventBusTest.java b/user/test/com/google/gwt/event/shared/SimpleEventBusTest.java
index 944cd77..3221e83 100644
--- a/user/test/com/google/gwt/event/shared/SimpleEventBusTest.java
+++ b/user/test/com/google/gwt/event/shared/SimpleEventBusTest.java
@@ -17,22 +17,82 @@
 package com.google.gwt.event.shared;
 
 import com.google.gwt.core.client.Scheduler.ScheduledCommand;
+import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.DomEvent.Type;
 import com.google.gwt.event.dom.client.MouseDownEvent;
 import com.google.gwt.event.dom.client.MouseDownHandler;
+import com.google.gwt.event.shared.testing.CountingEventBus;
 
 import junit.framework.AssertionFailedError;
 
 import java.util.Set;
 
 /**
- * Eponymous unit test. Redundant with
- * {@link com.google.web.bindery.event.shared.SimpleEventBusTest}, here to
- * ensure legacy compatibility.
+ * Eponymous unit test.
  */
-@SuppressWarnings("deprecation")
 public class SimpleEventBusTest extends HandlerTestBase {
 
+  public void testAddAndRemoveHandlers() {
+    CountingEventBus eventBus = new CountingEventBus(new SimpleEventBus());
+    eventBus.addHandler(MouseDownEvent.getType(), mouse1);
+    eventBus.addHandler(MouseDownEvent.getType(), mouse2);
+    HandlerRegistration reg1 = eventBus.addHandler(MouseDownEvent.getType(),
+        adaptor1);
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertEquals(3, eventBus.getCount(MouseDownEvent.getType()));
+    assertFired(mouse1, mouse2, adaptor1);
+    eventBus.addHandler(MouseDownEvent.getType(), mouse3);
+    assertEquals(4, eventBus.getCount(MouseDownEvent.getType()));
+
+    eventBus.addHandler(MouseDownEvent.getType(), mouse1);
+    eventBus.addHandler(MouseDownEvent.getType(), mouse2);
+    HandlerRegistration reg2 = eventBus.addHandler(MouseDownEvent.getType(),
+        adaptor1);
+
+    /*
+     * You can indeed add handlers twice, they will only be removed one at a
+     * time though.
+     */
+    assertEquals(7, eventBus.getCount(MouseDownEvent.getType()));
+    eventBus.addHandler(ClickEvent.getType(), adaptor1);
+    eventBus.addHandler(ClickEvent.getType(), click1);
+    eventBus.addHandler(ClickEvent.getType(), click2);
+
+    assertEquals(7, eventBus.getCount(MouseDownEvent.getType()));
+    assertEquals(3, eventBus.getCount(ClickEvent.getType()));
+
+    reset();
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(mouse1, mouse2, mouse3, adaptor1);
+    assertNotFired(click1, click2);
+
+    // Gets rid of first instance.
+    reg1.removeHandler();
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(mouse1, mouse2, mouse3, adaptor1);
+    assertNotFired(click1, click2);
+
+    // Gets rid of second instance.
+    reg2.removeHandler();
+    reset();
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+
+    assertFired(mouse1, mouse2, mouse3);
+    assertNotFired(adaptor1, click1, click2);
+
+    // Checks to see if click events are still working.
+    reset();
+    eventBus.fireEvent(new ClickEvent() {
+    });
+
+    assertNotFired(mouse1, mouse2, mouse3);
+    assertFired(click1, click2, adaptor1);
+  }
+
   public void testConcurrentAdd() {
     final SimpleEventBus eventBus = new SimpleEventBus();
     final MouseDownHandler two = new MouseDownHandler() {
@@ -70,6 +130,26 @@
     }
   }
 
+  public void testConcurrentRemove() {
+    final SimpleEventBus eventBus = new SimpleEventBus();
+
+    ShyHandler h = new ShyHandler();
+
+    eventBus.addHandler(MouseDownEvent.getType(), mouse1);
+    h.r = eventBus.addHandler(MouseDownEvent.getType(), h);
+    eventBus.addHandler(MouseDownEvent.getType(), mouse2);
+    eventBus.addHandler(MouseDownEvent.getType(), mouse3);
+
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(h, mouse1, mouse2, mouse3);
+    reset();
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(mouse1, mouse2, mouse3);
+    assertNotFired(h);
+  }
+
   class SourcedHandler implements MouseDownHandler {
     final String expectedSource;
 
@@ -231,6 +311,109 @@
     assertNotFired(two);
   }
 
+  public void testRemoveSelf() {
+    final SimpleEventBus eventBus = new SimpleEventBus();
+
+    MouseDownHandler h = new MouseDownHandler() {
+      HandlerRegistration reg = eventBus.addHandler(MouseDownEvent.getType(),
+          this);
+
+      public void onMouseDown(MouseDownEvent event) {
+        add(this);
+        reg.removeHandler();
+      }
+    };
+
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(h);
+
+    reset();
+
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertNotFired(h);
+  }
+
+  public void testNoDoubleRemove() {
+    final SimpleEventBus eventBus = new SimpleEventBus();
+    HandlerRegistration reg = eventBus.addHandler(MouseDownEvent.getType(),
+        mouse1);
+    reg.removeHandler();
+
+    boolean assertsOn = getClass().desiredAssertionStatus();
+
+    if (assertsOn) {
+      try {
+        reg.removeHandler();
+        fail("Should have thrown on remove");
+      } catch (AssertionError e) { /* pass */
+      }
+    } else {
+      reg.removeHandler();
+      // Succeed on no assert failure
+    }
+  }
+
+  public void testConcurrentAddAfterRemoveIsNotClobbered() {
+    final SimpleEventBus eventBus = new SimpleEventBus();
+
+    MouseDownHandler one = new MouseDownHandler() {
+      HandlerRegistration reg = addIt();
+
+      public void onMouseDown(MouseDownEvent event) {
+        reg.removeHandler();
+        addIt();
+        add(this);
+      }
+
+      private HandlerRegistration addIt() {
+        return eventBus.addHandler(MouseDownEvent.getType(), mouse1);
+      }
+    };
+
+    eventBus.addHandler(MouseDownEvent.getType(), one);
+
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(one);
+
+    reset();
+
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(one, mouse1);
+  }
+
+  public void testReverseOrder() {
+    @SuppressWarnings("deprecation")
+    final SimpleEventBus eventBus = new SimpleEventBus(true);
+    final MouseDownHandler handler0 = new MouseDownHandler() {
+      public void onMouseDown(MouseDownEvent event) {
+        add(this);
+      }
+    };
+    final MouseDownHandler handler1 = new MouseDownHandler() {
+      public void onMouseDown(MouseDownEvent event) {
+        assertNotFired(handler0);
+        add(this);
+      }
+    };
+    final MouseDownHandler handler2 = new MouseDownHandler() {
+      public void onMouseDown(MouseDownEvent event) {
+        assertNotFired(handler0, handler1);
+        add(this);
+      }
+    };
+    eventBus.addHandler(MouseDownEvent.getType(), handler0);
+    eventBus.addHandler(MouseDownEvent.getType(), handler1);
+    eventBus.addHandler(MouseDownEvent.getType(), handler2);
+
+    reset();
+    eventBus.fireEvent(new MouseDownEvent() {
+    });
+    assertFired(handler0, handler1, handler2);
+  }
 
   static class ThrowingHandler implements MouseDownHandler {
     private final RuntimeException e;
diff --git a/user/test/com/google/gwt/user/client/ui/WidgetTest.java b/user/test/com/google/gwt/user/client/ui/WidgetTest.java
index 8a2d482..9d78fd7 100644
--- a/user/test/com/google/gwt/user/client/ui/WidgetTest.java
+++ b/user/test/com/google/gwt/user/client/ui/WidgetTest.java
@@ -18,7 +18,6 @@
 import com.google.gwt.event.dom.client.ChangeEvent;
 import com.google.gwt.event.dom.client.ClickEvent;
 import com.google.gwt.event.dom.client.ClickHandler;
-import com.google.gwt.event.shared.HandlerManager;
 import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.gwt.junit.client.GWTTestCase;
 
@@ -45,11 +44,13 @@
     return "com.google.gwt.user.User";
   }
 
+  @SuppressWarnings("deprecation")
   public void testCreateHandlerManager() {
-    final HandlerManager manager = new HandlerManager(null);
+    final com.google.gwt.event.shared.HandlerManager manager = new com.google.gwt.event.shared.HandlerManager(
+        null);
     Widget w = new Widget() {
       @Override
-      protected HandlerManager createHandlerManager() {
+      protected com.google.gwt.event.shared.HandlerManager createHandlerManager() {
         return manager;
       }
     };
diff --git a/user/test/com/google/web/bindery/event/shared/BarEvent.java b/user/test/com/google/web/bindery/event/shared/BarEvent.java
deleted file mode 100644
index 35b21f9..0000000
--- a/user/test/com/google/web/bindery/event/shared/BarEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-/**
- * For {@link EventBus} tests.
- */
-public class BarEvent extends Event<BarEvent.Handler> {
-  interface Handler {
-    void onBar(BarEvent e);
-  }
-  
-  static final Type<Handler> TYPE = new Type<Handler>();
-
-  public static HandlerRegistration register(EventBus bus, Handler handler) {
-    return bus.addHandler(TYPE, handler);
-  }
-
-  public static HandlerRegistration register(EventBus bus, Object source, Handler handler) {
-    return bus.addHandlerToSource(TYPE, source, handler);
-  }
-  
-  @Override
-  public com.google.web.bindery.event.shared.Event.Type<Handler> getAssociatedType() {
-    return TYPE;
-  }
-  
-  @Override
-  protected void dispatch(Handler handler) {
-    handler.onBar(this);
-  }
-}
diff --git a/user/test/com/google/web/bindery/event/shared/EventBusTestBase.java b/user/test/com/google/web/bindery/event/shared/EventBusTestBase.java
deleted file mode 100644
index 129b182..0000000
--- a/user/test/com/google/web/bindery/event/shared/EventBusTestBase.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import junit.framework.TestCase;
-
-import java.util.HashSet;
-
-/**
- * Support code for handler tests.
- */
-public abstract class EventBusTestBase extends TestCase {
-
-  class Adaptor implements FooEvent.Handler, BarEvent.Handler {
-
-    public void onFoo(FooEvent event) {
-      add(this);
-    }
-
-    public void onBar(BarEvent event) {
-      add(this);
-    }
-
-    @Override
-    public String toString() {
-      return "adaptor 1";
-    }
-  }
-
-  Adaptor adaptor1 = new Adaptor();
-
-  private HashSet<Object> active = new HashSet<Object>();
-
-  FooEvent.Handler fooHandler1 = new FooEvent.Handler() {
-    public void onFoo(FooEvent event) {
-      add(fooHandler1);
-    }
-
-    @Override
-    public String toString() {
-      return "fooHandler 1";
-    }
-  };
-
-  FooEvent.Handler fooHandler2 = new FooEvent.Handler() {
-    public void onFoo(FooEvent event) {
-      add(fooHandler2);
-    }
-
-    @Override
-    public String toString() {
-      return "fooHandler 2";
-    }
-  };
-
-  FooEvent.Handler fooHandler3 = new FooEvent.Handler() {
-    public void onFoo(FooEvent event) {
-      add(fooHandler3);
-    }
-
-    @Override
-    public String toString() {
-      return "fooHandler 3";
-    }
-  };
-
-  BarEvent.Handler barHandler1 = new BarEvent.Handler() {
-
-    public void onBar(BarEvent event) {
-      add(barHandler1);
-    }
-
-    @Override
-    public String toString() {
-      return "barHandler 1";
-    }
-  };
-
-  BarEvent.Handler barHandler2 = new BarEvent.Handler() {
-
-    public void onBar(BarEvent event) {
-      add(barHandler2);
-    }
-
-    @Override
-    public String toString() {
-      return "barHandler 2";
-    }
-  };
-
-  BarEvent.Handler barHandler3 = new BarEvent.Handler() {
-
-    public void onBar(BarEvent event) {
-      add(barHandler3);
-    }
-
-    @Override
-    public String toString() {
-      return "barHandler 3";
-    }
-  };
-
-  void add(Object handler) {
-    active.add(handler);
-  }
-
-  void assertFired(Object... handler) {
-    for (int i = 0; i < handler.length; i++) {
-      assertTrue(handler[i] + " should have fired", active.contains(handler[i]));
-    }
-  }
-
-  void assertNotFired(Object... handler) {
-    for (int i = 0; i < handler.length; i++) {
-      assertFalse(handler[i] + " should not have fired",
-          active.contains(handler[i]));
-    }
-  }
-
-  void reset() {
-    active.clear();
-  }
-
-}
diff --git a/user/test/com/google/web/bindery/event/shared/EventSharedSuite.java b/user/test/com/google/web/bindery/event/shared/EventSharedSuite.java
deleted file mode 100644
index cf26579..0000000
--- a/user/test/com/google/web/bindery/event/shared/EventSharedSuite.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-/**
- * Tests of shared Event code.
- */
-public class EventSharedSuite {
-  public static Test suite() {
-    TestSuite suite = new TestSuite("Tests of shared Event code");
-    
-    suite.addTestSuite(SimpleEventBusTest.class);
-    suite.addTestSuite(ResettableEventBusTest.class);
-    
-    return suite;
-  }
-  
-  private EventSharedSuite() {
-  }
-}
diff --git a/user/test/com/google/web/bindery/event/shared/FooEvent.java b/user/test/com/google/web/bindery/event/shared/FooEvent.java
deleted file mode 100644
index a63f53a..0000000
--- a/user/test/com/google/web/bindery/event/shared/FooEvent.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-/**
- * For {@link EventBus} tests.
- */
-public class FooEvent extends Event<FooEvent.Handler> {
-  interface Handler {
-    void onFoo(FooEvent e);
-  }
-  
-  static final Type<Handler> TYPE = new Type<Handler>();
-
-  public static HandlerRegistration register(EventBus bus, Handler handler) {
-    return bus.addHandler(TYPE, handler);
-  }
-
-  public static HandlerRegistration register(EventBus bus, Object source, Handler handler) {
-    return bus.addHandlerToSource(TYPE, source, handler);
-  }
-  
-  @Override
-  public com.google.web.bindery.event.shared.Event.Type<Handler> getAssociatedType() {
-    return TYPE;
-  }
-  
-  @Override
-  protected void dispatch(Handler handler) {
-    handler.onFoo(this);
-  }
-}
diff --git a/user/test/com/google/web/bindery/event/shared/ResettableEventBusTest.java b/user/test/com/google/web/bindery/event/shared/ResettableEventBusTest.java
deleted file mode 100644
index b8591a8..0000000
--- a/user/test/com/google/web/bindery/event/shared/ResettableEventBusTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import com.google.web.bindery.event.shared.testing.CountingEventBus;
-
-/**
- * Eponymous unit test.
- */
-public class ResettableEventBusTest extends EventBusTestBase {
-  public void testSimple() {
-    CountingEventBus wrapped = new CountingEventBus();
-    ResettableEventBus subject = new ResettableEventBus(wrapped);
-
-    Event.Type<FooEvent.Handler> type = FooEvent.TYPE;
-
-    assertEquals(0, wrapped.getCount(type));
-
-    subject.addHandler(type, fooHandler1);
-    subject.addHandlerToSource(type, "baker", fooHandler2);
-    subject.addHandler(type, fooHandler3);
-
-    assertEquals(3, wrapped.getCount(type));
-
-    subject.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler3);
-    assertNotFired(fooHandler2);
-
-    reset();
-
-    subject.fireEventFromSource(new FooEvent(), "baker");
-    assertFired(fooHandler1, fooHandler2, fooHandler3);
-
-    reset();
-
-    subject.removeHandlers();
-    assertEquals(0, wrapped.getCount(type));
-
-    subject.fireEvent(new FooEvent());
-    assertNotFired(fooHandler1, fooHandler2, fooHandler3);
-  }
-
-  public void testNestedResetInnerFirst() {
-    CountingEventBus wrapped = new CountingEventBus();
-    ResettableEventBus wideScope = new ResettableEventBus(wrapped);
-    ResettableEventBus narrowScope = new ResettableEventBus(wideScope);
-
-    Event.Type<FooEvent.Handler> type = FooEvent.TYPE;
-
-    wideScope.addHandler(type, fooHandler1);
-    narrowScope.addHandler(type, fooHandler2);
-
-    wrapped.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler2);
-
-    reset();
-
-    /*
-     * When I remove handlers from the narrow resettable, it should have no
-     * effect on handlers registered with the wider instance.
-     */
-
-    narrowScope.removeHandlers();
-
-    wrapped.fireEvent(new FooEvent());
-    assertFired(fooHandler1);
-    assertNotFired(fooHandler2);
-  }
-
-  public void testNestedResetOuterFirst() {
-    CountingEventBus wrapped = new CountingEventBus();
-    ResettableEventBus wideScope = new ResettableEventBus(wrapped);
-    ResettableEventBus narrowScope = new ResettableEventBus(wideScope);
-
-    Event.Type<FooEvent.Handler> type = FooEvent.TYPE;
-
-    wideScope.addHandler(type, fooHandler1);
-    narrowScope.addHandler(type, fooHandler2);
-
-    wrapped.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler2);
-
-    reset();
-
-    /*
-     * When I remove handlers from the first resettable, handlers registered by
-     * the narrower scoped one that wraps it should also be severed.
-     */
-
-    wideScope.removeHandlers();
-
-    wrapped.fireEvent(new FooEvent());
-    assertNotFired(fooHandler1);
-    assertNotFired(fooHandler2);
-  }
-
-  public void testManualRemoveMemory() {
-    SimpleEventBus eventBus = new SimpleEventBus();
-    ResettableEventBus subject = new ResettableEventBus(eventBus);
-
-    Event.Type<FooEvent.Handler> type = FooEvent.TYPE;
-
-    HandlerRegistration registration1 = subject.addHandler(type, fooHandler1);
-    HandlerRegistration registration2 = subject.addHandler(type, fooHandler2);
-    HandlerRegistration registration3 = subject.addHandler(type, fooHandler3);
-
-    registration1.removeHandler();
-    registration2.removeHandler();
-    registration3.removeHandler();
-
-    /*
-     * removing handlers manually should remove registration from the internal
-     * set.
-     */
-
-    assertEquals(0, subject.getRegistrationSize());
-
-    subject.removeHandlers();
-
-    // Expect nothing to happen. Especially no exceptions.
-    registration1.removeHandler();
-  }
-
-  public void testNestedRemoveMemory() {
-    SimpleEventBus eventBus = new SimpleEventBus();
-    ResettableEventBus wideScope = new ResettableEventBus(eventBus);
-    ResettableEventBus narrowScope = new ResettableEventBus(wideScope);
-
-    Event.Type<FooEvent.Handler> type = FooEvent.TYPE;
-
-    wideScope.addHandler(type, fooHandler1);
-    narrowScope.addHandler(type, fooHandler2);
-    narrowScope.addHandler(type, fooHandler3);
-
-    narrowScope.removeHandlers();
-    wideScope.removeHandlers();
-
-    /*
-     * Internal registeration should be empty after calling removeHandlers
-     */
-
-    assertEquals(0, wideScope.getRegistrationSize());
-    assertEquals(0, narrowScope.getRegistrationSize());
-
-    wideScope.addHandler(type, fooHandler1);
-    narrowScope.addHandler(type, fooHandler2);
-
-    /*
-     * Reverse remove order
-     */
-
-    wideScope.removeHandlers();
-    narrowScope.removeHandlers();
-
-    assertEquals(0, wideScope.getRegistrationSize());
-    assertEquals(0, narrowScope.getRegistrationSize());
-  }
-}
diff --git a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java b/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
deleted file mode 100644
index 29e6541..0000000
--- a/user/test/com/google/web/bindery/event/shared/SimpleEventBusTest.java
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Copyright 2011 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.web.bindery.event.shared;
-
-import com.google.web.bindery.event.shared.testing.CountingEventBus;
-
-import junit.framework.AssertionFailedError;
-
-import java.util.Set;
-
-/**
- * Eponymous unit test.
- */
-public class SimpleEventBusTest extends EventBusTestBase {
-
-  interface Command {
-    void execute();
-  }
-
-  class ShyHandler implements FooEvent.Handler {
-    HandlerRegistration r;
-
-    public void onFoo(FooEvent event) {
-      add(this);
-      r.removeHandler();
-    }
-  }
-
-  class SourcedHandler implements FooEvent.Handler {
-    final String expectedSource;
-
-    SourcedHandler(String source) {
-      this.expectedSource = source;
-    }
-
-    public void onFoo(FooEvent event) {
-      add(this);
-      assertEquals(expectedSource, event.getSource());
-    }
-  }
-
-  static class ThrowingHandler implements FooEvent.Handler {
-    private final RuntimeException e;
-
-    public ThrowingHandler(RuntimeException e) {
-      this.e = e;
-    }
-
-    public void onFoo(FooEvent event) {
-      throw e;
-    }
-  }
-
-  public void testAddAndRemoveHandlers() {
-    CountingEventBus eventBus = new CountingEventBus(new SimpleEventBus());
-    FooEvent.register(eventBus, fooHandler1);
-    FooEvent.register(eventBus, fooHandler2);
-    HandlerRegistration reg1 = FooEvent.register(eventBus, adaptor1);
-    eventBus.fireEvent(new FooEvent());
-    assertEquals(3, eventBus.getCount(FooEvent.TYPE));
-    assertFired(fooHandler1, fooHandler2, adaptor1);
-    FooEvent.register(eventBus, fooHandler3);
-    assertEquals(4, eventBus.getCount(FooEvent.TYPE));
-
-    FooEvent.register(eventBus, fooHandler1);
-    FooEvent.register(eventBus, fooHandler2);
-    HandlerRegistration reg2 = FooEvent.register(eventBus, adaptor1);
-
-    /*
-     * You can indeed add handlers twice, they will only be removed one at a
-     * time though.
-     */
-    assertEquals(7, eventBus.getCount(FooEvent.TYPE));
-    eventBus.addHandler(BarEvent.TYPE, adaptor1);
-    eventBus.addHandler(BarEvent.TYPE, barHandler1);
-    eventBus.addHandler(BarEvent.TYPE, barHandler2);
-
-    assertEquals(7, eventBus.getCount(FooEvent.TYPE));
-    assertEquals(3, eventBus.getCount(BarEvent.TYPE));
-
-    reset();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler2, fooHandler3, adaptor1);
-    assertNotFired(barHandler1, barHandler2);
-
-    // Gets rid of first instance.
-    reg1.removeHandler();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler2, fooHandler3, adaptor1);
-    assertNotFired(barHandler1, barHandler2);
-
-    // Gets rid of second instance.
-    reg2.removeHandler();
-    reset();
-    eventBus.fireEvent(new FooEvent());
-
-    assertFired(fooHandler1, fooHandler2, fooHandler3);
-    assertNotFired(adaptor1, barHandler1, barHandler2);
-
-    // Checks to see if barHandler events are still working.
-    reset();
-    eventBus.fireEvent(new BarEvent());
-
-    assertNotFired(fooHandler1, fooHandler2, fooHandler3);
-    assertFired(barHandler1, barHandler2, adaptor1);
-  }
-
-  public void testAssertThrowsNpe() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    try {
-      assertThrowsNpe(new Command() {
-        public void execute() {
-          FooEvent.register(eventBus, fooHandler1);
-        }
-      });
-      fail("expected AssertionFailedError");
-    } catch (AssertionFailedError e) {
-      /* pass */
-    }
-  }
-
-  public void testConcurrentAdd() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-    final FooEvent.Handler two = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        add(this);
-      }
-    };
-    FooEvent.Handler one = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        FooEvent.register(eventBus, two);
-        add(this);
-      }
-    };
-    FooEvent.register(eventBus, one);
-    FooEvent.register(eventBus, fooHandler1);
-    FooEvent.register(eventBus, fooHandler2);
-    FooEvent.register(eventBus, fooHandler3);
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one, fooHandler1, fooHandler2, fooHandler3);
-    assertNotFired(two);
-
-    reset();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one, two, fooHandler1, fooHandler2, fooHandler3);
-  }
-
-  public void testConcurrentAddAfterRemoveIsNotClobbered() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    FooEvent.Handler one = new FooEvent.Handler() {
-      HandlerRegistration reg = addIt();
-
-      public void onFoo(FooEvent event) {
-        reg.removeHandler();
-        addIt();
-        add(this);
-      }
-
-      private HandlerRegistration addIt() {
-        return FooEvent.register(eventBus, fooHandler1);
-      }
-    };
-
-    FooEvent.register(eventBus, one);
-
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one);
-
-    reset();
-
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one, fooHandler1);
-  }
-
-  public void testConcurrentAddAndRemoveByNastyUsersTryingToHurtUs() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-    final FooEvent.Handler two = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        add(this);
-      }
-
-      @Override
-      public String toString() {
-        return "two";
-      }
-    };
-    FooEvent.Handler one = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        FooEvent.register(eventBus, two).removeHandler();
-        add(this);
-      }
-
-      @Override
-      public String toString() {
-        return "one";
-      }
-    };
-    FooEvent.register(eventBus, one);
-    FooEvent.register(eventBus, fooHandler1);
-    FooEvent.register(eventBus, fooHandler2);
-    FooEvent.register(eventBus, fooHandler3);
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one, fooHandler1, fooHandler2, fooHandler3);
-    assertNotFired(two);
-
-    reset();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(one, fooHandler1, fooHandler2, fooHandler3);
-    assertNotFired(two);
-  }
-
-  public void testConcurrentRemove() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    ShyHandler h = new ShyHandler();
-
-    FooEvent.register(eventBus, fooHandler1);
-    h.r = FooEvent.register(eventBus, h);
-    FooEvent.register(eventBus, fooHandler2);
-    FooEvent.register(eventBus, fooHandler3);
-
-    eventBus.fireEvent(new FooEvent());
-    assertFired(h, fooHandler1, fooHandler2, fooHandler3);
-    reset();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(fooHandler1, fooHandler2, fooHandler3);
-    assertNotFired(h);
-  }
-
-  public void testFromSource() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    SourcedHandler global = new SourcedHandler("able");
-    SourcedHandler able = new SourcedHandler("able");
-    SourcedHandler baker = new SourcedHandler("baker");
-
-    FooEvent.register(eventBus, global);
-    FooEvent.register(eventBus, "able", able);
-    FooEvent.register(eventBus, "baker", baker);
-
-    eventBus.fireEventFromSource(new FooEvent(), "able");
-    assertFired(global, able);
-    assertNotFired(baker);
-  }
-
-  public void testHandlersThrow() {
-    RuntimeException exception1 = new RuntimeException("first exception");
-    RuntimeException exception2 = new RuntimeException("second exception");
-
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    FooEvent.register(eventBus, fooHandler1);
-    FooEvent.register(eventBus, new ThrowingHandler(exception1));
-    FooEvent.register(eventBus, fooHandler2);
-    FooEvent.register(eventBus, new ThrowingHandler(exception2));
-    FooEvent.register(eventBus, fooHandler3);
-
-    FooEvent event = new FooEvent();
-
-    try {
-      eventBus.fireEvent(event);
-      fail("eventBus should have thrown");
-    } catch (UmbrellaException e) {
-      Set<Throwable> causes = e.getCauses();
-      assertEquals("Exception should wrap the two thrown exceptions", 2, causes.size());
-      assertTrue("First exception should be under the umbrella", causes.contains(exception1));
-      assertTrue("Second exception should be under the umbrella", causes.contains(exception2));
-    }
-
-    /*
-     * Exception should not have prevented all three mouse handlers from getting
-     * the event.
-     */
-    assertFired(fooHandler1, fooHandler2, fooHandler3);
-  }
-  
-  public void testNoDoubleRemove() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-    HandlerRegistration reg = FooEvent.register(eventBus, fooHandler1);
-    reg.removeHandler();
-
-    boolean assertsOn = getClass().desiredAssertionStatus();
-
-    if (assertsOn) {
-      try {
-        reg.removeHandler();
-        fail("Should have thrown on remove");
-      } catch (AssertionError e) { /* pass */
-      }
-    } else {
-      reg.removeHandler();
-      // Succeed on no assert failure
-    }
-  }
-
-  public void testNoSource() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    SourcedHandler global = new SourcedHandler(null);
-    SourcedHandler able = new SourcedHandler("able");
-    SourcedHandler baker = new SourcedHandler("baker");
-
-    FooEvent.register(eventBus, global);
-    FooEvent.register(eventBus, "able", able);
-    FooEvent.register(eventBus, "baker", baker);
-
-    eventBus.fireEvent(new FooEvent());
-    assertFired(global);
-    assertNotFired(able, baker);
-  }
-
-  public void testNullChecks() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.addHandler(null, fooHandler1);
-      }
-    });
-
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        FooEvent.register(eventBus, "foo", null);
-      }
-    });
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        FooEvent.register(eventBus, null, fooHandler1);
-      }
-    });
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.addHandlerToSource(null, "foo", fooHandler1);
-      }
-    });
-
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.fireEvent(null);
-      }
-    });
-
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.fireEventFromSource(null, "");
-      }
-    });
-
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.fireEventFromSource(new FooEvent() {
-        }, null);
-      }
-    });
-    assertThrowsNpe(new Command() {
-      public void execute() {
-        eventBus.fireEventFromSource(null, "baker");
-      }
-    });
-  }
-
-  public void testNullSourceOkay() {
-    SimpleEventBus reg = new SimpleEventBus();
-
-    FooEvent.Handler handler = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        add(this);
-        assertNull(event.getSource());
-      }
-    };
-    reg.addHandler(FooEvent.TYPE, handler);
-    reg.fireEvent(new FooEvent());
-    assertFired(handler);
-  }
-
-  public void testRemoveSelf() {
-    final SimpleEventBus eventBus = new SimpleEventBus();
-
-    FooEvent.Handler h = new FooEvent.Handler() {
-      HandlerRegistration reg = FooEvent.register(eventBus, this);
-
-      public void onFoo(FooEvent event) {
-        add(this);
-        reg.removeHandler();
-      }
-    };
-
-    eventBus.fireEvent(new FooEvent());
-    assertFired(h);
-
-    reset();
-
-    eventBus.fireEvent(new FooEvent());
-    assertNotFired(h);
-  }
-
-  public void testReverseOrder() {
-    @SuppressWarnings("deprecation")
-    final SimpleEventBus eventBus = new SimpleEventBus(true);
-    final FooEvent.Handler handler0 = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        add(this);
-      }
-    };
-    final FooEvent.Handler handler1 = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        assertNotFired(handler0);
-        add(this);
-      }
-    };
-    final FooEvent.Handler handler2 = new FooEvent.Handler() {
-      public void onFoo(FooEvent event) {
-        assertNotFired(handler0, handler1);
-        add(this);
-      }
-    };
-    FooEvent.register(eventBus, handler0);
-    FooEvent.register(eventBus, handler1);
-    FooEvent.register(eventBus, handler2);
-
-    reset();
-    eventBus.fireEvent(new FooEvent());
-    assertFired(handler0, handler1, handler2);
-  }
-
-  private void assertThrowsNpe(Command command) {
-    try {
-      command.execute();
-      fail("expected NullPointerException");
-    } catch (NullPointerException e) {
-      /* pass */
-    }
-  }
-}
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/FindServiceTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/FindServiceTest.java
index ca82e36..de1aab9 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/FindServiceTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/FindServiceTest.java
@@ -15,7 +15,7 @@
  */
 package com.google.web.bindery.requestfactory.gwt.client;
 
-import com.google.web.bindery.event.shared.HandlerRegistration;
+import com.google.gwt.event.shared.HandlerRegistration;
 import com.google.web.bindery.requestfactory.shared.EntityProxyChange;
 import com.google.web.bindery.requestfactory.shared.EntityProxyId;
 import com.google.web.bindery.requestfactory.shared.Receiver;
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryExceptionPropagationTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryExceptionPropagationTest.java
index 48482c7..45cf3d8 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryExceptionPropagationTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryExceptionPropagationTest.java
@@ -16,7 +16,7 @@
 package com.google.web.bindery.requestfactory.gwt.client;
 
 import com.google.gwt.core.client.GWT;
-import com.google.web.bindery.event.shared.UmbrellaException;
+import com.google.gwt.event.shared.UmbrellaException;
 import com.google.web.bindery.requestfactory.shared.Receiver;
 import com.google.web.bindery.requestfactory.shared.RequestContext;
 import com.google.web.bindery.requestfactory.shared.ServerFailure;
@@ -302,7 +302,7 @@
   }
 
   @Override
-  protected void gwtTearDown() {
+  protected void gwtTearDown() throws Exception {
     GWT.setUncaughtExceptionHandler(defaultUncaughtExceptionHandler);
   }
 }
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryPolymorphicTest.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryPolymorphicTest.java
index 83baef3..1e0fa52 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryPolymorphicTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryPolymorphicTest.java
@@ -16,9 +16,9 @@
 package com.google.web.bindery.requestfactory.gwt.client;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.shared.SimpleFooProxy;
 import com.google.web.bindery.requestfactory.shared.TestRequestFactory;
 
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
index cac062b..02a347b 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/RequestFactoryTestBase.java
@@ -15,12 +15,12 @@
  */
 package com.google.web.bindery.requestfactory.gwt.client;
 
-import com.google.gwt.core.client.GWT;
-import com.google.gwt.junit.client.GWTTestCase;
 import com.google.web.bindery.autobean.shared.AutoBean;
 import com.google.web.bindery.autobean.shared.AutoBeanUtils;
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.SimpleEventBus;
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
+import com.google.gwt.junit.client.GWTTestCase;
 import com.google.web.bindery.requestfactory.shared.BaseProxy;
 import com.google.web.bindery.requestfactory.shared.DefaultProxyStore;
 import com.google.web.bindery.requestfactory.shared.EntityProxy;
diff --git a/user/test/com/google/web/bindery/requestfactory/gwt/client/SimpleRequestFactoryInstance.java b/user/test/com/google/web/bindery/requestfactory/gwt/client/SimpleRequestFactoryInstance.java
index da4c61e..daaf415 100644
--- a/user/test/com/google/web/bindery/requestfactory/gwt/client/SimpleRequestFactoryInstance.java
+++ b/user/test/com/google/web/bindery/requestfactory/gwt/client/SimpleRequestFactoryInstance.java
@@ -16,7 +16,7 @@
 package com.google.web.bindery.requestfactory.gwt.client;
 
 import com.google.gwt.core.client.GWT;
-import com.google.web.bindery.event.shared.SimpleEventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.shared.SimpleRequestFactory;
 
 /**
diff --git a/user/test/com/google/web/bindery/requestfactory/server/BoxesAndPrimitivesJreTest.java b/user/test/com/google/web/bindery/requestfactory/server/BoxesAndPrimitivesJreTest.java
index c38d6c5..74e26a4 100644
--- a/user/test/com/google/web/bindery/requestfactory/server/BoxesAndPrimitivesJreTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/server/BoxesAndPrimitivesJreTest.java
@@ -113,7 +113,7 @@
   }
 
   @Override
-  protected void gwtSetUp() {
+  protected void gwtSetUp() throws Exception {
     super.gwtSetUp();
     errors = new VisibleErrorContext(Logger.getAnonymousLogger());
     v = new RequestFactoryInterfaceValidator(errors,
diff --git a/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryJreTest.java b/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryJreTest.java
index d17b608..dbe0645 100644
--- a/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryJreTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/server/RequestFactoryJreTest.java
@@ -15,8 +15,8 @@
  */
 package com.google.web.bindery.requestfactory.server;
 
-import com.google.web.bindery.event.shared.EventBus;
-import com.google.web.bindery.event.shared.SimpleEventBus;
+import com.google.gwt.event.shared.EventBus;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.web.bindery.requestfactory.gwt.client.RequestFactoryTest;
 import com.google.web.bindery.requestfactory.server.testing.InProcessRequestTransport;
 import com.google.web.bindery.requestfactory.shared.RequestFactory;
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/BoxesAndPrimitivesTest.java b/user/test/com/google/web/bindery/requestfactory/shared/BoxesAndPrimitivesTest.java
index 87f962e..2d3fde4 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/BoxesAndPrimitivesTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/BoxesAndPrimitivesTest.java
@@ -16,8 +16,8 @@
 package com.google.web.bindery.requestfactory.shared;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 
 /**
  * Contains a set of checks of how primitive and boxed method declarations
@@ -224,7 +224,7 @@
   }
 
   @Override
-  protected void gwtSetUp() {
+  protected void gwtSetUp() throws Exception {
     factory = createFactory();
   }
 
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/ComplexKeysTest.java b/user/test/com/google/web/bindery/requestfactory/shared/ComplexKeysTest.java
index 8c43a16..7184cd9 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/ComplexKeysTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/ComplexKeysTest.java
@@ -16,8 +16,8 @@
 package com.google.web.bindery.requestfactory.shared;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 
 /**
  * Tests the use of non-trivial EntityProxy and ValueProxy key types.
@@ -213,7 +213,7 @@
   }
 
   @Override
-  protected void gwtSetUp() {
+  protected void gwtSetUp() throws Exception {
     factory = createFactory();
   }
 
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/LocatorTest.java b/user/test/com/google/web/bindery/requestfactory/shared/LocatorTest.java
index 632ffb7..14376bd 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/LocatorTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/LocatorTest.java
@@ -16,8 +16,8 @@
 package com.google.web.bindery.requestfactory.shared;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 
 /**
  * Tests the use of Locator objects.
@@ -120,7 +120,7 @@
   }
 
   @Override
-  protected void gwtSetUp() {
+  protected void gwtSetUp() throws Exception {
     factory = createFactory();
   }
 
diff --git a/user/test/com/google/web/bindery/requestfactory/shared/ServiceInheritanceTest.java b/user/test/com/google/web/bindery/requestfactory/shared/ServiceInheritanceTest.java
index ee604b9..f4df2e6 100644
--- a/user/test/com/google/web/bindery/requestfactory/shared/ServiceInheritanceTest.java
+++ b/user/test/com/google/web/bindery/requestfactory/shared/ServiceInheritanceTest.java
@@ -16,8 +16,8 @@
 package com.google.web.bindery.requestfactory.shared;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.event.shared.SimpleEventBus;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.web.bindery.event.shared.SimpleEventBus;
 
 /**
  * Tests the ability of instance services to inherit methods
