Bug 334028: Rework event system

Removed RWTEvent (formerly named o.e.rwt.internal.events.Event)
diff --git a/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewer.java b/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
index ad214b6..f028d42 100755
--- a/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
+++ b/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewer.java
@@ -92,6 +92,7 @@
 				}
 
 				public void mouseDoubleClick(MouseEvent e) {
+				  e.count = 1;
 					handleMouseDown(e);
 				}
 			});
diff --git a/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java b/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java
index 8dbf667..4bb446d 100755
--- a/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java
+++ b/bundles/org.eclipse.rap.jface/src/org/eclipse/jface/viewers/ColumnViewerEditorActivationEvent.java
@@ -13,7 +13,6 @@
 
 import java.util.EventObject;
 
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.MouseEvent;
 import org.eclipse.swt.events.TraverseEvent;
@@ -123,10 +122,7 @@
 	public ColumnViewerEditorActivationEvent(ViewerCell cell, MouseEvent event) {
 		super(cell);
 
-// RAP [rh] MouseEvent#count not implemented. Changed if-statement works as
-//     long as conditions in the calling method don't change.
-//		if (event.count >= 2) {
-		if(event.getID() == SWT.MouseDoubleClick) {
+		if (event.count >= 2) {
 			eventType = MOUSE_DOUBLE_CLICK_SELECTION;
 		} else {
 			eventType = MOUSE_CLICK_SELECTION;
@@ -146,8 +142,7 @@
 		super(cell);
 		this.eventType = KEY_PRESSED;
 		this.sourceEvent = event;
-// RAP [rh] event timestamps not supported  
-//		this.time = event.time;
+		this.time = event.time;
 		this.keyCode = event.keyCode;
 		this.character = event.character;
 		this.stateMask = event.stateMask;
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/events/RWTEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/events/RWTEvent.java
deleted file mode 100644
index eae260b..0000000
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/internal/events/RWTEvent.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2002, 2011 Innoopract Informationssysteme GmbH.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    Innoopract Informationssysteme GmbH - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.rwt.internal.events;
-
-import java.util.EventObject;
-
-import org.eclipse.rap.rwt.Adaptable;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.internal.SWTEventListener;
-import org.eclipse.swt.internal.events.EventTable;
-import org.eclipse.swt.widgets.TypedListener;
-
-
-public abstract class RWTEvent extends EventObject {
-
-  private static final long serialVersionUID = 1L;
-  
-  private final int id;
-  
-  public RWTEvent( Object source, int id ) {
-    super( source );
-    this.id = id;
-  }
-  
-  public int getID() {
-    return id;
-  }
-  
-  protected static boolean hasListener( Adaptable adaptable, int[] eventTypes ) {
-    boolean result = false;
-    EventTable eventTable = adaptable.getAdapter( EventTable.class );
-    for( int i = 0; !result && i < eventTypes.length; i++ ) {
-      result = eventTable.hooks( eventTypes[ i ] );
-    }
-    return result;
-  }
-
-  protected static void addListener( Adaptable adaptable, 
-                                     int[] eventTypes, 
-                                     SWTEventListener listener ) 
-  {
-    if( listener == null ) {
-      SWT.error( SWT.ERROR_NULL_ARGUMENT );
-    }
-    TypedListener typedListener = new TypedListener( listener );
-    EventTable eventTable = adaptable.getAdapter( EventTable.class );
-    for( int eventType : eventTypes ) {
-      eventTable.hook( eventType, typedListener );
-    }
-  }
-
-  protected static void removeListener( Adaptable adaptable, 
-                                        int[] eventTypes, 
-                                        SWTEventListener listener ) 
-  {
-    if( listener == null ) {
-      SWT.error( SWT.ERROR_NULL_ARGUMENT );
-    }
-    EventTable eventTable = adaptable.getAdapter( EventTable.class );
-    for( int eventType : eventTypes ) {
-      eventTable.unhook( eventType, listener );
-    }
-  }
-  
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
index fed727c..e6c2324 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/rap/rwt/lifecycle/ControlLCAUtil.java
@@ -26,7 +26,6 @@
 import org.eclipse.rap.rwt.internal.util.NumberFormatUtil;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.KeyEvent;
 import org.eclipse.swt.events.MenuDetectEvent;
 import org.eclipse.swt.events.MouseEvent;
@@ -146,17 +145,17 @@
 
   public static void processMouseEvents( Control control ) {
     if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_MOUSE_DOWN ) ) {
-      createMouseEvent( control, ClientMessageConst.EVENT_MOUSE_DOWN, SWT.MouseDown );
+      sendMouseEvent( control, ClientMessageConst.EVENT_MOUSE_DOWN, SWT.MouseDown );
     }
     if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_MOUSE_DOUBLE_CLICK ) ) {
-      createMouseEvent( control, ClientMessageConst.EVENT_MOUSE_DOUBLE_CLICK, SWT.MouseDoubleClick );
+      sendMouseEvent( control, ClientMessageConst.EVENT_MOUSE_DOUBLE_CLICK, SWT.MouseDoubleClick );
     }
     if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_MOUSE_UP ) ) {
-      createMouseEvent( control, ClientMessageConst.EVENT_MOUSE_UP, SWT.MouseUp );
+      sendMouseEvent( control, ClientMessageConst.EVENT_MOUSE_UP, SWT.MouseUp );
     }
   }
 
-  private static void createMouseEvent( Control control, String eventName, int eventType ) {
+  private static void sendMouseEvent( Control control, String eventName, int eventType ) {
     Event event = new Event();
     event.widget = control;
     event.type = eventType;
@@ -171,6 +170,11 @@
                                        ClientMessageConst.EVENT_PARAM_TIME );
     event.stateMask = EventLCAUtil.readStateMask( control, eventName )
                     | EventLCAUtil.translateButton( event.button );
+    if( WidgetLCAUtil.wasEventSent( control, ClientMessageConst.EVENT_MOUSE_DOUBLE_CLICK ) ) {
+      event.count = 2;
+    } else {
+      event.count = 1;
+    }
     checkAndProcessMouseEvent( event );
   }
 
@@ -270,14 +274,14 @@
     if( ( control.getStyle() & SWT.NO_FOCUS ) == 0 ) {
       WidgetLCAUtil.preserveListener( control,
                                       PROP_FOCUS_LISTENER,
-                                      FocusEvent.hasListener( control ) );
+                                      hasFocusListener( control ) );
     }
     WidgetLCAUtil.preserveListener( control,
                                     PROP_KEY_LISTENER,
                                     KeyEvent.hasListener( control ) );
     WidgetLCAUtil.preserveListener( control,
                                     PROP_TRAVERSE_LISTENER,
-                                    TraverseEvent.hasListener( control ) );
+                                    control.isListening( SWT.Traverse ) );
     WidgetLCAUtil.preserveListener( control,
                                     PROP_MENU_DETECT_LISTENER,
                                     MenuDetectEvent.hasListener( control ) );
@@ -537,7 +541,7 @@
    */
   static void renderListenFocus( Control control ) {
     if( ( control.getStyle() & SWT.NO_FOCUS ) == 0 ) {
-      boolean newValue = FocusEvent.hasListener( control );
+      boolean newValue = hasFocusListener( control );
       WidgetLCAUtil.renderListener( control, PROP_FOCUS_LISTENER, newValue, false );
     }
   }
@@ -553,7 +557,7 @@
   }
 
   static void renderListenTraverse( Control control ) {
-    boolean newValue = TraverseEvent.hasListener( control );
+    boolean newValue = control.isListening( SWT.Traverse );
     WidgetLCAUtil.renderListener( control, PROP_TRAVERSE_LISTENER, newValue, false );
   }
 
@@ -932,4 +936,8 @@
     return control.isListening( SWT.Activate ) || control.isListening( SWT.Deactivate );
   }
 
+  private static boolean hasFocusListener( Control control ) {
+    return control.isListening( SWT.FocusIn ) || control.isListening( SWT.FocusOut );
+  }
+
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ArmEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ArmEvent.java
index 16965ce..25443f1 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ArmEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ArmEvent.java
@@ -47,24 +47,6 @@
    * @deprecated not part of the API, do not use in application code
    */
   @Deprecated
