diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
index 0670431..fc79bac 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumngroupkip/GridColumnGroupLCA_Test.java
@@ -14,12 +14,9 @@
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.loadImage;
 import static org.eclipse.nebula.widgets.grid.internal.gridkit.GridLCATestUtil.jsonEquals;
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
 import java.io.IOException;
 import java.util.Arrays;
+import java.util.LinkedList;
 import java.util.List;
 
 import org.eclipse.nebula.widgets.grid.Grid;
@@ -34,18 +31,16 @@
 import org.eclipse.rap.rwt.testfixture.Message.DestroyOperation;
 import org.eclipse.rap.rwt.testfixture.Message.Operation;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.internal.graphics.ImageFactory;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.mockito.ArgumentCaptor;
-
 import junit.framework.TestCase;
 
 
@@ -246,31 +241,29 @@
   }
 
   public void testProcessTreeEvent_Expanded() {
-    TreeListener treeListener = mock( TreeListener.class );
-    group.addTreeListener( treeListener );
+    List<Event> events = new LinkedList<Event>();
+    group.addListener( SWT.Expand, new LoggingTreeListener( events ) );
     group.setExpanded( false );
 
     Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_TREE_EXPANDED, null );
     Fixture.readDataAndProcessAction( group );
 
-    ArgumentCaptor<TreeEvent> captor = ArgumentCaptor.forClass( TreeEvent.class );
-    verify( treeListener, times( 1 ) ).treeExpanded( captor.capture() );
-    TreeEvent event = captor.getValue();
-    assertEquals( group, event.getSource() );
+    assertEquals( 1, events.size() );
+    Event event = events.get( 0 );
+    assertEquals( group, event.widget );
     assertTrue( group.getExpanded() );
   }
 
   public void testProcessTreeEvent_Collapsed() {
-    TreeListener treeListener = mock( TreeListener.class );
-    group.addTreeListener( treeListener );
+    List<Event> events = new LinkedList<Event>();
+    group.addListener( SWT.Collapse, new LoggingTreeListener( events ) );
 
     Fixture.fakeNotifyOperation( getId( group ), ClientMessageConst.EVENT_TREE_COLLAPSED, null );
     Fixture.readDataAndProcessAction( group );
 
-    ArgumentCaptor<TreeEvent> captor = ArgumentCaptor.forClass( TreeEvent.class );
-    verify( treeListener, times( 1 ) ).treeCollapsed( captor.capture() );
-    TreeEvent event = captor.getValue();
-    assertEquals( group, event.getSource() );
+    assertEquals( 1, events.size() );
+    Event event = events.get( 0 );
+    assertEquals( group, event.widget );
     assertFalse( group.getExpanded() );
   }
 
@@ -430,4 +423,17 @@
     assertNull( message.findSetOperation( group, "customVariant" ) );
   }
 
+  //////////////////
+  // Helping classes
+
+  private static class LoggingTreeListener implements Listener {
+    private final List<Event> events;
+    private LoggingTreeListener( List<Event> events ) {
+      this.events = events;
+    }
+    public void handleEvent( Event event ) {
+      events.add( event );
+    }
+  }
+
 }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
index 64afc1c..5231437 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/gridcolumnkit/GridColumnLCA_Test.java
@@ -14,11 +14,6 @@
 import static org.eclipse.nebula.widgets.grid.GridTestUtil.loadImage;
 import static org.eclipse.nebula.widgets.grid.internal.gridkit.GridLCATestUtil.jsonEquals;
 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.times;
-import static org.mockito.Mockito.verify;
-
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -37,8 +32,6 @@
 import org.eclipse.rap.rwt.testfixture.Message.DestroyOperation;
 import org.eclipse.rap.rwt.testfixture.Message.Operation;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -46,6 +39,8 @@
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.internal.graphics.ImageFactory;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.json.JSONArray;
 import org.json.JSONException;