-  public static void addListener( Adaptable adaptable, ArmListener listener ) {
-    addListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void removeListener( Adaptable adaptable, ArmListener listener ) {
-    removeListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
   public static boolean hasListener( Adaptable adaptable ) {
     return hasListener( adaptable, EVENT_TYPES );
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ControlEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ControlEvent.java
index 37c8140..9a59aec 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ControlEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/ControlEvent.java
@@ -52,24 +52,6 @@
    * @deprecated not part of the API, do not use in application code
    */
   @Deprecated
-  public static void addListener( Adaptable adaptable, ControlListener listener ) {
-    addListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void removeListener( Adaptable adaptable, ControlListener listener ) {
-    removeListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
   public static boolean hasListener( Adaptable adaptable ) {
     return hasListener( adaptable, EVENT_TYPES );
   }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/FocusEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/FocusEvent.java
index d759b44..09a53e6 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/FocusEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/FocusEvent.java
@@ -11,8 +11,6 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
-import org.eclipse.rap.rwt.Adaptable;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Event;
 
 
@@ -32,8 +30,6 @@
 
   private static final long serialVersionUID = 1L;
 
-  private static final int[] EVENT_TYPES = { SWT.FocusIn, SWT.FocusOut };
-
   /**
    * Constructs a new instance of this class based on the
    * information in the given untyped event.
@@ -44,31 +40,4 @@
     super( event );
   }
 
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void addListener( Adaptable adaptable, FocusListener listener ) {
-    addListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void removeListener( Adaptable adaptable, FocusListener listener ) {
-    removeListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static boolean hasListener( Adaptable adaptable ) {
-    return hasListener( adaptable, EVENT_TYPES );
-  }
-
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MenuDetectEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MenuDetectEvent.java
index 25e679e..6dd1f32 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MenuDetectEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MenuDetectEvent.java
@@ -12,7 +12,6 @@
 
 import org.eclipse.rap.rwt.Adaptable;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.internal.widgets.EventUtil;
 import org.eclipse.swt.widgets.Event;
 
 
@@ -79,10 +78,6 @@
   		+ "}";
   }
 
-  protected boolean allowProcessing() {
-    return EventUtil.allowProcessing( sourceEvent );
-  }
-
   /**
    * @since 2.0
    * @deprecated not part of the API, do not use in application code
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MouseEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MouseEvent.java
index 339ca60..1578e8d 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MouseEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/MouseEvent.java
@@ -72,14 +72,14 @@
    */
   public int y;
 
-//  /**
-//   * the number times the mouse has been clicked, as defined
-//   * by the operating system; 1 for the first click, 2 for the
-//   * second click and so on.
-//   *
-//   * @since 3.3
-//   */
-//  public int count;
+  /**
+   * the number times the mouse has been clicked, as defined
+   * by the operating system; 1 for the first click, 2 for the
+   * second click and so on.
+   *
+   * @since 2.0
+   */
+  public int count;
 
   /**
    * Constructs a new instance of this class based on the
@@ -95,6 +95,7 @@
     y = event.y;
     button = event.button;
     stateMask = event.stateMask;
+    count = event.count;
   }
 
   /**
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/PaintEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/PaintEvent.java
index 2c9d4dd..a56c111 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/PaintEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/PaintEvent.java
@@ -11,8 +11,6 @@
  *******************************************************************************/
 package org.eclipse.swt.events;
 
-import org.eclipse.rap.rwt.Adaptable;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.widgets.Event;
 
@@ -26,8 +24,6 @@
  */
 public final class PaintEvent extends TypedEvent {
 
-  private static final int[] EVENT_TYPES = { SWT.Paint };
-
   /**
    * the graphics context to use when painting that is configured to use the
    * colors, font and damaged region of the control. It is valid only during the
@@ -78,33 +74,6 @@
   }
 
   /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static boolean hasListener( Adaptable adaptable ) {
-    return hasListener( adaptable, EVENT_TYPES );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void addListener( Adaptable adaptable, PaintListener listener ) {
-    addListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void removeListener( Adaptable adaptable, PaintListener listener ) {
-    removeListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
    * Returns a string containing a concise, human-readable description of the
    * receiver.
    *
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TraverseEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TraverseEvent.java
index a982921..7641de0 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TraverseEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TraverseEvent.java
@@ -11,8 +11,6 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
-import org.eclipse.rap.rwt.Adaptable;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Event;
 
 
@@ -90,8 +88,6 @@
 
   private static final long serialVersionUID = 1L;
 
-  private static final int[] EVENT_TYPES = { SWT.Traverse };
-
   /**
    * The traversal type.
    * <p>
@@ -149,30 +145,4 @@
            + "}";
   }
 
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void addListener( Adaptable adaptable, TraverseListener listener ) {
-    addListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static void removeListener( Adaptable adaptable, TraverseListener listener ) {
-    removeListener( adaptable, EVENT_TYPES, listener );
-  }
-
-  /**
-   * @since 2.0
-   * @deprecated not part of the API, do not use in application code
-   */
-  @Deprecated
-  public static boolean hasListener( Adaptable adaptable ) {
-    return hasListener( adaptable, EVENT_TYPES );
-  }
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TypedEvent.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TypedEvent.java
index 48879d4..7686ef4 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TypedEvent.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/events/TypedEvent.java
@@ -11,17 +11,14 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.rap.rwt.internal.events.RWTEvent;
-import org.eclipse.rap.rwt.internal.lifecycle.CurrentPhase;
-import org.eclipse.rap.rwt.internal.service.ContextProvider;
-import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.service.IServiceStore;
+import org.eclipse.rap.rwt.Adaptable;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.internal.SWTEventListener;
+import org.eclipse.swt.internal.SWTEventObject;
+import org.eclipse.swt.internal.events.EventTable;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.TypedListener;
 import org.eclipse.swt.widgets.Widget;
 
 
@@ -32,14 +29,9 @@
  *
  * @see org.eclipse.swt.widgets.Event
  */
-public class TypedEvent extends RWTEvent {
+public class TypedEvent extends SWTEventObject {
   private static final long serialVersionUID = 1L;
 
-  private static final String ATTR_SCHEDULED_EVENT_LIST
-    = TypedEvent.class.getName() + "#scheduledEventList";
-
-  protected Event sourceEvent;
-
   /**
    * the display where the event occurred
    *
@@ -69,21 +61,6 @@
   public Object data;
 
   /**
-   * Constructs a new instance of this class based on the
-   * information in the argument.
-   *
-   * @param event the low level event to initialize the receiver with
-   */
-  public TypedEvent( Event event ) {
-    super( event.widget, event.type );
-    display = event.display;
-    widget = event.widget;
-    data = event.data;
-    time = event.time;
-    sourceEvent = event;
-  }
-
-  /**
    * Constructs a new instance of this class.
    *
    * @param source the object that fired the event
@@ -91,80 +68,23 @@
    * @since 1.3
    */
   public TypedEvent( Object source ) {
-    this( source, SWT.None );
+    super( source );
   }
 
   /**
-   * Constructs a new instance of this class.
+   * Constructs a new instance of this class based on the
+   * information in the argument.
    *
-   * <p><strong>IMPORTANT:</strong> This method is <em>not</em> part of the RWT
-   * public API. It is marked public only so that it can be shared
-   * within the packages provided by RWT. It should never be accessed
-   * from application code.
-   * </p>
+   * @param event the low level event to initialize the receiver with
    */
-  public TypedEvent( Object source, int id ) {
-    super( source, id );
-    widget = ( Widget )source;
-    display = widget.getDisplay();
+  public TypedEvent( Event event ) {
+    super( event.widget );
+    this.display = event.display;
+    this.widget = event.widget;
+    this.time = event.time;
+    this.data = event.data;
   }
 
-  @Override
-  public Object getSource() {
-    // [rh] introduced to get rid of discouraged access warning when
-    // application code accesses getSource() which is defined in
-    // org.eclipse.rwt.internal.events.Event
-    return super.getSource();
-  }
-
-  /**
-   * <p><strong>IMPORTANT:</strong> This method is <em>not</em> part of the RWT
-   * public API. It is marked public only so that it can be shared
-   * within the packages provided by RWT. It should never be accessed
-   * from application code.
-   * </p>
-   */
-  public final void processEvent() {
-    // TODO: [fappel] In case of session invalidation there's no phase.
-    //                So no event processing should take place, this situation
-    //                may improve with the new readAndDispatch mechanism in
-    //                place.
-    PhaseId currentPhase = CurrentPhase.get();
-    if( currentPhase != null ) {
-      if(    PhaseId.PREPARE_UI_ROOT.equals( currentPhase )
-          || PhaseId.PROCESS_ACTION.equals( currentPhase ) )
-      {
-        // TODO [fappel]: changes of the event fields in the filter handler
-        //                methods should be forwarded to this event...
-        sourceEvent.widget.notifyListeners( sourceEvent.type, sourceEvent );
-      } else {
-        addToScheduledEvents( this );
-      }
-    }
-  }
-
-  ///////////////////////////////////////////////
-  // Methods to maintain list of scheduled events
-
-  private static void addToScheduledEvents( TypedEvent event ) {
-    getScheduledEventList().add( event );
-  }
-
-  @SuppressWarnings("unchecked")
-  private static List<TypedEvent> getScheduledEventList() {
-    IServiceStore serviceStore = ContextProvider.getServiceStore();
-    List<TypedEvent> result
-      = ( List<TypedEvent> )serviceStore.getAttribute( ATTR_SCHEDULED_EVENT_LIST );
-    if( result == null ) {
-      result = new ArrayList<TypedEvent>();
-      serviceStore.setAttribute( ATTR_SCHEDULED_EVENT_LIST, result );
-    }
-    return result;
-  }
-
-  ///////////////////////////////
-  // toString & getName from SWT
-
   // this implementation is extended by subclasses
   @Override
   public String toString() {
@@ -179,4 +99,41 @@
     }
     return result;
   }
+
+  protected static boolean hasListener( Adaptable adaptable, int[] eventTypes ) {
+    boolean result = false;
+    EventTable eventTable = adaptable.getAdapter( EventTable.class );
+    for( int i = 0; !result && i < eventTypes.length; i++ ) {
+      result = eventTable.hooks( eventTypes[ i ] );
+    }
+    return result;
+  }
+
+  protected static void addListener( Adaptable adaptable, 
+                                     int[] eventTypes, 
+                                     SWTEventListener listener ) 
+  {
+    if( listener == null ) {
+      SWT.error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    EventTable eventTable = adaptable.getAdapter( EventTable.class );
+    for( int eventType : eventTypes ) {
+      eventTable.hook( eventType, typedListener );
+    }
+  }
+
+  protected static void removeListener( Adaptable adaptable, 
+                                        int[] eventTypes, 
+                                        SWTEventListener listener ) 
+  {
+    if( listener == null ) {
+      SWT.error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    EventTable eventTable = adaptable.getAdapter( EventTable.class );
+    for( int eventType : eventTypes ) {
+      eventTable.unhook( eventType, listener );
+    }
+  }
+  
 }
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Canvas.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Canvas.java
index 9677912..df9f87b 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Canvas.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Canvas.java
@@ -13,7 +13,6 @@
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.PaintEvent;
 import org.eclipse.swt.events.PaintListener;
 import org.eclipse.swt.graphics.GC;
 import org.eclipse.swt.graphics.Point;
@@ -129,7 +128,11 @@
    */
   public void addPaintListener( PaintListener listener ) {
     checkWidget();
-    PaintEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Paint, typedListener );
   }
 
   /**
@@ -152,7 +155,10 @@
    */
   public void removePaintListener( PaintListener listener ) {
     checkWidget();
-    PaintEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.Paint, listener );
   }
 
   /////////////
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
index be8b365..94e4cbf 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Control.java
@@ -16,13 +16,11 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.accessibility.Accessible;
-import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.DragDetectEvent;
 import org.eclipse.swt.events.DragDetectListener;
-import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.FocusListener;
 import org.eclipse.swt.events.GestureListener;
 import org.eclipse.swt.events.HelpEvent;
@@ -35,7 +33,6 @@
 import org.eclipse.swt.events.MouseListener;
 import org.eclipse.swt.events.PaintListener;
 import org.eclipse.swt.events.TouchListener;
-import org.eclipse.swt.events.TraverseEvent;
 import org.eclipse.swt.events.TraverseListener;
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.graphics.Cursor;
@@ -1507,7 +1504,12 @@
    */
   public void addControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Move, typedListener );
+    addListener( SWT.Resize, typedListener );
   }
 
   /**
@@ -1529,7 +1531,11 @@
    */
   public void removeControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.Move, listener );
+    removeListener( SWT.Resize, listener );
   }
 
   /**
@@ -1674,7 +1680,11 @@
    */
   public void addTraverseListener( TraverseListener listener ) {
     checkWidget();
-    TraverseEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Traverse, typedListener );
   }
 
   /**
@@ -1698,7 +1708,10 @@
    */
   public void removeTraverseListener( TraverseListener listener ) {
     checkWidget();
-    TraverseEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.Traverse, listener );
   }
 
   /**
@@ -1722,7 +1735,12 @@
    */
   public void addFocusListener( FocusListener listener ) {
     checkWidget();
-    FocusEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.FocusIn, typedListener );
+    addListener( SWT.FocusOut, typedListener );
   }
 
   /**
@@ -1744,7 +1762,11 @@
    */
   public void removeFocusListener( FocusListener listener ) {
     checkWidget();
-    FocusEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.FocusIn, listener );
+    removeListener( SWT.FocusOut, listener );
   }
 
   /**
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
index 9efa727..d3be1f7 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/Display.java
@@ -212,17 +212,15 @@
   private Collection<Control> redrawControls;
   private Control focusControl;
   private EventTable filterTable;
+  private EventTable eventTable;
   private transient Monitor monitor;
   private transient IDisplayAdapter displayAdapter;
   private WidgetAdapter widgetAdapter;
-  private Set<Listener> closeListeners;
-  private Set<Listener> disposeListeners;
   private Runnable[] disposeList;
   private Composite[] layoutDeferred;
   private int layoutDeferredCount;
   private Widget[] skinList;
   private int skinCount;
-  private Set<Listener> skinListeners;
   private boolean beep;
 
   /* Display Data */
@@ -575,22 +573,10 @@
     if( listener == null ) {
       error( SWT.ERROR_NULL_ARGUMENT );
     }
-    if( eventType == SWT.Close ) {
-      if( closeListeners == null ) {
-        closeListeners = new HashSet<Listener>();
-      }
-      closeListeners.add( listener );
-    } else if( eventType == SWT.Dispose ) {
-      if( disposeListeners == null ) {
-        disposeListeners = new HashSet<Listener>();
-      }
-      disposeListeners.add( listener );
-    } else if( eventType == SWT.Skin ) {
-      if( skinListeners == null ) {
-        skinListeners = new HashSet<Listener>();
-      }
-      skinListeners.add( listener );
+    if( eventTable == null ) {
+      eventTable = new EventTable();
     }
+    eventTable.hook( eventType, listener );
   }
 
   /**
@@ -620,21 +606,20 @@
     if( listener == null ) {
       error( SWT.ERROR_NULL_ARGUMENT );
     }
-    if( eventType == SWT.Close && closeListeners != null ) {
-      closeListeners.remove( listener );
-      if( closeListeners.size() == 0 ) {
-        closeListeners = null;
-      }
-    } else if ( eventType == SWT.Dispose && disposeListeners != null ) {
-      disposeListeners.remove( listener );
-      if( disposeListeners.size() == 0 ) {
-        disposeListeners = null;
-      }
-    } else if ( eventType == SWT.Skin && skinListeners != null ) {
-      skinListeners.remove( listener );
-      if( skinListeners.size() == 0 ) {
-        skinListeners = null;
-      }
+    if( eventTable != null ) {
+      eventTable.unhook( eventType, listener );
+    }
+  }
+
+  void sendEvent( int eventType, Event event ) {
+    event.display = this;
+    event.type = eventType;
+    if( event.time == 0 ) {
+      event.time = EventUtil.getLastEventTime();
+    }
+    filterEvent( event );
+    if( eventTable != null ) {
+      eventTable.sendEvent( event );
     }
   }
 
@@ -685,16 +670,7 @@
   public void close() {
     checkDevice();
     Event event = new Event();
-    event.display = this;
-    event.type = SWT.Close;
-    notifyFilters( event );
-    if( closeListeners != null ) {
-      Listener[] listeners = new Listener[ closeListeners.size() ];
-      closeListeners.toArray( listeners );
-      for( int i = 0; i < listeners.length; i++ ) {
-        listeners[ i ].handleEvent( event );
-      }
-    }
+    sendEvent( SWT.Close, event );
     if( event.doit ) {
       dispose();
     }
@@ -710,6 +686,7 @@
       scheduler.dispose();
     }
     filterTable = null;
+    eventTable = null;
   }
 
   @Override
@@ -718,22 +695,7 @@
   }
 
   private void sendDisposeEvent() {
-    Event event = new Event();
-    event.display = this;
-    event.type = SWT.Dispose;
-    notifyFilters( event );
-    if( disposeListeners != null ) {
-      Listener[] listeners = new Listener[ disposeListeners.size() ];
-      disposeListeners.toArray( listeners );
-      for( int i = 0; i < listeners.length; i++ ) {
-        try {
-          listeners[ i ].handleEvent( event );
-        } catch( Throwable thr ) {
-          String msg = "Exception while executing dispose-listener.";
-          ServletLog.log( msg, thr );
-        }
-      }
-    }
+    sendEvent( SWT.Dispose, new Event() );
   }
 
   private void disposeShells() {
@@ -1856,16 +1818,7 @@
   private void sendSkinEvent( Widget widget ) {
     Event event = new Event();
     event.widget = widget;
-    event.display = this;
-    event.type = SWT.Skin;
-    notifyFilters( event );
-    if( skinListeners != null ) {
-      Listener[] listeners = new Listener[ skinListeners.size() ];
-      skinListeners.toArray( listeners );
-      for( int i = 0; i < listeners.length; i++ ) {
-        listeners[ i ].handleEvent( event );
-      }
-    }
+    sendEvent( SWT.Skin, event );
   }
 
   ///////////////
@@ -2293,10 +2246,6 @@
     return result;
   }
 
-  private void notifyFilters( Event event ) {
-    filterEvent( event );
-  }
-
   /////////////////
   // Inner classes
 
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/MenuItem.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/MenuItem.java
index c23af37..353f338 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/MenuItem.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/MenuItem.java
@@ -13,7 +13,6 @@
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.ArmEvent;
 import org.eclipse.swt.events.ArmListener;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
@@ -506,7 +505,11 @@
    */
   public void addArmListener( ArmListener listener ) {
     checkWidget();
-    ArmEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Arm, typedListener );
   }
 
   /**
@@ -529,7 +532,7 @@
    */
   public void removeArmListener( ArmListener listener ) {
     checkWidget();
-    ArmEvent.removeListener( this, listener );
+    removeListener( SWT.Arm, listener );
   }
 
   //////////////////
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
index 10a2cf2..ff2067b 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TableColumn.java
@@ -15,11 +15,13 @@
 import org.eclipse.rap.rwt.internal.theme.IThemeAdapter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.*;
+import org.eclipse.swt.events.ControlListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.internal.SerializableCompatibility;
-import org.eclipse.swt.internal.widgets.*;
+import org.eclipse.swt.internal.widgets.IColumnAdapter;
 import org.eclipse.swt.internal.widgets.tablekit.TableThemeAdapter;
 
 
@@ -385,7 +387,12 @@
    */
   public void addControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Move, typedListener );
+    addListener( SWT.Resize, typedListener );
   }
 
   /**
@@ -407,7 +414,11 @@
    */
   public void removeControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.Move, listener );
+    removeListener( SWT.Resize, listener );
   }
 
   /**
diff --git a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
index 61ccba4..0db22f6 100644
--- a/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
+++ b/bundles/org.eclipse.rap.rwt/src/org/eclipse/swt/widgets/TreeColumn.java
@@ -16,7 +16,6 @@
 import org.eclipse.rap.rwt.internal.theme.IThemeAdapter;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.ControlEvent;
 import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -161,7 +160,12 @@
    */
   public void addControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.addListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    TypedListener typedListener = new TypedListener( listener );