@@ -523,11 +518,10 @@
   }
 
   public void testReadWidth() {
+    final List<Event> events = new LinkedList<Event>();
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
-    ControlListener controlListener0 = mock( ControlListener.class );
-    columns[ 0 ].addControlListener( controlListener0 );
-    ControlListener controlListener1 = mock( ControlListener.class );
-    columns[ 1 ].addControlListener( controlListener1 );
+    columns[ 0 ].addListener( SWT.Resize, new LoggingControlListener( events ) );
+    columns[ 1 ].addListener( SWT.Move, new LoggingControlListener( events ) );
 
     // Simulate request that initializes widgets
     Fixture.fakeNewRequest( display );
@@ -541,22 +535,23 @@
     Fixture.fakeCallOperation( getId( columns[ 0 ] ), "resize", parameters );
     Fixture.executeLifeCycleFromServerThread();
 
-    verify( controlListener0, times( 1 ) ).controlResized( any( ControlEvent.class ) );
+    assertEquals( 2, events.size() );
+    Event event = events.get( 0 );
+    assertSame( columns[ 0 ], event.widget );
     assertEquals( newWidth, columns[ 0 ].getWidth() );
-    verify( controlListener1, times( 1 ) ).controlMoved( any( ControlEvent.class ) );
+    event = events.get( 1 );
+    assertSame( columns[ 1 ], event.widget );
     Message message = Fixture.getProtocolMessage();
     assertEquals( Integer.valueOf( newWidth ), message.findSetProperty( columns[ 0 ], "width" ) );
     assertEquals( Integer.valueOf( newLeft ), message.findSetProperty( columns[ 1 ], "left" ) );
   }
 
   public void testReadLeft() {
+    final List<Event> events = new LinkedList<Event>();
     GridColumn[] columns = createGridColumns( grid, 2, SWT.NONE );
-    ControlListener controlListener = mock( ControlListener.class );
-    column.addControlListener( controlListener );
-    ControlListener controlListener0 = mock( ControlListener.class );
-    columns[ 0 ].addControlListener( controlListener0 );
-    ControlListener controlListener1 = mock( ControlListener.class );
-    columns[ 1 ].addControlListener( controlListener1 );
+    column.addListener( SWT.Move, new LoggingControlListener( events ) );
+    columns[ 0 ].addListener( SWT.Move, new LoggingControlListener( events ) );
+    columns[ 1 ].addListener( SWT.Move, new LoggingControlListener( events ) );
 
     // Simulate request that initializes widgets
     Fixture.fakeNewRequest( display );
@@ -569,9 +564,11 @@
     Fixture.fakeCallOperation( getId( columns[ 0 ] ), "move", parameters );
     Fixture.executeLifeCycleFromServerThread();
 
-    verify( controlListener, times( 1 ) ).controlMoved( any( ControlEvent.class ) );
-    verify( controlListener0, times( 1 ) ).controlMoved( any( ControlEvent.class ) );
-    verify( controlListener1, times( 0 ) ).controlMoved( any( ControlEvent.class ) );
+    assertEquals( 2, events.size() );
+    Event event = events.get( 0 );
+    assertSame( columns[ 0 ], event.widget );
+    event = events.get( 1 );
+    assertSame( column, event.widget );
     Message message = Fixture.getProtocolMessage();
     assertEquals( Integer.valueOf( 20 ), message.findSetProperty( column, "left" ) );
     assertEquals( Integer.valueOf( 0 ), message.findSetProperty( columns[ 0 ], "left" ) );
@@ -976,4 +973,17 @@
     assertEquals( JSONObject.NULL, message.findSetProperty( column, "footerImage" ) );
   }
 
+  //////////////////
+  // Helping classes
+
+  private static class LoggingControlListener implements Listener {
+    private final List<Event> events;
+    private LoggingControlListener( List<Event> events ) {
+      this.events = events;
+    }
+    public void handleEvent( Event event ) {
+      events.add( event );
+    }
+  }
+
 }