+    addListener( SWT.Move, typedListener );
+    addListener( SWT.Resize, typedListener );
   }
 
   /**
@@ -393,7 +397,11 @@
    */
   public void removeControlListener( ControlListener listener ) {
     checkWidget();
-    ControlEvent.removeListener( this, listener );
+    if( listener == null ) {
+      error( SWT.ERROR_NULL_ARGUMENT );
+    }
+    removeListener( SWT.Move, listener );
+    removeListener( SWT.Resize, listener );
   }
 
   /**
diff --git a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/menukit/MenuLCAUtil.java b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/menukit/MenuLCAUtil.java
index 153459b..d079034 100644
--- a/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/menukit/MenuLCAUtil.java
+++ b/bundles/org.eclipse.rap.rwt/widgetkits/org/eclipse/swt/internal/widgets/menukit/MenuLCAUtil.java
@@ -24,7 +24,6 @@
 import org.eclipse.rap.rwt.internal.protocol.IClientObject;
 import org.eclipse.rap.rwt.lifecycle.WidgetLCAUtil;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ArmEvent;
 import org.eclipse.swt.events.MenuEvent;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Menu;
@@ -92,8 +91,8 @@
     boolean result = MenuEvent.hasListener( menu );
     if( !result ) {
       MenuItem[] items = menu.getItems();
-      for( int i = 0; i < items.length && !result; i++ ) {
-        result = ArmEvent.hasListener( items[ i ] );
+      for( int i = 0; !result && i < items.length && !result; i++ ) {
+        result = items[ i ].isListening( SWT.Arm );
       }
     }
     return result;
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/events/RWTEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/events/RWTEvent_Test.java
deleted file mode 100644
index e1b96f6..0000000
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/rap/rwt/internal/events/RWTEvent_Test.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    EclipseSource - initial API and implementation
- ******************************************************************************/
-package org.eclipse.rap.rwt.internal.events;
-
-import static org.mockito.Matchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import junit.framework.TestCase;
-
-import org.eclipse.rap.rwt.Adaptable;
-import org.eclipse.swt.internal.SWTEventListener;
-import org.eclipse.swt.internal.events.EventTable;
-import org.eclipse.swt.widgets.TypedListener;
-import org.mockito.ArgumentCaptor;
-
-
-public class RWTEvent_Test extends TestCase {
-  
-  private Adaptable widget;
-  private EventTable eventTable;
-
-  public void testAddListener() {
-    SWTEventListener listener = mock( SWTEventListener.class );
-    
-    RWTEvent.addListener( widget, new int[] { 1, 2 }, listener );
-    
-    ArgumentCaptor<TypedListener> captor = ArgumentCaptor.forClass( TypedListener.class );
-    verify( eventTable ).hook( eq( 1 ), captor.capture() );
-    assertSame( listener, captor.getValue().getEventListener() );
-    verify( eventTable ).hook( eq( 2 ), captor.capture() );
-    assertSame( listener, captor.getValue().getEventListener() );
-  }
-  
-  public void testAddListenerWithNullListener() {
-    try {
-      RWTEvent.addListener( widget, new int[ 0 ], null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
-  }
-
-  public void testRemoveListener() {
-    SWTEventListener listener = mock( SWTEventListener.class );
-    
-    RWTEvent.removeListener( widget, new int[] { 1, 2 }, listener );
-    
-    verify( eventTable ).unhook( 1, listener );
-    verify( eventTable ).unhook( 2, listener );
-  }
-  
-  public void testRemoveListenerWithNullListener() {
-    try {
-      RWTEvent.removeListener( widget, new int[ 0 ], null );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
-  }
-  
-  public void testHasListenerWithoutAnyRegisteredListener() {
-    boolean hasListener = RWTEvent.hasListener( widget, new int[] { 1, 2 } );
-    
-    assertFalse( hasListener );
-  }
-  
-  public void testHasListenerWithMatchingRegisteredListener() {
-    RWTEvent.addListener( widget, new int[] { 1 }, mock( SWTEventListener.class ) );
-    
-    boolean hasListener = RWTEvent.hasListener( widget, new int[] { 1, 2 } );
-    
-    assertTrue( hasListener );
-  }
-  
-  public void testHasListenerWithoutMatchingRegisteredListener() {
-    RWTEvent.addListener( widget, new int[] { 1 }, mock( SWTEventListener.class ) );
-    
-    boolean hasListener = RWTEvent.hasListener( widget, new int[] { 47 } );
-    
-    assertFalse( hasListener );
-  }
-  
-  @Override
-  protected void setUp() throws Exception {
-    eventTable = spy( new EventTable() );
-    widget = mock( Adaptable.class );
-    when( widget.getAdapter( EventTable.class ) ).thenReturn( eventTable );
-  }
-}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/ControlEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/ControlEvent_Test.java
index b3d7ecc..d053f4a 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/ControlEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/ControlEvent_Test.java
@@ -46,6 +46,18 @@
     Fixture.tearDown();
   }
 
+  public void testUntypedEventConstructor() throws Exception {
+    Event event = new Event();
+    event.display = display;
+    event.widget = mock( Widget.class );
+    event.time = 1;
+    event.data = new Object();
+    
+    ControlEvent controlEvent = new ControlEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( controlEvent, event );
+  }
+
   public void testResized() {
     ControlListener listener = mock( ControlListener.class );
     control.addControlListener( listener );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/DisposeEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/DisposeEvent_Test.java
index 85ce8bf..c6c549f 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/DisposeEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/DisposeEvent_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2010 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2012 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,75 +11,26 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
+import static org.mockito.Mockito.mock;
 import junit.framework.TestCase;
 
-import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.testfixture.Fixture;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Widget;
 
 
 public class DisposeEvent_Test extends TestCase {
 
-  private static final String WIDGET_DISPOSED = "widgetDiposed|";
-
-  private String log;
-  private Display display;
-  private Composite shell;
-
-  protected void setUp() throws Exception {
-    Fixture.setUp();
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    log = "";
-    display = new Display();
-    shell = new Shell( display );
-  }
-
-  protected void tearDown() throws Exception {
-    Fixture.tearDown();
-  }
-
-  public void testAddListener() {
-    DisposeListener listener = new DisposeListener() {
-      public void widgetDisposed( DisposeEvent event ) {
-        log += WIDGET_DISPOSED;
-      }
-    };
-    shell.addDisposeListener( listener );
-
-    shell.notifyListeners( SWT.Dispose, new Event() );
-    
-    assertEquals( WIDGET_DISPOSED, log );
-  }
-  
-  public void testRemoveListener() {
-    DisposeListener listener = new DisposeListener() {
-      public void widgetDisposed( DisposeEvent event ) {
-        log += WIDGET_DISPOSED;
-      }
-    };
-    shell.addDisposeListener( listener );
-
-    shell.removeDisposeListener( listener );
-
-    assertEquals( "", log );
-  }
-
-  // bug 328043
-  public void testUntypedEvent() {
-    DisposeListener listener = new DisposeListener() {
-      public void widgetDisposed( DisposeEvent event ) {
-        log += WIDGET_DISPOSED;
-      }
-    };
-    shell.addDisposeListener( listener );
-
+  public void testUntypedEventConstructor() {
     Event event = new Event();
-    event.widget = shell;
-    event.type = SWT.Dispose;
-    event.display = display;
-    shell.notifyListeners( SWT.Dispose, event );
-
-    assertEquals( WIDGET_DISPOSED, log );
+    event.display = mock( Display.class );
+    event.widget = mock( Widget.class );
+    event.time = 7;
+    event.data = new Object();
+    
+    DisposeEvent disposeEvent = new DisposeEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( disposeEvent, event );
   }
+
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/FocusEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/FocusEvent_Test.java
index 1249ad1..f1ba0e2 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/FocusEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/FocusEvent_Test.java
@@ -13,25 +13,29 @@
 
 import static org.eclipse.rap.rwt.internal.lifecycle.DisplayUtil.getId;
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
-
-import java.util.ArrayList;
-import java.util.List;
-
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Widget;
+import org.mockito.ArgumentCaptor;
 
 
 public class FocusEvent_Test extends TestCase {
 
   private Display display;
   private Shell shell;
-  private List<FocusEvent> events;
-  private FocusAdapter listener;
+  private FocusListener focusListener;
 
   @Override
   protected void setUp() throws Exception {
@@ -39,17 +43,7 @@
     display = new Display();
     shell = new Shell( display );
     shell.open();
-    events = new ArrayList<FocusEvent>();
-    listener = new FocusAdapter() {
-      @Override
-      public void focusLost( FocusEvent event ) {
-        events.add( event );
-      }
-      @Override
-      public void focusGained( FocusEvent event ) {
-        events.add( event );
-      }
-    };
+    focusListener = mock( FocusListener.class );
     Fixture.fakeNewRequest( display );
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
   }
@@ -59,7 +53,7 @@
     Fixture.tearDown();
   }
 
-  public void testUntypedEventConstructor() throws Exception {
+  public void testUntypedEventConstructor() {
     Event event = new Event();
     event.display = display;
     event.widget = mock( Widget.class );
@@ -74,49 +68,47 @@
     Button unfocusControl = new Button( shell, SWT.PUSH );
     unfocusControl.setText( "unfocusControl" );
     unfocusControl.setFocus();
-    unfocusControl.addFocusListener( listener );
+    unfocusControl.addFocusListener( focusListener );
     Button focusControl = new Button( shell, SWT.PUSH );
     focusControl.setText( "focusControl" );
     
     Fixture.fakeSetParameter( getId( display ), "focusControl", getId( focusControl ) );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 1, events.size() );
-    FocusEvent event = events.get( 0 );
-    assertEquals( SWT.FocusOut, event.getID() );
-    assertSame( unfocusControl, event.getSource() );
+    verify( focusListener, never() ).focusGained( any( FocusEvent.class ) );
+    ArgumentCaptor<FocusEvent> captor = ArgumentCaptor.forClass( FocusEvent.class );
+    verify( focusListener ).focusLost( captor.capture() );
+    assertEquals( unfocusControl, captor.getValue().widget );
   }
 
   public void testFocusGained() {
     Control control = new Button( shell, SWT.PUSH );
-    control.addFocusListener( listener );
+    control.addFocusListener( focusListener );
 
     Fixture.fakeSetParameter( getId( display ), "focusControl", getId( control ) );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 1, events.size() );
-    FocusEvent event = events.get( 0 );
-    assertEquals( SWT.FocusIn, event.getID() );
-    assertSame( control, event.getSource() );
+    verify( focusListener, never() ).focusLost( any( FocusEvent.class ) );
+    ArgumentCaptor<FocusEvent> captor = ArgumentCaptor.forClass( FocusEvent.class );
+    verify( focusListener ).focusGained( captor.capture() );
+    assertEquals( control, captor.getValue().widget );
   }
 
   public void testFocusGainedLostOrder() {
     Button button1 = new Button( shell, SWT.PUSH );
-    button1.addFocusListener( listener );
     Button button2 = new Button( shell, SWT.PUSH );
-    button2.addFocusListener( listener );
     button1.setFocus();
-    events.clear();
+    button1.addFocusListener( focusListener );
+    button2.addFocusListener( focusListener );
 
     Fixture.fakeSetParameter( getId( display ), "focusControl", getId( button2 ) );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 2, events.size() );
-    FocusEvent event1 = events.get( 0 );
-    assertEquals( SWT.FocusOut, event1.getID() );
-    assertSame( button1, event1.widget );
-    FocusEvent event2 = events.get( 1 );
-    assertEquals( SWT.FocusIn, event2.getID() );
-    assertSame( button2, event2.widget );
+    ArgumentCaptor<FocusEvent> captor1 = ArgumentCaptor.forClass( FocusEvent.class );
+    verify( focusListener ).focusLost( captor1.capture() );
+    assertEquals( button1, captor1.getValue().widget );
+    ArgumentCaptor<FocusEvent> captor2 = ArgumentCaptor.forClass( FocusEvent.class );
+    verify( focusListener ).focusGained( captor2.capture() );
+    assertEquals( button2, captor2.getValue().widget );
   }
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/KeyEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/KeyEvent_Test.java
index f1708c9..1e48891 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/KeyEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/KeyEvent_Test.java
@@ -11,9 +11,9 @@
 package org.eclipse.swt.events;
 
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
 
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -23,11 +23,15 @@
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.internal.protocol.ClientMessageConst;
-import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
-import org.mockito.ArgumentCaptor;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swt.widgets.Widget;
+import org.mockito.InOrder;
 
 
 public class KeyEvent_Test extends TestCase {
@@ -50,99 +54,74 @@
     Fixture.tearDown();
   }
 
-  public void testCopyFieldsFromUntypedEvent() {
-    Button button = new Button( shell, SWT.PUSH );
-    KeyListener listener = mock( KeyListener.class );
-    button.addKeyListener( listener );
-    Object data = new Object();
+  public void testUntypedEventConstructor() throws Exception {
     Event event = new Event();
+    event.display = display;
+    event.widget = mock( Widget.class );
+    event.time = 4325;
     event.stateMask = 23;
     event.keyCode = 42;
     event.character = 'f';
     event.doit = true;
-    event.data = data;
-
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    button.notifyListeners( SWT.KeyDown, event );
-
-    ArgumentCaptor<KeyEvent> captor = ArgumentCaptor.forClass( KeyEvent.class );
-    verify( listener, times( 1 ) ).keyPressed( captor.capture() );
-    KeyEvent keyEvent = captor.getValue();
-    assertSame( button, keyEvent.getSource() );
-    assertSame( button, keyEvent.widget );
-    assertSame( display, keyEvent.display );
-    assertSame( data, keyEvent.data );
-    assertEquals( 23, keyEvent.stateMask );
-    assertEquals( 42, keyEvent.keyCode );
-    assertEquals( 'f', keyEvent.character );
-    assertEquals( true, keyEvent.doit );
-    assertEquals( SWT.KeyDown, keyEvent.getID() );
+    event.data = new Object();
+    
+    KeyEvent keyEvent = new KeyEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( keyEvent, event );
   }
 
   public void testKeySelectionEventsOrder() {
+    KeyListener keyListener = mock( KeyListener.class );
+    SelectionListener selectionListener = mock( SelectionListener.class );
     Tree tree = createTreeWithKeyListener();
-    tree.addSelectionListener( new SelectionListener() {
-      public void widgetSelected( SelectionEvent event ) {
-        events.add( event );
-      }
-      public void widgetDefaultSelected( SelectionEvent event ) {
-        events.add( event );
-      }
-    } );
     Fixture.fakeNewRequest( display );
     fakeKeyDownRequest( tree, 65, 65 );
     fakeSelectionRequest( tree, tree.getItem( 1 ) );
 
-    events.clear();
+    tree.addKeyListener( keyListener );
+    tree.addSelectionListener( selectionListener );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 3, events.size() );
-    assertEquals( SWT.KeyDown, ( ( TypedEvent )events.get( 0 ) ).getID() );
-    assertEquals( SWT.Selection, ( ( TypedEvent )events.get( 1 ) ).getID() );
-    assertEquals( SWT.KeyUp, ( ( TypedEvent )events.get( 2 ) ).getID() );
+    InOrder inOrder = inOrder( keyListener, selectionListener );
+    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
+    inOrder.verify( selectionListener ).widgetSelected( any( SelectionEvent.class ) );
+    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
   }
 
   public void testKeyTreeEventsOrder() {
+    KeyListener keyListener = mock( KeyListener.class );
+    TreeListener treeListener = mock( TreeListener.class );
     Tree tree = createTreeWithKeyListener();
-    tree.addTreeListener( new TreeListener() {
-      public void treeExpanded( TreeEvent event ) {
-        events.add( event );
-      }
-      public void treeCollapsed( TreeEvent event ) {
-        events.add( event );
-      }
-    } );
     Fixture.fakeNewRequest( display );
     fakeKeyDownRequest( tree, 65, 65 );
     fakeTreeRequest( tree.getItem( 1 ) );
 
-    events.clear();
+    tree.addKeyListener( keyListener );
+    tree.addTreeListener( treeListener );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 3, events.size() );
-    assertEquals( SWT.KeyDown, ( ( TypedEvent )events.get( 0 ) ).getID() );
-    assertEquals( SWT.Expand, ( ( TypedEvent )events.get( 1 ) ).getID() );
-    assertEquals( SWT.KeyUp, ( ( TypedEvent )events.get( 2 ) ).getID() );
+    InOrder inOrder = inOrder( keyListener, treeListener );
+    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
+    inOrder.verify( treeListener ).treeExpanded( any( TreeEvent.class ) );
+    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
   }
 
   public void testKeyHelpEventsOrder() {
+    KeyListener keyListener = mock( KeyListener.class );
+    HelpListener helpListener = mock( HelpListener.class );
     Tree tree = createTreeWithKeyListener();
-    tree.addHelpListener( new HelpListener() {
-      public void helpRequested( HelpEvent event ) {
-        events.add( event );
-      }
-    } );
     Fixture.fakeNewRequest( display );
     fakeKeyDownRequest( tree, 65, 65 );
     fakeHelpRequest( tree );
 
-    events.clear();
+    tree.addKeyListener( keyListener );
+    tree.addHelpListener( helpListener );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 3, events.size() );
-    assertEquals( SWT.KeyDown, ( ( TypedEvent )events.get( 0 ) ).getID() );
-    assertEquals( SWT.Help, ( ( TypedEvent )events.get( 1 ) ).getID() );
-    assertEquals( SWT.KeyUp, ( ( TypedEvent )events.get( 2 ) ).getID() );
+    InOrder inOrder = inOrder( keyListener, helpListener );
+    inOrder.verify( keyListener ).keyPressed( any( KeyEvent.class ) );
+    inOrder.verify( helpListener ).helpRequested( any( HelpEvent.class ) );
+    inOrder.verify( keyListener ).keyReleased( any( KeyEvent.class ) );
   }
 
   private Tree createTreeWithKeyListener() {
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MenuDetectEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MenuDetectEvent_Test.java
index 5d7fe8e..49ef28c 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MenuDetectEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MenuDetectEvent_Test.java
@@ -10,57 +10,43 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
-import java.util.ArrayList;
-import java.util.List;
-
+import static org.mockito.Mockito.mock;
 import junit.framework.TestCase;
 
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Widget;
 
 
 public class MenuDetectEvent_Test extends TestCase {
 
   private Display display;
-  private Shell shell;
 
   protected void setUp() throws Exception {
     Fixture.setUp();
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
     display = new Display();
-    shell = new Shell( display );
   }
 
   protected void tearDown() throws Exception {
     Fixture.tearDown();
   }
 
-  public void testCopyFieldsFromUntypedEvent() {
-    final List<MenuDetectEvent> log = new ArrayList<MenuDetectEvent>();
-    Button button = new Button( shell, SWT.PUSH );
-    button.addMenuDetectListener( new MenuDetectListener() {
-      public void menuDetected( MenuDetectEvent event ) {
-        log.add( event );
-      }
-    } );
-    Object data = new Object();
+  public void testUntypedEventConstructor() throws Exception {
     Event event = new Event();
+    event.display = display;
+    event.widget = mock( Widget.class );
+    event.time = 4325;
     event.x = 10;
     event.y = 20;
     event.doit = true;
-    event.data = data;
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    button.notifyListeners( SWT.MenuDetect, event );
-    MenuDetectEvent menuDetectEvent = log.get( 0 );
-    assertSame( button, menuDetectEvent.getSource() );
-    assertSame( button, menuDetectEvent.widget );
-    assertSame( display, menuDetectEvent.display );
-    assertSame( data, menuDetectEvent.data );
-    assertEquals( event.x, menuDetectEvent.x );
-    assertEquals( event.y, menuDetectEvent.y );
-    assertEquals( event.doit, menuDetectEvent.doit );
-    assertEquals( SWT.MenuDetect, menuDetectEvent.getID() );
+    event.data = new Object();
+    
+    MenuDetectEvent menuDeteectEvent = new MenuDetectEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( menuDeteectEvent, event );
   }
+
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MouseEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MouseEvent_Test.java
index 43a843d..0943d0b 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MouseEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/MouseEvent_Test.java
@@ -13,6 +13,7 @@
 
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
 import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -37,6 +38,8 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableItem;
 import org.eclipse.swt.widgets.Widget;
+import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
 
 
 public class MouseEvent_Test extends TestCase {
@@ -95,6 +98,7 @@
     event.x = 10;
     event.y = 20;
     event.stateMask = 23;
+    event.count = 8;
     
     MouseEvent mouseEvent = new MouseEvent( event );
     
@@ -156,66 +160,81 @@
   }
 
   public void testTypedMouseEventOrderWithClick() {
+    MouseListener mouseListener = mock( MouseListener.class );
     shell.setLocation( 100, 100 );
     shell.open();
-    shell.addMouseListener( new LoggingMouseListener( events ) );
+    shell.addMouseListener( mouseListener );
     int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
     int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
+
     // Simulate request that sends a mouseDown + mouseUp sequence
     Fixture.fakeNewRequest( display );
     fakeMouseDownRequest( shell, eventX, eventY );
     fakeMouseUpRequest( shell, eventX, eventY );
     Fixture.readDataAndProcessAction( display );
-    assertEquals( 2, events.size() );
-    MouseEvent mouseDown = ( ( MouseEvent )events.get( 0 ) );
-    assertEquals( SWT.MouseDown, mouseDown.getID() );
+    
+    InOrder inOrder = inOrder( mouseListener );
+    ArgumentCaptor<MouseEvent> downCaptor = ArgumentCaptor.forClass( MouseEvent.class );
+    inOrder.verify( mouseListener ).mouseDown( downCaptor.capture() );
+    MouseEvent mouseDown = downCaptor.getValue();
     assertSame( shell, mouseDown.widget );
     assertEquals( 1, mouseDown.button );
     assertEquals( 15, mouseDown.x );
     assertEquals( 53, mouseDown.y );
-    MouseEvent mouseUp = ( ( MouseEvent )events.get( 1 ) );
-    assertEquals( SWT.MouseUp, mouseUp.getID() );
+    assertEquals( 1, mouseDown.count );
+    ArgumentCaptor<MouseEvent> upCaptor = ArgumentCaptor.forClass( MouseEvent.class );
+    inOrder.verify( mouseListener ).mouseUp( upCaptor.capture() );
+    MouseEvent mouseUp = upCaptor.getValue();
     assertSame( shell, mouseUp.widget );
     assertEquals( 1, mouseUp.button );
     assertEquals( 15, mouseUp.x );
     assertEquals( 53, mouseUp.y );
     assertTrue( ( mouseUp.stateMask & SWT.BUTTON1 ) != 0 );
+    assertEquals( 1, mouseUp.count );
   }
 
   public void testTypedMouseEventOrderWithDoubleClick() {
+    MouseListener mouseListener = mock( MouseListener.class );
     shell.setLocation( 100, 100 );
     shell.open();
-    shell.addMouseListener( new LoggingMouseListener( events ) );
+    shell.addMouseListener( mouseListener );
     int eventX = shell.getLocation().x + shell.getClientArea().x + 1;
     int eventY = shell.getLocation().y + shell.getClientArea().y + 1;
+
     // Simulate request that sends a mouseDown + mouseUp + dblClick sequence
     Fixture.fakeNewRequest( display );
     fakeMouseDownRequest( shell, eventX, eventY );
     fakeMouseUpRequest( shell, eventX, eventY );
     fakeMouseDoubleClickRequest( shell, eventX, eventY );
     Fixture.readDataAndProcessAction( display );
-    assertEquals( 3, events.size() );
-    MouseEvent mouseDown = ( ( MouseEvent )events.get( 0 ) );
-    assertEquals( SWT.MouseDown, mouseDown.getID() );
+    
+    InOrder inOrder = inOrder( mouseListener );
+    ArgumentCaptor<MouseEvent> downCaptor = ArgumentCaptor.forClass( MouseEvent.class );
+    inOrder.verify( mouseListener ).mouseDown( downCaptor.capture() );
+    MouseEvent mouseDown = downCaptor.getValue();
     assertSame( shell, mouseDown.widget );
     assertEquals( 1, mouseDown.button );
     assertEquals( 15, mouseDown.x );
     assertEquals( 53, mouseDown.y );
-    assertTrue( ( mouseDown.stateMask & SWT.BUTTON1 ) != 0 );
-    MouseEvent mouseDoubleClick = ( ( MouseEvent )events.get( 1 ) );
-    assertEquals( SWT.MouseDoubleClick, mouseDoubleClick.getID() );
+    assertEquals( 2, mouseDown.count );
+    ArgumentCaptor<MouseEvent> doubleClickCaptor = ArgumentCaptor.forClass( MouseEvent.class );
+    inOrder.verify( mouseListener ).mouseDoubleClick( doubleClickCaptor.capture() );
+    MouseEvent mouseDoubleClick = doubleClickCaptor.getValue();
     assertSame( shell, mouseDoubleClick.widget );
     assertEquals( 1, mouseDoubleClick.button );
     assertEquals( 15, mouseDoubleClick.x );
     assertEquals( 53, mouseDoubleClick.y );
     assertTrue( ( mouseDoubleClick.stateMask & SWT.BUTTON1 ) != 0 );
-    MouseEvent mouseUp = ( ( MouseEvent )events.get( 2 ) );
-    assertEquals( SWT.MouseUp, mouseUp.getID() );
+    assertEquals( 2, mouseDoubleClick.count );
+    ArgumentCaptor<MouseEvent> upCaptor = ArgumentCaptor.forClass( MouseEvent.class );
+    inOrder.verify( mouseListener ).mouseUp( upCaptor.capture() );
+    MouseEvent mouseUp = upCaptor.getValue();
     assertSame( shell, mouseUp.widget );
     assertEquals( 1, mouseUp.button );
     assertEquals( 15, mouseUp.x );
     assertEquals( 53, mouseUp.y );
     assertTrue( ( mouseUp.stateMask & SWT.BUTTON1 ) != 0 );
+    assertEquals( 2, mouseUp.count );
   }
 
   public void testUntypedMouseEventOrderWithClick() {
@@ -324,50 +343,43 @@
   }
 
   public void testMouseSelectionEventsOrder() {
+    MouseListener mouseListener = mock( MouseListener.class );
+    SelectionListener selectionListener = mock( SelectionListener.class );
     Table table = createTableWithMouseListener();
-    table.addSelectionListener( new SelectionListener() {
-      public void widgetSelected( SelectionEvent event ) {
-        events.add( event );
-      }
-      public void widgetDefaultSelected( SelectionEvent event ) {
-        events.add( event );
-      }
-    } );
     Fixture.fakeNewRequest( display );
     fakeMouseDownRequest( table, 30, 50 );
     fakeMouseDoubleClickRequest( table, 30, 50 );
     fakeMouseUpRequest( table, 30, 50 );
     fakeSelectionRequest( table, table.getItem( 1 ) );
 
-    events.clear();
+    table.addMouseListener( mouseListener );
+    table.addSelectionListener( selectionListener );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 4, events.size() );
-    assertEquals( SWT.MouseDown, ( ( TypedEvent )events.get( 0 ) ).getID() );
-    assertEquals( SWT.MouseDoubleClick, ( ( TypedEvent )events.get( 1 ) ).getID() );
-    assertEquals( SWT.Selection, ( ( TypedEvent )events.get( 2 ) ).getID() );
-    assertEquals( SWT.MouseUp, ( ( TypedEvent )events.get( 3 ) ).getID() );
+    InOrder inOrder = inOrder( selectionListener, mouseListener );
+    inOrder.verify( mouseListener ).mouseDown( any( MouseEvent.class ) );
+    inOrder.verify( mouseListener ).mouseDoubleClick( any( MouseEvent.class ) );
+    inOrder.verify( selectionListener ).widgetSelected( any( SelectionEvent.class ) );
+    inOrder.verify( mouseListener ).mouseUp( any( MouseEvent.class ) );
   }
 
   public void testMouseMenuDetectEventsOrder() {
+    MouseListener mouseListener = mock( MouseListener.class );
+    MenuDetectListener menuDetectListener = mock( MenuDetectListener.class );
     Table table = createTableWithMouseListener();
-    table.addMenuDetectListener( new MenuDetectListener() {
-      public void menuDetected( MenuDetectEvent event ) {
-        events.add( event );
-      }
-    } );
     Fixture.fakeNewRequest( display );
     fakeMouseDownRequest( table, 30, 50 );
     fakeMouseUpRequest( table, 30, 50 );
     fakeMenuDetectRequest( table, 30, 50 );
 
-    events.clear();
+    table.addMouseListener( mouseListener );
+    table.addMenuDetectListener( menuDetectListener );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 3, events.size() );
-    assertEquals( SWT.MouseDown, ( ( TypedEvent )events.get( 0 ) ).getID() );
-    assertEquals( SWT.MenuDetect, ( ( TypedEvent )events.get( 1 ) ).getID() );
-    assertEquals( SWT.MouseUp, ( ( TypedEvent )events.get( 2 ) ).getID() );
+    InOrder inOrder = inOrder( menuDetectListener, mouseListener );
+    inOrder.verify( mouseListener ).mouseDown( any( MouseEvent.class ) );
+    inOrder.verify( menuDetectListener ).menuDetected( any( MenuDetectEvent.class ) );
+    inOrder.verify( mouseListener ).mouseUp( any( MouseEvent.class ) );
   }
 
   private Table createTableWithMouseListener() {
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/PaintEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/PaintEvent_Test.java
new file mode 100644
index 0000000..fbcaa78
--- /dev/null
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/PaintEvent_Test.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2012 EclipseSource and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *    EclipseSource - initial API and implementation
+ ******************************************************************************/
+package org.eclipse.swt.events;
+
+import static org.mockito.Mockito.mock;
+import junit.framework.TestCase;
+
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Widget;
+
+
+public class PaintEvent_Test extends TestCase {
+
+  public void testUntypedEventConstructor() throws Exception {
+    Event event = new Event();
+    event.display = mock( Display.class );
+    event.widget = mock( Widget.class );
+    event.time = 321;
+    event.gc = mock( GC.class );
+    event.x = 3;
+    event.y = 4;
+    event.width = 5;
+    event.height = 6;
+    event.count = 99;
+
+    PaintEvent paintEvent = new PaintEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( paintEvent, event );
+  }
+
+}
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TreeEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TreeEvent_Test.java
index feced56..764a383 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TreeEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TreeEvent_Test.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2002, 2008 Innoopract Informationssysteme GmbH and others.
+ * Copyright (c) 2002, 2012 Innoopract Informationssysteme GmbH and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -11,49 +11,25 @@
  ******************************************************************************/
 package org.eclipse.swt.events;
 
+import static org.mockito.Mockito.mock;
 import junit.framework.TestCase;
 
-import org.eclipse.rap.rwt.lifecycle.PhaseId;
-import org.eclipse.rap.rwt.testfixture.Fixture;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Widget;
 
 public class TreeEvent_Test extends TestCase {
 
-  private static final String TREE_EXPANDED = "treeExpanded";
-  private static final String TREE_COLLAPSED = "treeCollapsed";
-  
-  private String log = "";
-  private Display display;
-
-  protected void setUp() throws Exception {
-    Fixture.setUp();
-    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
-    display = new Display();
+  public void testUntypedEventConstructor() {
+    Event event = new Event();
+    event.display = mock( Display.class );
+    event.widget = mock( Widget.class );
+    event.time = 7;
+    event.data = new Object();
+    
+    TreeEvent treeEvent = new TreeEvent( event );
+    
+    EventTestHelper.assertFieldsEqual( treeEvent, event );
   }
 
-  protected void tearDown() throws Exception {
-    Fixture.tearDown();
-  }
-
-  public void testAddRemoveListener() {
-    TreeListener listener = new TreeListener() {
-      public void treeCollapsed( TreeEvent e ) {
-        log += TREE_COLLAPSED;
-      }
-      public void treeExpanded( TreeEvent e ) {
-        log += TREE_EXPANDED;
-      }
-    };
-    Shell shell = new Shell( display, SWT.NONE );
-    Tree tree = new Tree( shell, SWT.NONE );
-    tree.addTreeListener( listener );
-    log = "";
-    tree.notifyListeners( SWT.Collapse, new Event() );
-    assertEquals( TREE_COLLAPSED, log );
-
-    log = "";
-    tree.notifyListeners( SWT.Expand, new Event() );
-    assertEquals( TREE_EXPANDED, log );
-  }
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TypedEvent_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TypedEvent_Test.java
index bad222b..16a3fdf 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TypedEvent_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/events/TypedEvent_Test.java
@@ -81,6 +81,7 @@
     
     TestTypedEvent typedEvent = new TestTypedEvent( event );
     
+    assertSame( event.widget, typedEvent.getSource() );
     EventTestHelper.assertFieldsEqual( typedEvent, event );
   }
 
@@ -151,22 +152,10 @@
 
   public void testSourceConstructor() {
     TypedEvent event = new TypedEvent( shell );
-    assertSame( shell, event.widget );
-    assertSame( shell.getDisplay(), event.display );
-  }
-
-  public void testEventConstructor() {
-    Event event = new Event();
-    event.widget = shell;
-    event.display = shell.getDisplay();
-    event.data = new Object();
     
-    TypedEvent typedEvent = new TypedEvent( event );
-    
-    assertSame( event.widget, typedEvent.getSource() );
-    assertSame( event.widget, typedEvent.widget );
-    assertSame( event.display, typedEvent.display );
-    assertSame( event.data, typedEvent.data );
+    assertSame( shell, event.getSource() );
+    assertNull( event.widget );
+    assertNull( event.display );
   }
 
   public void testEventConstructorWithNullWidget() {
@@ -186,14 +175,6 @@
     }
   }
 
-  public void testSourceIdConstructorWithNullWidget() {
-    try {
-      new TypedEvent( null, SWT.Arm );
-      fail();
-    } catch( IllegalArgumentException expected ) {
-    }
-  }
-
   private static void fakeMouseDownRequest( Widget widget, int x, int y ) {
     Map<String, Object> parameters = new HashMap<String, Object>();
     parameters.put( ClientMessageConst.EVENT_PARAM_BUTTON, Integer.valueOf( 1 ) );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/events/EventLCAUtil_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/events/EventLCAUtil_Test.java
index 2b86b5d..cbbc993 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/events/EventLCAUtil_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/events/EventLCAUtil_Test.java
@@ -12,7 +12,9 @@
 
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_WIDGET_SELECTED;
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
+import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
@@ -21,12 +23,15 @@
 
 import junit.framework.TestCase;
 
+import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.ScrolledComposite;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Scrollable;
 import org.eclipse.swt.widgets.Shell;
 import org.mockito.ArgumentCaptor;
 
@@ -42,6 +47,7 @@
     display = new Display();
     shell = new Shell( display );
     Fixture.fakeNewRequest( display );
+    Fixture.fakePhase( PhaseId.PROCESS_ACTION );
   }
 
   @Override
@@ -143,7 +149,55 @@
     assertTrue( ( button & SWT.BUTTON5 ) != 0 );
   }
   
-  public void testProcessScrollBarSelection() {
-    fail( "tests mising" );
+  public void testProcessVerticalScrollBarSelection() {
+    SelectionListener listener = mock( SelectionListener.class );
+    Scrollable scrollable = createScrollable( listener );
+    
+    simulateScrollbarSelected( scrollable, "vertical", Boolean.TRUE );
+    EventLCAUtil.processScrollBarSelection( scrollable );
+    
+    verify( listener ).widgetSelected( any( SelectionEvent.class ) );
+    verify( listener, never() ).widgetDefaultSelected( any( SelectionEvent.class ) );
+  }
+
+  public void testProcessHorizontalScrollBarSelection() {
+    SelectionListener listener = mock( SelectionListener.class );
+    Scrollable scrollable = createScrollable( listener );
+    
+    simulateScrollbarSelected( scrollable, "horizontal", Boolean.TRUE );
+    EventLCAUtil.processScrollBarSelection( scrollable );
+    
+    verify( listener ).widgetSelected( any( SelectionEvent.class ) );
+    verify( listener, never() ).widgetDefaultSelected( any( SelectionEvent.class ) );
+  }
+  
+  public void testProcessVerticalAndHorizontalScrollBarSelection() {
+    SelectionListener listener = mock( SelectionListener.class );
+    Scrollable scrollable = createScrollable( listener );
+    
+    Map<String, Object> parameters = new HashMap<String, Object>();
+    parameters.put( "vertical", Boolean.TRUE );
+    parameters.put( "horizontal", Boolean.TRUE );
+    Fixture.fakeNotifyOperation( getId( scrollable ), "scrollBarSelected", parameters );
+    EventLCAUtil.processScrollBarSelection( scrollable );
+    
+    verify( listener, times( 2 ) ).widgetSelected( any( SelectionEvent.class ) );
+    verify( listener, never() ).widgetDefaultSelected( any( SelectionEvent.class ) );
+  }
+  
+  private Scrollable createScrollable( SelectionListener listener ) {
+    Scrollable result = new ScrolledComposite( shell, SWT.H_SCROLL | SWT.V_SCROLL );
+    result.getVerticalBar().addSelectionListener( listener );
+    result.getHorizontalBar().addSelectionListener( listener );
+    return result;
+  }
+
+  private static void simulateScrollbarSelected( Scrollable scrollable, 
+                                                 String paramKey, 
+                                                 Object paramValue ) 
+  {
+    Map<String, Object> parameters = new HashMap<String, Object>();
+    parameters.put( paramKey, paramValue );
+    Fixture.fakeNotifyOperation( getId( scrollable ), "scrollBarSelected", parameters );
   }
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/Decorator_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/Decorator_Test.java
index ddebd22..2f30245 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/Decorator_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/Decorator_Test.java
@@ -16,11 +16,14 @@
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.FocusEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
 
 @SuppressWarnings("deprecation")
 // TODO [rh] rename to ControlDecorator_Test
@@ -43,7 +46,8 @@
     assertEquals( 0, decoration.getMarginWidth() );
     assertFalse( decoration.isVisible() );
     assertEquals( new Rectangle( 0, 0, 0, 0 ), decoration.getBounds() );
-    assertFalse( FocusEvent.hasListener( control ) );
+    assertFalse( control.isListening( SWT.FocusIn ) );
+    assertFalse( control.isListening( SWT.FocusOut ) );
     assertEquals( 1, Decorator.getDecorators( control ).length );
 
     decoration = new ControlDecorator( control, SWT.LEFT, shell );
@@ -110,28 +114,41 @@
     assertEquals( 5, decoration.getMarginWidth() );
   }
 
-  public void testShowOnlyOnFocus() {
+  public void testSetShowOnlyOnFocusToTrue() {
     Composite composite = new Composite( shell, SWT.NONE );
     Control control = new Button( composite, SWT.PUSH );
     ControlDecorator decoration = new ControlDecorator( control, SWT.RIGHT, null );
-    assertFalse( decoration.getShowOnlyOnFocus() );
-    assertFalse( FocusEvent.hasListener( control ) );
+
     decoration.setShowOnlyOnFocus( true );
+    
     assertTrue( decoration.getShowOnlyOnFocus() );
-    assertTrue( FocusEvent.hasListener( control ) );
-    decoration.setShowOnlyOnFocus( false );
-    assertFalse( decoration.getShowOnlyOnFocus() );
-    assertFalse( FocusEvent.hasListener( control ) );
+    assertTrue( control.isListening( SWT.FocusIn ) );
+    assertTrue( control.isListening( SWT.FocusOut ) );
   }
 
-  public void testShowOnlyOnFocusCalledTwice() {
+  public void testSetShowOnlyOnFocusToFalse() {
+    Composite composite = new Composite( shell, SWT.NONE );
+    Control control = new Button( composite, SWT.PUSH );
+    ControlDecorator decoration = new ControlDecorator( control, SWT.RIGHT, null );
+    decoration.setShowOnlyOnFocus( true );
+    
+    decoration.setShowOnlyOnFocus( false );
+
+    assertFalse( decoration.getShowOnlyOnFocus() );
+    assertFalse( control.isListening( SWT.FocusIn ) );
+    assertFalse( control.isListening( SWT.FocusOut ) );
+  }
+  
+  public void testSetShowOnlyOnFocusCalledTwice() {
     Control control = new Button( shell, SWT.PUSH );
     ControlDecorator decoration = new ControlDecorator( control, SWT.RIGHT, null );
     decoration.setShowOnlyOnFocus( true );
-    assertTrue( FocusEvent.hasListener( control ) );
+
     decoration.setShowOnlyOnFocus( true );
     decoration.setShowOnlyOnFocus( false );
-    assertFalse( FocusEvent.hasListener( control ) );
+
+    assertFalse( control.isListening( SWT.FocusIn ) );
+    assertFalse( control.isListening( SWT.FocusOut ) );
   }
 
   public void testShowHover() {
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DNDSupport_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DNDSupport_Test.java
index 6b3fe45..ea94eb4 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DNDSupport_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/internal/widgets/displaykit/DNDSupport_Test.java
@@ -61,7 +61,8 @@
 
   private Display display;
   private Shell shell;
-  private List<TypedEvent> log;
+  private List<TypedEvent> events;
+  private List<Integer> eventTypes;
   private Control sourceControl;
   private Control targetControl;
   private DragSource dragSource;
@@ -76,7 +77,8 @@
     shell.open();
     sourceControl = new Label( shell, SWT.NONE );
     targetControl = new Label( shell, SWT.NONE );
-    log = new ArrayList<TypedEvent>();
+    events = new ArrayList<TypedEvent>();
+    eventTypes = new ArrayList<Integer>();
     Fixture.fakeNewRequest( display );
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
     transfers = new Transfer[] {
@@ -132,7 +134,8 @@
     addLogger( dragSource );
     sourceControl.addDragDetectListener( new DragDetectListener() {
       public void dragDetected( DragDetectEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( SWT.DragDetect ) );
       }
     } );
 
@@ -151,7 +154,7 @@
     dragSource.addDragListener( new DragSourceAdapter() {
       @Override
       public void dragStart( DragSourceEvent event ) {
-        log.add( event );
+        events.add( event );
       }
     } );
 
@@ -159,7 +162,7 @@
     createDragSourceEvent( "dragStart", 20, 30, "move", 1 );
     Fixture.executeLifeCycleFromServerThread();
 
-    DragSourceEvent dragSourceEvent = ( DragSourceEvent )log.get( 0 );
+    DragSourceEvent dragSourceEvent = ( DragSourceEvent )events.get( 0 );
     assertEquals( 4, dragSourceEvent.x );
     assertEquals( 4, dragSourceEvent.y );
   }
@@ -248,7 +251,7 @@
       }
       @Override
       public void drop( DropTargetEvent event ) {
-        log.add( event );
+        events.add( event );
       }
     } );
     addLogger( dragSource );
@@ -290,12 +293,14 @@
     dropTarget.addDropListener( new DropTargetAdapter() {
       @Override
       public void dropAccept( DropTargetEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( DND.DropAccept ) );
         event.detail = DND.DROP_NONE;
       }
       @Override
       public void drop( DropTargetEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( DND.Drop ) );
       }
     } );
     addLogger( dragSource );
@@ -318,9 +323,9 @@
     fakeDragSourceEvent( "dragFinished", 1 );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 1, log.size() );
+    assertEquals( 1, events.size() );
     DragSourceEvent event = getDragSourceEvent( 0 );
-    assertEquals( DND.DragEnd, event.getID() );
+    assertEquals( DND.DragEnd, getEventType( 0 ) );
     assertTrue( event.doit ); // Actual SWT behavior
   }
 
@@ -332,12 +337,12 @@
     dropTarget.addDropListener( new DropTargetAdapter() {
       @Override
       public void dropAccept( DropTargetEvent event ) {
-        log.add( event );
+        events.add( event );
         event.detail = DND.DROP_COPY;
       }
       @Override
       public void drop( DropTargetEvent event ) {
-        log.add( event );
+        events.add( event );
       }
     } );
 
@@ -677,10 +682,9 @@
     Fixture.executeLifeCycleFromServerThread();
 
     DropTargetEvent dragOperationChanged = getDropTargetEvent( 1 );
-    assertEquals( DND.DragOperationChanged, dragOperationChanged.getID() );
+    assertEquals( DND.DragOperationChanged, getEventType( 1 ) );
     assertTrue( ( dragOperationChanged.detail & DND.DROP_COPY ) != 0 );