diff --git a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
index 14c3f77..67a3dfa 100644
--- a/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
+++ b/tests/org.eclipse.rap.nebula.widgets.grid.test/src/org/eclipse/nebula/widgets/grid/internal/griditemkit/GridItemLCA_Test.java
@@ -16,11 +16,10 @@
 import static org.eclipse.nebula.widgets.grid.internal.gridkit.GridLCATestUtil.jsonEquals;
 import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.EVENT_TREE_EXPANDED;
 import static org.eclipse.rap.rwt.lifecycle.WidgetUtil.getId;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
 import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
 import org.eclipse.nebula.widgets.grid.Grid;
 import org.eclipse.nebula.widgets.grid.GridItem;
 import org.eclipse.rap.rwt.RWT;
@@ -32,17 +31,15 @@
 import org.eclipse.rap.rwt.testfixture.Message.CreateOperation;
 import org.eclipse.rap.rwt.testfixture.Message.DestroyOperation;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.TreeEvent;
-import org.eclipse.swt.events.TreeListener;
 import org.eclipse.swt.graphics.Font;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Shell;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
-import org.mockito.ArgumentCaptor;
-
 import junit.framework.TestCase;
 
 
@@ -620,34 +617,32 @@
   }
 
   public void testProcessTreeEvent_Expanded() {
-    TreeListener treeListener = mock( TestTreeListener.class );
-    grid.addTreeListener( treeListener );
+    List<Event> events = new LinkedList<Event>();
+    grid.addListener( SWT.Expand, new LoggingTreeListener( events ) );
     new GridItem( item, SWT.NONE );
 
     Fixture.fakeNotifyOperation( getId( item ), ClientMessageConst.EVENT_TREE_EXPANDED, null );
     Fixture.readDataAndProcessAction( item );
 
-    ArgumentCaptor<TreeEvent> captor = ArgumentCaptor.forClass( TreeEvent.class );
-    verify( treeListener, times( 1 ) ).treeExpanded( captor.capture() );
-    TreeEvent event = captor.getValue();
-    assertEquals( grid, event.getSource() );
+    assertEquals( 1, events.size() );
+    Event event = events.get( 0 );
+    assertEquals( grid, event.widget );
     assertEquals( item, event.item );
     assertTrue( item.isExpanded() );
   }
 
   public void testProcessTreeEvent_Collapsed() {
-    TreeListener treeListener = mock( TestTreeListener.class );
-    grid.addTreeListener( treeListener );
+    List<Event> events = new LinkedList<Event>();
+    grid.addListener( SWT.Collapse, new LoggingTreeListener( events ) );
     new GridItem( item, SWT.NONE );
     item.setExpanded( true );
 
     Fixture.fakeNotifyOperation( getId( item ), ClientMessageConst.EVENT_TREE_COLLAPSED, null );
     Fixture.readDataAndProcessAction( item );
 
-    ArgumentCaptor<TreeEvent> captor = ArgumentCaptor.forClass( TreeEvent.class );
-    verify( treeListener, times( 1 ) ).treeCollapsed( captor.capture() );
-    TreeEvent event = captor.getValue();
-    assertEquals( grid, event.getSource() );
+    assertEquals( 1, events.size() );
+    Event event = events.get( 0 );
+    assertEquals( grid, event.widget );
     assertEquals( item, event.item );
     assertFalse( item.isExpanded() );
   }
@@ -669,12 +664,13 @@
   //////////////////
   // Helping classes
 
-  // [if] Workaround for mockito exception on the build server:
-  // "Mockito cannot mock this class: interface org.eclipse.swt.events.TreeListener"
-  public static class TestTreeListener implements TreeListener {
-    public void treeCollapsed( TreeEvent event ) {
+  private static class LoggingTreeListener implements Listener {
+    private final List<Event> events;
+    private LoggingTreeListener( List<Event> events ) {
+      this.events = events;
     }
-    public void treeExpanded( TreeEvent event ) {
+    public void handleEvent( Event event ) {
+      events.add( event );
     }
   }
 