-    DropTargetEvent dragOver = getDropTargetEvent( 2 );
-    assertEquals( DND.DragOver, dragOver.getID() );
+    assertEquals( DND.DragOver, getEventType( 2 ) );
   }
 
   public void testOperationsField() {
@@ -700,7 +704,7 @@
     fakeDropTargetEvent( "dropAccept", 8 );
     Fixture.readDataAndProcessAction( display );
 
-    assertEquals( 6, log.size() );
+    assertEquals( 6, events.size() );
     assertEquals( DND.DROP_MOVE | DND.DROP_LINK, getDropTargetEvent( 0 ).operations );
     assertEquals( DND.DROP_MOVE | DND.DROP_LINK, getDropTargetEvent( 1 ).operations );
     assertEquals( DND.DROP_MOVE | DND.DROP_LINK, getDropTargetEvent( 2 ).operations );
@@ -768,13 +772,16 @@
   private void addLogger( DragSource dragSource ) {
     dragSource.addDragListener( new DragSourceListener() {
       public void dragStart( DragSourceEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( DND.DragStart ) );
       }
       public void dragSetData( DragSourceEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( DND.DragSetData ) );
       }
       public void dragFinished( DragSourceEvent event ) {
-        log.add( event );
+        events.add( event );
+        eventTypes.add( Integer.valueOf( DND.DragEnd ) );
       }
     } );
   }
@@ -783,31 +790,10 @@
     dropTarget.addDropListener( new LoggingDropTargetListener() );
   }
 
-  private class LoggingDropTargetListener implements DropTargetListener {
-    public void dragEnter( DropTargetEvent event ) {
-      log.add( event );
-    }
-    public void dragLeave( DropTargetEvent event ) {
-      log.add( event );
-    }
-    public void dragOperationChanged( DropTargetEvent event ) {
-      log.add( event );
-    }
-    public void dragOver( DropTargetEvent event ) {
-      log.add( event );
-    }
-    public void drop( DropTargetEvent event ) {
-      log.add( event );
-    }
-    public void dropAccept( DropTargetEvent event ) {
-      log.add( event );
-    }
-  }
-
   private int[] getEventOrder() {
-    int[] result = new int[ log.size() ];
+    int[] result = new int[ eventTypes.size() ];
     for( int i = 0; i < result.length; i++ ) {
-      result[ i ] = log.get( i ).getID();
+      result[ i ] = eventTypes.get( i ).intValue();
     }
     return result;
   }
@@ -820,13 +806,44 @@
       }
     } );
   }
+  
+  private int getEventType( int index ) {
+    return eventTypes.get( index ).intValue();
+  }
 
   private DropTargetEvent getDropTargetEvent( int index ) {
-    return ( DropTargetEvent )log.get( index );
+    return ( DropTargetEvent )events.get( index );
   }
 
   private DragSourceEvent getDragSourceEvent( int index ) {
-    return ( DragSourceEvent )log.get( index );
+    return ( DragSourceEvent )events.get( index );
+  }
+
+  private class LoggingDropTargetListener implements DropTargetListener {
+    public void dragEnter( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.DragEnter ) );
+    }
+    public void dragLeave( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.DragLeave ) );
+    }
+    public void dragOperationChanged( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.DragOperationChanged ) );
+    }
+    public void dragOver( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.DragOver ) );
+    }
+    public void drop( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.Drop ) );
+    }
+    public void dropAccept( DropTargetEvent event ) {
+      events.add( event );
+      eventTypes.add( Integer.valueOf( DND.DropAccept ) );
+    }
   }
 
 }
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Canvas_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Canvas_Test.java
index 3f3a042..2343cf3 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Canvas_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Canvas_Test.java
@@ -61,18 +61,6 @@
     assertEquals( event.height, canvas.getClientArea().height );
   }
   
-  public void testRemovePaintListener() {
-    PaintListener listener = new PaintListener() {
-      public void paintControl( PaintEvent event ) {
-        paintEventLog.add( event );
-      }
-    };
-    canvas.addPaintListener( listener );
-    canvas.removePaintListener( listener );
-    canvas.redraw();
-    assertEquals( 0, paintEventLog.size() );
-  }
-  
   public void testResize() {
     canvas.addPaintListener( new PaintListener() {
       public void paintControl( PaintEvent event ) {
@@ -108,6 +96,15 @@
     assertTrue( canvas.isListening( SWT.Paint ) );
   }
 
+  public void testRemovePaintListener() {
+    PaintListener listener = mock( PaintListener.class );
+    canvas.addPaintListener( listener );
+    
+    canvas.removePaintListener( listener );
+    
+    assertFalse( canvas.isListening( SWT.Paint ) );
+  }
+  
   public void testRemovePaintListenerUnregistersUntypedEvent() {
     PaintListener listener = mock( PaintListener.class );
     canvas.addPaintListener( listener );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Display_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Display_Test.java
index 7e3c34c..10b19b3 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Display_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Display_Test.java
@@ -16,6 +16,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
@@ -27,18 +28,39 @@
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.graphics.Graphics;
 import org.eclipse.rap.rwt.internal.application.RWTFactory;
-import org.eclipse.rap.rwt.internal.lifecycle.*;
-import org.eclipse.rap.rwt.lifecycle.*;
-import org.eclipse.rap.rwt.testfixture.*;
+import org.eclipse.rap.rwt.internal.lifecycle.DisplayUtil;
+import org.eclipse.rap.rwt.internal.lifecycle.EntryPointUtil;
+import org.eclipse.rap.rwt.internal.lifecycle.IDisplayLifeCycleAdapter;
+import org.eclipse.rap.rwt.internal.lifecycle.IUIThreadHolder;
+import org.eclipse.rap.rwt.internal.lifecycle.LifeCycleUtil;
+import org.eclipse.rap.rwt.internal.lifecycle.RWTLifeCycle;
+import org.eclipse.rap.rwt.lifecycle.IEntryPoint;
+import org.eclipse.rap.rwt.lifecycle.ILifeCycleAdapter;
+import org.eclipse.rap.rwt.lifecycle.IWidgetAdapter;
+import org.eclipse.rap.rwt.lifecycle.PhaseId;
+import org.eclipse.rap.rwt.lifecycle.UICallBack;
+import org.eclipse.rap.rwt.lifecycle.WidgetUtil;
+import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.rap.rwt.testfixture.internal.NoOpRunnable;
-import org.eclipse.swt.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.SWTError;
+import org.eclipse.swt.SWTException;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.graphics.*;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.Cursor;
+import org.eclipse.swt.graphics.Device;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.internal.widgets.IDisplayAdapter;
 import org.eclipse.swt.layout.FillLayout;
+import org.mockito.ArgumentCaptor;
 
 
 public class Display_Test extends TestCase {
@@ -1014,28 +1036,6 @@
     assertTrue( display.isDisposed() );
   }
 
-  public void testDisposeWithExceptionsInListeners() {
-    Display display = new Display();
-    Shell shell = new Shell( display );
-    shell.addDisposeListener( new DisposeListener() {
-      public void widgetDisposed( DisposeEvent event ) {
-        throw new RuntimeException();
-      }
-    } );
-    display.addListener( SWT.Dispose, new Listener() {
-      public void handleEvent( Event event ) {
-        throw new RuntimeException();
-      }
-    } );
-    display.disposeExec( new Runnable() {
-      public void run() {
-        throw new RuntimeException();
-      }
-    } );
-    display.dispose();
-    assertTrue( display.isDisposed() );
-  }
-
   public void testSystemCursor() {
     Display display = new Display();
     Cursor arrow = display.getSystemCursor( SWT.CURSOR_ARROW );
@@ -1457,13 +1457,95 @@
     
     verify( listener, never() ).handleEvent( any( Event.class ) );
   }
+  
+  public void testAddListenerWithNullArgument() {
+    Display display = new Display();
+    
+    try {
+      display.addListener( 123, null );
+      fail();
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
 
+  public void testRemoveListenerWithNullArgument() {
+    Display display = new Display();
+    
+    try {
+      display.removeListener( 123, null );
+      fail();
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
+  
+  public void testAddListener() {
+    Display display = new Display();
+    Listener listener = mock( Listener.class );
+    
+    display.addListener( 123, listener );
+    Event event = new Event();
+    display.sendEvent( 123, event );
+    
+    verify( listener ).handleEvent( event );
+  }
+  
+  public void testRemoveListener() {
+    Display display = new Display();
+    Listener listener = mock( Listener.class );
+    display.addListener( 123, listener );
+    
+    display.removeListener( 123, listener );
+    display.sendEvent( 123, new Event() );
+    
+    verifyZeroInteractions( listener );
+  }
+  
+  public void testSendEvent() {
+    Display display = new Display();
+    Listener listener = mock( Listener.class );
+    display.addListener( 123, listener );
+    
+    display.sendEvent( 123, new Event() );
+    
+    ArgumentCaptor<Event> captor = ArgumentCaptor.forClass( Event.class );
+    verify( listener ).handleEvent( captor.capture() );
+    assertEquals( 123, captor.getValue().type );
+    assertEquals( display, captor.getValue().display );
+    assertTrue( captor.getValue().time > 0 );
+  }
+  
+  public void testSendEventWithPredefinedTime() {
+    Display display = new Display();
+    Listener listener = mock( Listener.class );
+    display.addListener( 123, listener );
+    
+    Event event = new Event();
+    event.time = 4;
+    display.sendEvent( 123, event );
+    
+    ArgumentCaptor<Event> captor = ArgumentCaptor.forClass( Event.class );
+    verify( listener ).handleEvent( captor.capture() );
+    assertEquals( 123, captor.getValue().type );
+    assertEquals( display, captor.getValue().display );
+    assertEquals( event.time, captor.getValue().time );
+  }
+  
+  public void testRemoveListenerWithoutAddingListener() {
+    Display display = new Display();
+    Listener listener = mock( Listener.class );
+    
+    display.removeListener( 123, listener );
+    display.sendEvent( 123, new Event() );
+    
+    verifyZeroInteractions( listener );
+  }
+  
   private static void setCursorLocation( Display display, int x, int y ) {
     IDisplayAdapter adapter = display.getAdapter( IDisplayAdapter.class );
     adapter.setCursorLocation( x, y );
   }
 
-  public static final class EnsureIdEntryPoint implements IEntryPoint {
+  public static class EnsureIdEntryPoint implements IEntryPoint {
     public int createUI() {
       Display display = new Display();
       Shell shell = new Shell( display );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
index 0c3c2a4..e8665e8 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TableColumn_Test.java
@@ -394,6 +394,48 @@
     }
   }
 
+  public void testAddControlListenerWithNullArgument() {
+    Table table = new Table( shell, SWT.NONE );
+    TableColumn column = new TableColumn( table, SWT.NONE );
+    
+    try {
+      column.addControlListener( null );
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
+
+  public void testAddControlListener() {
+    Table table = new Table( shell, SWT.NONE );
+    TableColumn column = new TableColumn( table, SWT.NONE );
+
+    column.addControlListener( mock( ControlListener.class ) );
+    
+    assertTrue( column.isListening( SWT.Move ) );
+    assertTrue( column.isListening( SWT.Resize ) );
+  }
+
+  public void testRemoveControlListenerWithNullArgument() {
+    Table table = new Table( shell, SWT.NONE );
+    TableColumn column = new TableColumn( table, SWT.NONE );
+
+    try {
+      column.removeControlListener( null );
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
+
+  public void testRemoveControlListener() {
+    ControlListener listener = mock( ControlListener.class );
+    Table table = new Table( shell, SWT.NONE );
+    TableColumn column = new TableColumn( table, SWT.NONE );
+    column.addControlListener( listener );
+    
+    column.removeControlListener( listener );
+    
+    assertFalse( column.isListening( SWT.Move ) );
+    assertFalse( column.isListening( SWT.Resize ) );
+  }
+
   protected void setUp() throws Exception {
     Fixture.setUp();
     Fixture.fakePhase( PhaseId.PROCESS_ACTION );
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
index 3818e69..a5e3a00 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/TreeColumn_Test.java
@@ -22,6 +22,7 @@
 import org.eclipse.rap.rwt.lifecycle.PhaseId;
 import org.eclipse.rap.rwt.testfixture.Fixture;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
 
@@ -315,6 +316,44 @@
     }
   }
 
+  public void testAddControlListenerWithNullArgument() {
+    TreeColumn column = new TreeColumn( tree, SWT.NONE );
+    
+    try {
+      column.addControlListener( null );
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
+
+  public void testAddControlListener() {
+    TreeColumn column = new TreeColumn( tree, SWT.NONE );
+
+    column.addControlListener( mock( ControlListener.class ) );
+    
+    assertTrue( column.isListening( SWT.Move ) );
+    assertTrue( column.isListening( SWT.Resize ) );
+  }
+
+  public void testRemoveControlListenerWithNullArgument() {
+    TreeColumn column = new TreeColumn( tree, SWT.NONE );
+
+    try {
+      column.removeControlListener( null );
+    } catch( IllegalArgumentException expected ) {
+    }
+  }
+
+  public void testRemoveControlListener() {
+    ControlListener listener = mock( ControlListener.class );
+    TreeColumn column = new TreeColumn( tree, SWT.NONE );
+    column.addControlListener( listener );
+    
+    column.removeControlListener( listener );
+    
+    assertFalse( column.isListening( SWT.Move ) );
+    assertFalse( column.isListening( SWT.Resize ) );
+  }
+
   //////////////////
   // Helping classes
 
diff --git a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Widget_Test.java b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Widget_Test.java
index e7942c8..fde54b6 100644
--- a/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Widget_Test.java
+++ b/tests/org.eclipse.rap.rwt.test/src/org/eclipse/swt/widgets/Widget_Test.java
@@ -289,10 +289,17 @@
   public void testRemoveListener() {
     // Ensure that removing a listener that was never added is ignored
     // silently see https://bugs.eclipse.org/251816
-    shell.removeListener( SWT.Activate, new Listener() {
-      public void handleEvent( Event event ) {
-      }
-    } );
+    shell.removeListener( SWT.Activate, mock( Listener.class ) );
+  }
+
+  // bug 328043
+  public void testUntypedDisposeListener() {
+    DisposeListener listener = mock( DisposeListener.class );
+    shell.addDisposeListener( listener );
+
+    shell.notifyListeners( SWT.Dispose, new Event() );
+
+    verify( listener ).widgetDisposed( any( DisposeEvent.class ) );
   }
 
   public void testNotifyListeners() {