Merge remote-tracking branch 'eclipse/master' into recorder-spike
diff --git a/.git-svn-authors b/.git-svn-authors
index 36897d9..b7e86b6 100644
--- a/.git-svn-authors
+++ b/.git-svn-authors
@@ -1,3 +1,3 @@
 kpadegaonka = Ketan Padegaonkar <ketanpadegaonkar@gmail.com>
 mchauvin = Mariot Chauvin <mariot.chauvin@obeo.fr>
-
+caniszczyk = Chris Aniszczyk <caniszczyk@gmail.com>
diff --git a/.gitignore b/.gitignore
index 69ff730..03ab73c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,15 +1,17 @@
 /eclipse/
 /.metadata/
-.svn/
 /swtbot/
 .DS_Store
 /*/bin
+target/
 
 examples/rcp/*/bin/
 examples/gef/*/bin/
 
 /*/screenshots
 
+org.eclipse.swtbot.releng/.git.properties
+
 org.eclipse.swtbot.releng/externals/eclipse-SDK-*
 org.eclipse.swtbot.releng/externals/libs
 org.eclipse.swtbot.releng/externals/eclipse-test-framework-3.3.zip
@@ -20,7 +22,6 @@
 org.eclipse.swtbot.releng/build.properties
 org.eclipse.swtbot.releng/artifacts/
 org.eclipse.swtbot.releng/to-upload/
-org.eclipse.swtbot.releng/javadoc
 
 org.eclipse.swtbot.releng/test-sandbox/results/
 org.eclipse.swtbot.releng/test-sandbox/screenshots/
@@ -32,17 +33,17 @@
 
 /swtbot/
 
-org.eclipse.swtbot.junit4_x/.classpath
-org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF
-org.eclipse.swtbot.junit4_x/build.properties
-
-org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF
-
 org.eclipse.swtbot.releng/test-sandbox/passFail.txt
+org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.ui.test.ser
+
 org.eclipse.swtbot.swt.finder.test/keyboard.layout
 org.eclipse.swtbot.swt.finder.test/keyboard.layout.filtered
-org.eclipse.swtbot.eclipse.ui/.classpath
-org.eclipse.swtbot.eclipse.ui/build.properties
+
+org.eclipse.ui.forms.examples/examples.jar
+
 /eclipse-3.4/
 /eclipse-3.5/
 /eclipse/
+
+*recorder*
+External Plug-in Libraries
diff --git a/.project b/.project
new file mode 100644
index 0000000..f104bbe
--- /dev/null
+++ b/.project
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>swtbot</name>
+	<comment/>
+	<projects/>
+	<buildSpec/>
+	<natures/>
+</projectDescription>
diff --git a/examples/gef/org.eclipse.gef.examples.logic.test/META-INF/MANIFEST.MF b/examples/gef/org.eclipse.gef.examples.logic.test/META-INF/MANIFEST.MF
index 5f3b888..4605293 100644
--- a/examples/gef/org.eclipse.gef.examples.logic.test/META-INF/MANIFEST.MF
+++ b/examples/gef/org.eclipse.gef.examples.logic.test/META-INF/MANIFEST.MF
@@ -2,13 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: GEF logic SWTBot Test
 Bundle-SymbolicName: org.eclipse.gef.examples.logic.test
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.gef.examples.logic,
  org.eclipse.swtbot.eclipse.gef.finder,
  org.eclipse.swtbot.eclipse.finder,
  org.eclipse.swtbot.eclipse.core,
  org.eclipse.swtbot.swt.finder,
+ org.eclipse.swtbot.junit4_x,
  org.junit4,
  org.eclipse.swt,
  org.eclipse.ui,
@@ -16,4 +17,5 @@
  org.hamcrest,
  org.eclipse.gef,
  org.eclipse.core.runtime,
- org.apache.log4j
+ org.apache.log4j,
+ org.eclipse.core.resources
diff --git a/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorTest.java b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorAndCreateContentsExampleTest.java
similarity index 72%
rename from examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorTest.java
rename to examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorAndCreateContentsExampleTest.java
index 5f4d54e..291eb40 100644
--- a/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorTest.java
+++ b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/OpenGefEditorAndCreateContentsExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Obeo
+ * Copyright (c) 2009, 2010 Obeo
  * 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
@@ -22,13 +22,15 @@
 import org.eclipse.swtbot.swt.finder.matchers.AbstractMatcher;
 import org.hamcrest.Description;
 
-public class OpenGefEditorTest extends SWTBotGefTestCase {
+public class OpenGefEditorAndCreateContentsExampleTest extends SWTBotGefTestCase {
 
 
 	private NewEmptyEmfProject emfProject = new NewEmptyEmfProject();
+	
 	private CreateLogicDiagram logicDiagram = new CreateLogicDiagram();
 
-
+	private SWTBotGefEditor editor;
+	
 
 	@Override
 	protected void setUp() throws Exception {
@@ -36,7 +38,6 @@
 		closeWelcomePage();
 	}
 
-
 	private void closeWelcomePage() {
 		try {
 			bot.viewByTitle("Welcome").close();
@@ -49,55 +50,44 @@
 		bot.menu("File").menu("Save").click();
 	}
 
-	public void testCreateFile() throws Exception {
-
+	public void testCreateContents() throws Exception {
 		emfProject.createProject("test");
 		logicDiagram.createFile("test", "test.logic");
-		SWTBotGefEditor editor = bot.gefEditor("test.logic");
+		editor = bot.gefEditor("test.logic");
 		createContents(editor);
 		saveCurrentEditor();
-		bot.sleep(3000);	
 	}
 
-//	public void testCreateMFile() throws Exception {
-//		emfProject.createProject("testM");
-//		logicDiagram.createMFile("testM", "test.logicm");
-//		final SWTBotGefEditor editor = bot.gefEditor("Logic M Graphical Editor");	
-//		createContents(editor);
-//		saveCurrentEditor();
-//		bot.sleep(3000);	
-//	}
-
 	private void createContents(final SWTBotGefEditor editor) {
 
 		editor.activateTool("Circuit");
-		editor.mouseDrag(55, 55, 150, 100);
+		editor.drag(55, 55, 150, 100);
 
 		editor.activateTool("Circuit");
-		editor.mouseMoveLeftClick(150, 150);
+		editor.click(150, 150);
 
 		editor.activateTool("Connection");
-		editor.mouseMoveLeftClick(150, 150);
-		editor.mouseMoveLeftClick(55, 55);
+		editor.click(150, 150);
+		editor.click(55, 55);
 
 
 		editor.activateTool("Or Gate");
-		editor.mouseMoveLeftClick(200, 200);
+		editor.click(200, 200);
 
 		editor.activateTool("Connection");
-		editor.mouseMoveLeftClick(150, 150);
-		editor.mouseMoveLeftClick(200, 200);
+		editor.click(150, 150);
+		editor.click(200, 200);
 
 
-		editor.mouseMoveLeftClick(200, 150);
-		editor.mouseMoveLeftClick(210, 200);
+		editor.click(200, 150);
+		editor.click(210, 200);
 
 
-		editor.mouseMoveLeftClick(200, 200);
-		editor.mouseMoveLeftClick(230, 230);
+		editor.click(200, 200);
+		editor.click(230, 230);
 		
 		editor.activateTool("Label");
-		editor.mouseMoveLeftClick(300, 300);
+		editor.click(300, 300);
 		List<SWTBotGefEditPart> editParts = editor.editParts(new AbstractMatcher<LogicLabelEditPart>() {
 			@Override
 			protected boolean doMatch(Object item) {
diff --git a/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/AllTests.java b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/AllTests.java
new file mode 100644
index 0000000..f3a2e62
--- /dev/null
+++ b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/AllTests.java
@@ -0,0 +1,351 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 Obeo
+ * 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:
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.gef.examples.logic.test.unit;
+
+import static org.eclipse.swtbot.eclipse.gef.finder.matchers.IsInstanceOf.instanceOf;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.draw2d.Connection;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.geometry.Point;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.examples.logic.test.CreateLogicDiagram;
+import org.eclipse.gef.examples.logic.test.NewEmptyEmfProject;
+import org.eclipse.gef.examples.logicdesigner.edit.CircuitEditPart;
+import org.eclipse.gef.examples.logicdesigner.edit.LogicLabelEditPart;
+import org.eclipse.gef.examples.logicdesigner.model.Circuit;
+import org.eclipse.gef.examples.logicdesigner.model.Wire;
+import org.eclipse.swtbot.eclipse.gef.finder.SWTBotGefTestCase;
+import org.eclipse.swtbot.eclipse.gef.finder.SWTGefBot;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefConnectionEditPart;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditor;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.ui.PlatformUI;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(SWTBotJunit4ClassRunner.class)
+public class AllTests extends SWTBotGefTestCase implements LogicModeler {
+
+	private static final String	PROJECT_NAME	= "Test";
+
+	private static final String	FILE_NAME		= "test.logic";
+
+	private NewEmptyEmfProject	emfProject		= new NewEmptyEmfProject();
+
+	private CreateLogicDiagram	logicDiagram	= new CreateLogicDiagram();
+
+	private SWTBotGefEditor		editor;
+
+	@BeforeClass
+	public static void closeWelcomePage() {
+		try {
+			new SWTGefBot().viewByTitle("Welcome").close();
+		} catch (WidgetNotFoundException e) {
+			// do nothing
+		}
+	}
+	
+	@Before
+	public void setUp() throws Exception {
+		super.setUp();
+		emfProject.createProject(PROJECT_NAME);
+		logicDiagram.createFile(PROJECT_NAME, FILE_NAME);
+		editor = bot.gefEditor(FILE_NAME);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		if (editor != null)
+			editor.close();
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME);
+		project.delete(true, null);
+		super.tearDown();
+	}
+
+	public void saveCurrentEditor() throws Exception {
+		bot.menu("File").menu("Save").click();
+	}
+
+	@Test
+	public void activateTool() {
+		editor.activateTool(TOOL_CIRCUIT);
+		assertEquals(TOOL_CIRCUIT, getActiveToolLabel());
+
+		editor.activateTool(TOOL_CONNECTION);
+		assertEquals(TOOL_CONNECTION, getActiveToolLabel());
+
+		editor.activateTool(TOOL_OR_GATE);
+		assertEquals(TOOL_OR_GATE, getActiveToolLabel());
+
+		editor.activateTool(TOOL_CIRCUIT);
+		assertEquals(TOOL_CIRCUIT, getActiveToolLabel());
+	}
+
+	private String getActiveToolLabel() {
+		return editor.getActiveTool().getLabel();
+	}
+
+	@Test
+	public void doubleClick() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(10, 10);
+
+		SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		Circuit circuit = (Circuit) circuitEditPart.part().getModel();
+		final String nameBeforeDoubleClick = circuit.getName();
+		editor.select(circuitEditPart).doubleClick(15, 15);		
+		
+		/* we need to wait that double click  have been executed */
+		syncWithUIThread();
+		
+		final String nameAfterDoubleClick = circuit.getName();
+		assertFalse("circuit name was not modified by double click", nameBeforeDoubleClick.equals(nameAfterDoubleClick));
+	}
+	
+	
+	
+	@Test
+	public void getEditPartWithLabelOnCanvas() throws Exception {
+		editor.activateTool(TOOL_LABEL);
+		editor.click(10, 10);
+		SWTBotGefEditPart botPart = editor.getEditPart("Label");
+		assertNotNull(botPart);
+		assertTrue(botPart.part() instanceof LogicLabelEditPart);
+	}
+
+	@Test
+	public void getEditPartWithLabelInsideNode() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(10, 10);
+		editor.activateTool(TOOL_LABEL);
+		editor.click(10 + 3, 10 + 3);
+
+		SWTBotGefEditPart botPart = editor.getEditPart("Label");
+		assertNotNull(botPart);
+		assertTrue(botPart.part() instanceof LogicLabelEditPart);
+	}
+
+	@Test
+	public void drag() throws Exception {
+		editor.activateTool(TOOL_LABEL);
+		editor.click(10, 10);
+		editor.drag("Label", 100, 110);
+
+		Rectangle bounds = ((GraphicalEditPart) editor.getEditPart("Label").part()).getFigure().getBounds();
+		assertEquals(100, bounds.x);
+		assertEquals(110, bounds.y);
+	}
+
+	@Test
+	public void dragOnResizableElement() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(30, 30);
+		SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		Rectangle boundsBeforeDrag = getBounds(circuitEditPart);
+		editor.drag(circuitEditPart, 50, 50);
+		syncWithUIThread();
+		checkSize(getBounds(circuitEditPart), boundsBeforeDrag.width, boundsBeforeDrag.height);
+	}
+
+	@Test
+	public void dragAndDropWithRelativeCoodinatesFigure() throws Exception {
+
+		int offset = 30;
+		int circuitFigureSize = 100;
+
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(offset, offset);
+
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(circuitFigureSize * 2 + offset, offset);
+
+		SWTBotGefEditPart circuitEditPart1 = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		SWTBotGefEditPart circuitEditPart2 = editor.editParts(instanceOf(CircuitEditPart.class)).get(1);
+
+		/* create a child of circuitEditPart1 */
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(circuitFigureSize / 2 + offset, circuitFigureSize / 2 + offset);
+
+		SWTBotGefEditPart circuitEditPart1child = circuitEditPart1.children().get(0);
+
+		editor.drag(circuitEditPart1child, 5 * (circuitFigureSize / 2) + offset, circuitFigureSize / 2 + offset);
+		syncWithUIThread();
+		assertFalse(circuitEditPart2.children().isEmpty());
+	}
+
+	@Test
+	public void resize() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(30, 30);
+		SWTBotGefEditPart circuitEditPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		Rectangle boundsBeforeResize = getBounds(circuitEditPart);
+
+		circuitEditPart.resize(PositionConstants.SOUTH_WEST, 200, 200);
+		syncWithUIThread();
+		Rectangle boundsAfterResize = getBounds(circuitEditPart);
+		checkLocation(boundsAfterResize, boundsBeforeResize.x, boundsBeforeResize.y);
+		checkSize(boundsAfterResize, 200, 200);
+
+		circuitEditPart.resize(PositionConstants.EAST, 150, 200);
+		syncWithUIThread();
+		boundsAfterResize = getBounds(circuitEditPart);
+		checkLocation(boundsAfterResize, boundsBeforeResize.x + 50, boundsBeforeResize.y);
+		checkSize(boundsAfterResize, 150, 200);
+
+		circuitEditPart.resize(PositionConstants.NORTH, 150, 50);
+		syncWithUIThread();
+		boundsAfterResize = getBounds(circuitEditPart);
+		checkLocation(boundsAfterResize, boundsBeforeResize.x + 50, boundsBeforeResize.y + 150);
+		checkSize(boundsAfterResize, 150, 50);
+
+		circuitEditPart.resize(PositionConstants.NORTH_EAST, 175, 75);
+		syncWithUIThread();
+		boundsAfterResize = getBounds(circuitEditPart);
+		checkLocation(boundsAfterResize, boundsBeforeResize.x + 25, boundsBeforeResize.y + 125);
+		checkSize(boundsAfterResize, 175, 75);
+
+	}
+
+	@Test
+	public void createBendpointFromEditor() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(10, 10);
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(120, 10);
+		editor.activateTool(TOOL_CONNECTION);
+		editor.drag(100, 20, 130, 20);
+		editor.click(130, 20);
+
+		final SWTBotGefEditPart circuitPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		final SWTBotGefConnectionEditPart wirePart = circuitPart.sourceConnections().get(0);
+		final Wire wire = (Wire) (wirePart.part()).getModel();
+		final Connection connection = (Connection) wirePart.part().getFigure();
+
+		editor.activateTool("Select");
+		assertEquals("Select", getActiveToolLabel());
+
+		Point startMove = connection.getPoints().getMidpoint().getCopy();
+		editor.click(startMove.x, startMove.y);
+
+		
+		
+		/* we need to wait element selection before proceed or drag will fail */
+		syncWithUIThread();
+		assertTrue(editor.selectedEditParts().contains(wirePart));
+
+		assertEquals(0, wire.getBendpoints().size());
+
+		editor.drag(startMove.x, startMove.y, 130, 250);
+		/* we need to wait the drag operates */
+		syncWithUIThread();
+
+		assertEquals(1, wire.getBendpoints().size());
+		/* we do not check the location, as WireBendpoint overrides getLocation to return null */
+	}
+
+	@Test
+	public void createBendpointFromEditPart() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(10, 10);
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.click(120, 10);
+		editor.activateTool(TOOL_CONNECTION);
+		editor.drag(100, 20, 130, 20);
+		editor.click(130, 20);
+
+		editor.activateTool("Select");
+		assertEquals("Select", getActiveToolLabel());
+
+		final SWTBotGefEditPart circuitPart = editor.editParts(instanceOf(CircuitEditPart.class)).get(0);
+		final SWTBotGefConnectionEditPart wirePart = circuitPart.sourceConnections().get(0);
+		final Wire wire = (Wire) wirePart.part().getModel();
+
+		assertEquals(0, wire.getBendpoints().size());
+		wirePart.createBenpoint(130, 250);
+		/* we need to wait the drag operates */
+		syncWithUIThread();
+		assertEquals(1, wire.getBendpoints().size());
+	}
+
+	@Test
+	public void directEdit() throws Exception {
+		// TODO
+	}
+
+	/* Deprecated methods */
+
+	@Test
+	public void deprecatedGetEditPartWithLabelOnCanvas() throws Exception {
+		editor.activateTool(TOOL_LABEL);
+		editor.mouseMoveLeftClick(10, 10);
+		SWTBotGefEditPart botPart = editor.getEditPart("Label");
+		assertNotNull(botPart);
+		assertTrue(botPart.part() instanceof LogicLabelEditPart);
+	}
+
+	@Test
+	public void deprecatedGetEditPartWithLabelInsideNode() throws Exception {
+		editor.activateTool(TOOL_CIRCUIT);
+		editor.mouseMoveLeftClick(10, 10);
+		editor.activateTool("Label");
+		editor.mouseMoveLeftClick(10 + 3, 10 + 3);
+
+		SWTBotGefEditPart botPart = editor.getEditPart("Label");
+		assertNotNull(botPart);
+		assertTrue(botPart.part() instanceof LogicLabelEditPart);
+	}
+
+	@Test
+	public void deprecatedDrag() throws Exception {
+		editor.activateTool(TOOL_LABEL);
+		editor.mouseMoveLeftClick(10, 10);
+		editor.mouseDrag("Label", 100, 110);
+
+		Rectangle bounds = ((GraphicalEditPart) editor.getEditPart("Label").part()).getFigure().getBounds();
+		assertEquals(100, bounds.x);
+		assertEquals(110, bounds.y);
+	}
+
+	private void syncWithUIThread() {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				while (PlatformUI.getWorkbench().getDisplay().readAndDispatch()) {
+				}
+			}
+		});
+	}
+
+	private Rectangle getBounds(SWTBotGefEditPart editPart) throws Exception {
+		return ((GraphicalEditPart) editPart.part()).getFigure().getBounds().getCopy();
+	}
+
+	private void checkLocation(final Rectangle bounds, int x, int y) throws Exception {
+		assertEquals(x, bounds.x);
+		assertEquals(y, bounds.y);
+	}
+
+	private void checkSize(final Rectangle bounds, int width, int height) throws Exception {
+		assertEquals(width, bounds.width);
+		assertEquals(height, bounds.height);
+	}
+
+}
diff --git a/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/LogicModeler.java b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/LogicModeler.java
new file mode 100644
index 0000000..5e31bf0
--- /dev/null
+++ b/examples/gef/org.eclipse.gef.examples.logic.test/src/org/eclipse/gef/examples/logic/test/unit/LogicModeler.java
@@ -0,0 +1,13 @@
+package org.eclipse.gef.examples.logic.test.unit;
+
+public interface LogicModeler {
+
+	String TOOL_LABEL = "Label";
+	
+	String TOOL_CONNECTION = "Connection";
+	
+	String TOOL_CIRCUIT = "Circuit";
+	
+	String TOOL_OR_GATE = "Or Gate";
+	
+}
diff --git a/examples/gef/org.eclipse.gef.examples.logic/META-INF/MANIFEST.MF b/examples/gef/org.eclipse.gef.examples.logic/META-INF/MANIFEST.MF
index f52fcdc..528c6e0 100644
--- a/examples/gef/org.eclipse.gef.examples.logic/META-INF/MANIFEST.MF
+++ b/examples/gef/org.eclipse.gef.examples.logic/META-INF/MANIFEST.MF
@@ -40,8 +40,10 @@
  org.eclipse.gef.ui.palette.customize,

  org.eclipse.gef.ui.parts,

  org.eclipse.gef.ui.rulers,

+ org.eclipse.jface,

  org.eclipse.jface.action,

  org.eclipse.jface.dialogs,

+ org.eclipse.jface.operation,

  org.eclipse.jface.preference,

  org.eclipse.jface.resource,

  org.eclipse.jface.util,

diff --git a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/CircuitEditPart.java b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/CircuitEditPart.java
index 78d56bb..514df3b 100644
--- a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/CircuitEditPart.java
+++ b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/CircuitEditPart.java
@@ -24,12 +24,15 @@
 import org.eclipse.gef.EditPolicy;

 import org.eclipse.gef.ExposeHelper;

 import org.eclipse.gef.MouseWheelHelper;

+import org.eclipse.gef.Request;

+import org.eclipse.gef.RequestConstants;

 import org.eclipse.gef.editparts.ViewportAutoexposeHelper;

 import org.eclipse.gef.editparts.ViewportExposeHelper;

 import org.eclipse.gef.editparts.ViewportMouseWheelHelper;

 

 import org.eclipse.gef.examples.logicdesigner.figures.CircuitFigure;

 import org.eclipse.gef.examples.logicdesigner.figures.FigureFactory;

+import org.eclipse.gef.examples.logicdesigner.model.Circuit;

 

 /**

  * Holds a circuit, which is a container capable of 

@@ -95,4 +98,11 @@
 	return getCircuitBoardFigure().getContentsPane();

 }

 

+public void performRequest(Request request){

+	if (request.getType() == RequestConstants.REQ_OPEN) {

+		Circuit circuit = (Circuit) this.getModel();

+		circuit.setName("doubleClicked");

+	}

+}

+

 }

diff --git a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/LogicLabelEditPart.java b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/LogicLabelEditPart.java
index bede19a..168a886 100644
--- a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/LogicLabelEditPart.java
+++ b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/LogicLabelEditPart.java
@@ -21,7 +21,6 @@
 import org.eclipse.gef.EditPolicy;

 import org.eclipse.gef.Request;

 import org.eclipse.gef.RequestConstants;

-import org.eclipse.gef.tools.DirectEditManager;

 

 import org.eclipse.gef.examples.logicdesigner.LogicMessages;

 import org.eclipse.gef.examples.logicdesigner.figures.StickyNoteFigure;

diff --git a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/WireEditPart.java b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/WireEditPart.java
index 56dd817..20a546a 100644
--- a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/WireEditPart.java
+++ b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/edit/WireEditPart.java
@@ -22,7 +22,6 @@
 import org.eclipse.draw2d.Connection;

 import org.eclipse.draw2d.IFigure;

 import org.eclipse.draw2d.ManhattanConnectionRouter;

-import org.eclipse.draw2d.PolylineConnection;

 import org.eclipse.draw2d.RelativeBendpoint;

 

 import org.eclipse.gef.AccessibleEditPart;

diff --git a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/model/Circuit.java b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/model/Circuit.java
index a50589e..f1e732c 100644
--- a/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/model/Circuit.java
+++ b/examples/gef/org.eclipse.gef.examples.logic/src/org/eclipse/gef/examples/logicdesigner/model/Circuit.java
@@ -19,6 +19,9 @@
 static final long serialVersionUID = 1;

 

 private static int count;

+

+private static String name = "NoName";

+

 public static String TERMINALS_OUT [] = 

 	new String [] {	"1","2","3","4", //$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$

 				"5","6","7","8"};//$NON-NLS-4$//$NON-NLS-3$//$NON-NLS-2$//$NON-NLS-1$

@@ -40,4 +43,12 @@
 		setOutput(TERMINALS_OUT[i],getInput(TERMINALS_IN[i]));

 }

 

+public void setName(String name) {

+		this.name = name;

+}

+

+public String getName() {

+		return this.name;

+}

+

 }

diff --git a/examples/rcp/org.rcpmail.test/META-INF/MANIFEST.MF b/examples/rcp/org.rcpmail.test/META-INF/MANIFEST.MF
index 567b37a..bb2dea3 100644
--- a/examples/rcp/org.rcpmail.test/META-INF/MANIFEST.MF
+++ b/examples/rcp/org.rcpmail.test/META-INF/MANIFEST.MF
@@ -12,4 +12,4 @@
  org.junit4,
  org.eclipse.swtbot.junit4_x
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
diff --git a/examples/rcp/org.rcpmail.test/pom.xml b/examples/rcp/org.rcpmail.test/pom.xml
new file mode 100644
index 0000000..35168e8
--- /dev/null
+++ b/examples/rcp/org.rcpmail.test/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.rcpmail.test</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/examples/rcp/org.rcpmail/META-INF/MANIFEST.MF b/examples/rcp/org.rcpmail/META-INF/MANIFEST.MF
index aefae27..2d4456a 100644
--- a/examples/rcp/org.rcpmail/META-INF/MANIFEST.MF
+++ b/examples/rcp/org.rcpmail/META-INF/MANIFEST.MF
@@ -8,4 +8,4 @@
  org.eclipse.core.runtime
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
diff --git a/examples/rcp/org.rcpmail/pom.xml b/examples/rcp/org.rcpmail/pom.xml
new file mode 100644
index 0000000..783f56b
--- /dev/null
+++ b/examples/rcp/org.rcpmail/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.rcpmail</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/git-foo.txt b/git-foo.txt
deleted file mode 100644
index 66ec789..0000000
--- a/git-foo.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Copy a range of commits from svn to master. Useful when someone checks in into svn and those changes are pulled into the svn branch via 'git svn rebase'.
-$ git format-patch from..to --stdout --full-index -k | grep -v 'git-svn-id: svn+ssh://dev.eclipse.org/svnroot/technology/' | git am -k -3
-
-Check in changes into svn.
-$ git branch -D svn; git co -b svn; git svn rebase; git svn dcommit
-
diff --git a/org.eclipse.swt.examples/META-INF/MANIFEST.MF b/org.eclipse.swt.examples/META-INF/MANIFEST.MF
index 936905f..68405df 100644
--- a/org.eclipse.swt.examples/META-INF/MANIFEST.MF
+++ b/org.eclipse.swt.examples/META-INF/MANIFEST.MF
@@ -2,10 +2,11 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Eclipse SWT Example plugin (based on Eclipse's SWT Examples) (incubation)
 Bundle-SymbolicName: org.eclipse.swt.examples;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-ClassPath: .
-Export-Package: org.eclipse.swt.examples.addressbook,
+Export-Package: org.eclipse.jface.snippets.viewers,
+ org.eclipse.swt.examples.addressbook,
  org.eclipse.swt.examples.browserexample,
  org.eclipse.swt.examples.clipboard,
  org.eclipse.swt.examples.controlexample,
@@ -19,10 +20,9 @@
  org.eclipse.swt.examples.layoutexample,
  org.eclipse.swt.examples.paint,
  org.eclipse.swt.examples.texteditor
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Import-Package: org.eclipse.core.commands.common,
- org.eclipse.core.runtime,
  org.eclipse.jface.viewers,
  org.eclipse.swt,
  org.eclipse.swt.accessibility,
@@ -35,3 +35,4 @@
  org.eclipse.swt.printing,
  org.eclipse.swt.program,
  org.eclipse.swt.widgets
+Require-Bundle: org.eclipse.core.runtime;bundle-version="3.6.0"
diff --git a/org.eclipse.swt.examples/build.properties b/org.eclipse.swt.examples/build.properties
index d5c5d28..d7992f7 100644
--- a/org.eclipse.swt.examples/build.properties
+++ b/org.eclipse.swt.examples/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -15,10 +15,5 @@
                .,\
                src/,\
                about.html
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               build.properties,\
-               src/,\
+src.includes = LICENSE.EPL,\
                about.html
diff --git a/org.eclipse.swt.examples/pom.xml b/org.eclipse.swt.examples/pom.xml
new file mode 100644
index 0000000..7826b61
--- /dev/null
+++ b/org.eclipse.swt.examples/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.test</groupId>
+  <artifactId>org.eclipse.swt.examples</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java b/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java
index 03ab9f2..5f657a0 100644
--- a/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java
+++ b/org.eclipse.swt.examples/src/org/eclipse/swt/examples/controlexample/ControlExample.java
@@ -29,6 +29,12 @@
 import org.eclipse.swt.widgets.TabItem;
 
 public class ControlExample {
+
+	static {
+		// System.setProperty(LogFactory.DIAGNOSTICS_DEST_PROPERTY, "STDOUT");
+		System.setProperty("org.eclipse.swt.internal.carbon.smallFonts", "");
+	}
+
 	private static ResourceBundle	resourceBundle	= ResourceBundle.getBundle("examples_control");			//$NON-NLS-1$
 	static final int				ciClosedFolder	= 0, ciOpenFolder = 1, ciTarget = 2, ciBackground = 3,
 			ciParentBackground = 4;
diff --git a/org.eclipse.swtbot.ant.optional.junit4/.project b/org.eclipse.swtbot.ant.junit/.project
similarity index 76%
rename from org.eclipse.swtbot.ant.optional.junit4/.project
rename to org.eclipse.swtbot.ant.junit/.project
index 68534e8..249a720 100644
--- a/org.eclipse.swtbot.ant.optional.junit4/.project
+++ b/org.eclipse.swtbot.ant.junit/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.ant.optional.junit4</name>
+	<name>org.eclipse.swtbot.ant.junit</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.ant.junit/META-INF/MANIFEST.MF b/org.eclipse.swtbot.ant.junit/META-INF/MANIFEST.MF
new file mode 100755
index 0000000..b52fcf3
--- /dev/null
+++ b/org.eclipse.swtbot.ant.junit/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Headless Ant support for JUnit
+Bundle-SymbolicName: org.eclipse.swtbot.ant.junit
+Bundle-Version: 2.0.5.qualifier
+Fragment-Host: org.apache.ant
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.core.runtime.compatibility,
+ org.junit
+Bundle-Vendor: Eclipse.org - SWTBot
diff --git a/org.eclipse.swtbot.ant.optional.junit3/about.html b/org.eclipse.swtbot.ant.junit/about.html
similarity index 100%
rename from org.eclipse.swtbot.ant.optional.junit3/about.html
rename to org.eclipse.swtbot.ant.junit/about.html
diff --git a/org.eclipse.swtbot.ant.optional.junit3/build.properties b/org.eclipse.swtbot.ant.junit/build.properties
similarity index 100%
rename from org.eclipse.swtbot.ant.optional.junit3/build.properties
rename to org.eclipse.swtbot.ant.junit/build.properties
diff --git a/org.eclipse.swtbot.ant.junit/pom.xml b/org.eclipse.swtbot.ant.junit/pom.xml
new file mode 100644
index 0000000..84d368c
--- /dev/null
+++ b/org.eclipse.swtbot.ant.junit/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.ant.junit</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.ant.optional.junit3/.project b/org.eclipse.swtbot.ant.optional.junit3/.project
index ab878a9..249a720 100644
--- a/org.eclipse.swtbot.ant.optional.junit3/.project
+++ b/org.eclipse.swtbot.ant.optional.junit3/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.ant.optional.junit3</name>
+	<name>org.eclipse.swtbot.ant.junit</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.ant.optional.junit3/META-INF/MANIFEST.MF b/org.eclipse.swtbot.ant.optional.junit3/META-INF/MANIFEST.MF
deleted file mode 100755
index 4dac4bc..0000000
--- a/org.eclipse.swtbot.ant.optional.junit3/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.swtbot.ant.optional.junit3
-Bundle-Version: 2.0.0.qualifier
-Fragment-Host: org.apache.ant
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.junit
-Bundle-Vendor: %providerName
diff --git a/org.eclipse.swtbot.ant.optional.junit4/META-INF/MANIFEST.MF b/org.eclipse.swtbot.ant.optional.junit4/META-INF/MANIFEST.MF
deleted file mode 100755
index 20cd782..0000000
--- a/org.eclipse.swtbot.ant.optional.junit4/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.swtbot.ant.optional.junit4
-Bundle-Version: 2.0.0.qualifier
-Fragment-Host: org.apache.ant
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime.compatibility,
- org.junit4
-Bundle-Vendor: %providerName
diff --git a/org.eclipse.swtbot.ant.optional.junit4/about.html b/org.eclipse.swtbot.ant.optional.junit4/about.html
deleted file mode 100755
index 5d03fd4..0000000
--- a/org.eclipse.swtbot.ant.optional.junit4/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.core/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.core/META-INF/MANIFEST.MF
index 0a2911f..16feb1b 100644
--- a/org.eclipse.swtbot.eclipse.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.core/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Test Launcher Application Plug-in
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.core;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Import-Package: org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.equinox.app;version="1.0.0",
  org.eclipse.jdt.internal.junit.runner,
- org.eclipse.ui,
+ org.eclipse.ui;ui.workbench=split,
  org.eclipse.ui.testing,
  org.osgi.framework;version="1.4.0"
diff --git a/org.eclipse.swtbot.eclipse.core/build.properties b/org.eclipse.swtbot.eclipse.core/build.properties
index 922b4b0..107559e 100644
--- a/org.eclipse.swtbot.eclipse.core/build.properties
+++ b/org.eclipse.swtbot.eclipse.core/build.properties
@@ -1,3 +1,13 @@
+###############################################################################
+# Copyright (c) 2010 Ketan Padegaonkar 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:
+#     Ketan Padegaonkar - initial API and implementation
+###############################################################################
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
@@ -7,9 +17,4 @@
                src/,\
                plugin.xml
 src.includes = LICENSE.EPL,\
-               META-INF/,\
-               about.html,\
-               build.properties,\
-               src/,\
-               .project,\
-               .classpath
+               about.html
diff --git a/org.eclipse.swtbot.eclipse.core/pom.xml b/org.eclipse.swtbot.eclipse.core/pom.xml
new file mode 100644
index 0000000..4ce190d
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.core/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.core</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.core/src/org/eclipse/swtbot/eclipse/core/UITestApplication.java b/org.eclipse.swtbot.eclipse.core/src/org/eclipse/swtbot/eclipse/core/UITestApplication.java
index 5cd5761..005dd87 100644
--- a/org.eclipse.swtbot.eclipse.core/src/org/eclipse/swtbot/eclipse/core/UITestApplication.java
+++ b/org.eclipse.swtbot.eclipse.core/src/org/eclipse/swtbot/eclipse/core/UITestApplication.java
@@ -11,8 +11,6 @@
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.core;
 
-import java.util.Arrays;
-
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
@@ -47,7 +45,7 @@
 		String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
 		Object app = getApplication(args);
 
-		Assert.isNotNull(app);
+		Assert.isNotNull(app, "The application " + getApplicationToRun(args) + " could not be found. Please see the SWTBot troubleshooting guide: http://wiki.eclipse.org/SWTBot/Troubleshooting");
 
 		fTestableObject = PlatformUI.getTestableObject();
 		fTestableObject.setTestHarness(this);
@@ -74,10 +72,12 @@
 		// Find the name of the application as specified by the PDE JUnit launcher.
 		// If no application is specified, the 3.0 default workbench application
 		// is returned.
+		String applicationToRun = getApplicationToRun(args);
+		
 		IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME, Platform.PT_APPLICATIONS,
-				getApplicationToRun(args));
+				applicationToRun);
 
-		Assert.isNotNull(extension);
+		Assert.isNotNull(extension, "Could not find IExtension for application: " + applicationToRun);
 
 		// If the extension does not have the correct grammar, return null.
 		// Otherwise, return the application object.
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/.project b/org.eclipse.swtbot.eclipse.dsl.test/.project
deleted file mode 100644
index cd83c4b..0000000
--- a/org.eclipse.swtbot.eclipse.dsl.test/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.eclipse.dsl.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.dsl.test/META-INF/MANIFEST.MF
deleted file mode 100644
index b2910b7..0000000
--- a/org.eclipse.swtbot.eclipse.dsl.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Dsl for Eclipse IDE (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.eclipse.dsl.test
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.swtbot.eclipse.dsl,
- org.junit4
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/build.properties b/org.eclipse.swtbot.eclipse.dsl.test/build.properties
deleted file mode 100644
index 465a72e..0000000
--- a/org.eclipse.swtbot.eclipse.dsl.test/build.properties
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               src/
-src.includes = src/,\
-               META-INF/,\
-               .project,\
-               .classpath
diff --git a/org.eclipse.swtbot.eclipse.dsl/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.dsl/META-INF/MANIFEST.MF
index 3b3be8b..ced4501 100644
--- a/org.eclipse.swtbot.eclipse.dsl/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.dsl/META-INF/MANIFEST.MF
@@ -2,12 +2,12 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Dsl for Eclipse IDE (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.dsl
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-Activator: org.eclipse.swtbot.eclipse.dsl.Activator
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
-Import-Package: org.apache.log4j;version="1.2.12",
+Import-Package: org.apache.log4j;version="[1.2.13,1.3.0)",
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.swt.widgets,
  org.eclipse.swtbot.eclipse.finder,
@@ -17,7 +17,7 @@
  org.eclipse.swtbot.swt.finder.results,
  org.eclipse.swtbot.swt.finder.utils,
  org.eclipse.swtbot.swt.finder.widgets,
- org.eclipse.ui,
  org.eclipse.ui.plugin,
- org.hamcrest;version="1.1.0",
  org.osgi.framework;version="1.4.0"
+Require-Bundle: org.eclipse.ui.workbench;bundle-version="3.6.0",
+ org.hamcrest.core;bundle-version="1.1.0"
diff --git a/org.eclipse.swtbot.eclipse.dsl/build.properties b/org.eclipse.swtbot.eclipse.dsl/build.properties
index 9d0c8c9..9025deb 100644
--- a/org.eclipse.swtbot.eclipse.dsl/build.properties
+++ b/org.eclipse.swtbot.eclipse.dsl/build.properties
@@ -1,11 +1,16 @@
+###############################################################################
+# Copyright (c) 2010 Ketan Padegaonkar 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:
+#     Ketan Padegaonkar - initial API and implementation
+###############################################################################
 source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
                src/,\
                .settings/
-src.includes = src/,\
-               META-INF/,\
-               .settings/,\
-               .project,\
-               .classpath
diff --git a/org.eclipse.swtbot.eclipse.dsl/pom.xml b/org.eclipse.swtbot.eclipse.dsl/pom.xml
new file mode 100644
index 0000000..b0305c1
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.dsl/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.dsl</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.finder.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.finder.test/META-INF/MANIFEST.MF
index c631f04..66cfb7a 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.finder.test/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Eclipse Control Finder Plug-in Test (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.finder.test;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Require-Bundle: org.eclipse.jface.text,
  org.eclipse.core.resources,
  org.eclipse.ui,
@@ -13,15 +13,13 @@
  org.eclipse.swtbot.eclipse.finder,
  org.hamcrest,
  org.junit4,
- org.apache.log4j;version="1.2.12",
- org.eclipse.swtbot.junit4_x
+ org.apache.log4j;bundle-version="[1.2.13,1.3.0)",
+ org.eclipse.swtbot.junit4_x,
+ org.eclipse.jdt.ui;bundle-version="3.6.0",
+ org.eclipse.ui.intro,
+ org.eclipse.ui.intro.universal,
+ org.eclipse.sdk;bundle-version="3.6.0",
+ org.eclipse.platform
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.swtbot.eclipse.finder,
- org.eclipse.swtbot.eclipse.finder.exceptions,
- org.eclipse.swtbot.eclipse.finder.test.ui.data.internal,
- org.eclipse.swtbot.eclipse.finder.test.ui.handler,
- org.eclipse.swtbot.eclipse.finder.test.ui.views,
- org.eclipse.swtbot.eclipse.finder.widgets,
- org.eclipse.swtbot.eclipse.finder.widgets.helpers
+Bundle-Vendor: Eclipse.org - SWTBot
 Eclipse-RegisterBuddy: org.apache.log4j
diff --git a/org.eclipse.swtbot.eclipse.finder.test/build.properties b/org.eclipse.swtbot.eclipse.finder.test/build.properties
index 77caec5..934b8ce 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/build.properties
+++ b/org.eclipse.swtbot.eclipse.finder.test/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -17,10 +17,5 @@
                src/,\
                plugin.xml
 source.. = src/
-src.includes = .classpath,\
-               LICENSE.EPL,\
-               .project,\
-               META-INF/,\
-               about.html,\
-               build.properties,\
-               src/
+src.includes = LICENSE.EPL,\
+               about.html
diff --git a/org.eclipse.swtbot.eclipse.finder.test/plugin.xml b/org.eclipse.swtbot.eclipse.finder.test/plugin.xml
index d30dd74..df1048f 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/plugin.xml
+++ b/org.eclipse.swtbot.eclipse.finder.test/plugin.xml
@@ -15,6 +15,18 @@
             id="org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotTestView"
             name="SWTBot Test View">
       </view>
+      <view
+            class="org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotFormView"
+            id="org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotFormView1"
+            name="Form 1"
+            restorable="true">
+      </view>
+      <view
+            class="org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotFormView"
+            id="org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotFormView2"
+            name="Form 2"
+            restorable="true">
+      </view>
    </extension>
    <extension
          point="org.eclipse.ui.handlers">
@@ -22,6 +34,10 @@
             class="org.eclipse.swtbot.eclipse.finder.test.ui.handler.SampleHandler"
             commandId="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ContributionItemCommand">
       </handler>
+      <handler
+            class="org.eclipse.swtbot.eclipse.finder.test.ui.handler.SampleParameterizedHandler"
+            commandId="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ParameterizedContributionItemCommand">
+      </handler>
    </extension>
    <extension
          point="org.eclipse.ui.bindings">
@@ -43,6 +59,26 @@
                mnemonic="C"
                style="toggle">
          </command>
+         <command
+               commandId="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ParameterizedContributionItemCommand"
+               id="org.eclipse.swtbot.eclipse.finder.test.ui.view.menu.ParameterizedContributionItemCommand"
+               label="Try the Strawberry"
+               mnemonic="S">
+               <parameter
+                     name="org.eclipse.swtbot.eclipse.finder.test.flavor"
+                     value="Strawberry">
+               </parameter>
+         </command>
+         <command
+               commandId="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ParameterizedContributionItemCommand"
+               id="org.eclipse.swtbot.eclipse.finder.test.ui.view.menu.ParameterizedContributionItemCommand"
+               label="Try the Banana"
+               mnemonic="B">
+               <parameter
+                     name="org.eclipse.swtbot.eclipse.finder.test.flavor"
+                     value="Banana">
+               </parameter>
+         </command>
       </menuContribution>
    </extension>
    <extension
@@ -56,6 +92,35 @@
             id="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ContributionItemCommand"
             name="Contribution Item Command">
       </command>
+      <command
+            categoryId="org.eclipse.swtbot.eclipse.finder.test.ui.commands.category"
+            id="org.eclipse.swtbot.eclipse.finder.test.ui.commands.ParameterizedContributionItemCommand"
+            name="Parameterized Contribution Item Command">
+            <commandParameter
+                  id="org.eclipse.swtbot.eclipse.finder.test.flavor"
+                  name="Flavor"
+                  optional="true">
+            </commandParameter>
+      </command>
+   </extension>
+   <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="org.eclipse.swtbot.eclipse.finder.test.ui.editors.MultiPageEditor"
+            contributorClass="org.eclipse.swtbot.eclipse.finder.test.ui.editors.MultiPageEditorContributor"
+            extensions="mpe"
+            icon="icons/sample.gif"
+            id="org.eclipse.swtbot.eclipse.finder.test.ui.editors.MultiPageEditor"
+            name="Sample Multi-page Editor">
+      </editor>
+   </extension>
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            class="org.eclipse.swtbot.eclipse.finder.test.ui.perspectives.FormPerspective"
+            id="org.eclipse.swtbot.eclipse.finder.test.ui.perspectives.FormPerspective"
+            name="name">
+      </perspective>
    </extension>
 
 </plugin>
diff --git a/org.eclipse.swtbot.eclipse.finder.test/pom.xml b/org.eclipse.swtbot.eclipse.finder.test/pom.xml
new file mode 100644
index 0000000..be27975
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/pom.xml
@@ -0,0 +1,81 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot.plugins</groupId>
+	<artifactId>org.eclipse.swtbot.eclipse.finder.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.swtbot</groupId>
+		<artifactId>parent</artifactId>
+		<version>2.0.5-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<properties>
+		<!-- tycho.testArgLine repeated to re-use the configuration for argLine for jacoco agent -->
+		<uitest.vmparams>${tycho.testArgLine} -Xms64m -Xmx1024m -XX:MaxPermSize=128M</uitest.vmparams>
+	</properties>
+	<profiles>
+		<profile>
+			<id>skip-ui-tests</id>
+			<activation>
+				<property>
+					<name>skip-ui-tests</name>
+				</property>
+			</activation>
+			<properties>
+				<maven.test.skip>true</maven.test.skip>
+			</properties>
+		</profile>
+		<profile>
+			<id>macosx</id>
+			<activation>
+				<os>
+					<name>mac os x</name>
+					<family>mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams} -XstartOnFirstThread</ui.test.vmargs>
+			</properties>
+		</profile>
+		<profile>
+			<id>other-os</id>
+			<activation>
+				<os>
+					<name>not-mac</name>
+					<family>!mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams}</ui.test.vmargs>
+			</properties>
+		</profile>
+	</profiles>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<argLine>${ui.test.vmargs}</argLine>
+					<useUIHarness>true</useUIHarness>
+					<useUIThread>false</useUIThread>
+					<product>org.eclipse.sdk.ide</product>
+					<application>org.eclipse.ui.ide.workbench</application>
+					<testSuite>org.eclipse.swtbot.eclipse.finder.test</testSuite>
+					<testClass>org.eclipse.swtbot.eclipse.finder.AllTests</testClass>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/AllTests.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/AllTests.java
index 412baf1..6a19215 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/AllTests.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/AllTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2009,2010 Ketan Padegaonkar 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
@@ -13,16 +13,22 @@
 import org.eclipse.swtbot.eclipse.finder.exceptions.QuickFixNotFoundExceptionTest;
 import org.eclipse.swtbot.eclipse.finder.finders.CommandFinderTest;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditorTest;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotMultiPageEditorTest;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotViewTest;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJUnit4Suite;
 import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-@RunWith(Suite.class)
-@SuiteClasses( { QuickFixNotFoundExceptionTest.class, CommandFinderTest.class, SWTBotEclipseEditorTest.class, SWTBotViewTest.class })
+@RunWith(SWTBotJUnit4Suite.class)
+@SuiteClasses({
+		QuickFixNotFoundExceptionTest.class,
+		CommandFinderTest.class,
+		SWTBotEclipseEditorTest.class,
+		SWTBotViewTest.class,
+		SWTBotMultiPageEditorTest.class })
 public class AllTests {
 }
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/FinderTestIds.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/FinderTestIds.java
new file mode 100644
index 0000000..ad81546
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/FinderTestIds.java
@@ -0,0 +1,14 @@
+package org.eclipse.swtbot.eclipse.finder;
+
+import org.eclipse.swtbot.eclipse.finder.test.ui.perspectives.FormPerspective;
+import org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotFormView;
+import org.eclipse.swtbot.eclipse.finder.test.ui.views.SWTBotTestView;
+
+public class FinderTestIds {
+
+	public static final String VIEW_ID_TEST = SWTBotTestView.class.getName();
+	public static final String VIEW_ID_FORM_1 = SWTBotFormView.class.getName() + "1";
+	public static final String VIEW_ID_FORM_2 = SWTBotFormView.class.getName() + "2";
+	public static final String PERSPECTIVE_ID_FORM = FormPerspective.class.getName();
+
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/data/internal/SWTBotTestContentProvider.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/data/internal/SWTBotTestContentProvider.java
index a4253c4..896ab61 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/data/internal/SWTBotTestContentProvider.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/data/internal/SWTBotTestContentProvider.java
@@ -68,7 +68,8 @@
 	}
 
 	public void dispose() {
-		data.clear();
+		if (data != null)
+			data.clear();
 		data = null;
 		viewer.getTable().dispose();
 		viewer = null;
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditor.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditor.java
new file mode 100644
index 0000000..7ea2543
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditor.java
@@ -0,0 +1,261 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.finder.test.ui.editors;
+
+import java.io.StringWriter;
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.StringTokenizer;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.StyledText;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.graphics.FontData;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FontDialog;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IEditorSite;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.editors.text.TextEditor;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.part.FileEditorInput;
+import org.eclipse.ui.part.MultiPageEditorPart;
+
+/**
+ * An example showing how to create a multi-page editor. This example has 3 pages:
+ * <ul>
+ * <li>page 0 contains a nested text editor.
+ * <li>page 1 allows you to change the font used in page 2
+ * <li>page 2 shows the words in page 0 in sorted order
+ * </ul>
+ */
+public class MultiPageEditor extends MultiPageEditorPart implements IResourceChangeListener {
+
+	/** The text editor used in page 0. */
+	private TextEditor	editor;
+
+	/** The font chosen in page 1. */
+	private Font		font;
+
+	/** The text widget used in page 2. */
+	private StyledText	text;
+
+	/**
+	 * Creates a multi-page editor example.
+	 */
+	public MultiPageEditor() {
+		super();
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+	}
+
+	/**
+	 * Creates page 0 of the multi-page editor, which contains a text editor.
+	 */
+	void createPage0() {
+		try {
+			editor = new TextEditor();
+			int index = addPage(editor, getEditorInput());
+			setPageText(index, editor.getTitle());
+		} catch (PartInitException e) {
+			ErrorDialog.openError(
+					getSite().getShell(),
+					"Error creating nested text editor",
+					null,
+					e.getStatus());
+		}
+	}
+
+	/**
+	 * Creates page 1 of the multi-page editor, which allows you to change the font used in page 2.
+	 */
+	void createPage1() {
+
+		Composite composite = new Composite(getContainer(), SWT.NONE);
+		GridLayout layout = new GridLayout();
+		composite.setLayout(layout);
+		layout.numColumns = 2;
+
+		Button fontButton = new Button(composite, SWT.NONE);
+		GridData gd = new GridData(GridData.BEGINNING);
+		gd.horizontalSpan = 2;
+		fontButton.setLayoutData(gd);
+		fontButton.setText("Change Font...");
+
+		fontButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent event) {
+				setFont();
+			}
+		});
+
+		int index = addPage(composite);
+		setPageText(index, "Properties");
+	}
+
+	/**
+	 * Creates page 2 of the multi-page editor, which shows the sorted text.
+	 */
+	void createPage2() {
+		Composite composite = new Composite(getContainer(), SWT.NONE);
+		FillLayout layout = new FillLayout();
+		composite.setLayout(layout);
+		text = new StyledText(composite, SWT.H_SCROLL | SWT.V_SCROLL);
+		text.setEditable(false);
+
+		int index = addPage(composite);
+		setPageText(index, "Preview");
+	}
+
+	/**
+	 * Creates the pages of the multi-page editor.
+	 */
+	protected void createPages() {
+		createPage0();
+		createPage1();
+		createPage2();
+	}
+
+	/**
+	 * The <code>MultiPageEditorPart</code> implementation of this <code>IWorkbenchPart</code> method disposes all
+	 * nested editors. Subclasses may extend.
+	 */
+	public void dispose() {
+		ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+		super.dispose();
+	}
+
+	/**
+	 * Saves the multi-page editor's document.
+	 */
+	public void doSave(IProgressMonitor monitor) {
+		getEditor(0).doSave(monitor);
+	}
+
+	/**
+	 * Saves the multi-page editor's document as another file. Also updates the text for page 0's tab, and updates this
+	 * multi-page editor's input to correspond to the nested editor's.
+	 */
+	public void doSaveAs() {
+		IEditorPart editor = getEditor(0);
+		editor.doSaveAs();
+		setPageText(0, editor.getTitle());
+		setInput(editor.getEditorInput());
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IEditorPart
+	 */
+	public void gotoMarker(IMarker marker) {
+		setActivePage(0);
+		IDE.gotoMarker(getEditor(0), marker);
+	}
+
+	/**
+	 * The <code>MultiPageEditorExample</code> implementation of this method checks that the input is an instance of
+	 * <code>IFileEditorInput</code>.
+	 */
+	public void init(IEditorSite site, IEditorInput editorInput)
+			throws PartInitException {
+		// if (!(editorInput instanceof IFileEditorInput))
+		// throw new PartInitException("Invalid Input: Must be IFileEditorInput");
+		super.init(site, editorInput);
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IEditorPart.
+	 */
+	public boolean isSaveAsAllowed() {
+		return true;
+	}
+
+	/**
+	 * Calculates the contents of page 2 when the it is activated.
+	 */
+	protected void pageChange(int newPageIndex) {
+		super.pageChange(newPageIndex);
+		if (newPageIndex == 2) {
+			sortWords();
+		}
+	}
+
+	/**
+	 * Closes all project files on project close.
+	 */
+	public void resourceChanged(final IResourceChangeEvent event) {
+		if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					IWorkbenchPage[] pages = getSite().getWorkbenchWindow().getPages();
+					for (int i = 0; i < pages.length; i++) {
+						if (((FileEditorInput) editor.getEditorInput()).getFile().getProject().equals(event.getResource())) {
+							IEditorPart editorPart = pages[i].findEditor(editor.getEditorInput());
+							pages[i].closeEditor(editorPart, true);
+						}
+					}
+				}
+			});
+		}
+	}
+
+	/**
+	 * Sets the font related data to be applied to the text in page 2.
+	 */
+	void setFont() {
+		FontDialog fontDialog = new FontDialog(getSite().getShell());
+		fontDialog.setFontList(text.getFont().getFontData());
+		FontData fontData = fontDialog.open();
+		if (fontData != null) {
+			if (font != null)
+				font.dispose();
+			font = new Font(text.getDisplay(), fontData);
+			text.setFont(font);
+		}
+	}
+
+	/**
+	 * Sorts the words in page 0, and shows them in page 2.
+	 */
+	void sortWords() {
+
+		String editorText =
+				editor.getDocumentProvider().getDocument(editor.getEditorInput()).get();
+
+		StringTokenizer tokenizer =
+				new StringTokenizer(editorText, " \t\n\r\f!@#\u0024%^&*()-_=+`~[]{};:'\",.<>/?|\\");
+		ArrayList editorWords = new ArrayList();
+		while (tokenizer.hasMoreTokens()) {
+			editorWords.add(tokenizer.nextToken());
+		}
+
+		Collections.sort(editorWords, Collator.getInstance());
+		StringWriter displayText = new StringWriter();
+		for (int i = 0; i < editorWords.size(); i++) {
+			displayText.write(((String) editorWords.get(i)));
+			displayText.write(System.getProperty("line.separator"));
+		}
+		text.setText(displayText.toString());
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditorContributor.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditorContributor.java
new file mode 100644
index 0000000..1e82698
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/editors/MultiPageEditorContributor.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.finder.test.ui.editors;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchActionConstants;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.actions.ActionFactory;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.ui.ide.IDEActionFactory;
+import org.eclipse.ui.part.MultiPageEditorActionBarContributor;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.ui.texteditor.ITextEditorActionConstants;
+
+/**
+ * Manages the installation/deinstallation of global actions for multi-page editors. Responsible for the redirection of
+ * global actions to the active editor. Multi-page contributor replaces the contributors for the individual editors in
+ * the multi-page editor.
+ */
+public class MultiPageEditorContributor extends MultiPageEditorActionBarContributor {
+	private IEditorPart	activeEditorPart;
+	private Action		sampleAction;
+
+	/**
+	 * Creates a multi-page contributor.
+	 */
+	public MultiPageEditorContributor() {
+		super();
+		createActions();
+	}
+
+	/**
+	 * Returns the action registed with the given text editor.
+	 * 
+	 * @return IAction or null if editor is null.
+	 */
+	protected IAction getAction(ITextEditor editor, String actionID) {
+		return (editor == null ? null : editor.getAction(actionID));
+	}
+
+	/*
+	 * (non-JavaDoc) Method declared in AbstractMultiPageEditorActionBarContributor.
+	 */
+
+	public void setActivePage(IEditorPart part) {
+		if (activeEditorPart == part)
+			return;
+
+		activeEditorPart = part;
+
+		IActionBars actionBars = getActionBars();
+		if (actionBars != null) {
+
+			ITextEditor editor = (part instanceof ITextEditor) ? (ITextEditor) part : null;
+
+			actionBars.setGlobalActionHandler(
+					ActionFactory.DELETE.getId(),
+					getAction(editor, ITextEditorActionConstants.DELETE));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.UNDO.getId(),
+					getAction(editor, ITextEditorActionConstants.UNDO));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.REDO.getId(),
+					getAction(editor, ITextEditorActionConstants.REDO));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.CUT.getId(),
+					getAction(editor, ITextEditorActionConstants.CUT));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.COPY.getId(),
+					getAction(editor, ITextEditorActionConstants.COPY));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.PASTE.getId(),
+					getAction(editor, ITextEditorActionConstants.PASTE));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.SELECT_ALL.getId(),
+					getAction(editor, ITextEditorActionConstants.SELECT_ALL));
+			actionBars.setGlobalActionHandler(
+					ActionFactory.FIND.getId(),
+					getAction(editor, ITextEditorActionConstants.FIND));
+			actionBars.setGlobalActionHandler(
+					IDEActionFactory.BOOKMARK.getId(),
+					getAction(editor, IDEActionFactory.BOOKMARK.getId()));
+			actionBars.updateActionBars();
+		}
+	}
+
+	private void createActions() {
+		sampleAction = new Action() {
+			public void run() {
+				MessageDialog.openInformation(null, "SWTBot Eclipse Control Finder Plug-in Test (incubation)", "Sample Action Executed");
+			}
+		};
+		sampleAction.setText("Sample Action");
+		sampleAction.setToolTipText("Sample Action tool tip");
+		sampleAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
+				getImageDescriptor(IDE.SharedImages.IMG_OBJS_TASK_TSK));
+	}
+
+	public void contributeToMenu(IMenuManager manager) {
+		IMenuManager menu = new MenuManager("Editor &Menu");
+		manager.prependToGroup(IWorkbenchActionConstants.MB_ADDITIONS, menu);
+		menu.add(sampleAction);
+	}
+
+	public void contributeToToolBar(IToolBarManager manager) {
+		manager.add(new Separator());
+		manager.add(sampleAction);
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/handler/SampleParameterizedHandler.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/handler/SampleParameterizedHandler.java
new file mode 100644
index 0000000..cc78262
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/handler/SampleParameterizedHandler.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *     Jesper Steen Moeller - support for parameterized commands
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.finder.test.ui.handler;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+/**
+ * Our sample handler extends AbstractHandler, an IHandler base class.
+ * 
+ * @see org.eclipse.core.commands.IHandler
+ * @see org.eclipse.core.commands.AbstractHandler
+ */
+public class SampleParameterizedHandler extends AbstractHandler {
+	/**
+	 * The constructor.
+	 */
+	public SampleParameterizedHandler() {
+	}
+
+	/**
+	 * the command has been executed, so extract extract the needed information from the application context.
+	 */
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+		MessageDialog.openInformation(window.getShell(), "Simple Dialog", "My parameters:" + event.getParameters().toString());
+		return null;
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/perspectives/FormPerspective.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/perspectives/FormPerspective.java
new file mode 100644
index 0000000..d18e08f
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/perspectives/FormPerspective.java
@@ -0,0 +1,14 @@
+package org.eclipse.swtbot.eclipse.finder.test.ui.perspectives;
+
+import org.eclipse.swtbot.eclipse.finder.FinderTestIds;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+
+public class FormPerspective implements IPerspectiveFactory {
+
+	public void createInitialLayout(IPageLayout layout) {
+		layout.addView(FinderTestIds.VIEW_ID_FORM_1, IPageLayout.LEFT, 0.2f, layout.getEditorArea());
+		layout.addView(FinderTestIds.VIEW_ID_FORM_2, IPageLayout.RIGHT, 0.2f, FinderTestIds.VIEW_ID_FORM_1);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/views/SWTBotFormView.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/views/SWTBotFormView.java
new file mode 100644
index 0000000..fd12894
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/test/ui/views/SWTBotFormView.java
@@ -0,0 +1,28 @@
+package org.eclipse.swtbot.eclipse.finder.test.ui.views;
+
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.part.ViewPart;
+
+public class SWTBotFormView extends ViewPart {
+
+	private Text text;
+
+	@Override
+	public void createPartControl(Composite parent) {
+		GridLayoutFactory.fillDefaults().numColumns(2).applyTo(parent);
+		Label label = new Label(parent, SWT.NONE);
+		label.setText(getPartName());
+		text = new Text(parent, SWT.BORDER);
+		text.setText(getPartName());
+	}
+
+	@Override
+	public void setFocus() {
+		text.setFocus();
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/AbstractSWTBotEclipseTest.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/AbstractSWTBotEclipseTest.java
new file mode 100644
index 0000000..7808f12
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/AbstractSWTBotEclipseTest.java
@@ -0,0 +1,55 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Ketan Padegaonkar 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:

+ *     Ketan Padegaonkar - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.swtbot.eclipse.finder.widgets;

+

+import java.util.List;

+

+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;

+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;

+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;

+import org.junit.After;

+import org.junit.BeforeClass;

+

+public abstract class AbstractSWTBotEclipseTest {

+

+	protected static SWTWorkbenchBot	bot	= new SWTWorkbenchBot();

+

+	@BeforeClass

+	public static void beforeClass() {

+		closeWelcomePage();

+	}

+

+	private static void closeWelcomePage() {

+		try {

+			SWTBotPreferences.TIMEOUT = 0;

+			bot.viewByTitle("Welcome").close();

+		} catch (WidgetNotFoundException e) {

+			// do nothing

+		} finally {

+			SWTBotPreferences.TIMEOUT = 5000;

+		}

+	}

+

+	@After

+	public void tearDown() throws Exception {

+		saveAndCloseAllEditors();

+	}

+

+	/**

+	 * @throws WidgetNotFoundException

+	 */

+	private void saveAndCloseAllEditors() {

+		List<? extends SWTBotEditor> editors = bot.editors();

+		for (SWTBotEditor editor : editors) {

+			editor.saveAndClose();

+		}

+	}

+}

diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditorTest.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditorTest.java
new file mode 100644
index 0000000..3460631
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditorTest.java
@@ -0,0 +1,131 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Ketan Padegaonkar 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:

+ *     Ketan Padegaonkar - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.swtbot.eclipse.finder.widgets;

+

+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;

+import static org.hamcrest.MatcherAssert.assertThat;

+import static org.hamcrest.Matchers.hasItems;

+import static org.hamcrest.Matchers.startsWith;

+import static org.junit.Assert.assertEquals;

+import static org.junit.Assert.assertFalse;

+import static org.junit.Assert.assertTrue;

+

+import java.io.File;

+import java.util.List;

+

+import org.eclipse.swt.custom.StyledText;

+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;

+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;

+import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;

+import org.eclipse.swtbot.swt.finder.results.VoidResult;

+import org.eclipse.swtbot.swt.finder.utils.FileUtils;

+import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText;

+import org.eclipse.ui.IWorkbenchPage;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.PlatformUI;

+import org.eclipse.ui.ide.IDE;

+import org.junit.After;

+import org.junit.Before;

+import org.junit.Test;

+import org.junit.runner.RunWith;

+

+@RunWith(SWTBotJunit4ClassRunner.class)

+public class SWTBotMultiPageEditorTest extends AbstractSWTBotEclipseTest {

+

+	private File					testFile;

+	private SampleMultiPageEditor	editor;

+

+	@Before

+	public void before() throws Exception {

+		testFile = File.createTempFile("multipage", ".mpe");

+		testFile.deleteOnExit();

+		UIThreadRunnable.syncExec(new VoidResult() {

+			public void run() {

+				try {

+					IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();

+					IDE.openEditor(activePage, testFile.toURI(),

+							"org.eclipse.swtbot.eclipse.finder.test.ui.editors.MultiPageEditor", true);

+				} catch (PartInitException e) {

+					e.printStackTrace();

+				}

+			}

+		});

+		this.editor = new SampleMultiPageEditor(bot.multipageEditorByTitle("Sample Multi-page Editor"), bot);

+	}

+

+	@After

+	public void after() {

+		if (testFile != null) {

+			testFile.delete();

+		}

+	}

+

+	@Test

+	public void shouldGetPageCount() throws Exception {

+		assertEquals(3, editor.getPageCount());

+	}

+

+	@Test

+	public void shouldGetActivePage() throws Exception {

+		assertTrue(editor.isActive());

+		assertEquals(testFile.getName(), editor.getActivePageTitle());

+	}

+

+	@Test

+	public void shouldGetListOfPageTitles() throws Exception {

+		List<String> pages = editor.getPagesTitles();

+		assertThat("Pages", pages, hasItems(testFile.getName(), "Properties", "Preview"));

+		assertEquals(3, pages.size());

+	}

+

+	@Test

+	public void shouldAnswerIsActivePageCorrectly() throws Exception {

+		assertTrue(editor.isActivePage(testFile.getName()));

+		assertTrue(editor.isActivePage(startsWith("multipage")));

+		assertFalse(editor.isActivePage("Properties"));

+	}

+

+	@Test

+	public void shouldSetActivePage() throws Exception {

+		assertFalse(editor.isActivePage("Properties"));

+		editor.activatePage("Properties");

+		assertTrue(editor.isActivePage("Properties"));

+		editor.activatePage("Preview");

+		assertTrue(editor.isActivePage("Preview"));

+	}

+

+	@Test

+	public void editorShouldBeMarkedDirtyOnChanges() {

+		assertFalse(editor.isDirty());

+		editor.getText().setText("Make editor dirty");

+		assertTrue(editor.isDirty());

+		editor.save();

+		assertFalse(editor.isDirty());

+	}

+

+	@Test

+	public void shouldSaveEditorContents() throws Exception {

+		String expectedContent = "Some content...";

+		editor.getText().setText(expectedContent);

+		editor.save();

+		assertEquals(expectedContent, FileUtils.read(testFile));

+	}

+

+	private static class SampleMultiPageEditor extends SWTBotMultiPageEditor {

+		public SampleMultiPageEditor(SWTBotMultiPageEditor editor, SWTWorkbenchBot bot) {

+			super(editor.getReference(), bot);

+		}

+

+		public SWTBotStyledText getText() {

+			return new SWTBotStyledText(findWidget(widgetOfType(StyledText.class)));

+		}

+	}

+}

diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewTest.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewTest.java
index f87cb94..47fc269 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewTest.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewTest.java
@@ -16,9 +16,11 @@
 
 import java.util.List;
 
+import org.eclipse.swtbot.eclipse.finder.FinderTestIds;
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarRadioButton;
@@ -104,8 +106,17 @@
 		cICMenu.click();
 		bot.button("OK").click();
 //		assertTrue(cICMenu.isChecked());
-	}
 
+		// Runs an action that has a contribution ID instead of the action.
+		List<SWTBotViewMenu> menus = view.menus();
+		System.out.println(menus);
+
+		// Runs an action that has a contribution ID instead of the action.
+		SWTBotViewMenu pCICMenu = view.menu("Try the Banana");
+		pCICMenu.click();
+		bot.button("OK").click();
+}
+	
 	@Test
 	public void getToolbarButtons() throws Exception {
 		SWTBotView view = bot.viewByTitle("SWTBot Test View");
@@ -169,4 +180,33 @@
 			// This is expected.
 		}
 	}
+
+	@Test
+	public void viewBotWidgetScope() {
+		try {
+			SWTBotPreferences.TIMEOUT = 0;
+			bot.perspectiveById(FinderTestIds.PERSPECTIVE_ID_FORM).activate();
+			SWTBotView form1 = bot.viewByTitle("Form 1");
+			try {
+				form1.bot().textWithLabel("Form 2");
+				fail("Form 2 text with label should not be reachable in form 1");
+			} catch (WidgetNotFoundException e) {
+				// expected
+			}
+			assertEquals("Form 1", form1.bot().textWithLabel("Form 1").getText());
+
+			SWTBotView form2 = bot.viewByTitle("Form 2");
+			try {
+				form2.bot().textWithLabel("Form 1");
+				fail("Form 1 text with label should not be reachable in form 2");
+			} catch (WidgetNotFoundException e) {
+				// expected
+			}
+			assertEquals("Form 2", form2.bot().textWithLabel("Form 2").getText());
+		} finally {
+			SWTBotPreferences.TIMEOUT = 5000;
+			bot.resetWorkbench();
+		}
+	}
+
 }
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaClass.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaClass.java
index 7b58b9a..2cd790b 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaClass.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaClass.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.swt.finder.waits.Conditions;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 
 /**
@@ -25,6 +26,16 @@
 	private SWTWorkbenchBot	bot	= new SWTWorkbenchBot();
 
 	public void createClass(String packageName, String className) {
+		try {
+			SWTBotMenu windowMenu = bot.menu("Window");
+			SWTBotMenu perspectiveMenu = windowMenu.menu("Open Perspective");
+			SWTBotMenu javaPerspectiveMenu = perspectiveMenu.menu("Java");
+			if (javaPerspectiveMenu.isVisible() && javaPerspectiveMenu.isEnabled()) { 
+				javaPerspectiveMenu.click();
+			}
+		} catch (Exception ex) {
+			// Java menu not available: already selected
+		}
 		bot.menu("File").menu("New").menu("Class").click();
 		SWTBotShell shell = bot.shell("New Java Class");
 		shell.activate();
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaProject.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaProject.java
index 0d0fd22..90ffd79 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaProject.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/NewJavaProject.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.swt.finder.waits.Conditions;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 
 /**
@@ -25,7 +26,18 @@
 	private SWTWorkbenchBot	bot	= new SWTWorkbenchBot();
 
 	public void createProject(String projectName) throws Exception {
+		try {
+			SWTBotMenu windowMenu = bot.menu("Window");
+			SWTBotMenu perspectiveMenu = windowMenu.menu("Open Perspective");
+			SWTBotMenu javaPerspectiveMenu = perspectiveMenu.menu("Java");
+			if (javaPerspectiveMenu.isVisible() && javaPerspectiveMenu.isEnabled()) { 
+				javaPerspectiveMenu.click();
+			}
+		} catch (Exception ex) {
+			// Java menu not available: already selected
+		}
 		bot.menu("File").menu("New").menu("Java Project").click();
+	
 
 		SWTBotShell shell = bot.shell("New Java Project");
 		shell.activate();
diff --git a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/PackageExplorerView.java b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/PackageExplorerView.java
index 8f13d96..f19d992 100644
--- a/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/PackageExplorerView.java
+++ b/org.eclipse.swtbot.eclipse.finder.test/src/org/eclipse/swtbot/eclipse/finder/widgets/helpers/PackageExplorerView.java
@@ -12,14 +12,12 @@
 
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
 
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.waits.Conditions;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotRadio;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 
@@ -38,23 +36,12 @@
 		tree.setFocus();
 		tree.select(projectName);
 		bot.menu("Edit").menu("Delete").click();
-		String version = (String) Platform.getBundle("org.eclipse.core.runtime").getHeaders().get("Bundle-Version");
-		if (version.startsWith("3.3")) {
-			SWTBotShell shell = bot.shell("Confirm Project Delete");
-			shell.activate();
-			Button button = bot.widget(widgetOfType(Button.class), shell.widget);
-			new SWTBotRadio(button).click();
-			bot.button("Yes").click();
-			bot.waitUntil(Conditions.shellCloses(shell));
-		}
-		if (version.startsWith("3.4") || version.startsWith("3.5")) {
-			SWTBotShell shell = bot.shell("Delete Resources");
-			shell.activate();
-			Button button = bot.widget(widgetOfType(Button.class), shell.widget);
-			new SWTBotCheckBox(button).select();
-			bot.button("OK").click();
-			bot.waitUntil(Conditions.shellCloses(shell));
-		}
+		SWTBotShell shell = bot.shell("Delete Resources");
+		shell.activate();
+		Button button = bot.widget(widgetOfType(Button.class), shell.widget);
+		new SWTBotCheckBox(button).select();
+		bot.button("OK").click();
+		bot.waitUntil(Conditions.shellCloses(shell));
 	}
 
 	/**
diff --git a/org.eclipse.swtbot.eclipse.finder/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.finder/META-INF/MANIFEST.MF
index 24ffdc6..ca1d041 100644
--- a/org.eclipse.swtbot.eclipse.finder/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.finder/META-INF/MANIFEST.MF
@@ -2,10 +2,9 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Eclipse Control Finder Plug-in (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.finder;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Activator: org.eclipse.swtbot.eclipse.finder.Activator
+Bundle-Version: 2.0.5.qualifier
 Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Export-Package: org.eclipse.swtbot.eclipse.finder,
  org.eclipse.swtbot.eclipse.finder.exceptions,
  org.eclipse.swtbot.eclipse.finder.finders,
@@ -15,8 +14,8 @@
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ClassPath: .
 Import-Package: javax.swing.text,
- junit.framework;version="4.3.1",
- org.apache.log4j;version="1.2.12",
+ junit.framework;version="4.5.0",
+ org.apache.log4j;version="[1.2.13,1.3.0)",
  org.eclipse.core.commands,
  org.eclipse.core.commands.common,
  org.eclipse.core.runtime;version="3.4.0",
@@ -27,21 +26,9 @@
  org.eclipse.swt.custom,
  org.eclipse.swt.graphics,
  org.eclipse.swt.widgets,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.exceptions,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.keyboard,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.results,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.utils.internal,
- org.eclipse.swtbot.swt.finder.waits,
- org.eclipse.swtbot.swt.finder.widgets,
- org.eclipse.ui; ui.workbench="split",
- org.eclipse.ui.commands,
- org.eclipse.ui.handlers,
- org.eclipse.ui.internal,
- org.eclipse.ui.plugin,
- org.eclipse.ui.texteditor;resolution:=optional,
- org.hamcrest;version="1.1.0",
  org.osgi.framework;version="1.4.0"
+Require-Bundle: org.eclipse.swtbot.swt.finder;visibility:=reexport,
+ org.hamcrest.core;bundle-version="1.1.0",
+ org.hamcrest;bundle-version="1.1.0",
+ org.eclipse.ui;bundle-version="3.6.0",
+ org.eclipse.ui.editors;bundle-version="3.6.0"
diff --git a/org.eclipse.swtbot.eclipse.finder/build.properties b/org.eclipse.swtbot.eclipse.finder/build.properties
index 3714ba6..76d73f2 100644
--- a/org.eclipse.swtbot.eclipse.finder/build.properties
+++ b/org.eclipse.swtbot.eclipse.finder/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -16,10 +16,5 @@
                about.html,\
                src/
 jars.compile.order = .
-src.includes = src/,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
+src.includes = LICENSE.EPL,\
                about.html
diff --git a/org.eclipse.swtbot.eclipse.finder/pom.xml b/org.eclipse.swtbot.eclipse.finder/pom.xml
new file mode 100644
index 0000000..edc2ad9
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.finder</artifactId>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+  <packaging>eclipse-plugin</packaging>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/Activator.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/Activator.java
deleted file mode 100644
index 0acfb72..0000000
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/Activator.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.finder;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	/** The plugin ID */
-	public static final String PLUGIN_ID = "org.eclipse.swtbot.eclipse.finder"; //$NON-NLS-1$
-
-	/** The shared instance */
-	private static Activator plugin;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-		//Nothing to do.
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/**
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/DefaultWorkbench.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/DefaultWorkbench.java
new file mode 100644
index 0000000..150b149
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/DefaultWorkbench.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2009 - 2010 David Green 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:
+ *     David Green - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.finder;
+
+import java.util.List;
+
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * A default implementation of the workbench. May be subclassed to provide alternate implementations for different
+ * versions of Eclipse.
+ * <p>
+ * Do not access directly. Instead use <code>Eclipse.workbench()</code>
+ * </p>
+ * 
+ * @author David Green
+ * @see Eclipse
+ */
+class DefaultWorkbench {
+
+	/** The bot that may be used to drive the workbench. */
+	private final SWTWorkbenchBot	bot;
+
+	/**
+	 * Creates an instance of the default workbench.
+	 * 
+	 * @param bot the bot that can drive the workbench.
+	 */
+	DefaultWorkbench(SWTWorkbenchBot bot) {
+		this.bot = bot;
+	}
+
+	DefaultWorkbench resetActivePerspective() {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				activePage().resetPerspective();
+			}
+		});
+		return this;
+	}
+
+	DefaultWorkbench resetWorkbench() {
+		return closeAllShells().saveAllEditors().closeAllEditors();
+	}
+
+	DefaultWorkbench closeAllShells() {
+		SWTBotShell[] shells = bot.shells();
+		for (SWTBotShell shell : shells) {
+			if (!isEclipseShell(shell)) {
+				shell.close();
+			}
+		}
+		return this;
+	}
+
+	DefaultWorkbench saveAllEditors() {
+		List<? extends SWTBotEditor> editors = bot.editors();
+		for (SWTBotEditor editor : editors) {
+			editor.save();
+		}
+		return this;
+	}
+
+	DefaultWorkbench closeAllEditors() {
+		List<? extends SWTBotEditor> editors = bot.editors();
+		for (SWTBotEditor editor : editors) {
+			editor.close();
+		}
+		return this;
+	}
+
+	private boolean isEclipseShell(final SWTBotShell shell) {
+		return getActiveWorkbenchWindowShell() == shell.widget;
+	}
+
+	private IWorkbenchWindow getActiveWorkbenchWindow() {
+		return UIThreadRunnable.syncExec(bot.getDisplay(), new Result<IWorkbenchWindow>() {
+			public IWorkbenchWindow run() {
+				return PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			}
+		});
+	}
+	
+	private Widget getActiveWorkbenchWindowShell() {
+		return getActiveWorkbenchWindow().getShell();
+	}
+
+	private IWorkbenchPage activePage() {
+		return getActiveWorkbenchWindow().getActivePage();
+	}
+
+	private IPerspectiveDescriptor[] perspectives() {
+		return PlatformUI.getWorkbench().getPerspectiveRegistry().getPerspectives();
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java
index 963f589..beda1d0 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java
@@ -20,7 +20,7 @@
  */
 public class SWTBotInfo {
 
-	private static final String	VERSION	= "@svn.version@";
+	private static final String	VERSION	= "@git.version@";
 
 	/**
 	 * Prints out some platform specific information useful for diagnosis.
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTWorkbenchBot.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTWorkbenchBot.java
index 4fab555..0cf9dec 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTWorkbenchBot.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTWorkbenchBot.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 SWTBot Committers and others
+ * Copyright (c) 2009,2010 SWTBot Committers 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
@@ -7,6 +7,7 @@
  * 
  * Contributors:
  *     Ralf Ebert www.ralfebert.de - (bug 271630) SWTBot Improved RCP / Workbench support
+ *     Ketan Padegaonkar - (bug 260088) Support for MultiPageEditorPart
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.finder;
 
@@ -16,6 +17,7 @@
 import static org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory.withPerspectiveLabel;
 import static org.eclipse.swtbot.eclipse.finder.waits.Conditions.waitForEditor;
 import static org.eclipse.swtbot.eclipse.finder.waits.Conditions.waitForView;
+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -25,13 +27,17 @@
 import org.eclipse.swtbot.eclipse.finder.waits.WaitForEditor;
 import org.eclipse.swtbot.eclipse.finder.waits.WaitForView;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotMultiPageEditor;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotPerspective;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
 import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.results.Result;
 import org.eclipse.ui.IEditorReference;
 import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
 import org.hamcrest.Matcher;
 import org.hamcrest.Matchers;
 
@@ -252,8 +258,66 @@
 			throw new WidgetNotFoundException("There is no active editor"); //$NON-NLS-1$
 		return new SWTBotEditor(editor, this);
 	}
+	
+	/**
+	 * Waits for a multipage editor matching the given matcher to appear in the active workbench page and returns it
+	 * 
+	 * @param matcher the matcher used to find the editor
+	 * @return an editor that matches the matcher
+	 * @throws WidgetNotFoundException if the editor is not found
+	 */
+	public SWTBotMultiPageEditor multipageEditor(Matcher<IEditorReference> matcher) {
+		WaitForEditor waitForEditor = waitForEditor(matcher);
+		waitUntilWidgetAppears(waitForEditor);
+		return new SWTBotMultiPageEditor(waitForEditor.get(0), this);
+	}
 
 	/**
+	 * @return all multipage editors which are opened currently (no waiting!) which match the given matcher
+	 * @param matcher the matcher used to find all editors
+	 */
+	public List<SWTBotMultiPageEditor> multipageEditors(Matcher<?> matcher) {
+		List<IEditorReference> editors = workbenchContentsFinder.findEditors(matcher);
+
+		List<SWTBotMultiPageEditor> editorBots = new ArrayList<SWTBotMultiPageEditor>();
+		for (IEditorReference editorReference : editors)
+			editorBots.add(new SWTBotMultiPageEditor(editorReference, this));
+
+		return editorBots;
+	}
+
+	/**
+	 * @return all editors which are opened currently
+	 */
+	public List<? extends SWTBotMultiPageEditor> multipageEditors() {
+		return multipageEditors(Matchers.anything());
+	}
+
+	/**
+	 * Shortcut for multipageEditor(withPartName(title))
+	 * 
+	 * @param fileName the the filename on the editor tab
+	 * @return the editor with the specified title
+	 * @see #editor(Matcher)
+	 */
+	public SWTBotMultiPageEditor multipageEditorByTitle(String fileName) {
+		Matcher<IEditorReference> withPartName = withPartName(fileName);
+		return multipageEditor(withPartName);
+	}
+
+	/**
+	 * Shortcut for multipageEditor(withPartId(id))
+	 * 
+	 * @param id the the id on the editor tab
+	 * @return the editor with the specified title
+	 * @see #editor(Matcher)
+	 */
+	public SWTBotMultiPageEditor multipageEditorById(String id) {
+		Matcher<IEditorReference> withPartId = withPartId(id);
+		return multipageEditor(withPartId);
+	}
+	
+	/**
 	 * @return the active perspective in the active workbench page
 	 */
 	public SWTBotPerspective activePerspective() {
@@ -262,4 +326,55 @@
 			throw new WidgetNotFoundException("There is no active perspective"); //$NON-NLS-1$
 		return new SWTBotPerspective(perspective, this);
 	}
+
+	/**
+	 * Does a <em>best effort</em> to reset the workbench. This method attempts to:
+	 * <ul>
+	 * <li>close all non-workbench windows</li>
+	 * <li>save and close all open editors</li>
+	 * <li>reset the <em>active</em> perspective</li>
+	 * <li>switch to the default perspective for the workbench</li>
+	 * <li>reset the <em>default</em> perspective for the workbench</li>
+	 * <ul>
+	 */
+	public void resetWorkbench() {
+		closeAllShells();
+		saveAllEditors();
+		closeAllEditors();
+		resetActivePerspective();
+
+		defaultPerspective().activate();
+		resetActivePerspective();
+	}
+
+	/**
+	 * Returns the default perspective as defined in the WorkbenchAdvisor of the application.
+	 */
+	public SWTBotPerspective defaultPerspective() {
+		return syncExec(new Result<SWTBotPerspective>() {
+
+			public SWTBotPerspective run() {
+				IWorkbench workbench = PlatformUI.getWorkbench();
+				return perspectiveById(workbench.getPerspectiveRegistry().getDefaultPerspective());
+			}
+		});
+	}
+
+	public void closeAllEditors() {
+		new DefaultWorkbench(this).closeAllEditors();
+	}
+
+	public void saveAllEditors() {
+		new DefaultWorkbench(this).saveAllEditors();
+	}
+
+	public SWTBotPerspective resetActivePerspective() {
+		new DefaultWorkbench(this).resetActivePerspective();
+		return activePerspective();
+	}
+
+	public void closeAllShells() {
+		new DefaultWorkbench(this).closeAllShells();
+	}
+
 }
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/finders/ViewMenuFinder.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/finders/ViewMenuFinder.java
index ce04bd6..309ebad 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/finders/ViewMenuFinder.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/finders/ViewMenuFinder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2012 Ketan Padegaonkar 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
@@ -16,14 +16,17 @@
 import org.apache.log4j.Logger;
 import org.eclipse.jface.action.ActionContributionItem;
 import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.SubContributionItem;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotViewMenu;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.ListResult;
+import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
+import org.eclipse.ui.IViewPart;
 import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.internal.ViewPane;
-import org.eclipse.ui.internal.WorkbenchPartReference;
+import org.eclipse.ui.menus.CommandContributionItem;
 import org.hamcrest.Matcher;
 
 /**
@@ -59,13 +62,14 @@
 		return UIThreadRunnable.syncExec(new ListResult<SWTBotViewMenu>() {
 
 			public List<SWTBotViewMenu> run() {
-				ViewPane viewPane = (ViewPane) ((WorkbenchPartReference) view).getPane();
-				MenuManager mgr = viewPane.getMenuManager();
 				List<SWTBotViewMenu> l = new ArrayList<SWTBotViewMenu>();
-
-				l.addAll(getMenuItemsInternal(mgr.getItems(), matcher, recursive));
-
-				return l;
+                IViewPart viewPart = view.getView(false);
+                if (viewPart == null) {
+                   return l;
+                }
+               IMenuManager viewMenuManager = viewPart.getViewSite().getActionBars().getMenuManager();
+               l.addAll(getMenuItemsInternal(viewMenuManager.getItems(), matcher, recursive));
+               return l;
 			}
 		});
 	}
@@ -84,12 +88,10 @@
 					MenuManager menuManager = (MenuManager) item;
 
 					l.addAll(getMenuItemsInternal(menuManager.getItems(), matcher, recursive));
-				} else if (item instanceof ActionContributionItem) {
-					// Menus
-					ActionContributionItem actionContribution = (ActionContributionItem) item;
-
-					if (matcher.matches(actionContribution.getAction()))
-						l.add(new SWTBotViewMenu(actionContribution));
+				} else {
+					SWTBotViewMenu menu = getMenuItem(item, matcher);
+					if (menu != null)
+						l.add(menu);
 				}
 			} catch (WidgetNotFoundException e) {
 				log.warn(e);
@@ -98,4 +100,40 @@
 
 		return l;
 	}
+	
+	private SWTBotViewMenu  getMenuItem(IContributionItem item, Matcher<?> matcher) {
+		SWTBotViewMenu menu = null;
+		if (item instanceof ActionContributionItem) {
+			ActionContributionItem actionContribution = (ActionContributionItem) item;
+			if (matcher.matches(actionContribution.getAction()))
+				menu = new SWTBotViewMenu(actionContribution);
+		} else if (item instanceof SubContributionItem ) {
+			    menu = getMenuItem(((SubContributionItem) item).getInnerItem(), matcher);
+		} else if (item instanceof CommandContributionItem) {
+			CommandContributionItem cmdContribution = (CommandContributionItem) item;
+			if (matcher.matches(new CommandItemWithTextMatcherWrapper(cmdContribution)))
+				menu = new SWTBotViewMenu(cmdContribution.getCommand());
+		}
+		return menu;
+	}
+	
+	/* This class should be public at it will be accessed outside of its parent class*/
+	public static class CommandItemWithTextMatcherWrapper {
+		
+		private CommandContributionItem wrappedCommandItem;
+		
+		public CommandItemWithTextMatcherWrapper(CommandContributionItem item) {
+			this.wrappedCommandItem = item;
+		}
+		
+		/*
+		 * This method will be called reflectively by a matcher.
+		 */
+		@SuppressWarnings("unused")
+		public String getText() throws Exception {
+				/* label attribute of command contribution item is not available */
+				String label = (String) SWTUtils.getAttribute(wrappedCommandItem, "label"); ////$NON-NLS-1$
+				return label != null ? label:""; ////$NON-NLS-1$
+		}
+	}
 }
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/matchers/WidgetMatcherFactory.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/matchers/WidgetMatcherFactory.java
index 1cb1cbe..00c304b 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/matchers/WidgetMatcherFactory.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/matchers/WidgetMatcherFactory.java
@@ -1,4 +1,6 @@
-// Generated source.
+// Generated source. DO NOT MODIFY.
+// To add new new methods, please see README file in the generator plugin.
+
 package org.eclipse.swtbot.eclipse.finder.matchers;
 
 public abstract class WidgetMatcherFactory extends org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory {
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEclipseEditor.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEclipseEditor.java
index 413afd1..1ee569a 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEclipseEditor.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEclipseEditor.java
@@ -535,6 +535,8 @@
 	}
 
 	/**
+	 * Get the text on line number given as parameter.
+	 * Note that in eclipse editors, folding has no incidence on line numbers.
 	 * @param line the line number, 0 based.
 	 * @return the text on the given line number, without the line delimiters.
 	 * @see SWTBotStyledText#getTextOnLine(int)
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEditor.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEditor.java
index 47fea3b..d1f7154 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEditor.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008-2009 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2009,2010 Ketan Padegaonkar 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
@@ -10,9 +10,12 @@
  *     Ketan Patel - https://bugs.eclipse.org/bugs/show_bug.cgi?id=259837
  *     Ralf Ebert www.ralfebert.de - (bug 271630) SWTBot Improved RCP / Workbench support
  *     Ralf Ebert - (bug 294452) - SWTBotEditor does not pass an IProgressMonitor when saving an editor
+ *     Ketan Padegaonkar - (bug 260088) Support for MultiPageEditorPart
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.finder.widgets;
 
+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
+
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
@@ -60,6 +63,12 @@
 	}
 
 	public void setFocus() {
+		syncExec(new VoidResult() {
+			public void run() {
+				IEditorPart editor = partReference.getEditor(true);
+				editor.setFocus();
+			}
+		});
 	}
 
 	/**
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditor.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditor.java
new file mode 100644
index 0000000..3b12436
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotMultiPageEditor.java
@@ -0,0 +1,181 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.finder.widgets;
+
+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
+import static org.hamcrest.Matchers.equalTo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.custom.CTabFolder;
+import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.matchers.WithItem;
+import org.eclipse.swtbot.swt.finder.results.IntResult;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotCTabItem;
+import org.eclipse.ui.IEditorReference;
+import org.hamcrest.Matcher;
+
+/**
+ * Base class for all multi-page editors in Eclipse.
+ * <p>
+ * <b>Note:</b> It is recommend that clients decorate this class with their own custom wrappers.
+ * </p>
+ * <p>
+ * <b>Note:</b> This API is very new, experimental and subject to change.
+ * </p>
+ * 
+ * <pre>
+ * public class PDEManifestEditor extends SWTBotMultiPageEditor {
+ * 	public PDEManifestEditor(SWTBotMultiPageEditor editor, SWTWorkbenchBot bot) {
+ * 		super(editor.getReference(), bot);
+ * 		this.editor = editor;
+ * 	}
+ * 
+ * 	// any custom behavior you need to test
+ * 	public activateBuildPropertiesTab() {
+ * 		activatePage(&quot;build.properties&quot;);
+ * 	}
+ * 
+ * 	public SWTBotStyledText buildProperties() {
+ * 		activateBuildPropertiesTab();
+ * 		return SWTBotStyledText((StyledText) findWidget(widgetOfType(StyledText.class)));
+ * 	}
+ * }
+ * </pre>
+ * 
+ * @author Ketan Patel
+ * @author Ketan Padegaonkar
+ * @since 2.0
+ */
+public class SWTBotMultiPageEditor extends SWTBotEditor {
+	/**
+	 * The tabFolder widget.
+	 */
+	protected final CTabFolder	tabFolder;
+
+	/**
+	 * Constructs an instance of the given object.
+	 * 
+	 * @param editorReference the editor reference.
+	 * @param bot the instance of {@link SWTWorkbenchBot} which will be used to drive operations on behalf of this
+	 *            object.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotMultiPageEditor(IEditorReference editorReference, SWTWorkbenchBot bot) {
+		super(editorReference, bot);
+		tabFolder = findWidget(widgetOfType(CTabFolder.class));
+	}
+
+	/**
+	 * Find the CTabItem whose text matches the given matcher.
+	 * 
+	 * @param titleMatcher the text matcher
+	 * @return a {@link SWTBotCTabItem} with the specified tab name.
+	 */
+	private SWTBotCTabItem findPage(Matcher<? extends Widget> titleMatcher) {
+		WithItem<CTabItem> itemMatcher = WithItem.withItem(allOf(widgetOfType(CTabItem.class), titleMatcher));
+		if (itemMatcher.matches(tabFolder))
+			return new SWTBotCTabItem(itemMatcher.get(0));
+		throw new WidgetNotFoundException("Could not find page with title " + titleMatcher);
+	}
+
+	/**
+	 * Returns the number of pages in this multi-page editor.
+	 * 
+	 * @return the number of pages
+	 */
+	public int getPageCount() {
+		return syncExec(new IntResult() {
+			public Integer run() {
+				return tabFolder.getItemCount();
+			}
+		});
+	}
+
+	/**
+	 * Sets the currently active page.
+	 * 
+	 * @param pageText the text label for the page to be activated
+	 * @return the {@link CTabItem} that was activated.
+	 */
+	public SWTBotCTabItem activatePage(String pageText) {
+		return activatePage(withMnemonic(pageText));
+	}
+
+	/**
+	 * Sets the currently active page.
+	 * 
+	 * @param titleMatcher the title matcher for the page to be activated.
+	 * @return the {@link CTabItem} that was activated.
+	 */
+	public SWTBotCTabItem activatePage(Matcher<? extends Widget> titleMatcher) {
+		return findPage(titleMatcher).show().activate();
+	}
+
+	/**
+	 * Returns the title of the currently active page or <code>null</code> if there is no active page
+	 * 
+	 * @return the title of the currently active page or <code>null</code> if there is no active page
+	 */
+	public String getActivePageTitle() {
+		CTabItem tab = tabFolder.getSelection();
+		if (tab != null) {
+			return new SWTBotCTabItem(tab).getText();
+		}
+		return null;
+	}
+
+	/**
+	 * Returns a list of title of all the pages in this multi-page editor.
+	 * 
+	 * @return List of title of all pages; empty list if no pages.
+	 */
+	public List<String> getPagesTitles() {
+		List<String> pages = null;
+		if (getPageCount() > 0) {
+			pages = UIThreadRunnable.syncExec(new Result<List<String>>() {
+				public List<String> run() {
+					ArrayList<String> titles = new ArrayList<String>();
+					for (CTabItem item : tabFolder.getItems()) {
+						titles.add(item.getText());
+					}
+					return titles;
+				}
+			});
+		}
+		return pages == null ? new ArrayList<String>() : pages;
+	}
+
+	/**
+	 * @param pageText the page title to test
+	 * @return <code>true</code> if the currently active page has given title, <code>false</code> otherwise.
+	 */
+	public boolean isActivePage(String pageText) {
+		return isActivePage(equalTo(pageText));
+	}
+
+	/**
+	 * @param titleMatcher the title matcher for the active page
+	 * @return <code>true</code> if the currently active page title matches, <code>false</code> otherwise.
+	 */
+	public boolean isActivePage(Matcher<String> titleMatcher) {
+		return titleMatcher.matches(getActivePageTitle());
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotPerspective.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotPerspective.java
index d393fa2..0201164 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotPerspective.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotPerspective.java
@@ -68,6 +68,13 @@
 		return bot.activePerspective().perspectiveDescriptor.getId().equals(this.perspectiveDescriptor.getId());
 	}
 
+	/**
+	 * @return the perspective label
+	 */
+	public String getLabel() {
+		return this.perspectiveDescriptor.getLabel();
+	}
+	
 	public String toString() {
 		return "SWTBotEclipsePerspective[id=\"" + perspectiveDescriptor.getLabel() + "\", label=\"" + perspectiveDescriptor.getLabel()
 				+ "\"]";
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotView.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotView.java
index fda837e..c740fff 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotView.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotView.java
@@ -12,12 +12,23 @@
 package org.eclipse.swtbot.eclipse.finder.widgets;
 
 import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
+import static org.hamcrest.Matchers.anything;
+import static org.hamcrest.Matchers.equalTo;
+
+import java.util.List;
 
 import javax.swing.text.View;
 
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
+import org.eclipse.swtbot.eclipse.finder.finders.CommandFinder;
+import org.eclipse.swtbot.eclipse.finder.finders.ViewMenuFinder;
+import org.eclipse.swtbot.eclipse.finder.widgets.utils.PartLabelDescription;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
 import org.eclipse.ui.IViewReference;
 import org.hamcrest.SelfDescribing;
 
@@ -30,6 +41,7 @@
  */
 public class SWTBotView extends SWTBotWorkbenchPart<IViewReference> {
 
+	private final ViewMenuFinder	menuFinder;
 	/**
 	 * Creates an instance of a view part.
 	 * 
@@ -38,7 +50,7 @@
 	 * @since 2.0
 	 */
 	public SWTBotView(IViewReference partReference, SWTWorkbenchBot bot) {
-		super(partReference, bot);
+		this(partReference, bot, new PartLabelDescription<IViewReference>(partReference));
 	}
 
 	/**
@@ -50,6 +62,7 @@
 	 */
 	public SWTBotView(IViewReference partReference, SWTWorkbenchBot bot, SelfDescribing description) {
 		super(partReference, bot, description);
+		this.menuFinder = new ViewMenuFinder();
 	}
 
 	public void setFocus() {
@@ -71,4 +84,58 @@
 		return partReference.getPage().getActivePartReference() == partReference;
 	}
 
+	/**
+	 * Close the partReference.
+	 */
+	public void close() {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				partReference.getPage().hideView(partReference);
+			}
+		});
+	}
+
+	/**
+	 * Gets a list of all menus within the partReference. This will also include sub menus.
+	 * 
+	 * @return The list of menus
+	 */
+	public List<SWTBotViewMenu> menus() {
+		return menuFinder.findMenus(partReference, anything(), true);
+	}
+
+	/**
+	 * Gets a menu item matching the give label within the partReference menu if one exists.
+	 * 
+	 * @param label The label matching name in the menu.
+	 * @return The {@link SWTBotMenu} item.
+	 * @throws WidgetNotFoundException Thrown if the menu can not be found or if the partReference does not contain a
+	 *             menu.
+	 */
+	public SWTBotViewMenu menu(String label) throws WidgetNotFoundException {
+		return menu(label, 0);
+	}
+
+	/**
+	 * Gets a menu item matching the give label within the partReference menu if one exists.
+	 * 
+	 * @param label The label matching name in the menu.
+	 * @param index The index of the menu to choose.
+	 * @return The {@link SWTBotMenu} item.
+	 * @throws WidgetNotFoundException Thrown if the menu can not be found or if the partReference does not contain a
+	 *             menu.
+	 */
+	public SWTBotViewMenu menu(String label, int index) throws WidgetNotFoundException {
+		try {
+			List<SWTBotViewMenu> menuItems = menuFinder.findMenus(partReference, withMnemonic(label), true);
+			if ((menuItems == null) || (menuItems.size() < 1)) {
+				CommandFinder finder = new CommandFinder();
+				List<SWTBotCommand> command = finder.findCommand(equalTo(label));
+				return command.get(index);
+			}
+			return menuItems.get(index);
+		} catch (Exception e) {
+			throw new WidgetNotFoundException("Could not find view menu with label " + label + " at index " + index, e); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
 }
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewMenu.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewMenu.java
index 5f54519..7b0ac8b 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewMenu.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotViewMenu.java
@@ -11,6 +11,7 @@
 package org.eclipse.swtbot.eclipse.finder.widgets;
 
 import org.eclipse.core.commands.Command;
+import org.eclipse.core.commands.ParameterizedCommand;
 import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.core.runtime.AssertionFailedException;
@@ -42,6 +43,10 @@
 	 */
 	protected Command				cmdItem			= null;
 	/**
+	 * Holds parameterized command if setup.
+	 */
+	protected ParameterizedCommand				paraCmdItem			= null;
+	/**
 	 * Holds the id of the command if one exists.
 	 */
 	protected String				commandID		= null;
@@ -63,6 +68,24 @@
 			text = ""; //$NON-NLS-1$
 		}
 	}
+	
+	/**
+	 * Constructs a SWTBot View Menu item.
+	 *
+	 * @param commandItem The parameterized command contribution item.
+	 * @throws WidgetNotFoundException Thrown if both values are <code>null</code>.
+	 * @throws AssertionFailedException If the contribution item is <code>null</code>.
+	 */
+	public SWTBotViewMenu(ParameterizedCommand commandItem) throws WidgetNotFoundException {
+		paraCmdItem = commandItem;
+
+		commandID = paraCmdItem.getId();
+		try {
+			text = paraCmdItem.getName();
+		} catch (NotDefinedException e) {
+			text = ""; //$NON-NLS-1$
+		}
+	}
 
 	/**
 	 * Constructs a SWTBot View Menu item.
diff --git a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotWorkbenchPart.java b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotWorkbenchPart.java
index fa573b8..cba2767 100644
--- a/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotWorkbenchPart.java
+++ b/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/widgets/SWTBotWorkbenchPart.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008-2009 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2012 Ketan Padegaonkar 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
@@ -10,23 +10,20 @@
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.finder.widgets;
 
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
 import static org.hamcrest.Matchers.any;
-import static org.hamcrest.Matchers.anything;
-import static org.hamcrest.Matchers.equalTo;
 
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.log4j.Logger;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.ToolBarManager;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
-import org.eclipse.swtbot.eclipse.finder.finders.CommandFinder;
-import org.eclipse.swtbot.eclipse.finder.finders.ViewMenuFinder;
 import org.eclipse.swtbot.eclipse.finder.widgets.utils.PartLabelDescription;
 import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
@@ -37,17 +34,16 @@
 import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
 import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
 import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotMenu;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarRadioButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarSeparatorButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarToggleButton;
-import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IViewSite;
 import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchPartSite;
 import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.internal.PartPane;
 import org.eclipse.ui.internal.WorkbenchPartReference;
 import org.hamcrest.Matcher;
 import org.hamcrest.SelfDescribing;
@@ -69,7 +65,6 @@
 	protected final Logger			log;
 	/** A helper swtbot instance. */
 	protected final SWTWorkbenchBot	bot;
-	private final ViewMenuFinder	menuFinder;
 	private final SelfDescribing	description;
 	private Widget widget;
 
@@ -97,7 +92,6 @@
 		this.description = description;
 		Assert.isNotNull(partReference, "The part reference cannot be null"); //$NON-NLS-1$
 		this.partReference = partReference;
-		this.menuFinder = new ViewMenuFinder();
 		log = Logger.getLogger(getClass());
 	}
 
@@ -108,18 +102,10 @@
 		return partReference;
 	}
 
-	
 	/**
 	 * Close the partReference.
 	 */
-	public void close() {
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				IViewReference viewReference = (IViewReference) partReference;
-				viewReference.getPage().hideView(viewReference);
-			}
-		});
-	}
+	public abstract void close();
 
 	/**
 	 * Shows the part if it is visible.
@@ -147,50 +133,6 @@
 	}
 
 	/**
-	 * Gets a list of all menus within the partReference. This will also include sub menus.
-	 * 
-	 * @return The list of menus
-	 */
-	public List<SWTBotViewMenu> menus() {
-		return menuFinder.findMenus((IViewReference) partReference, anything(), true);
-	}
-
-	/**
-	 * Gets a menu item matching the give label within the partReference menu if one exists.
-	 * 
-	 * @param label The label matching name in the menu.
-	 * @return The {@link SWTBotMenu} item.
-	 * @throws WidgetNotFoundException Thrown if the menu can not be found or if the partReference does not contain a
-	 *             menu.
-	 */
-	public SWTBotViewMenu menu(String label) throws WidgetNotFoundException {
-		return menu(label, 0);
-	}
-
-	/**
-	 * Gets a menu item matching the give label within the partReference menu if one exists.
-	 * 
-	 * @param label The label matching name in the menu.
-	 * @param index The index of the menu to choose.
-	 * @return The {@link SWTBotMenu} item.
-	 * @throws WidgetNotFoundException Thrown if the menu can not be found or if the partReference does not contain a
-	 *             menu.
-	 */
-	public SWTBotViewMenu menu(String label, int index) throws WidgetNotFoundException {
-		try {
-			List<SWTBotViewMenu> menuItems = menuFinder.findMenus((IViewReference) partReference, withMnemonic(label), true);
-			if ((menuItems == null) || (menuItems.size() < 1)) {
-				CommandFinder finder = new CommandFinder();
-				List<SWTBotCommand> command = finder.findCommand(equalTo(label));
-				return command.get(index);
-			}
-			return menuItems.get(index);
-		} catch (Exception e) {
-			throw new WidgetNotFoundException("Could not find view menu with label " + label + " at index " + index, e); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-	}
-
-	/**
 	 * Gets the toolbar buttons currently visible.
 	 * 
 	 * @return The set of toolbar buttons.
@@ -198,11 +140,19 @@
 	public List<SWTBotToolbarButton> getToolbarButtons() {
 		return UIThreadRunnable.syncExec(new ListResult<SWTBotToolbarButton>() {
 
-			public List<SWTBotToolbarButton> run() {
-				PartPane obj = ((WorkbenchPartReference) partReference).getPane();
-				ToolBar toolbar = (ToolBar) obj.getToolBar();
+			public List<SWTBotToolbarButton> run() {				
+				ToolBar toolbar = null;
+				
+				IWorkbenchPartSite site = partReference.getPart(false).getSite();
+				if (site instanceof IViewSite) {
+					IToolBarManager t = ((IViewSite) site).getActionBars().getToolBarManager();
+					if (t instanceof ToolBarManager) {
+						toolbar = ((ToolBarManager)t).getControl();
+					}
+				}
+				
 				final List<SWTBotToolbarButton> l = new ArrayList<SWTBotToolbarButton>();
-
+				
 				if (toolbar == null)
 					return l;
 
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.gef.finder/META-INF/MANIFEST.MF
index 2cb67bf..cd9049d 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.gef.finder/META-INF/MANIFEST.MF
@@ -2,14 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Gef Plug-in (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.gef.finder;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.swtbot.eclipse.gef.finder,
  org.eclipse.swtbot.eclipse.gef.finder.finders,
  org.eclipse.swtbot.eclipse.gef.finder.matchers,
  org.eclipse.swtbot.eclipse.gef.finder.widgets
-Bundle-Vendor: Eclipse.org
-Import-Package: org.apache.log4j;version="1.2.13",
+Bundle-Vendor: Eclipse.org - SWTBot
+Import-Package: org.apache.log4j;version="[1.2.13,1.3.0)",
  org.eclipse.core.commands,
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.draw2d,
@@ -24,23 +24,9 @@
  org.eclipse.swt,
  org.eclipse.swt.events,
  org.eclipse.swt.widgets,
- org.eclipse.swtbot.eclipse.finder,
- org.eclipse.swtbot.eclipse.finder.matchers,
- org.eclipse.swtbot.eclipse.finder.waits,
- org.eclipse.swtbot.eclipse.finder.widgets,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.exceptions,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.resolvers,
- org.eclipse.swtbot.swt.finder.results,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.utils.internal,
- org.eclipse.swtbot.swt.finder.waits,
- org.eclipse.swtbot.swt.finder.widgets,
- org.eclipse.ui,
- org.eclipse.ui.internal,
- org.eclipse.ui.part,
- org.hamcrest;version="1.1.0",
  org.hamcrest.core;version="1.1.0",
- org.junit;version="4.3.1"
+ org.junit;version="4.5.0"
+Require-Bundle: org.eclipse.swtbot.eclipse.finder;visibility:=reexport,
+ org.eclipse.ui.workbench;bundle-version="3.6.0",
+ org.hamcrest.core;bundle-version="1.1.0",
+ org.hamcrest;bundle-version="1.1.0"
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/about.html b/org.eclipse.swtbot.eclipse.gef.finder/about.html
similarity index 100%
copy from org.eclipse.swtbot.eclipse.junit3.headless/about.html
copy to org.eclipse.swtbot.eclipse.gef.finder/about.html
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/build.properties b/org.eclipse.swtbot.eclipse.gef.finder/build.properties
index ab04390..a998d55 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/build.properties
+++ b/org.eclipse.swtbot.eclipse.gef.finder/build.properties
@@ -15,7 +15,8 @@
                .,\
                LICENSE.EPL,\
                src/,\
-               build.properties
+               build.properties,\
+               about.html
 src.includes = LICENSE.EPL,\
                .project,\
                .classpath,\
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/pom.xml b/org.eclipse.swtbot.eclipse.gef.finder/pom.xml
new file mode 100644
index 0000000..1165113
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef.finder/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.gef.finder</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/SWTGefBot.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/SWTGefBot.java
index dea6e5b..046fb45 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/SWTGefBot.java
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/SWTGefBot.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Obeo
+ * Copyright (c) 2009, 2010 Obeo
  * 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
@@ -13,14 +13,19 @@
 
 import static org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory.withPartName;
 import static org.eclipse.swtbot.eclipse.finder.waits.Conditions.waitForEditor;
+import static org.eclipse.swtbot.eclipse.finder.waits.Conditions.waitForView;
 import static org.hamcrest.Matchers.allOf;
 
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.eclipse.finder.waits.WaitForEditor;
+import org.eclipse.swtbot.eclipse.finder.waits.WaitForView;
 import org.eclipse.swtbot.eclipse.gef.finder.matchers.IsInstanceOf;
 import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditor;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefView;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefViewer;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.ui.IEditorReference;
+import org.eclipse.ui.IViewReference;
 import org.hamcrest.Matcher;
 
 public class SWTGefBot extends SWTWorkbenchBot {
@@ -52,9 +57,87 @@
 		Matcher<IEditorReference> matcher = allOf(IsInstanceOf.instanceOf(IEditorReference.class), withPartName);
 		WaitForEditor waitForEditor = waitForEditor(matcher);
 		waitUntilWidgetAppears(waitForEditor);
-		return new SWTBotGefEditor(waitForEditor.get(index), this);
+		return createEditor(waitForEditor.get(index), this);
+	}
+	
+	/**
+	 * Create the editor. Subclass if necessary to instance your own GEF editor.
+	 * @param reference the editor reference
+	 * @param bot the bot
+	 * @return the created editor instance
+	 */
+	protected SWTBotGefEditor createEditor(final IEditorReference reference, final SWTWorkbenchBot bot) {
+		return new SWTBotGefEditor(reference, bot);
+	}
+
+	/**
+	 * Attempts to locate the view matching the given name. If no match is found an exception will be thrown. The name
+	 * is the name as displayed on the view in eclipse.
+	 * 
+	 * @param viewName the name of the view.
+	 * @return a view with the specified name.
+	 * @throws WidgetNotFoundException if the view is not found.
+	 */
+	public SWTBotGefView gefView(String viewName) throws WidgetNotFoundException {
+		return gefView(viewName, 0);
 	}
 	
 	
+	/**
+	 * Attempts to locate the view matching the given name. If no match is found an exception will be thrown. The name
+	 * is the name as displayed on the view in eclipse.
+	 * 
+	 * @param viewName the name of the view.
+	 * @param index in case of multiple views with the same fileName.
+	 * @return a view with the specified name.
+	 * @throws WidgetNotFoundException if the view is not found.
+	 */
+	@SuppressWarnings("unchecked")
+	public SWTBotGefView gefView(String viewName, int index) throws WidgetNotFoundException {
+		Matcher<IViewReference> withPartName = withPartName(viewName);
+		Matcher<IViewReference> matcher = allOf(IsInstanceOf.instanceOf(IViewReference.class), withPartName);
+		WaitForView waitForView = waitForView(matcher);
+		waitUntilWidgetAppears(waitForView);
+		return createView(waitForView.get(index), this);
+	}
+
 	
+	/**
+	 * Create the view. Subclass if necessary to instance your own GEF view.
+	 * @param reference the view reference
+	 * @param bot the bot
+	 * @return the created view instance
+	 */
+	protected SWTBotGefView createView(final IViewReference reference, final SWTWorkbenchBot bot) {
+		return new SWTBotGefView(reference, bot);
+	}
+		
+	/**
+	 * Attempts to locate a gef viewer that is embedded in a workbench part with the specified title.
+	 * 
+	 * @param partTitle the workbench part title
+	 * @return The gef viewer
+	 * @throws WidgetNotFoundException if a workbench part with the specified title cannot be found.
+	 */
+	public SWTBotGefViewer gefViewer(String partTitle) throws WidgetNotFoundException {
+		
+		Object editorOrView = null;
+		try {
+			editorOrView = gefEditor(partTitle);
+		} catch (WidgetNotFoundException exception) {
+			/* NOOP, means that it is not an editor. Search for a view instead then.*/
+			try {
+				editorOrView = gefView(partTitle);
+			} catch (WidgetNotFoundException e) {
+				/* It's not a view either! */
+				throw new WidgetNotFoundException("Unable to find a part with title " + partTitle);
+			}
+		}
+		if (editorOrView instanceof SWTBotGefEditor) {
+			return ((SWTBotGefEditor) editorOrView).getSWTBotGefViewer();
+		} else {
+			return ((SWTBotGefView) editorOrView).getSWTBotGefViewer();
+		}
+	}
 }
+	
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/matchers/IsSelected.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/matchers/IsSelected.java
new file mode 100644
index 0000000..85d6618
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/matchers/IsSelected.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Obeo.
+ * 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:
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.swtbot.eclipse.gef.finder.matchers;
+
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+/**
+ * Match if an edit part is selected.
+ * @author mchauvin
+ */
+public class IsSelected extends BaseMatcher<SWTBotGefEditPart>{
+
+	private EditPartViewer viewer;
+	
+	public IsSelected(final EditPartViewer viewer) {
+		this.viewer = viewer;
+	}
+	
+	public boolean matches(Object item) {
+		if (item instanceof SWTBotGefEditPart && viewer.getSelectedEditParts().contains(((SWTBotGefEditPart) item).part()))
+			return true;
+		return false;
+	}
+
+	public void describeTo(Description description) {
+		  description.appendText("is a selected edit part");
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/waits/WaitForEditPartSelection.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/waits/WaitForEditPartSelection.java
new file mode 100644
index 0000000..e37f007
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/waits/WaitForEditPartSelection.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Obeo.
+ * 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:
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.swtbot.eclipse.gef.finder.waits;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.gef.EditPartViewer;
+import org.eclipse.swtbot.eclipse.gef.finder.matchers.IsSelected;
+import org.eclipse.swtbot.eclipse.gef.finder.widgets.SWTBotGefEditPart;
+import org.eclipse.swtbot.swt.finder.waits.Conditions;
+import org.eclipse.swtbot.swt.finder.waits.WaitForObjectCondition;
+
+/**
+ * Condition that waits that given edit part is selected.
+ *
+ * @see Conditions
+ * @author mchauvin
+ */
+public class WaitForEditPartSelection extends WaitForObjectCondition<SWTBotGefEditPart> {
+
+	private SWTBotGefEditPart part;
+	
+	public WaitForEditPartSelection(final SWTBotGefEditPart part, final EditPartViewer viewer) {
+		super(new IsSelected(viewer));
+		this.part = part;
+	}
+	
+	@Override
+	protected List<SWTBotGefEditPart> findMatches() {
+		List<SWTBotGefEditPart> list = new ArrayList<SWTBotGefEditPart>(2);
+		if (matcher.matches(part))
+			list.add(part);
+		return list;
+	}
+
+	public String getFailureMessage() {
+		return "Could not find edit part in selected edit part list"; //$NON-NLS-1$
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefConnectionEditPart.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefConnectionEditPart.java
index 85a126b..05000ac 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefConnectionEditPart.java
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefConnectionEditPart.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 MAKE Technologies Inc and others.
+ * Copyright (c) 2004, 2010 MAKE Technologies Inc 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
@@ -7,12 +7,16 @@
  * 
  * Contributors:
  *     MAKE Technologies Inc - initial API and implementation
- *     Mariot Chauvin <mariot.chauvin@obeo.fr> - refactoring
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - Improvements and bug fixes
+ *     Pascal Gelinas <pascal.gelinas @nuecho.com> - Improvements and bug fixes
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.gef.finder.widgets;
 
 
+import org.eclipse.draw2d.Connection;
+import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.swtbot.eclipse.gef.finder.waits.WaitForEditPartSelection;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.Result;
 
@@ -28,13 +32,27 @@
 
     /**
      * Construct a new {@link SWTBotGefConnectionEditPart} instance.
-     * @param graphicalEditor the graphical editor
+     * @param viewer the viewer
      * @param part the {@link ConnectionEditPart} to wrap 
      */
-	SWTBotGefConnectionEditPart(SWTBotGefEditor graphicalEditor, org.eclipse.gef.ConnectionEditPart part) {
-		super(graphicalEditor, part);
+	SWTBotGefConnectionEditPart(SWTBotGefViewer viewer, org.eclipse.gef.ConnectionEditPart part) {
+		super(viewer, part);
 	}
 
+	/**
+	 * Create a new bendpoint for this connection to the given location,
+	 * @param toXPosition x position of the bendpoint location
+	 * @param toYPosition y position for the bendpoint location
+	 */
+	public void createBenpoint(final int toXPosition, final int toYPosition) {
+		Point startMove = ((Connection) part().getFigure()).getPoints().getMidpoint().getCopy();
+		viewer.click(startMove.x, startMove.y);		
+		/* we need to wait element selection before proceed or drag will fail */
+		viewer.bot().waitUntil(new WaitForEditPartSelection(this, viewer.graphicalViewer));
+		
+		viewer.drag(startMove.x, startMove.y, toXPosition, 250);
+	}
+	
 	/*
 	 * {@inheritDoc}
 	 * @see SWTBotGefEditPart#part()
@@ -52,7 +70,7 @@
 		return UIThreadRunnable.syncExec(new Result<SWTBotGefEditPart>() {
 			public SWTBotGefEditPart run() {
 				org.eclipse.gef.EditPart source = part().getSource();
-				return graphicalEditor.createEditPart(source);
+				return viewer.createEditPart(source);
 			}
 		});
 	}
@@ -65,7 +83,7 @@
 		return UIThreadRunnable.syncExec(new Result<SWTBotGefEditPart>() {
 			public SWTBotGefEditPart run() {
 				org.eclipse.gef.EditPart target = part().getTarget();
-				return graphicalEditor.createEditPart(target);
+				return viewer.createEditPart(target);
 			}
 		});
 	}
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditPart.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditPart.java
index 1402672..addf757 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditPart.java
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditPart.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 MAKE Technologies Inc and others
+ * Copyright (c) 2004, 2010 MAKE Technologies Inc 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
@@ -7,17 +7,24 @@
  * 
  * Contributors:
  *     MAKE Technologies Inc - initial API and implementation
- *     Mariot Chauvin <mariot.chauvin@obeo.fr> - refactoring
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - Improvements and bug fixes
+ *     Pascal Gelinas <pascal.gelinas @nuecho.com> - Improvements and bug fixes
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.gef.finder.widgets;
 
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.Stack;
 
 import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.PositionConstants;
+import org.eclipse.draw2d.ScrollBar;
+import org.eclipse.draw2d.ScrollPane;
 import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.EditPart;
@@ -32,21 +39,19 @@
  * represent an edit part of a graphical viewer.
  * 
  * @author David Green
- * 
  * @see SWTBotGefEditor
  */
 public class SWTBotGefEditPart {
-	protected final EditPart part;
-	protected final SWTBotGefEditor graphicalEditor;
-	
+	protected final EditPart		part;
+	protected final SWTBotGefViewer	viewer;
+
 	/**
-	 * 
-	 * @param graphicalEditor 
+	 * @param veiwer viewer
 	 * @param parent the parent, or null if this is the root edit part
 	 * @param part the GEF part
 	 */
-	SWTBotGefEditPart(final SWTBotGefEditor graphicalEditor, final EditPart part) {
-		this.graphicalEditor = graphicalEditor;
+	SWTBotGefEditPart(final SWTBotGefViewer viewer, final EditPart part) {
+		this.viewer = viewer;
 		this.part = part;
 	}
 
@@ -56,13 +61,14 @@
 	public SWTBotGefEditPart parent() {
 		return UIThreadRunnable.syncExec(new Result<SWTBotGefEditPart>() {
 			public SWTBotGefEditPart run() {
-				return graphicalEditor.createEditPart(part.getParent());
+				return viewer.createEditPart(part.getParent());
 			}
 		});
 	}
 
 	/**
 	 * Get the children of this edit part.
+	 * 
 	 * @return the edit part's children
 	 */
 	@SuppressWarnings("unchecked")
@@ -70,8 +76,8 @@
 		return UIThreadRunnable.syncExec(new Result<List<SWTBotGefEditPart>>() {
 			public List<SWTBotGefEditPart> run() {
 				List<SWTBotGefEditPart> children = new ArrayList<SWTBotGefEditPart>();
-				for (org.eclipse.gef.EditPart child: ((List<org.eclipse.gef.EditPart>)part.getChildren())) {
-					children.add(graphicalEditor.createEditPart(child));
+				for (org.eclipse.gef.EditPart child : ((List<org.eclipse.gef.EditPart>) part.getChildren())) {
+					children.add(viewer.createEditPart(child));
 				}
 				return children;
 			}
@@ -82,34 +88,34 @@
 	 * find descendants that match.
 	 * 
 	 * @param matcher the matcher that matches against {@link org.eclipse.gef.EditPart}
-	 * 
 	 * @return a list of matches or an empty list if there are none
 	 */
 	@SuppressWarnings("unchecked")
 	public List<SWTBotGefEditPart> descendants(final Matcher<? extends EditPart> matcher) {
-		return  UIThreadRunnable.syncExec(new Result<List<SWTBotGefEditPart>>() {
+		return UIThreadRunnable.syncExec(new Result<List<SWTBotGefEditPart>>() {
 			public List<SWTBotGefEditPart> run() {
 				List<SWTBotGefEditPart> descendants = new ArrayList<SWTBotGefEditPart>();
 				Stack<SWTBotGefEditPart> parts = new Stack<SWTBotGefEditPart>();
 				parts.push(SWTBotGefEditPart.this);
 				while (!parts.isEmpty()) {
 					SWTBotGefEditPart part = parts.pop();
-					for (org.eclipse.gef.EditPart child: ((List<org.eclipse.gef.EditPart>) part.part.getChildren())) {
-						SWTBotGefEditPart childPart = graphicalEditor.createEditPart(child);
+					for (org.eclipse.gef.EditPart child : ((List<org.eclipse.gef.EditPart>) part.part.getChildren())) {
+						SWTBotGefEditPart childPart = viewer.createEditPart(child);
 						if (matcher.matches(child)) {
 							descendants.add(childPart);
 						}
 						parts.push(childPart);
-					}	
+					}
 				}
 				return descendants;
 			}
 		});
 	}
-	
+
 	/**
 	 * get the underlying wrapped {@link EditPart} instance
-	 * @return the wrapped {@link EditPart}. 
+	 * 
+	 * @return the wrapped {@link EditPart}.
 	 */
 	public EditPart part() {
 		return part;
@@ -121,16 +127,16 @@
 	public void focus() {
 		UIThreadRunnable.syncExec(new VoidResult() {
 			public void run() {
-				graphicalEditor.graphicalViewer.setFocus(part);
+				viewer.graphicalViewer.setFocus(part);
 			}
 		});
 	}
-	
+
 	/**
 	 * select this edit part as a single selection
 	 */
 	public SWTBotGefEditPart select() {
-		graphicalEditor.select(this);
+		viewer.select(this);
 		return this;
 	}
 
@@ -141,16 +147,12 @@
 		final Rectangle bounds = getBounds();
 		return click(bounds.getTopLeft());
 	}
-	
+
 	/**
 	 * click on the edit part at the specified location
 	 */
 	public SWTBotGefEditPart click(final Point location) {
-		UIThreadRunnable.asyncExec(new VoidResult() {
-			public void run() {
-				graphicalEditor.getCanvas().mouseEnterLeftClickAndExit(location.x, location.y);
-			}		
-		});
+		viewer.getCanvas().mouseEnterLeftClickAndExit(location.x, location.y);
 		return this;
 	}
 
@@ -159,26 +161,115 @@
 	 */
 	public SWTBotGefEditPart doubleClick() {
 		final Rectangle bounds = getBounds();
-		UIThreadRunnable.asyncExec(new VoidResult() {
-			public void run() {
-				graphicalEditor.getCanvas().mouseMoveDoubleClick(bounds.x, bounds.y);
-			}		
-		});
+		viewer.getCanvas().mouseMoveDoubleClick(bounds.x, bounds.y);
 		return this;
 	}
 
+	
+	/* this method is not finished. She will become public when finished, but API is not guaranteed */
+	private void scrollUp() {
+		final IFigure figure = ((GraphicalEditPart) part).getFigure();
+		for (final Object child : figure.getChildren()) {
+			if (child instanceof ScrollPane) {
+				Collection<ScrollBar> scrollbars = getScrollBars((ScrollPane) child);
+				Point pointToClick = scrollbars.iterator().next().getBounds().getCenter();
+				viewer.getCanvas().mouseMoveLeftClick(pointToClick.x, pointToClick.y);
+			}
+		}
+	}
+	
+	/* this method is not finished. She will become public when finished, but API is not guaranteed */
+	private Collection<ScrollBar> getScrollBars(final ScrollPane scrollPane) {
+		Set<ScrollBar> scrollbars = new HashSet<ScrollBar>();
+		for (final Object child :scrollPane.getChildren()) {
+			if (child instanceof ScrollBar) {
+				scrollbars.add((ScrollBar) child);
+			}
+		}
+		return scrollbars;
+	}
+	
+	/**
+	 * Resize the current edit part from the corner orientation to the new size. The direction is specified using using
+	 * {@link PositionConstants#NORTH}, {@link PositionConstants#NORTH_EAST}, etc.
+	 * 
+	 * @param direction the direction
+	 * @param width the new width
+	 * @param height the new height
+	 */
+	public void resize(int direction, int width, int height) {
+		Rectangle bounds = getBounds();
+		int fromX = 0 ;
+		int fromY = 0;
+		int toX = 0;
+		int toY = 0;
+		
+		switch(direction) {
+		case PositionConstants.NORTH:
+			fromX = bounds.x + bounds.width / 2; 
+			fromY = bounds.y;
+			toX=  bounds.x + bounds.width / 2;
+			toY= bounds.y + bounds.height - height;
+			break;
+		case PositionConstants.SOUTH:
+			fromX = bounds.x + bounds.width / 2; 
+			fromY = bounds.y + bounds.height;
+			toX=bounds.x + bounds.width / 2;
+			toY=bounds.y +height;
+			break;
+		case PositionConstants.EAST:
+			fromX = bounds.x; 
+			fromY = bounds.y + bounds.height/2;
+			toX = bounds.x + bounds.width - width;
+			toY = bounds.y + bounds.height/2;
+			break;
+		case PositionConstants.WEST:
+			fromX = bounds.x + bounds.width; 
+			fromY = bounds.y + bounds.height/2;
+			toX = bounds.x + width;
+			toY = bounds.y + bounds.height/2;
+			break;
+		case PositionConstants.NORTH_EAST:
+			fromX = bounds.x; 
+			fromY = bounds.y;
+			toX = bounds.x + bounds.width - width;
+			toY= bounds.y + bounds.height - height;
+			break;
+		case PositionConstants.NORTH_WEST:
+			fromX = bounds.x + bounds.width; 
+			fromY = bounds.y;
+			toX = bounds.x + width;
+			toY= bounds.y + bounds.height - height;
+			break;
+		case PositionConstants.SOUTH_EAST:
+			fromX = bounds.x; 
+			fromY = bounds.y + bounds.height;
+			toX =  bounds.x + bounds.width - width;
+			toY = bounds.y +height;
+			break;
+		case PositionConstants.SOUTH_WEST:
+			fromX = bounds.x + bounds.width; 
+			fromY = bounds.y + bounds.height;
+			toX = bounds.x + width;
+			toY = bounds.y +height;
+			break;
+			default:
+				new IllegalArgumentException("direction given is not a valid one");
+		}
+		viewer.drag(fromX, fromY, toX, toY);
+	}
+
 	private Rectangle getBounds() {
 		final IFigure figure = ((GraphicalEditPart) part).getFigure();
 		final Rectangle bounds = figure.getBounds().getCopy();
 		figure.translateToAbsolute(bounds);
 		return bounds;
 	}
-	
+
 	public SWTBotGefEditPart activateDirectEdit() {
 		return activateDirectEdit(null);
 	}
-	
-	
+
 	public SWTBotGefEditPart activateDirectEdit(final Object feature) {
 		UIThreadRunnable.asyncExec(new VoidResult() {
 			public void run() {
@@ -191,39 +282,36 @@
 		return this;
 	}
 
-
-	
 	/**
 	 * provide a description of this edit part that is useful for debugging purposes.
 	 */
 	public String toString() {
 		StringWriter writer = new StringWriter();
 		PrintWriter out = new PrintWriter(writer);
-		
-		describe(out,0);
-		
+
+		describe(out, 0);
+
 		out.close();
 		return writer.toString();
 	}
 
-
-	private void describe(PrintWriter out,int indent) {
+	private void describe(PrintWriter out, int indent) {
 		out.print(indent(indent));
 		out.print(part.getClass().getName());
 		List<SWTBotGefEditPart> children = children();
-		out.print(" children="+children.size());
+		out.print(" children=" + children.size());
 		out.println();
-		for (SWTBotGefEditPart child: children) {
-			child.describe(out, indent+1);
+		for (SWTBotGefEditPart child : children) {
+			child.describe(out, indent + 1);
 		}
 	}
-	
+
 	private String indent(int size) {
 		if (size == 0) {
 			return "";
 		}
 		StringBuilder buf = new StringBuilder(size);
-		for (int x = 0;x<size;++x) {
+		for (int x = 0; x < size; ++x) {
 			buf.append("\t");
 		}
 		return buf.toString();
@@ -234,26 +322,26 @@
 		return UIThreadRunnable.syncExec(new Result<List<SWTBotGefConnectionEditPart>>() {
 			public List<SWTBotGefConnectionEditPart> run() {
 				List<SWTBotGefConnectionEditPart> connections = new ArrayList<SWTBotGefConnectionEditPart>();
-				List<org.eclipse.gef.ConnectionEditPart> sourceConnections = ((GraphicalEditPart)part).getSourceConnections();
-				for (org.eclipse.gef.ConnectionEditPart c: sourceConnections) {
-					connections.add(graphicalEditor.createEditPart(c));
+				List<org.eclipse.gef.ConnectionEditPart> sourceConnections = ((GraphicalEditPart) part).getSourceConnections();
+				for (org.eclipse.gef.ConnectionEditPart c : sourceConnections) {
+					connections.add(viewer.createEditPart(c));
 				}
 				return connections;
 			}
 		});
 	}
-	
+
 	@SuppressWarnings("unchecked")
 	public List<SWTBotGefConnectionEditPart> targetConnections() {
 		return UIThreadRunnable.syncExec(new Result<List<SWTBotGefConnectionEditPart>>() {
 			public List<SWTBotGefConnectionEditPart> run() {
 				List<SWTBotGefConnectionEditPart> connections = new ArrayList<SWTBotGefConnectionEditPart>();
-				List<org.eclipse.gef.ConnectionEditPart> targetConnections = ((GraphicalEditPart)part).getTargetConnections();
-				for (org.eclipse.gef.ConnectionEditPart c: targetConnections) {
-					connections.add(graphicalEditor.createEditPart(c));
+				List<org.eclipse.gef.ConnectionEditPart> targetConnections = ((GraphicalEditPart) part).getTargetConnections();
+				for (org.eclipse.gef.ConnectionEditPart c : targetConnections) {
+					connections.add(viewer.createEditPart(c));
 				}
 				return connections;
 			}
 		});
-	}	
+	}
 }
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditor.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditor.java
index dd566fc..6c9057b 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditor.java
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefEditor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2009 MAKE Technologies Inc and others
+ * Copyright (c) 2004, 2010 MAKE Technologies Inc 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
@@ -7,41 +7,25 @@
  * 
  * Contributors:
  *    MAKE Technologies Inc - initial API and implementation
- *    Mariot Chauvin <mariot.chauvin@obeo.fr> - refactoring
- *    Steve Monnier <steve.monnier@obeo.fr> - add mouseMoveDoubleClick action
- *    Nathalie Lepine <nathalie.lepine@obeo.fr> - add mouseMoveDoubleClick action
+ *    Mariot Chauvin <mariot.chauvin@obeo.fr> - Improvements and bug fixes
+ *    Steve Monnier <steve.monnier@obeo.fr> - Improvements and bug fixes
+ *    Nathalie Lepine <nathalie.lepine@obeo.fr> - Improvements and bug fixes
+ *    Pascal Gelinas <pascal.gelinas @nuecho.com> - Improvements and bug fixes
+ *    Mickael Istria <mickael.istria@bonitasoft.com> - Improvements and bug fixes
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.gef.finder.widgets;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.regex.Pattern;
 
-import org.eclipse.draw2d.FigureCanvas;
-import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Rectangle;
-import org.eclipse.draw2d.text.TextFlow;
 import org.eclipse.gef.ConnectionEditPart;
-import org.eclipse.gef.EditDomain;
 import org.eclipse.gef.EditPart;
-import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.GraphicalViewer;
-import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.gef.palette.ToolEntry;
 import org.eclipse.gef.ui.parts.GraphicalViewerImpl;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
 import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
-import org.eclipse.swtbot.eclipse.gef.finder.finders.PaletteFinder;
-import org.eclipse.swtbot.eclipse.gef.finder.matchers.IsInstanceOf;
-import org.eclipse.swtbot.eclipse.gef.finder.matchers.ToolEntryLabelMatcher;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.Result;
@@ -51,454 +35,343 @@
 import org.hamcrest.Matcher;
 
 /**
- * represent a graphical editor that uses the GEF framework. The underlying
- * editor must adapt to a {@link GraphicalViewer} which must extend
- * {@link GraphicalViewerImpl} (this is the default for all GEF-based editors
- * that extend {@link org.eclipse.gef.ui.parts.GraphicalEditor}).
- * 
- * Unlike most of SWTBot, this editor uses {@link org.eclipse.gef.EditPart edit
- * parts} to target UI events instead of SWT widgets. This is due to the fact
- * that GEF editors paint on a canvas and rarely use widgets at all. 
+ * represent a graphical editor that uses the GEF framework. The underlying editor must adapt to a
+ * {@link GraphicalViewer} which must extend {@link GraphicalViewerImpl} (this is the default for all GEF-based editors
+ * that extend {@link org.eclipse.gef.ui.parts.GraphicalEditor}). Unlike most of SWTBot, this editor uses
+ * {@link org.eclipse.gef.EditPart edit parts} to target UI events instead of SWT widgets. This is due to the fact that
+ * GEF editors paint on a canvas and rarely use widgets at all.
  * 
  * @author David Green
  */
 public class SWTBotGefEditor extends SWTBotEditor {
 
-    protected GraphicalViewer graphicalViewer;
+	protected final SWTBotGefViewer viewer;
 
-    protected EditDomain editDomain;
+	/**
+	 * Create a new bot GEF editor instance.
+	 * 
+	 * @param reference the editor reference
+	 * @param bot the workbench bot
+	 * @throws WidgetNotFoundException if widget could not be found
+	 */
+	public SWTBotGefEditor(final IEditorReference reference, final SWTWorkbenchBot bot) throws WidgetNotFoundException {
+		super(reference, bot);
+		GraphicalViewer graphicalViewer = UIThreadRunnable.syncExec(new Result<GraphicalViewer>() {
+			public GraphicalViewer run() {
+				final IEditorPart editor = partReference.getEditor(true);
+				return (GraphicalViewer) editor.getAdapter(GraphicalViewer.class);
+			}
+		});
+		viewer = new SWTBotGefViewer(graphicalViewer);
+		viewer.init();
+	}
 
-    protected SWTBotGefFigureCanvas canvas;
-    
-    private Map<EditPart, SWTBotGefEditPart> editPartMapping = new WeakHashMap<EditPart, SWTBotGefEditPart>();
+	/**
+	 * Get the wrapped SWTBotGefViewer instance.
+	 * @return a SWTBotGefViewer instance
+	 */
+	public SWTBotGefViewer getSWTBotGefViewer() {
+		return viewer;
+	}
+	
+	/**
+	 * clear the cache of edit parts
+	 */
+	public void clear() {
+		viewer.clear();
+	}
 
-    //TODO comment.
-    public SWTBotGefEditor(final IEditorReference reference, final SWTWorkbenchBot bot) throws WidgetNotFoundException {
-        super(reference, bot);
-        init();
-    }
-    
-    /**
-     * clear the cache of edit parts
-     */
-    public void clear() {
-        editPartMapping.clear();
-    }
+	public SWTBotGefEditPart mainEditPart() throws WidgetNotFoundException {
+		return viewer.mainEditPart();
+	}
 
-    protected void init() throws WidgetNotFoundException {
-        UIThreadRunnable.syncExec(new VoidResult() {
-        	public void run() {
-        		final IEditorPart editor = partReference.getEditor(true);
-        		graphicalViewer = (GraphicalViewer) editor.getAdapter(GraphicalViewer.class);
-        		final Control control = graphicalViewer.getControl();
-        		if (control instanceof FigureCanvas) {
-        			canvas = new SWTBotGefFigureCanvas((FigureCanvas) control);
-        		}
-        		editDomain = graphicalViewer.getEditDomain();
-        	}
-        });
+	/**
+	 * retrieve the root edit part.
+	 * 
+	 * @return the root edit part
+	 * @throws WidgetNotFoundException if root edit part could not be found
+	 * @see {@link GraphicalViewer#getRootEditPart()}
+	 */
+	public SWTBotGefEditPart rootEditPart() throws WidgetNotFoundException {
+		return viewer.rootEditPart();
+	}
 
-        if (graphicalViewer == null) {
-            throw new WidgetNotFoundException("Editor does not adapt to a GraphicalViewer");
-        }
-    }
-    
-    public SWTBotGefEditPart mainEditPart() throws WidgetNotFoundException {
-        List<SWTBotGefEditPart> children = rootEditPart().children();
-        if (children.size() != 1) {
-            throw new WidgetNotFoundException(String.format("Root edit part has %s children", children.size()));
-        }
-        return children.get(0);
-    }
+	/**
+	 * Get the selected edit parts.
+	 * @return the selected edit parts
+	 */
+	public List<SWTBotGefEditPart> selectedEditParts() {
+		return viewer.selectedEditParts();
+	}
+	
+	/**
+	 * lazily creates a {@link SWTBotGefEditPart} if this edit part does not exist yet. If an instance encapsulating the
+	 * specified edit part has been created before, that instance is returned.
+	 * 
+	 * @param part the edit part to create a {@link SWTBotGefEditPart} for
+	 * @return the created {@link SWTBotGefEditPart}
+	 */
+	protected SWTBotGefEditPart createEditPart(final EditPart part) {
+		return viewer.createEditPart(part);
+	}
 
-     /**
-     * retrieve the root edit part.
-     * @return the root edit part
-     * @throws WidgetNotFoundException if root edit part could not be found
-     * @see {@link GraphicalViewer#getRootEditPart()}
-     */
-    public SWTBotGefEditPart rootEditPart() throws WidgetNotFoundException {
-        Object o = UIThreadRunnable.syncExec(new Result<Object>() {
-            public Object run() {
-                return createEditPart(graphicalViewer.getRootEditPart());
-            }
-        });
-        if (o instanceof WidgetNotFoundException) {
-            throw (WidgetNotFoundException) o;
-        }
-        return (SWTBotGefEditPart) o;
-    }
+	/**
+	 * lazily creates a {@link SWTBotGefConnectionEditPart} if this edit part does not exist yet. If an instance
+	 * encapsulating the specified edit part has been created before, that instance is returned.
+	 * 
+	 * @param part a connection edit part connecting graphical nodes
+	 * @return a {@link SWTBotGefConnectionEditPart} encapsulating the connection edit part
+	 */
+	protected SWTBotGefConnectionEditPart createEditPart(ConnectionEditPart part) {
+		return viewer.createEditPart(part);
+	}
 
-   /**
-    * lazily creates a {@link SWTBotGefEditPart} if this edit part does not exist yet. If an instance encapsulating the specified edit part has been created before, that instance is returned. 
-     * @param part the edit part to create a {@link SWTBotGefEditPart} for
-     * @return the created {@link SWTBotGefEditPart}
-    */
-    protected SWTBotGefEditPart createEditPart(final EditPart part) {
-        SWTBotGefEditPart editPart = editPartMapping.get(part);
-        if (editPart == null) {
-            if (part instanceof ConnectionEditPart) {
-                editPart = new SWTBotGefConnectionEditPart(this, (ConnectionEditPart) part);
-            } else {
-                editPart = new SWTBotGefEditPart(this, part);
-            }
-            editPartMapping.put(part, editPart);
-        }
-        return editPart;
-    }
+	/**
+	 * Get the active tool.
+	 * @return the active tool
+	 */
+	public ToolEntry getActiveTool() {
+		return viewer.getActiveTool();
+	}
+	
+	/**
+	 * Activate the default tool.
+	 */
+	public void activateDefaultTool() {
+		viewer.activateDefaultTool();
+	}
 
-    /**
-     *  lazily creates a {@link SWTBotGefConnectionEditPart} if this edit part does not exist yet. If an instance encapsulating the specified edit part has been created before, that instance is returned. 
-     * @param part a connection edit part connecting graphical nodes
-     * @return a {@link SWTBotGefConnectionEditPart} encapsulating the connection edit part
-     */
-    protected SWTBotGefConnectionEditPart createEditPart(ConnectionEditPart part) {
-    	return (SWTBotGefConnectionEditPart) createEditPart((EditPart) part);
-    }
+	/**
+	 * Activate the tool with the specified label. If there is many tools with the same label the first one will be
+	 * used. See {@link SWTBotGefEditor#activateTool(String, int)}
+	 * 
+	 * @param label the label of the tool to activate
+	 * @return the editor bot
+	 * @throws WidgetNotFoundException if the tool with label specified could not be found
+	 */
+	public SWTBotGefEditor activateTool(final String label) throws WidgetNotFoundException {
+		viewer.activateTool(label);
+		return this;
+	}
 
-    /**
-     * Activate the default tool.
-     */
-    public void activateDefaultTool() {
-        UIThreadRunnable.syncExec(new VoidResult() {
-            public void run() {
-                final EditDomain editDomain = getEditDomain();
-                editDomain.setActiveTool(editDomain.getDefaultTool());
-            }
-        });
-    }
+	/**
+	 * Activate the tool with the specified label and the specified index. This method should be used only if there is
+	 * many tools with the same label. See {@link SWTBotGefEditor#activateTool(String)}
+	 * 
+	 * @param label the label of the tool to activate
+	 * @param index the index to use in order to make the selection.
+	 * @return the editor bot
+	 * @throws WidgetNotFoundException if the tool with label specified could not be found
+	 */
+	public SWTBotGefEditor activateTool(final String label, int index) throws WidgetNotFoundException {
+		viewer.activateTool(label, index);
+		return this;
+	}
 
-    /**
-     * Activate the tool with the specified label. If there is many tools with the same label the first one will be used. See {@link SWTBotGefEditor#activateTool(String, int)}
-     * @param label the label of the tool to activate
-     * @return the editor bot
-     * @throws WidgetNotFoundException if the tool with label specified could not be found
-     */
-    public SWTBotGefEditor activateTool(final String label) throws WidgetNotFoundException {
-        activateTool(Pattern.compile(Pattern.quote(label)), 0);
-        return this;
-    }
+	/**
+	 * type the given text into the graphical editor, presuming that it is already in 'direct edit' mode.
+	 * 
+	 * @param text the text to type.
+	 * @throws WidgetNotFoundException
+	 */
+	public void directEditType(String text) throws WidgetNotFoundException {
+		viewer.directEditType(text);
+	}
 
-    /**
-     * Activate the tool with the specified label and the specified index. This method should be used only if there is many tools with the same label. See {@link SWTBotGefEditor#activateTool(String)}
-     * @param label the label of the tool to activate
-     * @param index the index to use in order to make the selection. 
-     * @return the editor bot
-     * @throws WidgetNotFoundException if the tool with label specified could not be found
-     */
-    public SWTBotGefEditor activateTool(final String label, int index) throws WidgetNotFoundException {
-        activateTool(Pattern.compile(Pattern.quote(label)), index);
-        return this;
-    }
-
-    
-    private SWTBotGefEditor activateTool(final Pattern labelMatcher, final int index) throws WidgetNotFoundException {
-        final WidgetNotFoundException[] exception = new WidgetNotFoundException[1];
-        UIThreadRunnable.syncExec(new VoidResult() {
-            public void run() {
-                final EditDomain editDomain = getEditDomain();
-                final List<PaletteEntry> entries = new PaletteFinder(editDomain).findEntries(new ToolEntryLabelMatcher(labelMatcher));
-                if (entries.size() > 0) {
-                    final PaletteEntry paletteEntry = entries.get(index);
-                    if (paletteEntry instanceof ToolEntry) {
-                        editDomain.setActiveTool(((ToolEntry) paletteEntry).createTool());
-                    } else {
-                        exception[0] = new WidgetNotFoundException(String.format("%s is not a tool entry, it's a %s", labelMatcher.toString(), paletteEntry.getClass().getName()));
-                    }
-                } else {
-                    exception[0] = new WidgetNotFoundException(labelMatcher.toString());
-                }
-            }
-        });
-        if (exception[0] != null) {
-            throw exception[0];
-        }
-        return this;
-    }
-
-    /**
-     * call on UI thread only
-     */
-    private EditDomain getEditDomain() {
-        return editDomain;
-    }
-
-    /**
-     * type the given text into the graphical editor, presuming that it is
-     * already in 'direct edit' mode.
-     * 
-     * @param text
-     *            the text to type.
-     * @throws WidgetNotFoundException
-     */
-    public void directEditType(String text) throws WidgetNotFoundException {
-    	/* wait until text widget appears */ 
-    	bot.text();
-    	/* find it now */
-        List<Text> controls = bot.getFinder().findControls(getWidget(), new IsInstanceOf<Text>(Text.class), true);
-        if (controls.size() == 1) {
-            final Text textControl = controls.get(0);	
-            canvas.typeText(textControl, text);
-        } else {
-            throw new WidgetNotFoundException(String.format("Expected to find one text control, but found %s.  Is the editor in direct-edit mode?", controls.size()));
-        }
-    }
-
-    /**
-     * 
-     * @param matcher
-     *            the matcher that matches on {@link org.eclipse.gef.EditPart}
-     * @return a collection of {@link SWTBotGefEditPart}
-     * @throws WidgetNotFoundException
-     */
+	/**
+	 * @param matcher the matcher that matches on {@link org.eclipse.gef.EditPart}
+	 * @return a collection of {@link SWTBotGefEditPart}
+	 * @throws WidgetNotFoundException
+	 */
 	public List<SWTBotGefEditPart> editParts(Matcher<? extends EditPart> matcher) throws WidgetNotFoundException {
-        return rootEditPart().descendants(matcher);
-    }
+		return viewer.editParts(matcher);
+	}
 
-	protected SWTBotGefFigureCanvas getCanvas() {
-        return canvas;
-    }
-	
-    protected Control getControl() {
-        return graphicalViewer.getControl();
-    }
+	/**
+	 * select this edit part as a single selection
+	 */
+	public SWTBotGefEditor select(SWTBotGefEditPart... parts) {
+		return select(Arrays.asList(parts));
+	}
 
-    /**
-     * select this edit part as a single selection
-     */
-    public SWTBotGefEditor select(SWTBotGefEditPart... parts) {
-        return select(Arrays.asList(parts));
-    }
+	/**
+	 * select this edit part as a single selection
+	 */
+	public SWTBotGefEditor select(final Collection<SWTBotGefEditPart> parts) {
+		viewer.select(parts);
+		return this;
+	}
 
-    /**
-     * select this edit part as a single selection
-     */
-    public SWTBotGefEditor select(final Collection<SWTBotGefEditPart> parts) {
-        UIThreadRunnable.syncExec(new VoidResult() {
-            public void run() {
-                List<EditPart> selectParts = new ArrayList<EditPart>(parts.size());
-                for (SWTBotGefEditPart p : parts) {
-                    selectParts.add(p.part);
-                }
-                graphicalViewer.setFocus(selectParts.get(0));
-                graphicalViewer.setSelection(new StructuredSelection(selectParts));
-            }
-        });
-        return this;
-    }
+	@Override
+	public boolean isActive() {
+		// TODO Auto-generated method stub
+		return false;
+	}
 
-    @Override
-    public boolean isActive() {
-        // TODO Auto-generated method stub
-        return false;
-    }
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor#setFocus()
+	 */
+	@Override
+	public void setFocus() {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				IEditorPart editor = partReference.getEditor(false);
+				if (editor != null) {
+					editor.setFocus();
+				}
+			}
+		});
+	}
 
-    @Override
-    public void setFocus() {
-        // TODO Auto-generated method stub
-        
-    }
-    
-    public SWTBotGefEditor clickContextMenu(String text) throws WidgetNotFoundException {
-        new SWTBotGefContextMenu(getControl(), text).click();
-        return this;
-    }
+	public SWTBotGefEditor clickContextMenu(String text) throws WidgetNotFoundException {
+		viewer.clickContextMenu(text);
+		return this;
+	}
 
-    
-    /**
-     * this method emits mouse events that handle a mouse move and double click to the specified position within the editor.<br>
-     * Note that a move is required before double clicking in order to update the mouse cursor with the target editpart.  
-     *  
-     * @param xPosition the relative x position within the graphical viewer
-     * @param yPosition the relative y position within the graphical viewer
-     */
-    public void mouseMoveDoubleClick(final int xPosition, final int yPosition) {
-    	UIThreadRunnable.asyncExec(new VoidResult() {
-    		public void run() {
-    			canvas.mouseMoveDoubleClick(xPosition, yPosition);
-    		}
-    	});
-    }
-    
-    /**
-     * this method emits mouse events that handle a mouse move and left click to the specified position within the editor.<br>
-     * Note that a move is required before left clicking in order to update the mouse cursor with the target editpart.  
-     *  
-     * @param xPosition the relative x position within the graphical viewer
-     * @param yPosition the relative y position within the graphical viewer
-     */
-    public void mouseMoveLeftClick(final int xPosition, final int yPosition) {
-        UIThreadRunnable.asyncExec(new VoidResult() {
-            public void run() {
-        		canvas.mouseMoveLeftClick(xPosition, yPosition);
-            }
-        });
-    }
+	/**
+	 * Click on the editor at the specified location.
+	 * 
+	 * @param xPosition the x relative position
+	 * @param yPosition the y relative position
+	 */
+	public void click(final int xPosition, final int yPosition) {
+		viewer.click(xPosition, yPosition);
+	}
 
-    //TODO should be commented
-    /**
-     * this method emits mouse events that handle drags within the editor
-     * 
-     * @param fromXPosition the relative x position within the graphical viewer to drag from
-     * @param fromYPosition the relative y position within the graphical viewer to drag from
-     * @param toXPosition the relative x position within the graphical viewer to drag to
-     * @param toYPosition the relative y position within the graphical viewer to drag to
-     */
-    public void mouseDrag(final int fromXPosition, final int fromYPosition, final int toXPosition, final int toYPosition) {
-        UIThreadRunnable.asyncExec(new VoidResult() {
-            public void run() {
-                canvas.mouseDrag(fromXPosition, fromYPosition, toXPosition, toYPosition);
-            }
-        });
-    }
-	
+	/**
+	 * Click on the specified edit part at the top left hand corner of its bounds.
+	 * 
+	 * @param editPart the edit part to click on
+	 */
+	public void click(final SWTBotGefEditPart editPart) {
+		viewer.click(editPart);
+	}
 
-	//TODO should be commented
-	 /** 
-	    * this method emits mouse events that handle a mouse move and left click to the specified position within the editor.<br>
-	    * Note that a move is required before left clicking in order to update the mouse cursor with the target editpart.  
-	    *  
-	    * @param label the label 
-	    */
-	   public void mouseMoveLeftClick(String label) {
-	       SWTBotGefEditPart selectedEP = getEditPart(label);
-	       if (selectedEP==null) {
-	    	   throw new WidgetNotFoundException(String.format("Expected to find widget %s",label)); 
-	       }
-	       Rectangle bounds = ((GraphicalEditPart) selectedEP.part()).getFigure().getBounds();
-           mouseMoveLeftClick(bounds.x, bounds.y); 
-	   }
-	   
-	   /**
-	    * this method emits mouse events that handle a mouse move and double click to the specified position within the editor.<br>
-	    * Note that a move is required before double clicking in order to update the mouse cursor with the target editpart.  
-	    * As we can not double click on the corner, we move the double click position
-	    * @param label the label 
-	    */
-	   public void mouseMoveDoubleClick(final String label) {
-	       SWTBotGefEditPart selectedEP = getEditPart(label);
-	       if (selectedEP==null) {
-	    	   throw new WidgetNotFoundException(String.format("Expected to find widget %s",label)); 
-	       }
-	       Rectangle bounds = ((GraphicalEditPart) selectedEP.part()).getFigure().getBounds();
-           mouseMoveDoubleClick(bounds.x, bounds.y+MOVE);
-	   }
-	   
-	   private static final int MOVE = 3;
-	   
-	   /**
-	    * this method emits mouse events that handle drags within the editor
-	    * 
-	    * @param label the label 
-	    * @param toXPosition the relative x position within the graphical viewer to drag to
-	    * @param toYPosition the relative y position within the graphical viewer to drag to
-	    */
-	   public void mouseDrag(final String label, final int toXPosition, final int toYPosition) {
-	       SWTBotGefEditPart selectedEP = getEditPart(label);
-	       if (selectedEP==null) {
-	    	   throw new WidgetNotFoundException(String.format("Expected to find widget %s",label));  
-	       }
-           Rectangle bounds = ((GraphicalEditPart) selectedEP.part()).getFigure().getBounds();
-           mouseDrag(bounds.x, bounds.y, toXPosition, toYPosition);
-	   }
-	    
-	    /**
-	     * select the edit part with the label as a single selection
-	     */
-	   public SWTBotGefEditor select(String label)
-	   {
-	       SWTBotGefEditPart selectedEP = getEditPart(label);
-	       if (selectedEP == null) {
-	    	   throw new WidgetNotFoundException(String.format("Expected to find widget %s",label));  
-	       }
-	       List<SWTBotGefEditPart> editParts = new ArrayList<SWTBotGefEditPart>();
-	       editParts.add(selectedEP);
-	       return select(selectedEP);
-	   }
+	/**
+	 * Click on the edit part which owns the specified label at the top left hand corner of its bounds.
+	 * 
+	 * @param label the label to retrieve edit part to click on
+	 */
+	public void click(final String label) {
+		viewer.click(label);
+	}
 
-	   /**
-	    * get this edit part with the label as a single selection
-	    */
-	   public SWTBotGefEditPart getEditPart(String label)
-	   {  
-	       List<SWTBotGefEditPart> allEditParts = mainEditPart().children();
-	       allEditParts.addAll(mainEditPart().sourceConnections());
-	       return getEditpart(label, allEditParts);
-	   }
+	/**
+	 * Double click on the editor at the specified location.
+	 * 
+	 * @param xPosition the x relative position
+	 * @param yPosition the y relative position
+	 */
+	public void doubleClick(final int xPosition, final int yPosition) {
+		viewer.doubleClick(xPosition, yPosition);
+	}
 
-	   //FIXME should moved in a finder
-	   @Deprecated
-	   /**
-        * get this edit part with the label as a single selection
-        */
-	   public SWTBotGefEditPart getEditpart(String label, List<SWTBotGefEditPart> allEditParts)
-	   {
-	       for (SWTBotGefEditPart child : allEditParts) {
-	           IFigure figure = ((GraphicalEditPart) child.part()).getFigure();
-	           
-	           if (isLabel(figure, label)) {
-	                return child;
-	            }
-	           
-	               SWTBotGefEditPart childEditPart = getEditPart(child, label);
-	               if (childEditPart!=null) {
-	                   return childEditPart;
-	               }
-	               
-	               if (findLabelFigure(figure, label))
-	            	   return child;
-	               return null;
-	       }
-	       return null;
-	   }
-        
-        /**
-         * get this edit part with the label as a single selection
-         */
-        private SWTBotGefEditPart getEditPart(SWTBotGefEditPart editPart, String label)
-        {
-            if (editPart.children().isEmpty() && findLabelFigure(((GraphicalEditPart) editPart.part()).getFigure(), label)) {
-                return editPart;
-            }
-    
-            List<SWTBotGefEditPart> allEditParts = editPart.children();
-            allEditParts.addAll(editPart.sourceConnections());
-            return getEditpart(label, allEditParts);
-        }
+	/**
+	 * Double click on the edit part which owns the specified label at the top left hand corner (with an offset) of its
+	 * bounds.
+	 * 
+	 * @param editPart the edit part to double click on
+	 */
+	public void doubleClick(final SWTBotGefEditPart editPart) {
+		viewer.doubleClick(editPart);
+	}
 
-        //FIXME should moved in a finder
-        /**
-         * @return if the figure is a label
-         */
-        private boolean isLabel(IFigure figure, String label)
-        {
-            // case 1 : gef label
-            if ((figure instanceof Label && ((Label)figure).getText().equals(label)))
-            {
-                return true;
-            }
+	/**
+	 * Double click on the edit part which owns the specified label at the top left hand corner (with an offset) of its
+	 * bounds.
+	 * 
+	 * @param label the label to retrieve edit part to double click on
+	 */
+	public void doubleClick(final String label) {
+		viewer.doubleClick(label);
+	}
 
-            // case 2 : no gef label
-            if ((figure instanceof TextFlow && ((TextFlow)figure).getText().equals(label)))
-            {
-                return true;
-            }
-            return false;
-        }
-        
-        //FIXME should moved in a finder
-        /**
-         * @return if the figure or all its children contain the label 
-         */
-        private boolean findLabelFigure(IFigure figure, String label) {
-            if (isLabel(figure, label)) {
-                return true;
-            }
-            for (Object figureChild : figure.getChildren()) {
-                if (isLabel((IFigure) figureChild, label) || findLabelFigure((IFigure) figureChild, label)) {
-                    return true;
-                }
-            }
-            return false;
-        }
+	/**
+	 * Drag and drop from the specified to the specified location.
+	 * 
+	 * @param toXPosition the x relative location
+	 * @param toYPosition the y relative location
+	 */
+	public void drag(final int fromXPosition, final int fromYPosition, final int toXPosition, final int toYPosition) {
+		viewer.drag(fromXPosition, fromYPosition, toXPosition, toYPosition);
+	}
+
+	/**
+	 * Drag and drop the specified edit part to the specified location.
+	 * 
+	 * @param editPart the edit part to drag and drop
+	 * @param toXPosition the x relative location
+	 * @param toYPosition the y relative location
+	 */
+	public void drag(final SWTBotGefEditPart editPart, final int toXPosition, final int toYPosition) {
+		viewer.drag(editPart, toXPosition, toYPosition);
+	}
+
+	/**
+	 * Drag and drop the edit part which owns the specified label to the specified location
+	 * 
+	 * @param label the label to retrieve the edit part to drag and drop
+	 * @param toXPosition the x relative position
+	 * @param toYPosition the y relative position
+	 */
+	public void drag(final String label, final int toXPosition, final int toYPosition) {
+		viewer.drag(label, toXPosition, toYPosition);
+	}
+
+	/**
+	 * select the edit part with the label as a single selection.
+	 */
+	public SWTBotGefEditor select(String label) {
+		viewer.select(label);
+		return this;
+	}
+
+	/**
+	 * get this edit part with the label as a single selection.
+	 */
+	public SWTBotGefEditPart getEditPart(String label) {
+		return viewer.getEditPart(label);
+	}
+
+	// FIXME should moved in a finder
+	@Deprecated
+	/*
+	 * * get this edit part with the label as a single selection
+	 */
+	public SWTBotGefEditPart getEditpart(String label, List<SWTBotGefEditPart> allEditParts) {
+		return viewer.getEditpart(label, allEditParts);
+	}
+
+	/* deprecated methods -> keeped for compatibility */
+
+	@Deprecated
+	public void mouseDrag(final int fromXPosition, final int fromYPosition, final int toXPosition, final int toYPosition) {
+		drag(fromXPosition, fromYPosition, toXPosition, toYPosition);
+	}
+
+	@Deprecated
+	public void mouseDrag(final String label, final int toXPosition, final int toYPosition) {
+		drag(label, toXPosition, toYPosition);
+	}
+
+	@Deprecated
+	public void mouseMoveDoubleClick(final int xPosition, final int yPosition) {
+		doubleClick(xPosition, yPosition);
+	}
+
+	@Deprecated
+	public void mouseMoveDoubleClick(final String label) {
+		doubleClick(label);
+	}
+
+	@Deprecated
+	public void mouseMoveLeftClick(final int xPosition, final int yPosition) {
+		click(xPosition, yPosition);
+	}
+
+	@Deprecated
+	public void mouseMoveLeftClick(String label) {
+		click(label);
+	}
 }
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefFigureCanvas.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefFigureCanvas.java
index 7207f55..2a834f2 100644
--- a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefFigureCanvas.java
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefFigureCanvas.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 Obeo and others
+ * Copyright (c) 2009, 2010 Obeo 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
@@ -13,7 +13,9 @@
 
 import org.eclipse.draw2d.EventDispatcher;
 import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.LightweightSystem;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Canvas;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
@@ -22,58 +24,109 @@
 import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
 
 /**
- * TODO comment
+ * A bot  which wraps the swt canvas control.
  * @author mchauvin
  */
-public class SWTBotGefFigureCanvas extends AbstractSWTBotControl<FigureCanvas>{
+public class SWTBotGefFigureCanvas extends AbstractSWTBotControl<Canvas>{
 
     protected EventDispatcher eventDispatcher;
-
-    //TODO should be documented
-    public SWTBotGefFigureCanvas(FigureCanvas w) throws WidgetNotFoundException {
-        super(w);
-        eventDispatcher = w.getLightweightSystem().getRootFigure().internalGetEventDispatcher();
+    
+    /**
+     * Constructs a new instance from a {@link FigureCanvas}.
+     * @param canvas the canvas to wrap
+     * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+     */
+    public SWTBotGefFigureCanvas(FigureCanvas canvas) throws WidgetNotFoundException {
+        this(canvas, canvas.getLightweightSystem());
     }
 
-    public void mouseMoveDoubleClick(int xPosition, int yPosition) {
-        org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(xPosition, yPosition, 0, 0, 0);
-        eventDispatcher.dispatchMouseMoved(meMove);
-        org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMousePressed(meDown);
-        org.eclipse.swt.events.MouseEvent meDoubleClick = wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMouseDoubleClicked(meDoubleClick);
+    /**
+     * Constructs a new instance from a {@link Canvas} and a {@link LightweightSystem}. If the canvas is an instance of {@link FigureCanvas}, use {@link SWTBotGefFigureCanvas#SWTBotGefFigureCanvas(FigureCanvas)} instead.
+     * @param canvas the canvas to wrap
+     * @param lightweightSystem the lightweight system to use 
+     * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+     */
+    public SWTBotGefFigureCanvas(Canvas canvas, LightweightSystem lightweightSystem) throws WidgetNotFoundException {
+        super(canvas);
+        eventDispatcher = lightweightSystem.getRootFigure().internalGetEventDispatcher();
+    }
+    
+    /**
+     * this method emits mouse events that handle a mouse move and double click to the specified position within the canvas.
+     * @param xPosition the relative x position
+     * @param yPosition the relative y position
+     */
+    public void mouseMoveDoubleClick(final int xPosition, final int yPosition) {
+    UIThreadRunnable.asyncExec(new VoidResult() {
+    		public void run() {
+    	        org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(xPosition, yPosition, 0, 0, 0);
+    	        eventDispatcher.dispatchMouseMoved(meMove);
+    	        org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(xPosition, yPosition, 1, SWT.None, 1);
+    	        eventDispatcher.dispatchMousePressed(meDown);
+    	        org.eclipse.swt.events.MouseEvent meUp = wrapMouseEvent(xPosition, yPosition, 1 , SWT.BUTTON1, 1);
+    	        eventDispatcher.dispatchMouseReleased(meUp);
+    	        org.eclipse.swt.events.MouseEvent meDown2 = wrapMouseEvent(xPosition, yPosition, 1, SWT.None, 2);
+    	        eventDispatcher.dispatchMousePressed(meDown2);
+    	        org.eclipse.swt.events.MouseEvent meDoubleClick = wrapMouseEvent(xPosition, yPosition, 1, SWT.None, 2);
+    	        meDoubleClick.time = meDown2.time;
+    	        eventDispatcher.dispatchMouseDoubleClicked(meDoubleClick);
+    	        org.eclipse.swt.events.MouseEvent meUp2 = wrapMouseEvent(xPosition, yPosition, 1 , SWT.BUTTON1, 2);
+    	        eventDispatcher.dispatchMouseReleased(meUp2); 
+    		}
+    	});
     }
     
     private org.eclipse.swt.events.MouseEvent wrapMouseEvent(int x, int y, int button, int stateMask, int count) {
         return new org.eclipse.swt.events.MouseEvent(createMouseEvent(x, y, button, stateMask, count));
     }
 
-    public void mouseDrag(int fromXPosition, int fromYPosition, int toXPosition, int toYPosition) {
-        org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(fromXPosition, fromYPosition, 0, 0, 0);
-        eventDispatcher.dispatchMouseMoved(meMove);
-        org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(fromXPosition, fromYPosition, 1, SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMousePressed(meDown);
-        org.eclipse.swt.events.MouseEvent meMoveTarget = wrapMouseEvent(toXPosition, toYPosition, 1, SWT.BUTTON1, 0);
-        eventDispatcher.dispatchMouseMoved(meMoveTarget);
-        org.eclipse.swt.events.MouseEvent meUp = wrapMouseEvent(toXPosition, toYPosition, 1 , SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMouseReleased(meUp);
+    
+    /**
+     * this method emits mouse events that handle drags within the canvas
+     * 
+     * @param fromXPosition the relative x position within the canvas to drag from
+     * @param fromYPosition the relative y position within the canvas to drag from
+     * @param toXPosition the relative x position within the canvas to drag to
+     * @param toYPosition the relative y position within the canvas to drag to
+     */
+    public void mouseDrag(final int fromXPosition, final int fromYPosition, final int toXPosition, final int toYPosition) {
+        UIThreadRunnable.asyncExec(new VoidResult() {
+            public void run() {
+            	org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(fromXPosition, fromYPosition, 0, 0, 0);
+            	eventDispatcher.dispatchMouseMoved(meMove);
+            	org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(fromXPosition, fromYPosition, 1, SWT.BUTTON1, 1);
+            	eventDispatcher.dispatchMousePressed(meDown);
+            	org.eclipse.swt.events.MouseEvent meMoveTarget = wrapMouseEvent(toXPosition, toYPosition, 1, SWT.BUTTON1, 0);
+            	eventDispatcher.dispatchMouseMoved(meMoveTarget);
+            	org.eclipse.swt.events.MouseEvent meUp = wrapMouseEvent(toXPosition, toYPosition, 1 , SWT.BUTTON1, 1);
+            	eventDispatcher.dispatchMouseReleased(meUp);
+            }
+        });
     }
     
     public void mouseMoveLeftClick(final int xPosition, final int yPosition) {
-        org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(xPosition, yPosition, 0, 0, 0);
-        eventDispatcher.dispatchMouseMoved(meMove);
-        org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMousePressed(meDown);
-        org.eclipse.swt.events.MouseEvent meUp = wrapMouseEvent(xPosition, yPosition, 1 , SWT.BUTTON1, 1);
-        eventDispatcher.dispatchMouseReleased(meUp);
+        UIThreadRunnable.asyncExec(new VoidResult() {
+            public void run() {
+            	org.eclipse.swt.events.MouseEvent meMove = wrapMouseEvent(xPosition, yPosition, 0, 0, 0);
+            	eventDispatcher.dispatchMouseMoved(meMove);
+            	org.eclipse.swt.events.MouseEvent meDown = wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1);
+            	eventDispatcher.dispatchMousePressed(meDown);
+            	org.eclipse.swt.events.MouseEvent meUp = wrapMouseEvent(xPosition, yPosition, 1 , SWT.BUTTON1, 1);
+            	eventDispatcher.dispatchMouseReleased(meUp);
+            }
+        });
     }
     
-    public void mouseEnterLeftClickAndExit(int xPosition, int yPosition) {
-        eventDispatcher.dispatchMouseEntered(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
-        eventDispatcher.dispatchMouseMoved(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
-        eventDispatcher.dispatchMousePressed(wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1));
-        eventDispatcher.dispatchMouseReleased(wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1));
-        eventDispatcher.dispatchMouseExited(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
+    public void mouseEnterLeftClickAndExit(final int xPosition, final int yPosition) {
+		UIThreadRunnable.asyncExec(new VoidResult() {
+			public void run() {
+				eventDispatcher.dispatchMouseEntered(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
+				eventDispatcher.dispatchMouseMoved(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
+				eventDispatcher.dispatchMousePressed(wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1));
+				eventDispatcher.dispatchMouseReleased(wrapMouseEvent(xPosition, yPosition, 1, SWT.BUTTON1, 1));
+				eventDispatcher.dispatchMouseExited(wrapMouseEvent(xPosition, yPosition, 0, 0, 0));
+			}
+		});
     }
     
     public void typeText(final Text textControl, final String text) {
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefView.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefView.java
new file mode 100644
index 0000000..7e36dbe
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefView.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Obeo.
+ * 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:
+ *     Mariot Chauvin <mariot.chauvin@obeo.fr> - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.swtbot.eclipse.gef.finder.widgets;
+
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.ui.IViewPart;
+import org.eclipse.ui.IViewReference;
+
+public class SWTBotGefView extends SWTBotView {
+
+	protected final SWTBotGefViewer viewer;
+	
+	public SWTBotGefView(final IViewReference partReference, SWTWorkbenchBot bot) {
+		super(partReference, bot);
+		GraphicalViewer graphicalViewer = UIThreadRunnable.syncExec(new Result<GraphicalViewer>() {
+			public GraphicalViewer run() {
+				final IViewPart view = partReference.getView(true);
+				return (GraphicalViewer) view.getAdapter(GraphicalViewer.class);
+			}
+		});
+		viewer = new SWTBotGefViewer(graphicalViewer);
+		viewer.init();
+	}
+	
+	/**
+	 * Get the wrapped SWTBotGefViewer instance.
+	 * @return a SWTBotGefViewer instance
+	 */
+	public SWTBotGefViewer getSWTBotGefViewer() {
+		return viewer;
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefViewer.java b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefViewer.java
new file mode 100644
index 0000000..ff61baf
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef.finder/src/org/eclipse/swtbot/eclipse/gef/finder/widgets/SWTBotGefViewer.java
@@ -0,0 +1,567 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2011 MAKE Technologies Inc 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:
+ *    MAKE Technologies Inc - initial API and implementation
+ *    Mariot Chauvin <mariot.chauvin@obeo.fr> - Improvements and bug fixes
+ *    Steve Monnier <steve.monnier@obeo.fr> - Improvements and bug fixes
+ *    Nathalie Lepine <nathalie.lepine@obeo.fr> - Improvements and bug fixes
+ *    Pascal Gelinas <pascal.gelinas @nuecho.com> - Improvements and bug fixes
+ *    Mickael Istria <mickael.istria@bonitasoft.com> - Improvements and bug fixes
+ *    Tim Kaiser <tim.kaiser@sap.com> - Improvements and bug fixes
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.gef.finder.widgets;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.draw2d.FigureCanvas;
+import org.eclipse.draw2d.IFigure;
+import org.eclipse.draw2d.Label;
+import org.eclipse.draw2d.LightweightSystem;
+import org.eclipse.draw2d.geometry.Rectangle;
+import org.eclipse.draw2d.text.TextFlow;
+import org.eclipse.gef.ConnectionEditPart;
+import org.eclipse.gef.EditDomain;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
+import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.gef.palette.PaletteEntry;
+import org.eclipse.gef.palette.ToolEntry;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Canvas;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swtbot.eclipse.gef.finder.finders.PaletteFinder;
+import org.eclipse.swtbot.eclipse.gef.finder.matchers.ToolEntryLabelMatcher;
+import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.hamcrest.Matcher;
+
+/**
+ * represent a graphical viewer that uses the GEF framework.
+ * 
+ * @author David Green
+ */
+public class SWTBotGefViewer {
+
+	protected GraphicalViewer					graphicalViewer;
+
+	protected EditDomain						editDomain;
+
+	protected SWTBotGefFigureCanvas				canvas;
+
+	private Map<EditPart, SWTBotGefEditPart>	editPartMapping	= new WeakHashMap<EditPart, SWTBotGefEditPart>();
+
+	/**
+	 * Create a new bot GEF graphical viewer instance.
+	 * 
+	 * @param graphicalViewer the graphical viewer to wrap
+	 * @throws WidgetNotFoundException if graphical viewer is null
+	 */
+	public SWTBotGefViewer(final GraphicalViewer graphicalViewer) throws WidgetNotFoundException {
+		if (graphicalViewer == null) {
+			throw new WidgetNotFoundException("The graphical viewer is null.");
+		}
+		this.graphicalViewer = graphicalViewer;
+		init();
+	}
+
+	public SWTBot bot() {
+		return new SWTBot(canvas.widget);
+	}
+
+	/**
+	 * clear the cache of edit parts
+	 */
+	public void clear() {
+		editPartMapping.clear();
+	}
+
+	protected void init() throws WidgetNotFoundException {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				final Control control = graphicalViewer.getControl();
+				if (control instanceof FigureCanvas) {
+					canvas = new SWTBotGefFigureCanvas((FigureCanvas) control);
+				}  else if (control instanceof Canvas) {
+					if (control instanceof IAdaptable) {
+						IAdaptable adaptable = (IAdaptable) control;
+						Object adapter = adaptable.getAdapter(LightweightSystem.class);
+						if (adapter instanceof LightweightSystem) {
+							canvas = new SWTBotGefFigureCanvas((Canvas) control, (LightweightSystem) adapter);
+						}
+					}
+                }	
+				editDomain = graphicalViewer.getEditDomain();
+			}
+		});
+
+		if (graphicalViewer == null) {
+			throw new WidgetNotFoundException("Editor does not adapt to a GraphicalViewer");
+		}
+	}
+
+	public SWTBotGefEditPart mainEditPart() throws WidgetNotFoundException {
+		List<SWTBotGefEditPart> children = rootEditPart().children();
+		if (children.size() != 1) {
+			throw new WidgetNotFoundException(String.format("Root edit part has %s children", children.size()));
+		}
+		return children.get(0);
+	}
+
+	/**
+	 * retrieve the root edit part.
+	 * 
+	 * @return the root edit part
+	 * @throws WidgetNotFoundException if root edit part could not be found
+	 * @see {@link GraphicalViewer#getRootEditPart()}
+	 */
+	public SWTBotGefEditPart rootEditPart() throws WidgetNotFoundException {
+		Object o = UIThreadRunnable.syncExec(new Result<Object>() {
+			public Object run() {
+				return createEditPart(graphicalViewer.getRootEditPart());
+			}
+		});
+		if (o instanceof WidgetNotFoundException) {
+			throw (WidgetNotFoundException) o;
+		}
+		return (SWTBotGefEditPart) o;
+	}
+
+	/**
+	 * Get the selected edit parts.
+	 * @return the selected edit parts
+	 */
+	@SuppressWarnings("unchecked")
+	public List<SWTBotGefEditPart> selectedEditParts() {
+		List<SWTBotGefEditPart> toReturn = new ArrayList<SWTBotGefEditPart>();
+		List<EditPart> parts = graphicalViewer.getSelectedEditParts();
+		for (EditPart editPart : parts) {
+			toReturn.add(createEditPart(editPart));
+		}
+		return toReturn;
+	}
+
+	/**
+	 * lazily creates a {@link SWTBotGefEditPart} if this edit part does not exist yet. If an instance encapsulating the
+	 * specified edit part has been created before, that instance is returned.
+	 * 
+	 * @param part the edit part to create a {@link SWTBotGefEditPart} for
+	 * @return the created {@link SWTBotGefEditPart}
+	 */
+	protected SWTBotGefEditPart createEditPart(final EditPart part) {
+		SWTBotGefEditPart editPart = editPartMapping.get(part);
+		if (editPart == null) {
+			if (part instanceof ConnectionEditPart) {
+				editPart = new SWTBotGefConnectionEditPart(this, (ConnectionEditPart) part);
+			} else {
+				editPart = new SWTBotGefEditPart(this, part);
+			}
+			editPartMapping.put(part, editPart);
+		}
+		return editPart;
+	}
+
+	/**
+	 * lazily creates a {@link SWTBotGefConnectionEditPart} if this edit part does not exist yet. If an instance
+	 * encapsulating the specified edit part has been created before, that instance is returned.
+	 * 
+	 * @param part a connection edit part connecting graphical nodes
+	 * @return a {@link SWTBotGefConnectionEditPart} encapsulating the connection edit part
+	 */
+	protected SWTBotGefConnectionEditPart createEditPart(ConnectionEditPart part) {
+		return (SWTBotGefConnectionEditPart) createEditPart((EditPart) part);
+	}
+
+	/**
+	 * Activate the default tool.
+	 */
+	public void activateDefaultTool() {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				final EditDomain editDomain = getEditDomain();
+				editDomain.setActiveTool(editDomain.getDefaultTool());
+			}
+		});
+	}
+
+	/**
+	 * Activate the tool with the specified label. If there is many tools with the same label the first one will be
+	 * used. See {@link SWTBotGefViewer#activateTool(String, int)}
+	 * 
+	 * @param label the label of the tool to activate
+	 * @return the editor bot
+	 * @throws WidgetNotFoundException if the tool with label specified could not be found
+	 */
+	public SWTBotGefViewer activateTool(final String label) throws WidgetNotFoundException {
+		activateTool(Pattern.compile(Pattern.quote(label)), 0);
+		return this;
+	}
+
+	/**
+	 * Activate the tool with the specified label and the specified index. This method should be used only if there is
+	 * many tools with the same label. See {@link SWTBotGefViewer#activateTool(String)}
+	 * 
+	 * @param label the label of the tool to activate
+	 * @param index the index to use in order to make the selection.
+	 * @return the editor bot
+	 * @throws WidgetNotFoundException if the tool with label specified could not be found
+	 */
+	public SWTBotGefViewer activateTool(final String label, int index) throws WidgetNotFoundException {
+		activateTool(Pattern.compile(Pattern.quote(label)), index);
+		return this;
+	}
+
+	private SWTBotGefViewer activateTool(final Pattern labelMatcher, final int index) throws WidgetNotFoundException {
+		final WidgetNotFoundException[] exception = new WidgetNotFoundException[1];
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				final EditDomain editDomain = getEditDomain();
+				final List<PaletteEntry> entries = new PaletteFinder(editDomain).findEntries(new ToolEntryLabelMatcher(labelMatcher));
+				if (entries.size() > 0) {
+					final PaletteEntry paletteEntry = entries.get(index);
+					if (paletteEntry instanceof ToolEntry) {
+						editDomain.getPaletteViewer().setActiveTool((ToolEntry) paletteEntry);
+					} else {
+						exception[0] = new WidgetNotFoundException(String.format("%s is not a tool entry, it's a %s", labelMatcher
+								.toString(), paletteEntry.getClass().getName()));
+					}
+				} else {
+					exception[0] = new WidgetNotFoundException(labelMatcher.toString());
+				}
+			}
+		});
+		if (exception[0] != null) {
+			throw exception[0];
+		}
+		return this;
+	}
+
+	/**
+	 * call on UI thread only
+	 */
+	private EditDomain getEditDomain() {
+		return editDomain;
+	}
+
+	/**
+	 * type the given text into the graphical editor, presuming that it is already in 'direct edit' mode.
+	 * 
+	 * @param text the text to type.
+	 * @throws WidgetNotFoundException
+	 */
+	public void directEditType(String text) throws WidgetNotFoundException {
+
+		/*
+		 * we use 'bot()' and not 'bot' to scope the widget search to the editor. Otherwise if another widget of the
+		 * same type is present in the workspace and is found first, the code after will fail.
+		 * We specify the parent widget, to narrow the search to the supplied canvas.
+		 */
+
+		/* by using SWTBot#widgets() we get the added benefit of an implicit wait condition */
+		List<? extends Text> controls = bot().widgets(widgetOfType(Text.class), canvas.widget);
+		if (controls.size() == 1) {
+			final Text textControl = controls.get(0);
+			canvas.typeText(textControl, text);
+		} else {
+			throw new WidgetNotFoundException(String.format(
+					"Expected to find one text control, but found %s.  Is the editor in direct-edit mode?", controls.size()));
+		}
+	}
+
+	/**
+	 * @param matcher the matcher that matches on {@link org.eclipse.gef.EditPart}
+	 * @return a collection of {@link SWTBotGefEditPart}
+	 * @throws WidgetNotFoundException
+	 */
+	public List<SWTBotGefEditPart> editParts(Matcher<? extends EditPart> matcher) throws WidgetNotFoundException {
+		return rootEditPart().descendants(matcher);
+	}
+
+	/**
+	 * Get the canvas to do low-level operations.
+	 * 
+	 * @return the canvas
+	 */
+	protected SWTBotGefFigureCanvas getCanvas() {
+		return canvas;
+	}
+
+	protected Control getControl() {
+		return graphicalViewer.getControl();
+	}
+
+	/**
+	 * Get active tool.
+	 * 
+	 * @return the active tool
+	 */
+	public ToolEntry getActiveTool() {
+		return editDomain.getPaletteViewer().getActiveTool();
+	}
+
+	/**
+	 * select this edit part as a single selection
+	 */
+	public SWTBotGefViewer select(SWTBotGefEditPart... parts) {
+		return select(Arrays.asList(parts));
+	}
+
+	/**
+	 * select this edit part as a single selection
+	 */
+	public SWTBotGefViewer select(final Collection<SWTBotGefEditPart> parts) {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				List<EditPart> selectParts = new ArrayList<EditPart>(parts.size());
+				for (SWTBotGefEditPart p : parts) {
+					selectParts.add(p.part);
+				}
+				graphicalViewer.setFocus(selectParts.get(0));
+				graphicalViewer.setSelection(new StructuredSelection(selectParts));
+			}
+		});
+		return this;
+	}
+
+	public SWTBotGefViewer clickContextMenu(String text) throws WidgetNotFoundException {
+		new SWTBotGefContextMenu(getControl(), text).click();
+		return this;
+	}
+
+	/**
+	 * Click on the editor at the specified location.
+	 * 
+	 * @param xPosition the x relative position
+	 * @param yPosition the y relative position
+	 */
+	public void click(final int xPosition, final int yPosition) {
+		canvas.mouseMoveLeftClick(xPosition, yPosition);
+	}
+
+	/**
+	 * Click on the specified edit part at the top left hand corner of its bounds.
+	 * 
+	 * @param editPart the edit part to click on
+	 */
+	public void click(final SWTBotGefEditPart editPart) {
+		Rectangle bounds = getAbsoluteBounds(editPart);
+		click(bounds.x, bounds.y);
+	}
+
+	/**
+	 * Click on the edit part which owns the specified label at the top left hand corner of its bounds.
+	 * 
+	 * @param label the label to retrieve edit part to click on
+	 */
+	public void click(final String label) {
+		SWTBotGefEditPart selectedEP = getEditPart(label);
+		if (selectedEP == null) {
+			throw new WidgetNotFoundException(String.format("Expected to find widget %s", label));
+		}
+		click(selectedEP);
+	}
+
+	/**
+	 * Double click on the editor at the specified location.
+	 * 
+	 * @param xPosition the x relative position
+	 * @param yPosition the y relative position
+	 */
+	public void doubleClick(final int xPosition, final int yPosition) {
+		canvas.mouseMoveDoubleClick(xPosition, yPosition);
+	}
+
+	/**
+	 * Double click on the edit part which owns the specified label at the top left hand corner (with an offset) of its
+	 * bounds.
+	 * 
+	 * @param editPart the edit part to double click on
+	 */
+	public void doubleClick(final SWTBotGefEditPart editPart) {
+		Rectangle bounds = getAbsoluteBounds(editPart);
+		/*
+		 * Note that a move is required before double clicking in order to update the mouse cursor with the target
+		 * editpart. As we can not double click on the corner, we move the double click position
+		 */
+		int move = 3;
+		doubleClick(bounds.x, bounds.y + move);
+	}
+
+	/**
+	 * Double click on the edit part which owns the specified label at the top left hand corner (with an offset) of its
+	 * bounds.
+	 * 
+	 * @param label the label to retrieve edit part to double click on
+	 */
+	public void doubleClick(final String label) {
+		SWTBotGefEditPart selectedEP = getEditPart(label);
+		if (selectedEP == null) {
+			throw new WidgetNotFoundException(String.format("Expected to find widget %s", label));
+		}
+		doubleClick(selectedEP);
+	}
+
+	/**
+	 * Drag and drop from the specified to the specified location.
+	 * 
+	 * @param toXPosition the x relative location
+	 * @param toYPosition the y relative location
+	 */
+	public void drag(final int fromXPosition, final int fromYPosition, final int toXPosition, final int toYPosition) {
+		canvas.mouseDrag(fromXPosition, fromYPosition, toXPosition, toYPosition);
+	}
+
+	/**
+	 * Drag and drop the specified edit part to the specified location.
+	 * 
+	 * @param editPart the edit part to drag and drop
+	 * @param toXPosition the x relative location
+	 * @param toYPosition the y relative location
+	 */
+	public void drag(final SWTBotGefEditPart editPart, final int toXPosition, final int toYPosition) {
+		Rectangle bounds = getAbsoluteBounds(editPart);
+		/*
+		 * We should increment drag location to avoid a resize. 7 comes from SquareHandle#DEFAULT_HANDLE_SIZE and we
+		 * divided by 2 as AbstractHandle#getAccessibleLocation do that by default
+		 */
+		int offset = 7 / 2 + 1;
+		drag(bounds.x + offset, bounds.y + offset, toXPosition + offset, toYPosition + offset);
+	}
+
+	/**
+	 * Get absolute bounds of the edit part.
+	 * 
+	 * @param editPart edit part
+	 * @return the absolute bounds
+	 */
+	private Rectangle getAbsoluteBounds(final SWTBotGefEditPart editPart) {
+		IFigure figure = ((GraphicalEditPart) editPart.part()).getFigure();
+		Rectangle bounds = figure.getBounds().getCopy();
+		figure.translateToAbsolute(bounds);
+		return bounds;
+	}
+
+	/**
+	 * Drag and drop the edit part which owns the specified label to the specified location
+	 * 
+	 * @param label the label to retrieve the edit part to drag and drop
+	 * @param toXPosition the x relative position
+	 * @param toYPosition the y relative position
+	 */
+	public void drag(final String label, final int toXPosition, final int toYPosition) {
+		SWTBotGefEditPart selectedEP = getEditPart(label);
+		if (selectedEP == null) {
+			throw new WidgetNotFoundException(String.format("Expected to find widget %s", label));
+		}
+		drag(selectedEP, toXPosition, toYPosition);
+	}
+
+	/**
+	 * select the edit part with the label as a single selection.
+	 */
+	public SWTBotGefViewer select(String label) {
+		SWTBotGefEditPart selectedEP = getEditPart(label);
+		if (selectedEP == null) {
+			throw new WidgetNotFoundException(String.format("Expected to find widget %s", label));
+		}
+		List<SWTBotGefEditPart> editParts = new ArrayList<SWTBotGefEditPart>();
+		editParts.add(selectedEP);
+		return select(selectedEP);
+	}
+
+	/**
+	 * get this edit part with the label as a single selection.
+	 */
+	public SWTBotGefEditPart getEditPart(String label) {
+		List<SWTBotGefEditPart> allEditParts = mainEditPart().children();
+		allEditParts.addAll(mainEditPart().sourceConnections());
+		return getEditpart(label, allEditParts);
+	}
+
+	// FIXME should moved in a finder
+	@Deprecated
+	/*
+	 * * get this edit part with the label as a single selection
+	 */
+	public SWTBotGefEditPart getEditpart(String label, List<SWTBotGefEditPart> allEditParts) {
+		for (SWTBotGefEditPart child : allEditParts) {
+			IFigure figure = ((GraphicalEditPart) child.part()).getFigure();
+
+			if (isLabel(figure, label)) {
+				return child;
+			}
+
+			SWTBotGefEditPart childEditPart = getEditPart(child, label);
+			if (childEditPart != null) {
+				return childEditPart;
+			}
+
+			if (findLabelFigure(figure, label))
+				return child;
+		}
+		return null;
+	}
+
+	/**
+	 * get this edit part with the label as a single selection
+	 */
+	private SWTBotGefEditPart getEditPart(SWTBotGefEditPart editPart, String label) {
+		if (editPart.children().isEmpty() && findLabelFigure(((GraphicalEditPart) editPart.part()).getFigure(), label)) {
+			return editPart;
+		}
+
+		List<SWTBotGefEditPart> allEditParts = editPart.children();
+		allEditParts.addAll(editPart.sourceConnections());
+		return getEditpart(label, allEditParts);
+	}
+
+	// FIXME should moved in a finder
+	/**
+	 * @return if the figure is a label
+	 */
+	private boolean isLabel(IFigure figure, String label) {
+		// case 1 : gef label
+		if ((figure instanceof Label && ((Label) figure).getText().equals(label))) {
+			return true;
+		}
+
+		// case 2 : no gef label
+		if ((figure instanceof TextFlow && ((TextFlow) figure).getText().equals(label))) {
+			return true;
+		}
+		return false;
+	}
+
+	// FIXME should moved in a finder
+	/**
+	 * @return if the figure or all its children contain the label
+	 */
+	private boolean findLabelFigure(IFigure figure, String label) {
+		if (isLabel(figure, label)) {
+			return true;
+		}
+		for (Object figureChild : figure.getChildren()) {
+			if (isLabel((IFigure) figureChild, label) || findLabelFigure((IFigure) figureChild, label)) {
+				return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.gef/build.properties b/org.eclipse.swtbot.eclipse.gef/build.properties
index d774ab8..3bf4cca 100644
--- a/org.eclipse.swtbot.eclipse.gef/build.properties
+++ b/org.eclipse.swtbot.eclipse.gef/build.properties
@@ -10,10 +10,12 @@
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
\ No newline at end of file
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot.eclipse.gef/feature.properties b/org.eclipse.swtbot.eclipse.gef/feature.properties
new file mode 100644
index 0000000..26c6239
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef/feature.properties
@@ -0,0 +1,141 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c)  2004, 2009 MAKE Technologies Inc and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	MAKE Technologies Inc - initial API and implementation\n\
+ 	Mariot Chauvin (Obeo) -  SWTBot contribution\n
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.eclipse.gef/feature.xml b/org.eclipse.swtbot.eclipse.gef/feature.xml
index bc243d1..bae26d6 100644
--- a/org.eclipse.swtbot.eclipse.gef/feature.xml
+++ b/org.eclipse.swtbot.eclipse.gef/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.swtbot.eclipse.gef"
       label="SWTBot for GEF Testing (incubation)"
-      version="2.0.0.qualifier"
+      version="2.0.5.qualifier"
       provider-name="Eclipse.org"
       plugin="org.eclipse.swtbot.eclipse.ui">
 
@@ -10,113 +10,12 @@
       SWTBot for testing Gef based plugins and applications (incubation)
    </description>
 
-   <copyright url="http://eclipse.org/">
-      Copyright (c)  2004, 2009 MAKE Technologies Inc 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:
- MAKE Technologies Inc - initial API and implementation
- Mariot Chauvin (Obeo) -  SWTBot contribution
+   <copyright>
+      %copyright
    </copyright>
 
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-Eclipse Foundation Software User Agreement
-March 17, 2005
-Usage Of Content
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION,
-INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY
-THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED
-BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS
-AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO
-THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED
-OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-Applicable Licenses
-Unless otherwise indicated, all Content made available by the
-Eclipse Foundation is provided to you under the terms and conditions
-of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and
-is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-Content includes, but is not limited to, source code, object
-code, documentation and other files maintained in the Eclipse.org
-CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives
-(&quot;Downloads&quot;).
-* Content may be structured and packaged into modules to facilitate
-delivering, extending, and upgrading the Content.  Typical modules
-may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;),
-and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory
-or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments
-and associated material.  Each Feature may be packaged as a sub-directory
-in a directory named &quot;features&quot;.  Within a Feature, files named
-&quot;feature.xml&quot; may contain a list of the names and version numbers
-of the Plug-ins
-and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;).
-Within a Feature, files named &quot;feature.xml&quot; may contain a list
-of the names and version numbers of Included Features.
-The terms and conditions governing Plug-ins and Fragments should
-be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms
-and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot;
-(&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located
-in any directory of a Download or Module
-including, but not limited to the following locations:
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-Note: if a Feature made available by the Eclipse Foundation is
-installed using the Eclipse Update Manager, you must agree to
-a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features,
-the Feature Update License should either provide you with the
-terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses
-may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot;
-found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain
-the terms and conditions (or references to such terms and conditions)
-that govern your use of the associated Content in
-that directory.
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY
-REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS
-AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS
-PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or
-Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions
-govern that particular Content.
-Cryptography
-Content may contain encryption software. The country in which
-you are currently may have restrictions on the import, possession,
-and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption
-software, please check the country&apos;s laws, regulations and policies
-concerning the import,
-possession, or use, and re-export of encryption software, to
-see if this is permitted.
-Java and all Java-based trademarks are trademarks of Sun Microsystems,
-Inc. in the United States, other countries, or both.
+   <license url="%licenseURL">
+      %license
    </license>
 
    <url>
@@ -128,16 +27,16 @@
          version="0.0.0"/>
 
    <requires>
-      <import plugin="org.junit" version="3.7.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.resources" version="3.3.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.runtime" version="3.3.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.swt" version="3.3.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui" version="3.3.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.ide" version="3.3.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.swtbot.swt.finder" version="2.0.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.swtbot.eclipse.finder" version="2.0.0" match="greaterOrEqual"/>
-      <import plugin="org.hamcrest" version="1.1.0" match="greaterOrEqual"/>
-      <import plugin="org.apache.log4j" version="1.2.13" match="greaterOrEqual"/>
+      <import plugin="org.junit"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.swtbot.swt.finder"/>
+      <import plugin="org.eclipse.swtbot.eclipse.finder"/>
+      <import plugin="org.hamcrest"/>
+      <import plugin="org.apache.log4j"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.swtbot.eclipse.gef/license.html b/org.eclipse.swtbot.eclipse.gef/license.html
index c6af966..c184ca3 100644
--- a/org.eclipse.swtbot.eclipse.gef/license.html
+++ b/org.eclipse.swtbot.eclipse.gef/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
    For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
 
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,23 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
 </ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/org.eclipse.swtbot.eclipse.gef/pom.xml b/org.eclipse.swtbot.eclipse.gef/pom.xml
new file mode 100644
index 0000000..439bd5b
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.gef/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.gef</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/.classpath b/org.eclipse.swtbot.eclipse.junit.headless/.classpath
similarity index 100%
rename from org.eclipse.swtbot.eclipse.junit3.headless/.classpath
rename to org.eclipse.swtbot.eclipse.junit.headless/.classpath
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.eclipse.junit.headless/.project
similarity index 91%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.swtbot.eclipse.junit.headless/.project
index d2190e0..2d5e3c4 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.eclipse.junit.headless/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.swtbot.eclipse.junit.headless</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.eclipse.junit.headless/.settings/org.eclipse.jdt.core.prefs
similarity index 100%
rename from org.eclipse.swtbot.eclipse.junit3.headless/.settings/org.eclipse.jdt.core.prefs
rename to org.eclipse.swtbot.eclipse.junit.headless/.settings/org.eclipse.jdt.core.prefs
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/JUNIT.XSL b/org.eclipse.swtbot.eclipse.junit.headless/JUNIT.XSL
similarity index 97%
rename from org.eclipse.swtbot.eclipse.junit3.headless/JUNIT.XSL
rename to org.eclipse.swtbot.eclipse.junit.headless/JUNIT.XSL
index b426572..9fe45bb 100755
--- a/org.eclipse.swtbot.eclipse.junit3.headless/JUNIT.XSL
+++ b/org.eclipse.swtbot.eclipse.junit.headless/JUNIT.XSL
@@ -1,4 +1,6 @@
 <xsl:stylesheet	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:param name="screenshot_dir">.</xsl:param>
+<xsl:param name="screenshot_format">jpeg</xsl:param>
 <xsl:output method="html" indent="yes"/>
 <xsl:decimal-format decimal-separator="." grouping-separator="," />
 
@@ -395,6 +397,14 @@
 			<xsl:with-param name="word" select="."/>
 		</xsl:call-template>
 	</code>
+	<p><br/><br/>Screenshot:</p>
+	<p>
+  	<img>
+  	  <xsl:attribute name="src">
+  	    <xsl:value-of select="concat($screenshot_dir, '/', ../@name, '(', ../@classname, ').', $screenshot_format)"/>
+      </xsl:attribute>
+    </img>
+  </p>
 	<!-- the later is better but might be problematic for non-21" monitors... -->
 	<!--pre><xsl:value-of select="."/></pre-->
 </xsl:template>
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/LICENSE.EPL b/org.eclipse.swtbot.eclipse.junit.headless/LICENSE.EPL
similarity index 100%
rename from org.eclipse.swtbot.eclipse.junit3.headless/LICENSE.EPL
rename to org.eclipse.swtbot.eclipse.junit.headless/LICENSE.EPL
diff --git a/org.eclipse.swtbot.eclipse.junit.headless/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.junit.headless/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1ebf6c8
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.junit.headless/META-INF/MANIFEST.MF
@@ -0,0 +1,19 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: SWTBot Headless JUnit4 Launch Plug-in (incubation)
+Bundle-SymbolicName: org.eclipse.swtbot.eclipse.junit.headless;singleton:=true
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org - SWTBot
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.swtbot.eclipse.junit.headless
+Import-Package: junit.framework;version="4.5.0",
+ org.apache.tools.ant,
+ org.apache.tools.ant.taskdefs.optional.junit,
+ org.eclipse.core.runtime;version="3.4.0",
+ org.eclipse.equinox.app;version="1.0.0",
+ org.eclipse.osgi.util;version="1.1.0",
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.testing,
+ org.osgi.framework;version="1.4.0"
+Require-Bundle: org.eclipse.ui.workbench;bundle-version="3.6.0"
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/about.html b/org.eclipse.swtbot.eclipse.junit.headless/about.html
similarity index 100%
rename from org.eclipse.swtbot.eclipse.junit3.headless/about.html
rename to org.eclipse.swtbot.eclipse.junit.headless/about.html
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/build.properties b/org.eclipse.swtbot.eclipse.junit.headless/build.properties
similarity index 71%
rename from org.eclipse.swtbot.swt.recorder.ui.test/build.properties
rename to org.eclipse.swtbot.eclipse.junit.headless/build.properties
index 3672fd0..3c6bcff 100644
--- a/org.eclipse.swtbot.swt.recorder.ui.test/build.properties
+++ b/org.eclipse.swtbot.eclipse.junit.headless/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -8,17 +8,15 @@
 # Contributors:
 #     Ketan Padegaonkar - initial API and implementation
 ###############################################################################
-source.. = src/
-output.. = bin/
 bin.includes = META-INF/,\
+               plugin.xml,\
+               library.xml,\
+               about.html,\
+               LICENSE.EPL,\
+               src/,\
                .,\
-               about.html,\
+               JUNIT.XSL
+src.includes = library.xml,\
                LICENSE.EPL,\
-               src/
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               about.html,\
-               build.properties,\
-               src/
+               about.html
+source.. = src/
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/library.xml b/org.eclipse.swtbot.eclipse.junit.headless/library.xml
similarity index 90%
rename from org.eclipse.swtbot.eclipse.junit4.headless/library.xml
rename to org.eclipse.swtbot.eclipse.junit.headless/library.xml
index a7d3e35..cc3c848 100644
--- a/org.eclipse.swtbot.eclipse.junit4.headless/library.xml
+++ b/org.eclipse.swtbot.eclipse.junit.headless/library.xml
@@ -9,7 +9,7 @@
 
 -->
 
-<project name="Library" default="usage" basedir=".">
+<project name="swtbot-library-headless-junit4" default="usage" basedir=".">
 
 	<target name="usage">
 		<echo message="Please refer to the testframework.html in org.eclipse.test for instructions on usage." />
@@ -164,7 +164,21 @@
 			</fileset>
 		</junitreport>
 
-		<style style="${eclipse-home}/plugins/org.eclipse.test/JUNIT.XSL" basedir="${junit-report-output}" includes="${classname}.result.xml" destdir="${junit-report-output}" />
+	    <dirname property="swtbot.junit4.headless.dir" file="${ant.file.swtbot-library-headless-junit4}"/>
+
+		<mkdir dir="${junit-report-output}/screenshots" />
+		<move todir="${junit-report-output}/screenshots" failonerror="false">
+			<fileset dir="${eclipse-home}/screenshots" includes="*.*" />
+		</move>
+
+		<xslt style="${swtbot.junit4.headless.dir}/JUNIT.XSL" basedir="${junit-report-output}" includes="${classname}.xml" destdir="${junit-report-output}">
+			<param name="screenshot_dir" expression="screenshots"/>
+			<!--
+			Only use this if you've set SWTBotPreferences#SCREENSHOT_FORMAT preference
+			Optional: possible values are bmp, gif, ico, jpeg, jpg, png or tiff
+			<param name="screenshot_format" expression="jpeg"/>
+			-->
+		</xslt>
 
 		<!--save .log content and *.log content from configuration directory-->
 		<concat destfile="${junit-report-output}/${classname}.log">
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/plugin.xml b/org.eclipse.swtbot.eclipse.junit.headless/plugin.xml
similarity index 83%
rename from org.eclipse.swtbot.eclipse.junit4.headless/plugin.xml
rename to org.eclipse.swtbot.eclipse.junit.headless/plugin.xml
index c7b3b2d..554ebba 100644
--- a/org.eclipse.swtbot.eclipse.junit4.headless/plugin.xml
+++ b/org.eclipse.swtbot.eclipse.junit.headless/plugin.xml
@@ -7,7 +7,7 @@
       <application
             visible="false">
          <run
-               class="org.eclipse.swtbot.eclipse.junit4.headless.UITestApplication">
+               class="org.eclipse.swtbot.eclipse.junit.headless.UITestApplication">
             <parameter
                   name="productInfo"
                   value="product.ini">
diff --git a/org.eclipse.swtbot.eclipse.junit.headless/pom.xml b/org.eclipse.swtbot.eclipse.junit.headless/pom.xml
new file mode 100644
index 0000000..c854183
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.junit.headless/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.junit.headless</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/EclipseTestRunner.java b/org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/EclipseTestRunner.java
similarity index 99%
rename from org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/EclipseTestRunner.java
rename to org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/EclipseTestRunner.java
index b13e60d..f4a8418 100644
--- a/org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/EclipseTestRunner.java
+++ b/org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/EclipseTestRunner.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *******************************************************************************/
-package org.eclipse.swtbot.eclipse.junit4.headless;
+package org.eclipse.swtbot.eclipse.junit.headless;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/UITestApplication.java b/org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/UITestApplication.java
similarity index 90%
rename from org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/UITestApplication.java
rename to org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/UITestApplication.java
index b8bea58..64fafe4 100644
--- a/org.eclipse.swtbot.eclipse.junit4.headless/src/org/eclipse/swtbot/eclipse/junit4/headless/UITestApplication.java
+++ b/org.eclipse.swtbot.eclipse.junit.headless/src/org/eclipse/swtbot/eclipse/junit/headless/UITestApplication.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *******************************************************************************/
-package org.eclipse.swtbot.eclipse.junit4.headless;
+package org.eclipse.swtbot.eclipse.junit.headless;
 
 import java.io.IOException;
 
@@ -44,7 +44,7 @@
 		String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
 		Object app = getApplication(args);
 
-		Assert.isNotNull(app);
+		Assert.isNotNull(app, "The application " + getApplicationToRun(args) + " could not be found. Please see the SWTBot troubleshooting guide: http://wiki.eclipse.org/SWTBot/Troubleshooting");
 
 		fTestableObject = PlatformUI.getTestableObject();
 		fTestableObject.setTestHarness(this);
@@ -71,10 +71,11 @@
 		// Find the name of the application as specified by the PDE JUnit launcher.
 		// If no application is specified, the 3.0 default workbench application
 		// is returned.
+		String applicationToRun = getApplicationToRun(args);
 		IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME, Platform.PT_APPLICATIONS,
-				getApplicationToRun(args));
+				applicationToRun);
 
-		Assert.isNotNull(extension);
+		Assert.isNotNull(extension, "Could not find IExtension for application: " + applicationToRun);
 
 		// If the extension does not have the correct grammar, return null.
 		// Otherwise, return the application object.
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/.project b/org.eclipse.swtbot.eclipse.junit3.headless/.project
deleted file mode 100644
index 79498b8..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.eclipse.junit3.headless</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.junit3.headless/META-INF/MANIFEST.MF
deleted file mode 100644
index 88c428f..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Headless JUnit3 Launch Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.eclipse.junit3.headless;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.swtbot.eclipse.junit3.headless
-Import-Package: junit.framework;version="[3.8.2,4.0.0)",
- org.apache.tools.ant,
- org.apache.tools.ant.taskdefs.optional.junit,
- org.eclipse.core.runtime;version="3.4.0",
- org.eclipse.equinox.app;version="1.0.0",
- org.eclipse.osgi.util;version="1.1.0",
- org.eclipse.swt.widgets,
- org.eclipse.ui,
- org.eclipse.ui.testing,
- org.osgi.framework;version="1.4.0"
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/build.properties b/org.eclipse.swtbot.eclipse.junit3.headless/build.properties
deleted file mode 100644
index 6d79d9c..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/build.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               plugin.xml,\
-               library.xml,\
-               about.html,\
-               LICENSE.EPL,\
-               src/,\
-               .,\
-               JUNIT.XSL
-src.includes = src/,\
-               plugin.xml,\
-               library.xml,\
-               build.properties,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
-               META-INF/,\
-               about.html,\
-               .settings/
-source.. = src/
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/library.xml b/org.eclipse.swtbot.eclipse.junit3.headless/library.xml
deleted file mode 100644
index 5b726af..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/library.xml
+++ /dev/null
@@ -1,192 +0,0 @@
-<?xml version="1.0"?>
-<!--
-
-
-======================================================================
-this has been copied from o.e.test plugin with some targets for SWTBot
-======================================================================
-
-
--->
-
-<project name="Library" default="usage" basedir=".">
-
-	<target name="usage">
-		<echo message="Please refer to the testframework.html in org.eclipse.test for instructions on usage." />
-	</target>
-
-	<target name="init">
-		<!--
-			Parameters:
-				(Mandatory)
-				data-dir		- the directory for Eclipse to write its data
-				plugin-name		- the name of the plugin to test
-				classname		- the name of the test class
-
-				(Optional - overrides defaults set in script)
-				testProduct		- a string containing the product id to test.
-				testApplication	- a string containing the application id to test.
-				vmargs			- a string containing arguments to pass to the VM.
-				extraVMargs		- allows separate setting of VM args from separate caller.
-				timeout			- overrides default test timeout value (in milliseconds).
-				test-output		- overrides default output file produced from test run.
-				plugin-path		- path to root of plug-in
-				useEclipseExe	- property setting forces test to launch via eclipse executable.
-				junit-report-output - output directory for junit reports produced for specified classname.
-		-->
-
-		<tstamp>
-			<format property="TIMENOW" pattern="HHmmssSSSS" />
-		</tstamp>
-		<!--property setting useEclipseExe launches tests using the eclipse executable-->
-		<condition property="launchTarget" value="eclipse-test">
-			<isset property="useEclipseExe" />
-		</condition>
-		<!--default launch target for launching tests-->
-		<property name="launchTarget" value="java-test" />
-
-		<!-- default product/application to launch -->
-		<condition property="testproduct.if.available" value="-product ${testProduct}">
-			<isset property="testProduct" />
-		</condition>
-		<property name="testproduct.if.available" value="" />
-
-		<condition property="testapplication.if.available" value="-testApplication ${testApplication}">
-			<isset property="testApplication" />
-		</condition>
-
-		<property name="testapplication.if.available" value="" />
-
-		<!--default heap sizes when running performance tests-->
-		<condition property="vmargs" value=" -Xms256M -Xmx256M">
-			<equals arg1="${test.target}" arg2="performance" />
-		</condition>
-		<property name="extraVMargs" value="" />
-		<property name="plugin-path" value="" />
-		<property name="timeout" value="7200000" />
-		<property name="test-output" value="${eclipse-home}/${classname}.xml" />
-		<property name="junit-report-output" value="${eclipse-home}/results" />
-		<mkdir dir="${junit-report-output}" />
-	</target>
-
-	<target name="swtbot-test" description="Eclipse application used to launch UI plugin tests." depends="init">
-		<antcall target="${launchTarget}">
-			<!--param name="application" value="org.eclipse.test.uitestapplication"/-->
-			<param name="application" value="org.eclipse.swtbot.eclipse.junit3.headless.swtbottestapplication" />
-		</antcall>
-	</target>
-
-	<target name="java-test">
-		<!--default vm args-->
-		<property name="vmargs" value="-Xms256m -Xmx512m" />
-
-		<!-- this argument is needed for macosx -->
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
-			<os family="mac" />
-		</condition>
-
-		<property name="jvmOption" value="" />
-
-		<!--set default jvm to use for testing-->
-		<property name="jvm" value="${java.home}/bin/java" />
-
-		<property name="launcher-arg-line" value="
-			-application ${application}
-			${testproduct.if.available}
-			${testapplication.if.available}
-			-data ${data-dir}
-			formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter,${test-output} formatter=org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter
-			-testPluginName ${plugin-name}
-			-className ${classname}
-			-os ${os}
-			-ws ${ws}
-			-arch ${arch}
-			-consoleLog
-			-debug" />
-		<property name="jvm-arg-line" value="${vmargs} ${extraVMargs} ${jvmOption}" />
-
-		<echo>======================================</echo>
-		<echo>Running swtbot junit tests in ${classname}</echo>
-		<echo>Command line args are ${launcher-arg-line}</echo>
-		<echo>JVM args are ${jvm-arg-line}</echo>
-		<echo>JUnit Result File: ${junit-report-output}/${classname}.xml.</echo>
-		<echo>Console output File: ${junit-report-output}/${classname}.txt.</echo>
-		<echo>======================================</echo>
-
-		<fail unless="application" message="variable 'application' not defined." />
-		<fail unless="data-dir" message="variable 'data-dir' not defined." />
-		<fail unless="test-output" message="variable 'test-output' not defined" />
-		<fail unless="plugin-name" message="variable 'plugin-name' not defined" />
-		<fail unless="classname" message="variable 'classname' not defined" />
-		<fail unless="os" message="variable 'os' not defined. os can be one of win32, linux, macosx" />
-		<fail unless="ws" message="variable 'ws' not defined. ws can be one of win32, wpf, gtk, carbon, cocoa" />
-		<fail unless="arch" message="variable 'arch' not defined. arch can be one of x86, x86_64, ppc" />
-
-		<pathconvert property="foundJunit4" setonempty="false" pathsep=" ">
-			<path>
-				<fileset dir="${eclipse-home}/plugins" includes="org.eclipse.swtbot.eclipse.junit4.headless*/META-INF/MANIFEST.MF" />
-				<fileset dir="${eclipse-home}/plugins" includes="org.eclipse.swtbot.ant.optional.junit4*" />
-			</path>
-		</pathconvert>
-
-		<fail if="foundJunit4">
-			.
-			Found org.eclipse.swtbot.eclipse.junit4.headless or org.eclipse.swtbot.ant.optional.junit4 in the plugins directory.
-			JUnit 3.x and 4.x don't play well together.
-			Please remove org.eclipse.swtbot.eclipse.junit4.headless and org.eclipse.swtbot.ant.optional.junit4 from the plugins dir.
-		</fail>
-
-		<java fork="true" dir="." timeout="${timeout}" jvm="${jvm}" logError="true" classname="org.eclipse.core.launcher.Main" output="${junit-report-output}/${classname}.txt">
-			<classpath>
-				<fileset dir="${eclipse-home}/plugins">
-					<include name="org.eclipse.equinox.launcher_*.jar" />
-				</fileset>
-			</classpath>
-			<arg line="${launcher-arg-line}" />
-			<jvmarg line="${jvm-arg-line}" />
-			<sysproperty key="PLUGIN_PATH" value="${plugin-path}" />
-		</java>
-
-		<echo>======================================</echo>
-		<echo>If you see errors above please see the file ${junit-report-output}/${classname}.txt for more information.</echo>
-		<echo>Errors are generally caused by missing or incorrect dependencies.</echo>
-		<echo>======================================</echo>
-
-		<antcall target="collect-results" />
-	</target>
-
-	<target name="collect-results">
-		<dirname property="output-dir" file="${test-output}" />
-		<basename property="output-file-name" file="${test-output}" />
-		<junitreport todir="${junit-report-output}" tofile="${classname}.xml">
-			<fileset dir="${output-dir}">
-				<include name="${output-file-name}" />
-			</fileset>
-		</junitreport>
-
-		<style style="${eclipse-home}/plugins/org.eclipse.test/JUNIT.XSL" basedir="${junit-report-output}" includes="${classname}.result.xml" destdir="${junit-report-output}" />
-
-		<!--save .log content and *.log content from configuration directory-->
-		<concat destfile="${junit-report-output}/${classname}.log">
-			<fileset dir="${eclipse-home}" includes="${data-dir}/.metadata/*.log" />
-			<fileset dir="${eclipse-home}" includes="configuration/*.log" />
-		</concat>
-	</target>
-
-	<target name="collect">
-		<!--
-			This target can be used to aggragate test runs from multiple test suites into a single report.
-
-			Parameters to this target:
-			includes		- the names of the files to include
-			output-file		- the name of the output file to produce
-		-->
-		<junitreport todir="." tofile="${output-file}">
-			<fileset dir=".">
-				<include name="${includes}" />
-			</fileset>
-		</junitreport>
-	</target>
-
-</project>
-
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/plugin.xml b/org.eclipse.swtbot.eclipse.junit3.headless/plugin.xml
deleted file mode 100644
index 9c5bd89..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/plugin.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension
-         id="swtbottestapplication"
-         point="org.eclipse.core.runtime.applications">
-      <application
-            visible="false">
-         <run
-               class="org.eclipse.swtbot.eclipse.junit3.headless.UITestApplication">
-            <parameter
-                  name="productInfo"
-                  value="product.ini">
-            </parameter>
-         </run>
-      </application>
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/EclipseTestRunner.java b/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/EclipseTestRunner.java
deleted file mode 100644
index a81ca29..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/EclipseTestRunner.java
+++ /dev/null
@@ -1,500 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.junit3.headless;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.PrintStream;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Hashtable;
-import java.util.Properties;
-import java.util.Vector;
-
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestListener;
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.optional.junit.JUnitResultFormatter;
-import org.apache.tools.ant.taskdefs.optional.junit.JUnitTest;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.osgi.util.ManifestElement;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.Constants;
-
-/**
- * An exact copy of {@link org.eclipse.test.EclipseTestRunner}. A TestRunner for JUnit that supports Ant
- * JUnitResultFormatters and running tests inside Eclipse. Example call: EclipseTestRunner -classname
- * junit.samples.SimpleTest formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter
- */
-@SuppressWarnings("all")
-public class EclipseTestRunner implements TestListener {
-	class TestFailedException extends Exception {
-
-		private static final long	serialVersionUID	= 6009335074727417445L;
-
-		TestFailedException(String message) {
-			super(message);
-		}
-
-		TestFailedException(Throwable e) {
-			super(e);
-		}
-	}
-
-	/**
-	 * No problems with this test.
-	 */
-	public static final int		SUCCESS				= 0;
-	/**
-	 * Some tests failed.
-	 */
-	public static final int		FAILURES			= 1;
-	/**
-	 * An error occured.
-	 */
-	public static final int		ERRORS				= 2;
-
-	private static final String	SUITE_METHODNAME	= "suite"; //$NON-NLS-1$
-	/**
-	 * The current test result
-	 */
-	private TestResult			fTestResult;
-	/**
-	 * The name of the plugin containing the test
-	 */
-	private final String		fTestPluginName;
-	/**
-	 * The corresponding testsuite.
-	 */
-	private Test				fSuite;
-	/**
-	 * Formatters from the command line.
-	 */
-	private static Vector		fgFromCmdLine		= new Vector();
-	/**
-	 * Holds the registered formatters.
-	 */
-	private final Vector		formatters			= new Vector();
-	/**
-	 * Do we stop on errors.
-	 */
-	private boolean				fHaltOnError		= false;
-	/**
-	 * Do we stop on test failures.
-	 */
-	private boolean				fHaltOnFailure		= false;
-	/**
-	 * The TestSuite we are currently running.
-	 */
-	private final JUnitTest		fJunitTest;
-	/**
-	 * output written during the test
-	 */
-	private PrintStream			fSystemError;
-	/**
-	 * Error output during the test
-	 */
-	private PrintStream			fSystemOut;
-	/**
-	 * Exception caught in constructor.
-	 */
-	private Exception			fException;
-	/**
-	 * Returncode
-	 */
-	private int					fRetCode			= SUCCESS;
-
-	/**
-	 * The main entry point (the parameters are not yet consistent with the Ant JUnitTestRunner, but eventually they
-	 * should be). Parameters
-	 *
-	 * <pre>
-	 * -className: the name of the testSuite
-	 * -testPluginName: the name of the containing plugin
-	 * haltOnError: halt test on errors?
-	 * haltOnFailure: halt test on failures?
-	 * -testlistener listenerClass: deprecated
-	 * 		print a warning that this option is deprecated
-	 * formatter: a JUnitResultFormatter given as classname,filename.
-	 *  	If filename is ommitted, System.out is assumed.
-	 * </pre>
-	 */
-	public static void main(String[] args) throws IOException {
-		System.exit(run(args));
-	}
-
-	public static int run(String[] args) throws IOException {
-		String className = null;
-		String testPluginName = null;
-
-		boolean haltError = false;
-		boolean haltFail = false;
-
-		Properties props = new Properties();
-
-		int startArgs = 0;
-		if (args.length > 0)
-			// support the JUnit task commandline syntax where
-			// the first argument is the name of the test class
-			if (!args[0].startsWith("-")) { //$NON-NLS-1$
-				className = args[0];
-				startArgs++;
-			}
-		for (int i = startArgs; i < args.length; i++)
-			if (args[i].toLowerCase().equals("-classname")) { //$NON-NLS-1$
-				if (i < args.length - 1)
-					className = args[i + 1];
-				i++;
-			} else if (args[i].toLowerCase().equals("-testpluginname")) { //$NON-NLS-1$
-				if (i < args.length - 1)
-					testPluginName = args[i + 1];
-				i++;
-			} else if (args[i].startsWith("haltOnError=")) //$NON-NLS-1$
-				haltError = Project.toBoolean(args[i].substring(12));
-			else if (args[i].startsWith("haltOnFailure=")) //$NON-NLS-1$
-				haltFail = Project.toBoolean(args[i].substring(14));
-			else if (args[i].startsWith("formatter=")) //$NON-NLS-1$
-				try {
-					createAndStoreFormatter(args[i].substring(10));
-				} catch (BuildException be) {
-					System.err.println(be.getMessage());
-					return ERRORS;
-				}
-				else if (args[i].startsWith("propsfile=")) { //$NON-NLS-1$
-					FileInputStream in = new FileInputStream(args[i].substring(10));
-					props.load(in);
-					in.close();
-				} else if (args[i].equals("-testlistener")) { //$NON-NLS-1$
-					System.err.println("The -testlistener option is no longer supported\nuse the formatter= option instead"); //$NON-NLS-1$
-					return ERRORS;
-				}
-
-		if (className == null)
-			throw new IllegalArgumentException("Test class name not specified"); //$NON-NLS-1$
-
-		JUnitTest t = new JUnitTest(className);
-
-		// Add/overlay system properties on the properties from the Ant project
-		Hashtable p = System.getProperties();
-		for (Enumeration _enum = p.keys(); _enum.hasMoreElements();) {
-			Object key = _enum.nextElement();
-			props.put(key, p.get(key));
-		}
-		t.setProperties(props);
-
-		EclipseTestRunner runner = new EclipseTestRunner(t, testPluginName, haltError, haltFail);
-		transferFormatters(runner);
-		runner.run();
-		return runner.getRetCode();
-	}
-
-	/**
-	 *
-	 */
-	public EclipseTestRunner(JUnitTest test, String testPluginName, boolean haltOnError, boolean haltOnFailure) {
-		fJunitTest = test;
-		fTestPluginName = testPluginName;
-		fHaltOnError = haltOnError;
-		fHaltOnFailure = haltOnFailure;
-
-		try {
-			fSuite = getTest(test.getName());
-		} catch (Exception e) {
-			fRetCode = ERRORS;
-			fException = e;
-		}
-	}
-
-	/**
-	 * Returns the Test corresponding to the given suite.
-	 */
-	protected Test getTest(String suiteClassName) throws TestFailedException {
-		if (suiteClassName.length() <= 0) {
-			clearStatus();
-			return null;
-		}
-		Class testClass = null;
-		try {
-			testClass = loadSuiteClass(suiteClassName);
-		} catch (ClassNotFoundException e) {
-			if (e.getCause() != null)
-				runFailed(e.getCause());
-			String clazz = e.getMessage();
-			if (clazz == null)
-				clazz = suiteClassName;
-			runFailed("Class not found \"" + clazz + "\""); //$NON-NLS-1$ //$NON-NLS-2$
-			return null;
-		} catch (Exception e) {
-			runFailed(e);
-			return null;
-		}
-		Method suiteMethod = null;
-		try {
-			suiteMethod = testClass.getMethod(SUITE_METHODNAME, new Class[0]);
-		} catch (Exception e) {
-			// try to extract a test suite automatically
-			clearStatus();
-			return new TestSuite(testClass);
-		}
-		if (!Modifier.isStatic(suiteMethod.getModifiers())) {
-			runFailed("suite() method must be static"); //$NON-NLS-1$
-			return null;
-		}
-		Test test = null;
-		try {
-			test = (Test) suiteMethod.invoke(null, new Class[0]); // static method
-			if (test == null)
-				return test;
-		} catch (InvocationTargetException e) {
-			runFailed("Failed to invoke suite():" + e.getTargetException().toString()); //$NON-NLS-1$
-			return null;
-		} catch (IllegalAccessException e) {
-			runFailed("Failed to invoke suite():" + e.toString()); //$NON-NLS-1$
-			return null;
-		}
-		clearStatus();
-		return test;
-	}
-
-	protected void runFailed(String message) throws TestFailedException {
-		System.err.println(message);
-		throw new TestFailedException(message);
-	}
-
-	protected void runFailed(Throwable e) throws TestFailedException {
-		e.printStackTrace();
-		throw new TestFailedException(e);
-	}
-
-	protected void clearStatus() {
-	}
-
-	/**
-	 * Loads the class either with the system class loader or a plugin class loader if a plugin name was specified
-	 */
-	protected Class loadSuiteClass(String suiteClassName) throws ClassNotFoundException {
-		if (fTestPluginName == null)
-			return Class.forName(suiteClassName);
-		Bundle bundle = Platform.getBundle(fTestPluginName);
-		if (bundle == null)
-			throw new ClassNotFoundException(suiteClassName, new Exception("Could not find plugin \"" + fTestPluginName + "\"")); //$NON-NLS-1$ //$NON-NLS-2$
-
-		// is the plugin a fragment?
-		Dictionary headers = bundle.getHeaders();
-		String hostHeader = (String) headers.get(Constants.FRAGMENT_HOST);
-		if (hostHeader != null) {
-			// we are a fragment for sure
-			// we need to find which is our host
-			ManifestElement[] hostElement = null;
-			try {
-				hostElement = ManifestElement.parseHeader(Constants.FRAGMENT_HOST, hostHeader);
-			} catch (BundleException e) {
-				throw new RuntimeException("Could not find host for fragment:" + fTestPluginName, e); //$NON-NLS-1$
-			}
-			Bundle host = Platform.getBundle(hostElement[0].getValue());
-			// we really want to get the host not the fragment
-			bundle = host;
-		}
-
-		return bundle.loadClass(suiteClassName);
-	}
-
-	public void run() {
-		// IPerformanceMonitor pm = PerfMsrCorePlugin.getPerformanceMonitor(true);
-
-		fTestResult = new TestResult();
-		fTestResult.addListener(this);
-		for (int i = 0; i < formatters.size(); i++)
-			fTestResult.addListener((TestListener) formatters.elementAt(i));
-
-		long start = System.currentTimeMillis();
-		fireStartTestSuite();
-
-		if (fException != null) { // had an exception in the constructor
-			for (int i = 0; i < formatters.size(); i++)
-				((TestListener) formatters.elementAt(i)).addError(null, fException);
-			fJunitTest.setCounts(1, 0, 1);
-			fJunitTest.setRunTime(0);
-		} else {
-			ByteArrayOutputStream errStrm = new ByteArrayOutputStream();
-			fSystemError = new PrintStream(errStrm);
-
-			ByteArrayOutputStream outStrm = new ByteArrayOutputStream();
-			fSystemOut = new PrintStream(outStrm);
-
-			try {
-				// pm.snapshot(1); // before
-				fSuite.run(fTestResult);
-			} finally {
-				// pm.snapshot(2); // after
-				fSystemError.close();
-				fSystemError = null;
-				fSystemOut.close();
-				fSystemOut = null;
-				sendOutAndErr(new String(outStrm.toByteArray()), new String(errStrm.toByteArray()));
-				fJunitTest.setCounts(fTestResult.runCount(), fTestResult.failureCount(), fTestResult.errorCount());
-				fJunitTest.setRunTime(System.currentTimeMillis() - start);
-			}
-		}
-		fireEndTestSuite();
-
-		if ((fRetCode != SUCCESS) || (fTestResult.errorCount() != 0))
-			fRetCode = ERRORS;
-		else if (fTestResult.failureCount() != 0)
-			fRetCode = FAILURES;
-
-		// pm.upload(getClass().getName());
-	}
-
-	/**
-	 * Returns what System.exit() would return in the standalone version.
-	 *
-	 * @return 2 if errors occurred, 1 if tests failed else 0.
-	 */
-	public int getRetCode() {
-		return fRetCode;
-	}
-
-	/*
-	 * @see TestListener.addFailure
-	 */
-	public void startTest(Test t) {
-	}
-
-	/*
-	 * @see TestListener.addFailure
-	 */
-	public void endTest(Test test) {
-	}
-
-	/*
-	 * @see TestListener.addFailure
-	 */
-	public void addFailure(Test test, AssertionFailedError t) {
-		if (fHaltOnFailure)
-			fTestResult.stop();
-	}
-
-	/*
-	 * @see TestListener.addError
-	 */
-	public void addError(Test test, Throwable t) {
-		if (fHaltOnError)
-			fTestResult.stop();
-	}
-
-	private void fireStartTestSuite() {
-		for (int i = 0; i < formatters.size(); i++)
-			((JUnitResultFormatter) formatters.elementAt(i)).startTestSuite(fJunitTest);
-	}
-
-	private void fireEndTestSuite() {
-		for (int i = 0; i < formatters.size(); i++)
-			((JUnitResultFormatter) formatters.elementAt(i)).endTestSuite(fJunitTest);
-	}
-
-	public void addFormatter(JUnitResultFormatter f) {
-		formatters.addElement(f);
-	}
-
-	/**
-	 * Line format is: formatter=<classname>(,<pathname>)?
-	 */
-	private static void createAndStoreFormatter(String line) throws BuildException {
-		String formatterClassName = null;
-		File formatterFile = null;
-
-		int pos = line.indexOf(',');
-		if (pos == -1)
-			formatterClassName = line;
-		else {
-			formatterClassName = line.substring(0, pos);
-			formatterFile = new File(line.substring(pos + 1)); // the method is package visible
-		}
-		fgFromCmdLine.addElement(createFormatter(formatterClassName, formatterFile));
-	}
-
-	private static void transferFormatters(EclipseTestRunner runner) {
-		for (int i = 0; i < fgFromCmdLine.size(); i++)
-			runner.addFormatter((JUnitResultFormatter) fgFromCmdLine.elementAt(i));
-	}
-
-	/*
-	 * DUPLICATED from FormatterElement, since it is package visible only
-	 */
-	private static JUnitResultFormatter createFormatter(String classname, File outfile) throws BuildException {
-		OutputStream out = System.out;
-
-		if (classname == null)
-			throw new BuildException("you must specify type or classname"); //$NON-NLS-1$
-		Class f = null;
-		try {
-			f = EclipseTestRunner.class.getClassLoader().loadClass(classname);
-		} catch (ClassNotFoundException e) {
-			throw new BuildException(e);
-		}
-
-		Object o = null;
-		try {
-			o = f.newInstance();
-		} catch (InstantiationException e) {
-			throw new BuildException(e);
-		} catch (IllegalAccessException e) {
-			throw new BuildException(e);
-		}
-
-		if (!(o instanceof JUnitResultFormatter))
-			throw new BuildException(classname + " is not a JUnitResultFormatter"); //$NON-NLS-1$
-
-		JUnitResultFormatter r = (JUnitResultFormatter) o;
-
-		if (outfile != null)
-			try {
-				out = new FileOutputStream(outfile);
-			} catch (java.io.IOException e) {
-				throw new BuildException(e);
-			}
-			r.setOutput(out);
-			return r;
-	}
-
-	private void sendOutAndErr(String out, String err) {
-		for (int i = 0; i < formatters.size(); i++) {
-			JUnitResultFormatter formatter = ((JUnitResultFormatter) formatters.elementAt(i));
-
-			formatter.setSystemOutput(out);
-			formatter.setSystemError(err);
-		}
-	}
-
-	protected void handleOutput(String line) {
-		if (fSystemOut != null)
-			fSystemOut.println(line);
-	}
-
-	protected void handleErrorOutput(String line) {
-		if (fSystemError != null)
-			fSystemError.println(line);
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/UITestApplication.java b/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/UITestApplication.java
deleted file mode 100644
index 8f8543f..0000000
--- a/org.eclipse.swtbot.eclipse.junit3.headless/src/org/eclipse/swtbot/eclipse/junit3/headless/UITestApplication.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.junit3.headless;
-
-import java.io.IOException;
-
-import org.eclipse.core.runtime.Assert;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IProduct;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.equinox.app.IApplication;
-import org.eclipse.equinox.app.IApplicationContext;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.testing.ITestHarness;
-import org.eclipse.ui.testing.TestableObject;
-
-/**
- * This is just a copy of org.eclipse.test.UITestApplication from the eclipse test plugin, with {@link #runTests()}
- * overridden to return a custom {@link EclipseTestRunner} that runs in a non-UI thread. A Workbench that runs a test
- * suite specified in the command line arguments.
- */
-public class UITestApplication implements IApplication, ITestHarness {
-
-	private static final String	DEFAULT_APP_3_0	= "org.eclipse.ui.ide.workbench";	//$NON-NLS-1$
-
-	private TestableObject		fTestableObject;
-	private IApplication		fApplication;
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app.IApplicationContext)
-	 */
-	public Object start(IApplicationContext context) throws Exception {
-		String[] args = (String[]) context.getArguments().get(IApplicationContext.APPLICATION_ARGS);
-		Object app = getApplication(args);
-
-		Assert.isNotNull(app);
-
-		fTestableObject = PlatformUI.getTestableObject();
-		fTestableObject.setTestHarness(this);
-		if (app instanceof IApplication) {
-			fApplication = (IApplication) app;
-			return fApplication.start(context);
-		}
-		throw new IllegalArgumentException("Could not execute application " + getApplicationToRun(args));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.equinox.app.IApplication#stop()
-	 */
-	public void stop() {
-		if (fApplication != null)
-			fApplication.stop();
-	}
-
-	/*
-	 * return the application to run, or null if not even the default application is found.
-	 */
-	private Object getApplication(String[] args) throws CoreException {
-		// Find the name of the application as specified by the PDE JUnit launcher.
-		// If no application is specified, the 3.0 default workbench application
-		// is returned.
-		IExtension extension = Platform.getExtensionRegistry().getExtension(Platform.PI_RUNTIME, Platform.PT_APPLICATIONS,
-				getApplicationToRun(args));
-
-		Assert.isNotNull(extension);
-
-		// If the extension does not have the correct grammar, return null.
-		// Otherwise, return the application object.
-		IConfigurationElement[] elements = extension.getConfigurationElements();
-		if (elements.length > 0) {
-			IConfigurationElement[] runs = elements[0].getChildren("run"); //$NON-NLS-1$
-			if (runs.length > 0) {
-				Object runnable = runs[0].createExecutableExtension("class"); //$NON-NLS-1$
-				if (runnable instanceof IApplication)
-					return runnable;
-			}
-		}
-		return null;
-	}
-
-	/*
-	 * The -testApplication argument specifies the application to be run. If the PDE JUnit launcher did not set this
-	 * argument, then return the name of the default application. In 3.0, the default is the
-	 * "org.eclipse.ui.ide.worbench" application.
-	 */
-	private String getApplicationToRun(String[] args) {
-		IProduct product = Platform.getProduct();
-		if (product != null)
-			return product.getApplication();
-		for (int i = 0; i < args.length; i++)
-			if (args[i].equals("-testApplication") && (i < args.length - 1)) //$NON-NLS-1$
-				return args[i + 1];
-		return DEFAULT_APP_3_0;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.testing.ITestHarness#runTests()
-	 */
-	public void runTests() {
-		fTestableObject.testingStarting();
-		try {
-			EclipseTestRunner.run(Platform.getCommandLineArgs());
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-		fTestableObject.testingFinished();
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/.project b/org.eclipse.swtbot.eclipse.junit4.headless/.project
deleted file mode 100644
index 867b3f4..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.eclipse.junit4.headless</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.eclipse.junit4.headless/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c7ff7f4..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Tue Dec 16 23:22:49 IST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/JUNIT.XSL b/org.eclipse.swtbot.eclipse.junit4.headless/JUNIT.XSL
deleted file mode 100755
index b426572..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/JUNIT.XSL
+++ /dev/null
@@ -1,455 +0,0 @@
-<xsl:stylesheet	xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
-<xsl:output method="html" indent="yes"/>
-<xsl:decimal-format decimal-separator="." grouping-separator="," />
-
-<xsl:template match="testsuites">
-	<HTML>
-		<HEAD>
-    <style type="text/css">
-      body {
-      	font:normal 68% verdana,arial,helvetica;
-      	color:#000000;
-      }
-      table tr td, table tr th {
-          font-size: 68%;
-      }
-      table.details tr th{
-      	font-weight: bold;
-      	text-align:left;
-      	background:#a6caf0;
-      }
-      table.details tr td{
-      	background:#eeeee0;
-      }
-      
-      p {
-      	line-height:1.5em;
-      	margin-top:0.5em; margin-bottom:1.0em;
-      }
-      h1 {
-      	margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
-      }
-      h2 {
-      	margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
-      }
-      h3 {
-      	margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
-      }
-      h4 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      h5 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      h6 {
-      	margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
-      }
-      .Error {
-      	font-weight:bold; color:red;
-      }
-      .Failure {
-      	font-weight:bold; color:purple;
-      }
-      .Properties {
-      	text-align:right;
-      }
-      </style>
-      <script language="JavaScript">
-        var TestCases = new Array();
-        var cur;
-        <xsl:for-each select="./testsuite">      
-            <xsl:apply-templates select="properties"/>
-        </xsl:for-each>
-
-       </script>
-       <script language="JavaScript"><![CDATA[
-        function displayProperties (name) {
-          var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
-          var doc = win.document.open();
-          doc.write("<html><head><title>Properties of " + name + "</title>");
-          doc.write("<style>")
-          doc.write("body {font:normal 68% verdana,arial,helvetica;	color:#000000; }");
-          doc.write("table tr td, table tr th { font-size: 68%; }");
-          doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
-          doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
-          doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
-          doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
-          doc.write("</style>");
-          doc.write("</head><body>");
-          doc.write("<h3>Properties of " + name + "</h3>");
-          doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
-          doc.write("<table class='properties'>");
-          doc.write("<tr><th>Name</th><th>Value</th></tr>");
-          for (prop in TestCases[name]) {
-            doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
-          }
-          doc.write("</table>");
-          doc.write("</body></html>");
-          doc.close();
-          win.focus();
-        }
-      ]]>  
-      </script>
-		</HEAD>
-		<body>
-			<a name="top"></a>
-			<xsl:call-template name="pageHeader"/>	
-			
-			<!-- Summary part -->
-			<xsl:call-template name="summary"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- Package List part -->
-			<xsl:call-template name="packagelist"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- For each package create its part -->
-			<xsl:call-template name="packages"/>
-			<hr size="1" width="95%" align="left"/>
-			
-			<!-- For each class create the  part -->
-			<xsl:call-template name="classes"/>
-			
-		</body>
-	</HTML>
-</xsl:template>
-	
-	
-	
-	<!-- ================================================================== -->
-	<!-- Write a list of all packages with an hyperlink to the anchor of    -->
-	<!-- of the package name.                                               -->
-	<!-- ================================================================== -->
-	<xsl:template name="packagelist">	
-		<h2>Packages</h2>
-		Note: package statistics are not computed recursively, they only sum up all of its testsuites numbers.
-		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-			<xsl:call-template name="testsuite.test.header"/>
-			<!-- list all packages recursively -->
-			<xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
-				<xsl:sort select="@package"/>
-				<xsl:variable name="testsuites-in-package" select="/testsuites/testsuite[./@package = current()/@package]"/>
-				<xsl:variable name="testCount" select="sum($testsuites-in-package/@tests)"/>
-				<xsl:variable name="errorCount" select="sum($testsuites-in-package/@errors)"/>
-				<xsl:variable name="failureCount" select="sum($testsuites-in-package/@failures)"/>
-				<xsl:variable name="timeCount" select="sum($testsuites-in-package/@time)"/>
-				
-				<!-- write a summary for the package -->
-				<tr valign="top">
-					<!-- set a nice color depending if there is an error/failure -->
-					<xsl:attribute name="class">
-						<xsl:choose>
-							<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
-							<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
-						</xsl:choose>
-					</xsl:attribute>
-					<td><a href="#{@package}"><xsl:value-of select="@package"/></a></td>
-					<td><xsl:value-of select="$testCount"/></td>
-					<td><xsl:value-of select="$errorCount"/></td>
-					<td><xsl:value-of select="$failureCount"/></td>
-					<td>
-					<xsl:call-template name="display-time">
-						<xsl:with-param name="value" select="$timeCount"/>
-					</xsl:call-template>
-					</td>
-				</tr>
-			</xsl:for-each>
-		</table>		
-	</xsl:template>
-	
-	
-	<!-- ================================================================== -->
-	<!-- Write a package level report                                       -->
-	<!-- It creates a table with values from the document:                  -->
-	<!-- Name | Tests | Errors | Failures | Time                            -->
-	<!-- ================================================================== -->
-	<xsl:template name="packages">
-		<!-- create an anchor to this package name -->
-		<xsl:for-each select="/testsuites/testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
-			<xsl:sort select="@package"/>
-				<a name="{@package}"></a>
-				<h3>Package <xsl:value-of select="@package"/></h3>
-				
-				<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-					<xsl:call-template name="testsuite.test.header"/>
-			
-					<!-- match the testsuites of this package -->
-					<xsl:apply-templates select="/testsuites/testsuite[./@package = current()/@package]" mode="print.test"/>
-				</table>
-				<a href="#top">Back to top</a>
-				<p/>
-				<p/>
-		</xsl:for-each>
-	</xsl:template>
-	
-	<xsl:template name="classes">
-		<xsl:for-each select="testsuite">
-			<xsl:sort select="@name"/>
-			<!-- create an anchor to this class name -->
-			<a name="{@name}"></a>
-			<h3>TestCase <xsl:value-of select="@name"/></h3>
-			
-			<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-			  <xsl:call-template name="testcase.test.header"/>
-			  <!--
-			  test can even not be started at all (failure to load the class)
-			  so report the error directly
-			  -->
-				<xsl:if test="./error">
-					<tr class="Error">
-						<td colspan="4"><xsl:apply-templates select="./error"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:apply-templates select="./testcase" mode="print.test"/>
-			</table>
-            <div class="Properties">
-                <a>
-			        <xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
-			        Properties &gt;&gt;
-			    </a>
-            </div>
-			<p/>
-			
-			<a href="#top">Back to top</a>
-		</xsl:for-each>
-	</xsl:template>
-	
-	<xsl:template name="summary">
-		<h2>Summary</h2>
-		<xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
-		<xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
-		<xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
-		<xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
-		<xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
-		<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
-		<tr valign="top">
-			<th>Tests</th>
-			<th>Failures</th>
-			<th>Errors</th>
-			<th>Success rate</th>
-			<th>Time</th>
-		</tr>
-		<tr valign="top">
-			<xsl:attribute name="class">
-				<xsl:choose>
-					<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
-					<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
-				</xsl:choose>
-			</xsl:attribute>
-			<td><xsl:value-of select="$testCount"/></td>
-			<td><xsl:value-of select="$failureCount"/></td>
-			<td><xsl:value-of select="$errorCount"/></td>
-			<td>
-				<xsl:call-template name="display-percent">
-					<xsl:with-param name="value" select="$successRate"/>
-				</xsl:call-template>
-			</td>
-			<td>
-				<xsl:call-template name="display-time">
-					<xsl:with-param name="value" select="$timeCount"/>
-				</xsl:call-template>
-			</td>
-
-		</tr>
-		</table>
-		<table border="0" width="95%">
-		<tr>
-		<td	style="text-align: justify;">
-		Note: <i>failures</i> are anticipated and checked for with assertions while <i>errors</i> are unanticipated.
-		</td>
-		</tr>
-		</table>
-	</xsl:template>
-	
-  <!--
-   Write properties into a JavaScript data structure.
-   This is based on the original idea by Erik Hatcher (erik@hatcher.net)
-   -->
-  <xsl:template match="properties">
-    cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
-  	<xsl:for-each select="property">
-    <xsl:sort select="@name"/>
-        cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
-  	</xsl:for-each>
-  </xsl:template>
-	
-<!-- Page HEADER -->
-<xsl:template name="pageHeader">
-	<h1>Unit Test Results</h1>
-	<table width="100%">
-	<tr>
-		<td align="left"></td>
-		<td align="right">Designed for use with <a href='http://www.junit.org'>JUnit</a> and <a href='http://ant.apache.org'>Ant</a>.</td>
-	</tr>
-	</table>
-	<hr size="1"/>
-</xsl:template>
-
-<xsl:template match="testsuite" mode="header">
-	<tr valign="top">
-		<th width="80%">Name</th>
-		<th>Tests</th>
-		<th>Errors</th>
-		<th>Failures</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-<!-- class header -->
-<xsl:template name="testsuite.test.header">
-	<tr valign="top">
-		<th width="80%">Name</th>
-		<th>Tests</th>
-		<th>Errors</th>
-		<th>Failures</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-<!-- method header -->
-<xsl:template name="testcase.test.header">
-	<tr valign="top">
-		<th>Name</th>
-		<th>Status</th>
-		<th width="80%">Type</th>
-		<th nowrap="nowrap">Time(s)</th>
-	</tr>
-</xsl:template>
-
-
-<!-- class information -->
-<xsl:template match="testsuite" mode="print.test">
-	<tr valign="top">
-		<!-- set a nice color depending if there is an error/failure -->
-		<xsl:attribute name="class">
-			<xsl:choose>
-				<xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
-				<xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
-			</xsl:choose>
-		</xsl:attribute>
-	
-		<!-- print testsuite information -->
-		<td><a href="#{@name}"><xsl:value-of select="@name"/></a></td>
-		<td><xsl:value-of select="@tests"/></td>
-		<td><xsl:value-of select="@errors"/></td>
-		<td><xsl:value-of select="@failures"/></td>
-		<td>
-			<xsl:call-template name="display-time">
-				<xsl:with-param name="value" select="@time"/>
-			</xsl:call-template>
-		</td>
-	</tr>
-</xsl:template>
-
-<xsl:template match="testcase" mode="print.test">
-	<tr valign="top">
-		<xsl:attribute name="class">
-			<xsl:choose>
-				<xsl:when test="failure | error">Error</xsl:when>
-			</xsl:choose>
-		</xsl:attribute>
-		<td><xsl:value-of select="@name"/></td>
-		<xsl:choose>
-			<xsl:when test="failure">
-				<td>Failure</td>
-				<td><xsl:apply-templates select="failure"/></td>
-			</xsl:when>
-			<xsl:when test="error">
-				<td>Error</td>
-				<td><xsl:apply-templates select="error"/></td>
-			</xsl:when>
-			<xsl:otherwise>
-				<td>Success</td>
-				<td></td>
-			</xsl:otherwise>
-		</xsl:choose>
-		<td>
-			<xsl:call-template name="display-time">
-				<xsl:with-param name="value" select="@time"/>
-			</xsl:call-template>
-		</td>
-	</tr>
-</xsl:template>
-
-
-<xsl:template match="failure">
-	<xsl:call-template name="display-failures"/>
-</xsl:template>
-
-<xsl:template match="error">
-	<xsl:call-template name="display-failures"/>
-</xsl:template>
-
-<!-- Style for the error and failure in the tescase template -->
-<xsl:template name="display-failures">
-	<xsl:choose>
-		<xsl:when test="not(@message)">N/A</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="@message"/>
-		</xsl:otherwise>
-	</xsl:choose>
-	<!-- display the stacktrace -->
-	<code>
-		<p/>
-		<xsl:call-template name="br-replace">
-			<xsl:with-param name="word" select="."/>
-		</xsl:call-template>
-	</code>
-	<!-- the later is better but might be problematic for non-21" monitors... -->
-	<!--pre><xsl:value-of select="."/></pre-->
-</xsl:template>
-
-<xsl:template name="JS-escape">
-	<xsl:param name="string"/>
-	<xsl:choose><!-- something isn't right here, basically all single quotes need to be replaced with backslash-single-quote
-		<xsl:when test="contains($string,'&apos;')">
-			<xsl:value-of select="substring-before($string,'&apos;')"/>
-			\&apos;
-			<xsl:call-template name="JS-escape">
-				<xsl:with-param name="string" select="substring-after($string,'&apos;')"/>
-			</xsl:call-template>
-		</xsl:when> -->
-		<xsl:when test="contains($string,'\')">
-			<xsl:value-of select="substring-before($string,'\')"/>\\<xsl:call-template name="JS-escape">
-				<xsl:with-param name="string" select="substring-after($string,'\')"/>
-			</xsl:call-template>
-		</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="$string"/>
-		</xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-
-<!--
-	template that will convert a carriage return into a br tag
-	@param word the text from which to convert CR to BR tag
--->
-<xsl:template name="br-replace">
-	<xsl:param name="word"/>
-	<xsl:choose>
-		<xsl:when test="contains($word,'&#xA;')">
-			<xsl:value-of select="substring-before($word,'&#xA;')"/>
-			<br/>
-			<xsl:call-template name="br-replace">
-				<xsl:with-param name="word" select="substring-after($word,'&#xA;')"/>
-			</xsl:call-template>
-		</xsl:when>
-		<xsl:otherwise>
-			<xsl:value-of select="$word"/>
-		</xsl:otherwise>
-	</xsl:choose>
-</xsl:template>
-
-<xsl:template name="display-time">
-	<xsl:param name="value"/>
-	<xsl:value-of select="format-number($value,'0.000')"/>
-</xsl:template>
-
-<xsl:template name="display-percent">
-	<xsl:param name="value"/>
-	<xsl:value-of select="format-number($value,'0.00%')"/>
-</xsl:template>
-
-</xsl:stylesheet>
-
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/LICENSE.EPL b/org.eclipse.swtbot.eclipse.junit4.headless/LICENSE.EPL
deleted file mode 100644
index 3d967ae..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/LICENSE.EPL
+++ /dev/null
@@ -1,70 +0,0 @@
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-i) changes to the Program, and
-ii) additions to the Program;
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-b) its license agreement:
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-b) a copy of this Agreement must be included with each copy of the Program.
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.junit4.headless/META-INF/MANIFEST.MF
deleted file mode 100644
index ba80138..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Headless JUnit4 Launch Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.eclipse.junit4.headless;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.swtbot.eclipse.junit4.headless
-Import-Package: junit.framework;version="4.3.0",
- org.apache.tools.ant,
- org.apache.tools.ant.taskdefs.optional.junit,
- org.eclipse.core.runtime;version="3.4.0",
- org.eclipse.equinox.app;version="1.0.0",
- org.eclipse.osgi.util;version="1.1.0",
- org.eclipse.swt.widgets,
- org.eclipse.ui,
- org.eclipse.ui.testing,
- org.osgi.framework;version="1.4.0"
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/about.html b/org.eclipse.swtbot.eclipse.junit4.headless/about.html
deleted file mode 100644
index 88cfbc9..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>December 2nd, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/build.properties b/org.eclipse.swtbot.eclipse.junit4.headless/build.properties
deleted file mode 100644
index 6d79d9c..0000000
--- a/org.eclipse.swtbot.eclipse.junit4.headless/build.properties
+++ /dev/null
@@ -1,29 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-bin.includes = META-INF/,\
-               plugin.xml,\
-               library.xml,\
-               about.html,\
-               LICENSE.EPL,\
-               src/,\
-               .,\
-               JUNIT.XSL
-src.includes = src/,\
-               plugin.xml,\
-               library.xml,\
-               build.properties,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
-               META-INF/,\
-               about.html,\
-               .settings/
-source.. = src/
diff --git a/org.eclipse.swtbot.eclipse.spy/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.spy/META-INF/MANIFEST.MF
index 7a1fd15..741f714 100644
--- a/org.eclipse.swtbot.eclipse.spy/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.spy/META-INF/MANIFEST.MF
@@ -2,15 +2,15 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Eclipse Spy (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.spy;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-Activator: org.eclipse.swtbot.eclipse.spy.Activator
 Bundle-ActivationPolicy: lazy
 Bundle-ClassPath: .
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Export-Package: org.eclipse.swtbot.eclipse.spy,
  org.eclipse.swtbot.eclipse.spy.views
-Import-Package: org.apache.log4j;version="1.2.12",
+Import-Package: org.apache.log4j;version="[1.2.13,1.3.0)",
  org.eclipse.core.commands.common,
  org.eclipse.core.runtime;version="3.4.0",
  org.eclipse.jface.action,
@@ -29,7 +29,5 @@
  org.eclipse.swtbot.swt.finder.utils,
  org.eclipse.swtbot.swt.finder.waits,
  org.eclipse.swtbot.swt.finder.widgets,
- org.eclipse.ui.part,
- org.eclipse.ui.plugin,
- org.hamcrest;version="1.1.0",
  org.osgi.framework;version="1.4.0"
+Require-Bundle: org.eclipse.ui.workbench;bundle-version="3.6.0"
diff --git a/org.eclipse.swtbot.eclipse.spy/build.properties b/org.eclipse.swtbot.eclipse.spy/build.properties
index 1b4ab79..0992a63 100644
--- a/org.eclipse.swtbot.eclipse.spy/build.properties
+++ b/org.eclipse.swtbot.eclipse.spy/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -19,12 +19,6 @@
                LICENSE.EPL,\
                src/
 jars.compile.order = .
-src.includes = src/,\
-               plugin.xml,\
-               icons/,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath,\
+src.includes = icons/,\
                about.html,\
                LICENSE.EPL
diff --git a/org.eclipse.swtbot.eclipse.spy/plugin.xml b/org.eclipse.swtbot.eclipse.spy/plugin.xml
index 628bbc9..66aed8f 100644
--- a/org.eclipse.swtbot.eclipse.spy/plugin.xml
+++ b/org.eclipse.swtbot.eclipse.spy/plugin.xml
@@ -16,16 +16,4 @@
             id="org.eclipse.swtbot.eclipse.spy.views.EclipseSpyView">
       </view>
    </extension>
-   <extension
-         point="org.eclipse.ui.perspectiveExtensions">
-      <perspectiveExtension
-            targetID="org.eclipse.jdt.ui.JavaPerspective">
-         <view
-               id="org.eclipse.swtbot.eclipse.spy.views.EclipseSpyView"
-               minimized="false"
-               relationship="stack"
-               relative="org.eclipse.ui.views.TaskList">
-         </view>
-      </perspectiveExtension>
-   </extension>
 </plugin>
diff --git a/org.eclipse.swtbot.eclipse.spy/pom.xml b/org.eclipse.swtbot.eclipse.spy/pom.xml
new file mode 100644
index 0000000..539ea13
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.spy/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.spy</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseSpy.java b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseSpy.java
index a44bbe7..5e12928 100644
--- a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseSpy.java
+++ b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseSpy.java
@@ -67,7 +67,11 @@
 	private void createOutputText() {
 		output = new StyledText(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
 		output.setLayoutData(new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true));
-		output.setFont(new Font(Display.getCurrent(), "Courier New", 10, SWT.NONE)); //$NON-NLS-1$
+		output.setText("To toggle, or freeze info on a particular control, press CTRL+SHIFT: \n");
+		if (isMac()){
+			output.setFont(new Font(Display.getCurrent(), "Monaco", 11, SWT.NONE)); //$NON-NLS-1$
+		}else
+			output.setFont(new Font(Display.getCurrent(), "Courier New", 10, SWT.NONE)); //$NON-NLS-1$
 	}
 
 	private void hookAccelerator() {
@@ -86,6 +90,11 @@
 		// parent.getDisplay().addFilter(SWT.KeyDown, new SWTBotExecutionListener());
 	}
 
+	private static boolean isMac() {
+		String swtPlatform = SWT.getPlatform();
+		return ("carbon".equals(swtPlatform) || "cocoa".equals(swtPlatform));
+	}
+
 	private void initialize(Display display) {
 		createOutputText();
 		createActionMonitor();
diff --git a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseWidgetTracker.java b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseWidgetTracker.java
index eba8d00..7c112fe 100644
--- a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseWidgetTracker.java
+++ b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/EclipseWidgetTracker.java
@@ -190,6 +190,8 @@
 
 	private void getInformation(Control control, StringBuffer buf) {
 
+		getToggleInformation(control, buf);
+		
 		getLocationInformation(control, buf);
 
 		getLayoutInformation(control, buf);
@@ -202,6 +204,10 @@
 
 	}
 
+	private void getToggleInformation(Control control, StringBuffer buf) {
+		buf.append("To toggle, or freeze info on a particular control, press CTRL+SHIFT: \n").append("\n\n"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
 	String getStyle(Widget w) {
 
 		int style = w.getStyle();
diff --git a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/PlayBackThread.java b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/PlayBackThread.java
deleted file mode 100644
index eeba370..0000000
--- a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/PlayBackThread.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.spy;
-
-
-
-import org.apache.log4j.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swtbot.eclipse.finder.SWTEclipseBot;
-import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditor;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.waits.Conditions;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class PlayBackThread extends Thread {
-
-	private static final Logger	log	= Logger.getLogger(PlayBackThread.class);
-	/** the e */
-	private final Event			e;
-
-	public PlayBackThread(Event e) {
-		super("PlayBackThread"); //$NON-NLS-1$
-		this.e = e;
-	}
-
-	public void run() {
-		log.debug("running..."); //$NON-NLS-1$
-
-		try {
-			perform();
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-
-	}
-
-	/**
-	 * @throws WidgetNotFoundException
-	 */
-	private void perform() throws Exception {
-		Display display = e.display;
-		SWTEclipseBot bot = new SWTEclipseBot();
-
-		createJavaProject(bot);
-		createJavaClass(bot);
-		Thread.sleep(1000);
-		SWTBotEclipseEditor editor = bot.editor("HelloWorld.java"); //$NON-NLS-1$
-
-		Thread.sleep(1000);
-		editor.notifyKeyboardEvent(SWT.CTRL, '.');
-		editor.quickfix("Add unimplemented methods"); //$NON-NLS-1$
-
-		editor.navigateTo(7, 0);
-		editor.autoCompleteProposal("sys", "sysout - print to standard out"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		editor.typeText("\"Hello World\""); //$NON-NLS-1$
-
-		editor.navigateTo(3, 0);
-		editor.autoCompleteProposal("main", "main - main method"); //$NON-NLS-1$ //$NON-NLS-2$
-
-		editor.typeText("new Thread (new HelloWorld ());"); //$NON-NLS-1$
-		if (true)
-			return;
-		editor.notifyKeyboardEvent(SWT.CTRL, '2');
-		editor.notifyKeyboardEvent(SWT.NONE, 'L');
-		editor.notifyKeyboardEvent(SWT.NONE, '\n');
-
-		editor.typeText("\n"); //$NON-NLS-1$
-		editor.typeText("thread.start();\n"); //$NON-NLS-1$
-		editor.typeText("thread.join();"); //$NON-NLS-1$
-		editor.quickfix("Add throws declaration"); //$NON-NLS-1$
-		editor.notifyKeyboardEvent(SWT.NONE, (char) 27);
-		editor.notifyKeyboardEvent(SWT.NONE, '\n');
-
-		editor.notifyKeyboardEvent(SWT.CTRL, 's');
-
-		editor.notifyKeyboardEvent(SWT.ALT | SWT.SHIFT, 'x');
-		editor.notifyKeyboardEvent(SWT.NONE, 'j');
-
-		try {
-			Thread.sleep(1000);
-		} catch (InterruptedException e1) {
-			e1.printStackTrace();
-		}
-	}
-
-	/**
-	 * @param bot
-	 */
-	private void createJavaClass(SWTEclipseBot bot) throws Exception {
-		bot.menu("File").menu("New").menu("Class").click(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		bot.shell("New Java Class").activate(); //$NON-NLS-1$
-		bot.textWithLabel("Name:").setText("HelloWorld"); //$NON-NLS-1$ //$NON-NLS-2$
-		bot.textWithLabel("Package:").setText("com.helloworld"); //$NON-NLS-1$ //$NON-NLS-2$
-		implementsInterface(bot, "java.lang.Runnable"); //$NON-NLS-1$
-		bot.checkBox("Inherited abstract methods").click(); //$NON-NLS-1$
-		bot.button("Finish").click(); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param bot
-	 */
-	private void implementsInterface(final SWTEclipseBot bot, String interfaceClass) throws Exception {
-		bot.button("Add...").click(); //$NON-NLS-1$
-		bot.shell("Implemented Interfaces Selection").activate(); //$NON-NLS-1$
-		bot.textWithLabel("Choose interfaces:").setText(interfaceClass); //$NON-NLS-1$
-		bot.waitUntil(Conditions.tableHasRows(bot.table(), 1));
-		bot.button("OK").click(); //$NON-NLS-1$
-		bot.shell("New Java Class").activate(); //$NON-NLS-1$
-	}
-
-	/**
-	 * @param bot
-	 */
-	private void createJavaProject(SWTBot bot) throws Exception {
-		bot.menu("File").menu("New").menu("Java Project").click(); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-		bot.shell("New Java Project").activate(); //$NON-NLS-1$
-		bot.textWithLabel("Project name:").setText("MyProject"); //$NON-NLS-1$ //$NON-NLS-2$
-		bot.button("Finish").click(); //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/SWTBotExecutionListener.java b/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/SWTBotExecutionListener.java
deleted file mode 100644
index 17c8ddd..0000000
--- a/org.eclipse.swtbot.eclipse.spy/src/org/eclipse/swtbot/eclipse/spy/SWTBotExecutionListener.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.spy;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotExecutionListener implements Listener {
-	public void handleEvent(final Event e) {
-		if (e.stateMask == SWT.CTRL && e.keyCode == SWT.SHIFT) {
-			Thread thread = new PlayBackThread(e);
-			thread.start();
-		}
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.test/.project b/org.eclipse.swtbot.eclipse.test.junit/.project
similarity index 86%
rename from org.eclipse.swtbot.eclipse.test/.project
rename to org.eclipse.swtbot.eclipse.test.junit/.project
index cc43f93..139236f 100644
--- a/org.eclipse.swtbot.eclipse.test/.project
+++ b/org.eclipse.swtbot.eclipse.test.junit/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.eclipse.test</name>
+	<name>org.eclipse.swtbot.eclipse.test.junit</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.eclipse.test.junit/build.properties b/org.eclipse.swtbot.eclipse.test.junit/build.properties
new file mode 100644
index 0000000..275f92a
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.test.junit/build.properties
@@ -0,0 +1,10 @@
+bin.includes = feature.xml,\
+               license.html,\
+               epl-v10.html,\
+               feature.properties
+src.includes = license.html,\
+               feature.xml,\
+               epl-v10.html,\
+               build.properties,\
+               .project,\
+               feature.properties
diff --git a/org.eclipse.swtbot.eclipse.test/epl-v10.html b/org.eclipse.swtbot.eclipse.test.junit/epl-v10.html
similarity index 100%
rename from org.eclipse.swtbot.eclipse.test/epl-v10.html
rename to org.eclipse.swtbot.eclipse.test.junit/epl-v10.html
diff --git a/org.eclipse.swtbot.eclipse.test.junit/feature.properties b/org.eclipse.swtbot.eclipse.test.junit/feature.properties
new file mode 100644
index 0000000..b3dd40d
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.test.junit/feature.properties
@@ -0,0 +1,140 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c) 2007-2010 Ketan Padegaonkar and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	Ketan Padegaonkar - initial API and implementation
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.eclipse.test.junit/feature.xml b/org.eclipse.swtbot.eclipse.test.junit/feature.xml
new file mode 100644
index 0000000..a37bf95
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.test.junit/feature.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.swtbot.eclipse.test.junit"
+      label="SWTBot JUnit Headless launchers for Eclipse (incubation)"
+      version="2.0.5.qualifier"
+      provider-name="Eclipse.org">
+
+   <description url="http://eclipse.org/">
+      SWTBot Eclipse Headless Launchers to launch tests from within ant (incubation)
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import plugin="org.eclipse.core.runtime.compatibility"/>
+      <import plugin="org.apache.ant"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.equinox.app"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.junit"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.swtbot.ant.junit"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         fragment="true"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.swtbot.eclipse.junit.headless"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+</feature>
diff --git a/org.eclipse.swtbot.eclipse.test.junit/license.html b/org.eclipse.swtbot.eclipse.test.junit/license.html
new file mode 100644
index 0000000..c184ca3
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.test.junit/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.swtbot.eclipse.test.junit/pom.xml b/org.eclipse.swtbot.eclipse.test.junit/pom.xml
new file mode 100644
index 0000000..d1ec3de
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.test.junit/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.test.junit</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.test/.project b/org.eclipse.swtbot.eclipse.test.junit4/.project
similarity index 86%
copy from org.eclipse.swtbot.eclipse.test/.project
copy to org.eclipse.swtbot.eclipse.test.junit4/.project
index cc43f93..973c229 100644
--- a/org.eclipse.swtbot.eclipse.test/.project
+++ b/org.eclipse.swtbot.eclipse.test.junit4/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.eclipse.test</name>
+	<name>org.eclipse.swtbot.eclipse.test.junit4</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.eclipse.test/build.properties b/org.eclipse.swtbot.eclipse.test/build.properties
deleted file mode 100644
index 0e97b85..0000000
--- a/org.eclipse.swtbot.eclipse.test/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-bin.includes = feature.xml,\
-               license.html,\
-               epl-v10.html
-src.includes = license.html,\
-               feature.xml,\
-               epl-v10.html,\
-               build.properties,\
-               .project
diff --git a/org.eclipse.swtbot.eclipse.test/feature.xml b/org.eclipse.swtbot.eclipse.test/feature.xml
deleted file mode 100644
index baaf0d5..0000000
--- a/org.eclipse.swtbot.eclipse.test/feature.xml
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.swtbot.eclipse.test"
-      label="SWTBot Headless launchers for Eclipse (incubation)"
-      version="2.0.0.qualifier"
-      provider-name="Eclipse.org">
-
-   <description url="http://eclipse.org/">
-      SWTBot Eclipse Headless Launchers to launch tests from within ant (incubation)
-   </description>
-
-   <copyright url="http://eclipse.org/">
-      Copyright (c) 2007, 2008 Ketan Padegaonkar 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:
-    Ketan Padegaonkar - initial API and implementation
-   </copyright>
-
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-
-Eclipse Foundation Software User Agreement
-March 17, 2005
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-   
-Applicable Licenses
-   
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-   
-* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-  and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
- 
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:
-
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-  
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html) 
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is permitted.
-   
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime.compatibility"/>
-      <import plugin="org.junit"/>
-      <import plugin="org.apache.ant"/>
-      <import plugin="org.junit4"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.equinox.app"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.swtbot.ant.optional.junit3"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swtbot.ant.optional.junit4"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         fragment="true"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swtbot.eclipse.junit3.headless"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.swtbot.eclipse.junit4.headless"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-</feature>
diff --git a/org.eclipse.swtbot.eclipse.test/license.html b/org.eclipse.swtbot.eclipse.test/license.html
deleted file mode 100644
index c6af966..0000000
--- a/org.eclipse.swtbot.eclipse.test/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/org.eclipse.swtbot.eclipse.ui.test/.classpath b/org.eclipse.swtbot.eclipse.ui.test/.classpath
index 64c5e31..ba34924 100644
--- a/org.eclipse.swtbot.eclipse.ui.test/.classpath
+++ b/org.eclipse.swtbot.eclipse.ui.test/.classpath
@@ -3,5 +3,6 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="functional"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/org.eclipse.swtbot.eclipse.ui.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.ui.test/META-INF/MANIFEST.MF
index 62c51a7..9c75be5 100644
--- a/org.eclipse.swtbot.eclipse.ui.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.eclipse.ui.test/META-INF/MANIFEST.MF
@@ -2,10 +2,8 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Eclipse Ui Test Plug-in
 Bundle-SymbolicName: org.eclipse.swtbot.eclipse.ui.test
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.swtbot.eclipse.ui,
- org.eclipse.ui,
- org.junit4,
- org.hamcrest
+Fragment-Host: org.eclipse.swtbot.eclipse.ui
+Require-Bundle: org.eclipse.swtbot.go
diff --git a/org.eclipse.swtbot.eclipse.ui.test/build.properties b/org.eclipse.swtbot.eclipse.ui.test/build.properties
index a060787..74d1625 100644
--- a/org.eclipse.swtbot.eclipse.ui.test/build.properties
+++ b/org.eclipse.swtbot.eclipse.ui.test/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -8,7 +8,8 @@
 # Contributors:
 #     Ketan Padegaonkar - initial API and implementation
 ###############################################################################
-source.. = src/
+source.. = src/,\
+           functional/
 output.. = bin/
 bin.includes = META-INF/,\
                .
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/NullArgument.java b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/AllTests.java
similarity index 64%
rename from org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/NullArgument.java
rename to org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/AllTests.java
index 444bb04..c321230 100644
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/NullArgument.java
+++ b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/AllTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2010 Ketan Padegaonkar 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
@@ -8,18 +8,17 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.methodargs;
+package org.eclipse.swtbot.eclipse.ui.functional;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
 
 /**
- * Represents a 'no arg' argument.
- * 
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
  */
-public class NullArgument extends AbstractSWTBotEventArguments {
-
-	public String asString() {
-		return ""; //$NON-NLS-1$
-	}
+@RunWith(Suite.class)
+@SuiteClasses({ ProjectCreationWizardTest.class })
+public class AllTests {
 
 }
diff --git a/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/ProjectCreationWizardTest.java b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/ProjectCreationWizardTest.java
new file mode 100644
index 0000000..46663be
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/ProjectCreationWizardTest.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.functional;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.eclipse.swtbot.swt.finder.utils.FileUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+@RunWith(SWTBotJunit4ClassRunner.class)
+public class ProjectCreationWizardTest {
+
+	private static SWTWorkbenchBot	bot	= new SWTWorkbenchBot();
+
+	@Test
+	public void canCreateSWTBotProject() throws Exception {
+		new SWTBotProject().create("com.example");
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("com.example");
+		assertTrue(project.exists());
+
+		assertEquals("" +
+				"Manifest-Version: 1.0\n" +
+				"Bundle-ManifestVersion: 2\n" +
+				"Bundle-Name: com.example\n" +
+				"Bundle-SymbolicName: com.example;singleton:=true\n" +
+				"Bundle-Version: 1.0.0.qualifier\n" +
+				"Bundle-ActivationPolicy: lazy\n" +
+				"Bundle-Vendor: ACME Corp.\n" +
+				"Bundle-RequiredExecutionEnvironment: J2SE-1.5\n" +
+				"Require-Bundle: org.eclipse.swtbot.go\n" +
+				"", contentsOf(project, "META-INF/MANIFEST.MF"));
+
+		assertEquals("" +
+				"source.. = src/\n" +
+				"output.. = bin/\n" +
+				"bin.includes = META-INF/,\\\n" +
+				"               .\n" +
+				"", contentsOf(project, "build.properties"));
+
+		assertEquals("" +
+				"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+				"<projectDescription>\n" +
+				"	<name>com.example</name>\n" +
+				"	<comment></comment>\n" +
+				"	<projects>\n" +
+				"	</projects>\n" +
+				"	<buildSpec>\n" +
+				"		<buildCommand>\n" +
+				"			<name>org.eclipse.jdt.core.javabuilder</name>\n" +
+				"			<arguments>\n" +
+				"			</arguments>\n" +
+				"		</buildCommand>\n" +
+				"		<buildCommand>\n" +
+				"			<name>org.eclipse.pde.ManifestBuilder</name>\n" +
+				"			<arguments>\n" +
+				"			</arguments>\n" +
+				"		</buildCommand>\n" +
+				"		<buildCommand>\n" +
+				"			<name>org.eclipse.pde.SchemaBuilder</name>\n" +
+				"			<arguments>\n" +
+				"			</arguments>\n" +
+				"		</buildCommand>\n" +
+				"	</buildSpec>\n" +
+				"	<natures>\n" +
+				"		<nature>org.eclipse.pde.PluginNature</nature>\n" +
+				"		<nature>org.eclipse.jdt.core.javanature</nature>\n" +
+				"	</natures>\n" +
+				"</projectDescription>\n" +
+				"", contentsOf(project, ".project"));
+
+		assertEquals("" +
+						"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+						"<classpath>\n" +
+						"	<classpathentry kind=\"con\" " +
+						"path=\"org.eclipse.jdt.launching.JRE_CONTAINER/" +
+						"org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5\"/>\n" +
+						"	<classpathentry kind=\"con\" path=\"org.eclipse.pde.core.requiredPlugins\"/>\n" +
+						"	<classpathentry kind=\"src\" path=\"src\"/>\n" +
+						"	<classpathentry kind=\"output\" path=\"bin\"/>\n" +
+						"</classpath>\n" +
+						"", contentsOf(project, ".classpath"));
+
+	}
+
+	private String contentsOf(IProject project, String name) throws CoreException {
+		return FileUtils.read(project.getFile(name).getContents());
+	}
+
+	@BeforeClass
+	public static void oneTimeSetup() {
+		List<SWTBotView> views = bot.views();
+		for (SWTBotView view : views) {
+			if (view.getTitle().equals("Welcome"))
+				view.close();
+		}
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/SWTBotProject.java b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/SWTBotProject.java
new file mode 100644
index 0000000..aaf875d
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/functional/org/eclipse/swtbot/eclipse/ui/functional/SWTBotProject.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.functional;
+
+import static org.eclipse.swtbot.swt.finder.waits.Conditions.shellCloses;
+
+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class SWTBotProject {
+
+	private final SWTWorkbenchBot	bot	= new SWTWorkbenchBot();
+
+	public void create(String projectId) {
+		bot.menu("File").menu("New").menu("Project...").click();
+		SWTBotShell shell = bot.shell("New Project");
+		shell.activate();
+
+		bot.tree().expandNode("Other", "New SWTBot Test Plug-in").select();
+		bot.button("Next >").click();
+
+		bot.textWithLabel("Plug-in Name:").setText(projectId);
+		bot.textWithLabel("Plug-in id:").setText(projectId);
+		bot.textWithLabel("Provider:").setText("ACME Corp.");
+		bot.button("Finish").click();
+		bot.waitUntil(shellCloses(shell));
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui.test/pom.xml b/org.eclipse.swtbot.eclipse.ui.test/pom.xml
new file mode 100644
index 0000000..5534b2a
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/pom.xml
@@ -0,0 +1,80 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot.test</groupId>
+	<artifactId>org.eclipse.swtbot.eclipse.ui.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.swtbot</groupId>
+		<artifactId>parent</artifactId>
+		<version>2.0.5-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<properties>
+		<!-- tycho.testArgLine repeated to re-use the configuration for argLine for jacoco agent -->
+		<uitest.vmparams>${tycho.testArgLine} -Xms64m -Xmx1024m -XX:MaxPermSize=128M</uitest.vmparams>
+	</properties>
+	<profiles>
+		<profile>
+			<id>skip-ui-tests</id>
+			<activation>
+				<property>
+					<name>skip-ui-tests</name>
+				</property>
+			</activation>
+			<properties>
+				<maven.test.skip>true</maven.test.skip>
+			</properties>
+		</profile>
+		<profile>
+			<id>macosx</id>
+			<activation>
+				<os>
+					<name>mac os x</name>
+					<family>mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams} -XstartOnFirstThread</ui.test.vmargs>
+			</properties>
+		</profile>
+		<profile>
+			<id>other-os</id>
+			<activation>
+				<os>
+					<name>not-mac</name>
+					<family>!mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams}</ui.test.vmargs>
+			</properties>
+		</profile>
+	</profiles>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<argLine>${ui.test.vmargs}</argLine>
+					<useUIHarness>true</useUIHarness>
+					<useUIThread>false</useUIThread>
+					<product>org.eclipse.sdk.ide</product>
+					<application>org.eclipse.ui.ide.workbench</application>
+					<testSuite>org.eclipse.swtbot.eclipse.ui.test</testSuite>
+					<testClass>org.eclipse.swtbot.eclipse.ui.functional.AllTests</testClass>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroupTest.java b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroupTest.java
new file mode 100644
index 0000000..3178adb
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroupTest.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.launcher;
+
+import org.junit.Test;
+
+public class SWTBotJUnitTabGroupTest {
+
+	@Test
+	public void theFirstTabIsTheSWTBotJUnitLaunchTab() throws Exception {
+		SWTBotJUnitTabGroup tabGroup = new SWTBotJUnitTabGroup();
+		tabGroup.createTabs(null, null);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreatorTest.java b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreatorTest.java
new file mode 100644
index 0000000..4117c52
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreatorTest.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.project;
+
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.junit.Test;
+
+public class ProjectCreatorTest {
+
+	@Test
+	public void canCreateAProject() throws Exception {
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		ProjectCreator creator = new ProjectCreator("org.eclipse.swtbot.testplugin", "test plugin", "1.2.3.4", "Eclipse.org", root);
+		creator.create();
+
+		IProject project = root.getProject("org.eclipse.swtbot.testplugin");
+		IFolder metaInf = project.getFolder("META-INF");
+		IFolder src = project.getFolder("src");
+
+		assertTrue(project.exists());
+		assertTrue(src.exists());
+		assertTrue(metaInf.exists());
+	}
+}
diff --git a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/TemplatizerTest.java b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/TemplatizerTest.java
new file mode 100644
index 0000000..9dfe20c
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/project/TemplatizerTest.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.project;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+
+public class TemplatizerTest {
+
+	@Test
+	public void templatizesAllParams() throws Exception {
+		Templatizer templatizer = new Templatizer("org.eclipse.swtbot.example", "foo plugin", "1.2.3.4", "Eclipse.org");
+		String templatize = templatizer.templatize("" +
+				"Manifest-Version: 1.0\n" + 
+				"Bundle-ManifestVersion: 2\n" + 
+				"Bundle-Name: @PLUGIN_NAME@\n" + 
+				"Bundle-SymbolicName: @PLUGIN_ID@;singleton:=true\n" + 
+				"Bundle-Version: @PLUGIN_VERSION@\n" + 
+				"Bundle-ActivationPolicy: lazy\n" + 
+				"Bundle-Vendor: @PLUGIN_PROVIDER@\n" + 
+				"Bundle-RequiredExecutionEnvironment: J2SE-1.5\n" + 
+				"Require-Bundle: org.eclipse.swtbot.go\n" + 
+				"");
+		assertEquals("" +
+				"Manifest-Version: 1.0\n" + 
+				"Bundle-ManifestVersion: 2\n" + 
+				"Bundle-Name: foo plugin\n" + 
+				"Bundle-SymbolicName: org.eclipse.swtbot.example;singleton:=true\n" + 
+				"Bundle-Version: 1.2.3.4\n" + 
+				"Bundle-ActivationPolicy: lazy\n" + 
+				"Bundle-Vendor: Eclipse.org\n" + 
+				"Bundle-RequiredExecutionEnvironment: J2SE-1.5\n" + 
+				"Require-Bundle: org.eclipse.swtbot.go\n" + 
+				"", templatize);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/test/AllTests.java b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/test/AllTests.java
index dfde10c..8602e65 100644
--- a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/test/AllTests.java
+++ b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/test/AllTests.java
@@ -10,7 +10,11 @@
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.ui.test;
 
+import org.eclipse.swtbot.eclipse.ui.launcher.SWTBotJUnitTabGroupTest;
 import org.eclipse.swtbot.eclipse.ui.preferences.PreferenceInitializerTest;
+import org.eclipse.swtbot.eclipse.ui.project.ProjectCreatorTest;
+import org.eclipse.swtbot.eclipse.ui.project.TemplatizerTest;
+import org.eclipse.swtbot.eclipse.ui.wizards.ProjectSettingValidatorTest;
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
 import org.junit.runners.Suite.SuiteClasses;
@@ -20,7 +24,7 @@
  * @version $Id$
  */
 @RunWith(Suite.class)
-@SuiteClasses(PreferenceInitializerTest.class)
+@SuiteClasses({PreferenceInitializerTest.class, ProjectCreatorTest.class, TemplatizerTest.class, SWTBotJUnitTabGroupTest.class, ProjectSettingValidatorTest.class})
 public class AllTests {
 
 }
diff --git a/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidatorTest.java b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidatorTest.java
new file mode 100644
index 0000000..9930086
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui.test/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidatorTest.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.ArrayList;
+
+import org.junit.Test;
+
+public class ProjectSettingValidatorTest {
+
+	private static final class StubWizardSettings implements WizardPageSettings {
+		private boolean	complete;
+		private String	newMessage;
+
+		public void setPageComplete(boolean complete) {
+			this.complete = complete;
+		}
+
+		public void setErrorMessage(String newMessage) {
+			this.newMessage = newMessage;
+		}
+	}
+
+	@Test
+	public void canValidateWhenEverythingIsCorrect() throws Exception {
+		StubWizardSettings page = new StubWizardSettings();
+		ProjectSettingValidator validator = new ProjectSettingValidator("org.eclipse.plugin", "foo plugin", "1.0.0", new ArrayList<String>(), page);
+		validator.validate();
+		assertTrue(page.complete);
+		assertEquals(null, page.newMessage);
+	}
+
+	@Test
+	public void canValidateInValidPluginId() throws Exception {
+		StubWizardSettings page = new StubWizardSettings();
+		ProjectSettingValidator validator = new ProjectSettingValidator("org.eclipse.plugin*", "foo plugin", "1.0.0",
+				new ArrayList<String>(), page);
+		validator.validate();
+		assertFalse(page.complete);
+		assertEquals("Invalid plugin id! Legal characters are A-Z a-z 0-9 . _ -", page.newMessage);
+	}
+	
+	@Test
+	public void canValidateInValidPluginVersion() throws Exception {
+		StubWizardSettings page = new StubWizardSettings();
+		ProjectSettingValidator validator = new ProjectSettingValidator("org.eclipse.plugin", "foo plugin", "-1.0.0",
+				new ArrayList<String>(), page);
+		validator.validate();
+		assertFalse(page.complete);
+		assertEquals("The specified version does not have the correct format (major.minor.micro.qualifier) or contains invalid characters!", page.newMessage);
+	}
+	
+	@Test
+	public void canValidateInValidPluginName() throws Exception {
+		StubWizardSettings page = new StubWizardSettings();
+		ProjectSettingValidator validator = new ProjectSettingValidator("org.eclipse.plugin", "", "-1.0.0",
+				new ArrayList<String>(), page);
+		validator.validate();
+		assertFalse(page.complete);
+		assertEquals("Plugin name cannot be empty!", page.newMessage);
+	}
+	
+	@Test
+	public void canValidateInValidProjectName() throws Exception {
+		StubWizardSettings page = new StubWizardSettings();
+		ArrayList<String> projects = new ArrayList<String>();
+		projects.add("foo plugin");
+		ProjectSettingValidator validator = new ProjectSettingValidator("org.eclipse.plugin", "foo plugin", "1.0.0",
+				projects, page);
+		validator.validate();
+		assertFalse(page.complete);
+		assertEquals("A project by that name already exists!", page.newMessage);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_5 b/org.eclipse.swtbot.eclipse.ui/.classpath
similarity index 89%
rename from org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_5
rename to org.eclipse.swtbot.eclipse.ui/.classpath
index e2f3a55..41098a3 100644
--- a/org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_5
+++ b/org.eclipse.swtbot.eclipse.ui/.classpath
@@ -7,6 +7,5 @@
 		</accessrules>
 	</classpathentry>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="src_eclipse_3.5"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF b/org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f112ceb
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,37 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: SWTBot Eclipse UI Plug-in (incubation)
+Bundle-SymbolicName: org.eclipse.swtbot.eclipse.ui;singleton:=true
+Bundle-Version: 2.0.5.qualifier
+Bundle-Activator: org.eclipse.swtbot.eclipse.ui.Activator
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: Eclipse.org - SWTBot
+Export-Package: org.eclipse.swtbot.eclipse.ui,
+ org.eclipse.swtbot.eclipse.ui.launcher,
+ org.eclipse.swtbot.eclipse.ui.preferences,
+ org.eclipse.swtbot.eclipse.ui.project,
+ org.eclipse.swtbot.eclipse.ui.wizards
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime,
+ org.eclipse.core.runtime.jobs,
+ org.eclipse.core.runtime.preferences,
+ org.eclipse.debug.core,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.junit.launcher,
+ org.eclipse.jdt.launching,
+ org.eclipse.jdt.ui,
+ org.eclipse.jface.preference,
+ org.eclipse.jface.resource,
+ org.eclipse.jface.util,
+ org.eclipse.jface.wizard,
+ org.eclipse.osgi.util,
+ org.eclipse.pde.core.plugin,
+ org.eclipse.pde.launching,
+ org.eclipse.pde.ui.launcher,
+ org.eclipse.swt.events,
+ org.eclipse.swt.layout,
+ org.eclipse.swt.widgets,
+ org.osgi.framework
+Require-Bundle: org.eclipse.ui;bundle-version="3.6.0"
diff --git a/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_4 b/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_4
deleted file mode 100644
index d9cc234..0000000
--- a/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_4
+++ /dev/null
@@ -1,45 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Eclipse UI Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.eclipse.ui;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Activator: org.eclipse.swtbot.eclipse.ui.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.swtbot.eclipse.ui,
- org.eclipse.swtbot.eclipse.ui.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.eclipse.core.resources,
- org.eclipse.core.runtime;version="3.4.0",
- org.eclipse.core.runtime.preferences;version="3.2.0",
- org.eclipse.debug.core,
- org.eclipse.jdt.core,
- org.eclipse.jdt.junit.launcher,
- org.eclipse.jdt.launching,
- org.eclipse.jdt.ui,
- org.eclipse.jface.preference,
- org.eclipse.jface.resource,
- org.eclipse.jface.util,
- org.eclipse.osgi.util;version="1.1.0",
- org.eclipse.pde.core.plugin,
- org.eclipse.pde.internal.core.util,
- org.eclipse.pde.internal.core,
- org.eclipse.pde.internal.ui,
- org.eclipse.pde.internal.ui.launcher,
- org.eclipse.pde.ui.launcher,
- org.eclipse.swtbot.eclipse.finder.matchers,
- org.eclipse.swtbot.eclipse.finder.waits,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.waits,
- org.eclipse.ui,
- org.eclipse.ui.plugin,
- org.hamcrest;version="1.1.0",
- org.junit;version="4.3.1",
- org.osgi.framework;version="1.4.0",
- org.eclipse.swt.widgets,
- org.eclipse.debug.ui,
- org.eclipse.core.runtime.jobs
-
diff --git a/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_5 b/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_5
deleted file mode 100644
index 0197d3a..0000000
--- a/org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_5
+++ /dev/null
@@ -1,41 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Eclipse UI Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.eclipse.ui;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Activator: org.eclipse.swtbot.eclipse.ui.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.swtbot.eclipse.ui,
- org.eclipse.swtbot.eclipse.ui.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.eclipse.core.resources,
- org.eclipse.core.runtime;version="3.4.0",
- org.eclipse.core.runtime.preferences;version="3.2.0",
- org.eclipse.debug.core,
- org.eclipse.jdt.core,
- org.eclipse.jdt.junit.launcher,
- org.eclipse.jdt.launching,
- org.eclipse.jdt.ui,
- org.eclipse.jface.preference,
- org.eclipse.jface.resource,
- org.eclipse.jface.util,
- org.eclipse.osgi.util;version="1.1.0",
- org.eclipse.pde.core.plugin,
- org.eclipse.pde.ui.launcher,
- org.eclipse.swtbot.eclipse.finder.matchers,
- org.eclipse.swtbot.eclipse.finder.waits,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.waits,
- org.eclipse.ui,
- org.eclipse.ui.plugin,
- org.hamcrest;version="1.1.0",
- org.junit;version="4.5.0",
- org.osgi.framework;version="1.4.0",
- org.eclipse.swt.widgets,
- org.eclipse.debug.ui,
- org.eclipse.core.runtime.jobs
-
diff --git a/org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_4 b/org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_4
deleted file mode 100644
index 89571bc..0000000
--- a/org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_4
+++ /dev/null
@@ -1,40 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-source.. = src/,\
-           src_eclipse_3.4/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               LICENSE.EPL,\
-               about.html,\
-               plugin.xml,\
-               feature.gif,\
-               src/,\
-               intro/,\
-               about.ini,\
-               about.properties,\
-               icons/,\
-               src_eclipse_3.4/
-jars.compile.order = .
-src.includes = src/,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
-               about.html,\
-               plugin.xml,\
-               intro/,\
-               about.ini,\
-               feature.gif,\
-               .settings/,\
-               about.properties,\
-               icons/
diff --git a/org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_4 b/org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_4
deleted file mode 100644
index aaad475..0000000
--- a/org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_4
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="src_eclipse_3.4"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_5 b/org.eclipse.swtbot.eclipse.ui/build.properties
similarity index 71%
rename from org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_5
rename to org.eclipse.swtbot.eclipse.ui/build.properties
index b141d66..cf2cc54 100644
--- a/org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_5
+++ b/org.eclipse.swtbot.eclipse.ui/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -8,8 +8,7 @@
 # Contributors:
 #     Ketan Padegaonkar - initial API and implementation
 ###############################################################################
-source.. = src/,\
-           src_eclipse_3.5/
+source.. = src
 output.. = bin/
 bin.includes = META-INF/,\
                .,\
@@ -21,20 +20,12 @@
                intro/,\
                about.ini,\
                about.properties,\
-               icons/,\
-               src_eclipse_3.5/
+               icons/
 jars.compile.order = .
-src.includes = src/,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
+src.includes = LICENSE.EPL,\
                about.html,\
-               plugin.xml,\
                intro/,\
                about.ini,\
                feature.gif,\
-               .settings/,\
                about.properties,\
                icons/
diff --git a/org.eclipse.swtbot.eclipse.ui/plugin.xml b/org.eclipse.swtbot.eclipse.ui/plugin.xml
index 9119802..53f813e 100644
--- a/org.eclipse.swtbot.eclipse.ui/plugin.xml
+++ b/org.eclipse.swtbot.eclipse.ui/plugin.xml
@@ -19,7 +19,7 @@
          point="org.eclipse.debug.ui.launchConfigurationTabGroups">
       <launchConfigurationTabGroup
             type="org.eclipse.swtbot.eclipse.ui.launcher.JunitLaunchConfig"
-            class="org.eclipse.pde.ui.launcher.JUnitTabGroup"
+            class="org.eclipse.swtbot.eclipse.ui.launcher.SWTBotJUnitTabGroup"
             id="org.eclipse.swtbot.eclipse.ui.launcher.JUnitTabGroup">
          <launchMode
                description="Create a configuration that will launch a SWTBot test in debug mode."
@@ -46,7 +46,7 @@
             configTypeID="org.eclipse.swtbot.eclipse.ui.launcher.JunitLaunchConfig">
       </launchConfigType>
    </extension>
- 
+
    <extension
          point="org.eclipse.ui.commands">
       <command
@@ -61,7 +61,7 @@
             categoryId="org.eclipse.debug.ui.category.run"
             id="org.eclipse.swtbot.eclipse.ui.junitShortcut.debug">
       </command>
-   </extension>   
+   </extension>
    <extension
          point="org.eclipse.ui.bindings">
       <key
@@ -76,7 +76,7 @@
    <extension
          point="org.eclipse.debug.ui.launchShortcuts">
       <shortcut
-            class="org.eclipse.swtbot.eclipse.ui.SWTBotLaunchShortcut"
+            class="org.eclipse.swtbot.eclipse.ui.launcher.SWTBotLaunchShortcut"
             description="Launch an SWTBot Test"
             icon="icons/swtbot_runner.png"
             id="org.eclipse.swtbot.eclipse.ui.junitShortcut"
@@ -126,4 +126,15 @@
             content="intro/tutorialsExtensionContent.xml">
       </configExtension>
    </extension>
+   <extension
+         point="org.eclipse.ui.newWizards">
+      <wizard
+            class="org.eclipse.swtbot.eclipse.ui.wizards.NewSWTBotTestPluginWizard"
+            finalPerspective="org.eclipse.jdt.ui.JavaPerspective"
+            icon="icons/swtbot_runner.png"
+            id="org.eclipse.swtbot.eclipse.ui.wizards.NewSWTBotTestPluginWizard"
+            name="New SWTBot Test Plug-in"
+            project="true">
+      </wizard>
+   </extension>
 </plugin>
diff --git a/org.eclipse.swtbot.eclipse.ui/pom.xml b/org.eclipse.swtbot.eclipse.ui/pom.xml
new file mode 100644
index 0000000..a281cf2
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse.ui</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/Activator.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/Activator.java
index 91304ae..88a4371 100644
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/Activator.java
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/Activator.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.swtbot.eclipse.ui;
 
-import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
@@ -60,14 +59,4 @@
 		return plugin;
 	}
 
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
 }
diff --git a/org.eclipse.swtbot.eclipse.ui/src_eclipse_3.5/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java
similarity index 100%
rename from org.eclipse.swtbot.eclipse.ui/src_eclipse_3.5/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java
rename to org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroup.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroup.java
new file mode 100644
index 0000000..f3ddc03
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotJUnitTabGroup.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.launcher;
+
+import org.eclipse.debug.ui.ILaunchConfigurationDialog;
+import org.eclipse.debug.ui.ILaunchConfigurationTab;
+import org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationTab;
+import org.eclipse.pde.ui.launcher.JUnitTabGroup;
+
+public class SWTBotJUnitTabGroup extends JUnitTabGroup {
+
+	// use the pde defaults, just change the first tab to use the junit
+	// config instead of the pde one.
+	// SWTBot uses its own IApplication, which takes care of threading.
+	public void createTabs(ILaunchConfigurationDialog dialog, String mode) {
+		super.createTabs(dialog, mode);
+		ILaunchConfigurationTab[] tabs = getTabs();
+		tabs[0] = new JUnitLaunchConfigurationTab();
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchShortcut.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotLaunchShortcut.java
similarity index 89%
rename from org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchShortcut.java
rename to org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotLaunchShortcut.java
index 202336b..5a5adec 100644
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchShortcut.java
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/launcher/SWTBotLaunchShortcut.java
@@ -8,9 +8,10 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *******************************************************************************/
-package org.eclipse.swtbot.eclipse.ui;
+package org.eclipse.swtbot.eclipse.ui.launcher;
 
 import org.eclipse.pde.ui.launcher.JUnitWorkbenchLaunchShortcut;
+import org.eclipse.swtbot.eclipse.ui.SWTBotLaunchConfigurationDelegate;
 
 /**
  * Enhances the {@link JUnitWorkbenchLaunchShortcut} to launch SWTBot's launch configuration.
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/Messages.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/Messages.java
deleted file mode 100644
index d2a8c05..0000000
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/Messages.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.ui.preferences;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * 
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-@SuppressWarnings("all")
-public class Messages extends NLS {
-	private static final String	BUNDLE_NAME	= "org.eclipse.swtbot.eclipse.ui.preferences.messages"; //$NON-NLS-1$
-	public static String		Enable_Additional_Autocomplete_Options;
-	public static String		SWTBotPreferencePage_SWTBot_Preference_Dialog_Description;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/PreferenceInitializer.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/PreferenceInitializer.java
index 532eecb..b8aabab 100644
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/PreferenceInitializer.java
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/PreferenceInitializer.java
@@ -11,6 +11,7 @@
 package org.eclipse.swtbot.eclipse.ui.preferences;
 
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
 import java.util.Set;
@@ -20,20 +21,12 @@
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory;
-import org.eclipse.swtbot.eclipse.finder.waits.Conditions;
 import org.eclipse.swtbot.eclipse.ui.Activator;
-import org.eclipse.swtbot.swt.finder.SWTBotAssert;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.utils.StringUtils;
 import org.eclipse.ui.IStartup;
-import org.hamcrest.MatcherAssert;
-import org.hamcrest.Matchers;
-import org.junit.Assert;
 
 /**
  * Initializes the default preferences if none exist.
- *
+ * 
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
@@ -55,7 +48,7 @@
 
 	/**
 	 * Create a preference initializer with the two preference stores.
-	 *
+	 * 
 	 * @param swtbotPreferenceStore used by swtbot.
 	 * @param jdtPreferenceStore used by JDT.
 	 */
@@ -83,7 +76,7 @@
 			if (imports.containsAll(getDefaultFavorites()))
 				imports.removeAll(getDefaultFavorites());
 		}
-		String join = StringUtils.join(imports, SEMI_COLON);
+		String join = join(imports, SEMI_COLON);
 		jdtPreferenceStore.setValue(PreferenceConstants.CODEASSIST_FAVORITE_STATIC_MEMBERS, join);
 	}
 
@@ -101,23 +94,40 @@
 
 	private LinkedHashSet<String> getDefaultFavorites() {
 		LinkedHashSet<String> orderedSet = new LinkedHashSet<String>();
-		orderedSet.add(importStatement(org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.class));
-		orderedSet.add(importStatement(Matchers.class));
-		orderedSet.add(importStatement(MatcherAssert.class));
-		orderedSet.add(importStatement(Assert.class));
-		orderedSet.add(importStatement(WidgetMatcherFactory.class));
-		orderedSet.add(importStatement(UIThreadRunnable.class));
-		orderedSet.add(importStatement(SWTBotAssert.class));
-		orderedSet.add(importStatement(Conditions.class));
-		orderedSet.add(importStatement(org.eclipse.swtbot.swt.finder.waits.Conditions.class));
+		orderedSet.add(importStatement("org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory"));
+		orderedSet.add(importStatement("org.hamcrest.Matchers"));
+		orderedSet.add(importStatement("org.hamcrest.MatcherAssert"));
+		orderedSet.add(importStatement("org.junit.Assert"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.eclipse.finder.matchers.WidgetMatcherFactory"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.swt.finder.SWTBotAssert"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.swt.finder.SWTBotAssert"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.eclipse.finder.waits.Conditions"));
+		orderedSet.add(importStatement("org.eclipse.swtbot.swt.finder.waits.Conditions"));
 		return orderedSet;
 	}
 
-	private String importStatement(Class<?> clazz) {
-		return clazz.getName() + ".*"; //$NON-NLS-1$
-	}
-
 	public void propertyChange(PropertyChangeEvent event) {
 		initializeFavorites();
 	}
+
+	private String importStatement(String clazz) {
+		return clazz + ".*"; //$NON-NLS-1$;
+	}
+
+	private String join(Collection<?> toJoin, String delimiter) {
+		if ((toJoin == null) || (toJoin.size() == 0))
+			return ""; 
+		StringBuffer result = new StringBuffer();
+
+		for (Object object : toJoin) {
+			result.append(object);
+			result.append(delimiter);
+		}
+
+		result.lastIndexOf(delimiter);
+		result.replace(result.length() - delimiter.length(), result.length(), ""); //$NON-NLS-1$
+		return result.toString();
+	}
+
 }
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/SWTBotPreferencePage.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/SWTBotPreferencePage.java
index 7b40139..9c8fa5a 100644
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/SWTBotPreferencePage.java
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/SWTBotPreferencePage.java
@@ -17,15 +17,6 @@
 import org.eclipse.ui.IWorkbenchPreferencePage;
 
 /**
- * This class represents a preference page that is contributed to the Preferences dialog. By subclassing
- * <samp>FieldEditorPreferencePage</samp>, we can use the field support built into JFace that allows us to create a page
- * that is small and knows how to save, restore and apply itself.
- * <p>
- * This page is used to modify preferences only. They are stored in the preference store that belongs to the main
- * plug-in class. That way, preferences can be accessed directly via the preference store.
- */
-
-/**
  * Displays the preference page for SWTBot.
  * 
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
@@ -39,14 +30,13 @@
 	public SWTBotPreferencePage() {
 		super(GRID);
 		setPreferenceStore(Activator.getDefault().getPreferenceStore());
-		setDescription(Messages.SWTBotPreferencePage_SWTBot_Preference_Dialog_Description);
+		setDescription("SWTBot Preferences");
 	}
 
 	public void createFieldEditors() {
 		BooleanFieldEditor editor = new BooleanFieldEditor(PreferenceInitializer.ENABLE_ADDITIONAL_AUTOCOMPLETE_FAVOURTES,
-				Messages.Enable_Additional_Autocomplete_Options, getFieldEditorParent());
+				"Enable additional autocomplete favourites for java editing", getFieldEditorParent());
 		addField(editor);
-
 	}
 
 	public void init(IWorkbench workbench) {
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/messages.properties b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/messages.properties
deleted file mode 100644
index 7641a5b..0000000
--- a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/preferences/messages.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-Enable_Additional_Autocomplete_Options=Enable additional autocomplete favourites for java editing
-SWTBotPreferencePage_SWTBot_Preference_Dialog_Description=SWTBot Preferences
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreator.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreator.java
new file mode 100644
index 0000000..8c3b2ec
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/ProjectCreator.java
@@ -0,0 +1,107 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.project;
+
+import java.io.ByteArrayInputStream;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+
+public class ProjectCreator {
+
+	private final String			pluginId;
+	private final String			pluginProvider;
+	private final String			pluginVersion;
+	private final String			pluginName;
+	private final IWorkspaceRoot	root;
+
+	public ProjectCreator(String pluginId, String pluginName, String pluginVersion, String pluginProvider, IWorkspaceRoot root) {
+		this.pluginId = pluginId;
+		this.pluginName = pluginName;
+		this.pluginVersion = pluginVersion;
+		this.pluginProvider = pluginProvider;
+		this.root = root;
+	}
+
+	public void create() throws CoreException {
+		IProject project = getProject();
+		project.create(null);
+		project.open(null);
+
+		project.getFile("build.properties").create(stream("_build.properties"), true, null);
+		project.getFile(".classpath").create(stream("_classpath"), true, null);
+		IFolder folder = project.getFolder("META-INF");
+		folder.create(true, true, null);
+
+		folder.getFile("MANIFEST.MF").create(stream("_MANIFEST.MF"), true, null);
+
+		project.getFile(".project").setContents(stream("_project"), true, false, null);
+
+		project.getFolder("src").create(true, true, null);
+	}
+
+	public void delete() {
+		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(pluginId);
+		try {
+			project.delete(true, null);
+		} catch (CoreException e) {
+			throw new RuntimeException("Could not delete project " + project.getName(), e);
+		}
+	}
+
+	private InputStream stream(String path) {
+		InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream("org/eclipse/swtbot/eclipse/ui/project/" + path);
+		String contents = new Templatizer(pluginId, pluginName, pluginVersion, pluginProvider).templatize(read(resourceAsStream));
+		return new ByteArrayInputStream(contents.getBytes());
+	}
+
+	private String read(InputStream is) {
+		StringBuffer buffer = new StringBuffer();
+		InputStreamReader in = null;
+		try {
+			in = new InputStreamReader(is, "utf-8");
+			while (in.ready()) {
+				buffer.append((char) in.read());
+			}
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		} finally {
+			close(in);
+		}
+		return buffer.toString();
+	}
+
+	private void close(Closeable c) {
+		if (c != null) {
+			try {
+				c.close();
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+		}
+	}
+
+	private IProject getProject() {
+		return root().getProject(pluginId);
+	}
+
+	private IWorkspaceRoot root() {
+		return root;
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/Templatizer.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/Templatizer.java
new file mode 100644
index 0000000..15f4a3a
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/Templatizer.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.project;
+
+public class Templatizer {
+
+	private final String	pluginId;
+	private final String	pluginName;
+	private final String	pluginVersion;
+	private final String	pluginProvider;
+
+	public Templatizer(String pluginId, String pluginName, String pluginVersion, String pluginProvider) {
+		this.pluginId = pluginId;
+		this.pluginName = pluginName;
+		this.pluginVersion = pluginVersion;
+		this.pluginProvider = pluginProvider;
+	}
+
+	public String templatize(String contents) {
+		return 
+		contents
+		.replaceAll("@PLUGIN_NAME@", pluginName)
+		.replaceAll("@PLUGIN_ID@", pluginId)
+		.replaceAll("@PLUGIN_VERSION@", pluginVersion)
+		.replaceAll("@PLUGIN_PROVIDER@", pluginProvider);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_MANIFEST.MF b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_MANIFEST.MF
new file mode 100644
index 0000000..b4631e6
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: @PLUGIN_NAME@
+Bundle-SymbolicName: @PLUGIN_ID@;singleton:=true
+Bundle-Version: @PLUGIN_VERSION@
+Bundle-ActivationPolicy: lazy
+Bundle-Vendor: @PLUGIN_PROVIDER@
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.swtbot.go
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_build.properties b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/.classpath b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_classpath
similarity index 100%
rename from org.eclipse.swtbot.eclipse.dsl.test/.classpath
rename to org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_classpath
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_project
similarity index 92%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_project
index d2190e0..df1830e 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/project/_project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>@PLUGIN_ID@</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/LaunchConfigPropertiesWizardPage.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/LaunchConfigPropertiesWizardPage.java
new file mode 100644
index 0000000..870c956
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/LaunchConfigPropertiesWizardPage.java
@@ -0,0 +1,54 @@
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class LaunchConfigPropertiesWizardPage extends WizardPage {
+
+	protected LaunchConfigPropertiesWizardPage() {
+		super("Default launcher settings");
+		setTitle("Settings when you launch your application");
+	}
+
+	public void createControl(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		composite.setLayout(new GridLayout(2, false));
+
+		Label label;
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&Test Runner:");
+
+		Combo junitRunner = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
+		junitRunner.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, true, false));
+		junitRunner.setItems(new String[] { "JUnit 4(recommend)", "JUnit 3" });
+		junitRunner.select(0);
+
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&Program Arguments:");
+
+		Text programArgs = new Text(composite, SWT.MULTI | SWT.LEAD | SWT.BORDER);
+		GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		layoutData.horizontalSpan = 2;
+		programArgs.setLayoutData(layoutData);
+
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&VM Arguments:");
+		setControl(composite);
+
+		Text vmArgs = new Text(composite, SWT.MULTI | SWT.LEAD | SWT.BORDER);
+		layoutData = new GridData(SWT.FILL, SWT.FILL, true, true);
+		layoutData.horizontalSpan = 2;
+		vmArgs.setLayoutData(layoutData);
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewPluginProjectWizardPage.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewPluginProjectWizardPage.java
new file mode 100644
index 0000000..a28eb52
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewPluginProjectWizardPage.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.pde.core.plugin.TargetPlatform;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+
+public class NewPluginProjectWizardPage extends WizardPage implements WizardPageSettings {
+
+	private Button	productIdButton;
+	private Button	applicationIdButton;
+	private Combo	productId;
+	private Combo	applicationId;
+
+	private Text	pluginId;
+	private Text	pluginName;
+	private Text	pluginVersion;
+	private Text	pluginProvider;
+
+	protected NewPluginProjectWizardPage() {
+		super("New SWTBot Test Plugin");
+		setTitle("SWTBot plugin project");
+	}
+
+	public void createControl(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		composite.setLayout(new GridLayout(2, false));
+
+		Label label;
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("Plug-in &Name:");
+
+		// name, id, version, providers
+
+		pluginName = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+		pluginName.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		pluginName.setMessage("SWTBot Test Plugin");
+
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&Plug-in id:");
+
+		pluginId = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+		pluginId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		pluginId.setMessage("com.example.rcp.uitest");
+
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&Version:");
+
+		pluginVersion = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+		pluginVersion.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		pluginVersion.setText("1.0.0.qualifier");
+		pluginVersion.setMessage("1.0.0.qualifier");
+
+		label = new Label(composite, SWT.NONE);
+		label.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
+		label.setText("&Provider:");
+
+		pluginProvider = new Text(composite, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
+		pluginProvider.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		pluginProvider.setMessage("Your Company");
+
+		productAndApplication(composite);
+		hookListeners();
+		setControl(composite);
+	}
+
+	private void hookListeners() {
+		applicationIdButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				productId.setEnabled(false);
+				applicationId.setEnabled(true);
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+
+		productIdButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				applicationId.setEnabled(false);
+				productId.setEnabled(true);
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+
+		ModifyListener listener = new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				ProjectSettingValidator validator = new ProjectSettingValidator(pluginId.getText(), pluginName.getText(), pluginVersion.getText(), getProjects(), NewPluginProjectWizardPage.this);
+				validator.validate();
+			}
+		};
+
+		pluginId.addModifyListener(listener);
+		pluginName.addModifyListener(listener);
+		pluginVersion.addModifyListener(listener);
+		pluginProvider.addModifyListener(listener);
+	}
+
+	private List<String> getProjects() {
+		IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+
+		ArrayList<String> result = new ArrayList<String>();
+
+		for (IProject project : projects) {
+			result.add(project.getName());
+		}
+		return result;
+	}
+
+
+	private void productAndApplication(Composite parent) {
+		Group group = new Group(parent, SWT.NONE);
+		GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, false);
+		layoutData.horizontalSpan = 2;
+		group.setLayoutData(layoutData);
+		group.setLayout(new GridLayout(2, false));
+		group.setText("Program to test");
+
+		productIdButton = new Button(group, SWT.RADIO);
+		productIdButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+		productIdButton.setText("&Product id:");
+		productIdButton.setSelection(true);
+
+		productId = new Combo(group, SWT.DROP_DOWN);
+		productId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		productId.setItems(TargetPlatform.getProducts());
+		productId.setText(TargetPlatform.getDefaultProduct() == null ? "" : TargetPlatform.getDefaultProduct());
+
+		applicationIdButton = new Button(group, SWT.RADIO);
+		applicationIdButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
+		applicationIdButton.setText("&Application id:");
+
+		applicationId = new Combo(group, SWT.READ_ONLY | SWT.SINGLE);
+		applicationId.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
+		applicationId.setItems(TargetPlatform.getApplications());
+		applicationId.setText(TargetPlatform.getDefaultApplication());
+		applicationId.setEnabled(false);
+	}
+
+	public String pluginName() {
+		return pluginName.getText();
+	}
+
+	public String pluginId() {
+		return pluginId.getText();
+	}
+
+	public String pluginVersion() {
+		return pluginVersion.getText();
+	}
+
+	public String pluginProvider() {
+		return pluginProvider.getText();
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewSWTBotTestPluginWizard.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewSWTBotTestPluginWizard.java
new file mode 100644
index 0000000..21e9f46
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/NewSWTBotTestPluginWizard.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.swtbot.eclipse.ui.project.ProjectCreator;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+
+public class NewSWTBotTestPluginWizard extends Wizard implements INewWizard {
+
+	private final NewPluginProjectWizardPage			projectWizardPage;
+//	private final LaunchConfigPropertiesWizardPage	launchConfigWizardPage;
+
+	public NewSWTBotTestPluginWizard() {
+		setWindowTitle("New SWTBot Test Plugin");
+		projectWizardPage = new NewPluginProjectWizardPage();
+//		launchConfigWizardPage = new LaunchConfigPropertiesWizardPage();
+	}
+
+	public void addPages() {
+		addPage(projectWizardPage);
+//		addPage(launchConfigWizardPage);
+	}
+
+	@Override
+	public boolean performFinish() {
+		String pluginName = projectWizardPage.pluginName();
+		String pluginId = projectWizardPage.pluginId();
+		String pluginVersion = projectWizardPage.pluginVersion();
+		String pluginProvider = projectWizardPage.pluginProvider();
+
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		ProjectCreator projectCreator = new ProjectCreator(pluginId, pluginName, pluginVersion, pluginProvider, root);
+		try {
+			projectCreator.create();
+			return true;
+		} catch (CoreException e) {
+			projectCreator.delete();
+			return false;
+		}
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidator.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidator.java
new file mode 100644
index 0000000..2512b20
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/ProjectSettingValidator.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+import java.util.List;
+
+import org.osgi.framework.Version;
+
+public class ProjectSettingValidator {
+
+	private final String				pluginId;
+	private final String				pluginName;
+	private final String				pluginVersion;
+	private final WizardPageSettings	wizardPage;
+	private final List<String>			projectNames;
+
+	public ProjectSettingValidator(String pluginId, String pluginName, String pluginVersion, List<String> projectNames,
+			WizardPageSettings wizardPage) {
+		this.pluginId = pluginId;
+		this.pluginName = pluginName;
+		this.pluginVersion = pluginVersion;
+		this.projectNames = projectNames;
+		this.wizardPage = wizardPage;
+	}
+
+	public void validate() {
+
+		wizardPage.setPageComplete(true);
+		wizardPage.setErrorMessage(null);
+
+		if (pluginName.trim().length() == 0) {
+			wizardPage.setErrorMessage("Plugin name cannot be empty!");
+			wizardPage.setPageComplete(false);
+			return;
+		}
+
+		if (projectNames.contains(pluginName)) {
+			wizardPage.setErrorMessage("A project by that name already exists!");
+			wizardPage.setPageComplete(false);
+			return;
+		}
+
+		if (pluginId.trim().length() == 0) {
+			wizardPage.setErrorMessage("You did not set the plugin id!");
+			wizardPage.setPageComplete(false);
+			return;
+		}
+
+		if (!isValidCompositeID3_0(pluginId)) {
+			wizardPage.setErrorMessage("Invalid plugin id! Legal characters are A-Z a-z 0-9 . _ -");
+			wizardPage.setPageComplete(false);
+			return;
+		}
+
+		try {
+			new Version(pluginVersion);
+		} catch (IllegalArgumentException ex) {
+			wizardPage
+					.setErrorMessage("The specified version does not have the correct format (major.minor.micro.qualifier) or contains invalid characters!");
+			wizardPage.setPageComplete(false);
+			return;
+		}
+	}
+
+	// copied from IdUtil from PDE.
+	private boolean isValidCompositeID3_0(String name) {
+		if (name.length() <= 0) {
+			return false;
+		}
+		for (int i = 0; i < name.length(); i++) {
+			char c = name.charAt(i);
+			if ((c < 'A' || 'Z' < c) && (c < 'a' || 'z' < c) && (c < '0' || '9' < c) && c != '_' && c != '-') {
+				if (i == 0 || i == name.length() - 1 || c != '.') {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/WizardPageSettings.java b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/WizardPageSettings.java
new file mode 100644
index 0000000..1c7d763
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse.ui/src/org/eclipse/swtbot/eclipse/ui/wizards/WizardPageSettings.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.eclipse.ui.wizards;
+
+public interface WizardPageSettings {
+
+	void setErrorMessage(String newMessage);
+
+	void setPageComplete(boolean complete);
+
+}
diff --git a/org.eclipse.swtbot.eclipse.ui/src_eclipse_3.4/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java b/org.eclipse.swtbot.eclipse.ui/src_eclipse_3.4/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java
deleted file mode 100644
index 343098d..0000000
--- a/org.eclipse.swtbot.eclipse.ui/src_eclipse_3.4/org/eclipse/swtbot/eclipse/ui/SWTBotLaunchConfigurationDelegate.java
+++ /dev/null
@@ -1,428 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.eclipse.ui;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.debug.core.DebugPlugin;
-import org.eclipse.debug.core.ILaunch;
-import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants;
-import org.eclipse.jdt.launching.IVMInstall;
-import org.eclipse.jdt.launching.IVMRunner;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.pde.core.plugin.IFragmentModel;
-import org.eclipse.pde.core.plugin.IPluginModelBase;
-import org.eclipse.pde.core.plugin.PluginRegistry;
-import org.eclipse.pde.core.plugin.TargetPlatform;
-import org.eclipse.pde.internal.core.ClasspathHelper;
-import org.eclipse.pde.internal.core.PDECore;
-import org.eclipse.pde.internal.core.TargetPlatformHelper;
-import org.eclipse.pde.internal.core.util.CoreUtility;
-import org.eclipse.pde.internal.ui.IPDEUIConstants;
-import org.eclipse.pde.internal.ui.PDEPlugin;
-import org.eclipse.pde.internal.ui.PDEUIMessages;
-import org.eclipse.pde.internal.ui.launcher.EclipsePluginValidationOperation;
-import org.eclipse.pde.internal.ui.launcher.LaunchArgumentsHelper;
-import org.eclipse.pde.internal.ui.launcher.LaunchConfigurationHelper;
-import org.eclipse.pde.internal.ui.launcher.LaunchPluginValidator;
-import org.eclipse.pde.internal.ui.launcher.LauncherUtils;
-import org.eclipse.pde.internal.ui.launcher.VMHelper;
-import org.eclipse.pde.ui.launcher.IPDELauncherConstants;
-import org.eclipse.pde.ui.launcher.PDESourcePathProvider;
-
-/**
- * This class is a copy of {@link org.eclipse.pde.ui.launcher.JUnitLaunchConfigurationDelegate} with the
- * {@link #collectExecutionArguments(ILaunchConfiguration, List, List)} modified to use
- * {@value Activator#APPLICATION_ID}. A launch delegate for launching JUnit Plug-in tests.
- * 
- * @since 3.3
- */
-@SuppressWarnings("all")
-public class SWTBotLaunchConfigurationDelegate extends org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate {
-
-	public static final String	LAUNCH_CONFIG_ID	= "org.eclipse.swtbot.eclipse.ui.launcher.JunitLaunchConfig";							//$NON-NLS-1$
-
-	private static String[]		REQUIRED_PLUGINS	= { "org.junit", "org.eclipse.jdt.junit.runtime", "org.eclipse.pde.junit.runtime" };	//$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	protected File				fConfigDir			= null;
-	private Map					fPluginMap;
-
-	/**  */
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getVMRunner(org.eclipse.debug.core.
-	 * ILaunchConfiguration, java.lang.String)
-	 */
-	public IVMRunner getVMRunner(ILaunchConfiguration configuration, String mode) throws CoreException {
-		IVMInstall launcher = VMHelper.createLauncher(configuration);
-		return launcher.getVMRunner(mode);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate#verifyMainTypeName(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public String verifyMainTypeName(ILaunchConfiguration configuration) throws CoreException {
-		if (TargetPlatformHelper.getTargetVersion() >= 3.3)
-			return "org.eclipse.equinox.launcher.Main"; //$NON-NLS-1$
-		return "org.eclipse.core.launcher.Main"; //$NON-NLS-1$
-	}
-
-	private String getTestPluginId(ILaunchConfiguration configuration) throws CoreException {
-		IJavaProject javaProject = getJavaProject(configuration);
-		IPluginModelBase model = PluginRegistry.findModel(javaProject.getProject());
-		if (model == null)
-			abort(NLS.bind(PDEUIMessages.JUnitLaunchConfiguration_error_notaplugin, javaProject.getProject().getName()), null, IStatus.OK);
-		if (model instanceof IFragmentModel)
-			return ((IFragmentModel) model).getFragment().getPluginId();
-
-		return model.getPluginBase().getId();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.jdt.internal.junit.launcher.JUnitBaseLaunchConfiguration#abort(java.lang.String,
-	 * java.lang.Throwable, int)
-	 */
-	protected void abort(String message, Throwable exception, int code) throws CoreException {
-		throw new CoreException(new Status(IStatus.ERROR, Activator.PLUGIN_ID, code, message, exception));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate#collectExecutionArguments(org.eclipse.debug.core
-	 * .ILaunchConfiguration, java.util.List, java.util.List)
-	 */
-	protected void collectExecutionArguments(ILaunchConfiguration configuration, List/* String */vmArguments, List/* String */programArgs)
-			throws CoreException {
-		super.collectExecutionArguments(configuration, vmArguments, programArgs);
-
-		// Specify the JUnit Plug-in test application to launch
-		programArgs.add("-application"); //$NON-NLS-1$
-		String application = getApplication(configuration);
-
-		programArgs.add(application);
-
-		// If a product is specified, then add it to the program args
-		if (configuration.getAttribute(IPDELauncherConstants.USE_PRODUCT, false)) {
-			programArgs.add("-product"); //$NON-NLS-1$
-			programArgs.add(configuration.getAttribute(IPDELauncherConstants.PRODUCT, "")); //$NON-NLS-1$
-		} else {
-			// Specify the application to test
-			String defaultApplication = IPDEUIConstants.CORE_TEST_APPLICATION.equals(application) ? null : TargetPlatform
-					.getDefaultApplication();
-			String testApplication = configuration.getAttribute(IPDELauncherConstants.APP_TO_TEST, defaultApplication);
-			if (testApplication != null) {
-				programArgs.add("-testApplication"); //$NON-NLS-1$
-				programArgs.add(testApplication);
-			}
-		}
-
-		// Specify the location of the runtime workbench
-		String targetWorkspace = LaunchArgumentsHelper.getWorkspaceLocation(configuration);
-		if (targetWorkspace.length() > 0) {
-			programArgs.add("-data"); //$NON-NLS-1$
-			programArgs.add(targetWorkspace);
-		}
-
-		// Create the platform configuration for the runtime workbench
-		String productID = LaunchConfigurationHelper.getProductID(configuration);
-		LaunchConfigurationHelper.createConfigIniFile(configuration, productID, fPluginMap, getConfigurationDirectory(configuration));
-		String brandingId = LaunchConfigurationHelper.getContributingPlugin(productID);
-		TargetPlatform.createPlatformConfiguration(getConfigurationDirectory(configuration), (IPluginModelBase[]) fPluginMap.values()
-				.toArray(new IPluginModelBase[fPluginMap.size()]), brandingId != null ? (IPluginModelBase) fPluginMap.get(brandingId)
-				: null);
-		TargetPlatformHelper.checkPluginPropertiesConsistency(fPluginMap, getConfigurationDirectory(configuration));
-
-		programArgs.add("-configuration"); //$NON-NLS-1$
-		programArgs.add("file:" + new Path(getConfigurationDirectory(configuration).getPath()).addTrailingSeparator().toString()); //$NON-NLS-1$
-
-		// Specify the output folder names
-		programArgs.add("-dev"); //$NON-NLS-1$
-		programArgs.add(ClasspathHelper.getDevEntriesProperties(
-				getConfigurationDirectory(configuration).toString() + "/dev.properties", fPluginMap)); //$NON-NLS-1$
-
-		// necessary for PDE to know how to load plugins when target platform = host platform
-		// see PluginPathFinder.getPluginPaths()
-		if (fPluginMap.containsKey(PDECore.PLUGIN_ID))
-			programArgs.add("-pdelaunch"); //$NON-NLS-1$
-
-		// Create the .options file if tracing is turned on
-		if (configuration.getAttribute(IPDELauncherConstants.TRACING, false)
-				&& !IPDELauncherConstants.TRACING_NONE.equals(configuration.getAttribute(IPDELauncherConstants.TRACING_CHECKED,
-						(String) null))) {
-			programArgs.add("-debug"); //$NON-NLS-1$
-			String path = getConfigurationDirectory(configuration).getPath() + IPath.SEPARATOR + ".options"; //$NON-NLS-1$
-			programArgs.add(LaunchArgumentsHelper.getTracingFileArgument(configuration, path));
-		}
-
-		// add the program args specified by the user
-		String[] userArgs = LaunchArgumentsHelper.getUserProgramArgumentArray(configuration);
-		for (int i = 0; i < userArgs.length; i++) {
-			// be forgiving if people have tracing turned on and forgot
-			// to remove the -debug from the program args field.
-			if (userArgs[i].equals("-debug") && programArgs.contains("-debug")) //$NON-NLS-1$ //$NON-NLS-2$
-				continue;
-			programArgs.add(userArgs[i]);
-		}
-
-		if (!configuration.getAttribute(IPDEUIConstants.APPEND_ARGS_EXPLICITLY, false)) {
-			if (!programArgs.contains("-os")) { //$NON-NLS-1$
-				programArgs.add("-os"); //$NON-NLS-1$
-				programArgs.add(TargetPlatform.getOS());
-			}
-			if (!programArgs.contains("-ws")) { //$NON-NLS-1$
-				programArgs.add("-ws"); //$NON-NLS-1$
-				programArgs.add(TargetPlatform.getWS());
-			}
-			if (!programArgs.contains("-arch")) { //$NON-NLS-1$
-				programArgs.add("-arch"); //$NON-NLS-1$
-				programArgs.add(TargetPlatform.getOSArch());
-			}
-		}
-
-		programArgs.add("-testpluginname"); //$NON-NLS-1$
-		programArgs.add(getTestPluginId(configuration));
-	}
-
-	private String getApplication(ILaunchConfiguration configuration) {
-		return Activator.APPLICATION_ID;
-	}
-
-	private IPluginModelBase findPlugin(String id) throws CoreException {
-		IPluginModelBase model = PluginRegistry.findModel(id);
-		if (model == null)
-			model = PDECore.getDefault().findPluginInHost(id);
-		if (model == null)
-			abort(NLS.bind(PDEUIMessages.JUnitLaunchConfiguration_error_missingPlugin, id), null, IStatus.OK);
-		return model;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getProgramArguments(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public String getProgramArguments(ILaunchConfiguration configuration) throws CoreException {
-		return LaunchArgumentsHelper.getUserProgramArguments(configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getVMArguments(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public String getVMArguments(ILaunchConfiguration configuration) throws CoreException {
-		return LaunchArgumentsHelper.getUserVMArguments(configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getEnvironment(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public String[] getEnvironment(ILaunchConfiguration configuration) throws CoreException {
-		return DebugPlugin.getDefault().getLaunchManager().getEnvironment(configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getClasspath(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public String[] getClasspath(ILaunchConfiguration configuration) throws CoreException {
-		String[] classpath = LaunchArgumentsHelper.constructClasspath(configuration);
-		if (classpath == null)
-			abort(PDEUIMessages.WorkbenchLauncherConfigurationDelegate_noStartup, null, IStatus.OK);
-		return classpath;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getWorkingDirectory(org.eclipse.debug.core.
-	 * ILaunchConfiguration)
-	 */
-	public File getWorkingDirectory(ILaunchConfiguration configuration) throws CoreException {
-		return LaunchArgumentsHelper.getWorkingDirectory(configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getVMSpecificAttributesMap(org.eclipse.debug
-	 * .core.ILaunchConfiguration)
-	 */
-	public Map getVMSpecificAttributesMap(ILaunchConfiguration configuration) throws CoreException {
-		return LaunchArgumentsHelper.getVMSpecificAttributesMap(configuration);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#setDefaultSourceLocator(org.eclipse.debug.core
-	 * .ILaunch, org.eclipse.debug.core.ILaunchConfiguration)
-	 */
-	protected void setDefaultSourceLocator(ILaunch launch, ILaunchConfiguration configuration) throws CoreException {
-		ILaunchConfigurationWorkingCopy wc = null;
-		if (configuration.isWorkingCopy())
-			wc = (ILaunchConfigurationWorkingCopy) configuration;
-		else
-			wc = configuration.getWorkingCopy();
-		String id = configuration.getAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, (String) null);
-		if (!PDESourcePathProvider.ID.equals(id)) {
-			wc.setAttribute(IJavaLaunchConfigurationConstants.ATTR_SOURCE_PATH_PROVIDER, PDESourcePathProvider.ID);
-			wc.doSave();
-		}
-
-		manageLaunch(launch);
-	}
-
-	/**
-	 * Returns the location of the configuration area
-	 * 
-	 * @param configuration the launch configuration
-	 * @return a directory where the configuration area is located
-	 */
-	protected File getConfigurationDirectory(ILaunchConfiguration configuration) {
-		if (fConfigDir == null)
-			fConfigDir = LaunchConfigurationHelper.getConfigurationArea(configuration);
-		return fConfigDir;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getBuildOrder(org.eclipse.debug.core.
-	 * ILaunchConfiguration, java.lang.String)
-	 */
-	protected IProject[] getBuildOrder(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return computeBuildOrder(LaunchPluginValidator.getAffectedProjects(configuration));
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see
-	 * org.eclipse.jdt.launching.AbstractJavaLaunchConfigurationDelegate#getProjectsForProblemSearch(org.eclipse.debug
-	 * .core.ILaunchConfiguration, java.lang.String)
-	 */
-	protected IProject[] getProjectsForProblemSearch(ILaunchConfiguration configuration, String mode) throws CoreException {
-		return LaunchPluginValidator.getAffectedProjects(configuration);
-	}
-
-	/**
-	 * Adds a listener to the launch to be notified at interesting launch lifecycle events such as when the launch
-	 * terminates.
-	 * 
-	 * @param launch the launch
-	 */
-	protected void manageLaunch(ILaunch launch) {
-		PDEPlugin.getDefault().getLaunchListener().manage(launch);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @seeorg.eclipse.jdt.junit.launcher.JUnitLaunchConfigurationDelegate#preLaunchCheck(org.eclipse.debug.core.
-	 * ILaunchConfiguration, org.eclipse.debug.core.ILaunch, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	protected void preLaunchCheck(ILaunchConfiguration configuration, ILaunch launch, IProgressMonitor monitor) throws CoreException {
-		// Get the list of plug-ins to run
-		fPluginMap = LaunchPluginValidator.getPluginsToRun(configuration);
-
-		// implicitly add the plug-ins required for JUnit testing if necessary
-		for (int i = 0; i < REQUIRED_PLUGINS.length; i++) {
-			String id = REQUIRED_PLUGINS[i];
-			if (!fPluginMap.containsKey(id))
-				fPluginMap.put(id, findPlugin(id));
-		}
-
-		boolean autoValidate = configuration.getAttribute(IPDELauncherConstants.AUTOMATIC_VALIDATE, false);
-		monitor.beginTask("", autoValidate ? 3 : 4); //$NON-NLS-1$
-		if (autoValidate)
-			validatePluginDependencies(configuration, new SubProgressMonitor(monitor, 1));
-		validateProjectDependencies(configuration, new SubProgressMonitor(monitor, 1));
-		clear(configuration, new SubProgressMonitor(monitor, 1));
-		launch.setAttribute(IPDELauncherConstants.CONFIG_LOCATION, getConfigurationDirectory(configuration).toString());
-		synchronizeManifests(configuration, new SubProgressMonitor(monitor, 1));
-	}
-
-	/**
-	 * Checks for old-style plugin.xml files that have become stale since the last launch. For any stale plugin.xml
-	 * files found, the corresponding MANIFEST.MF is deleted from the runtime configuration area so that it gets
-	 * regenerated upon startup.
-	 * 
-	 * @param configuration the launch configuration
-	 * @param monitor the progress monitor
-	 */
-	protected void synchronizeManifests(ILaunchConfiguration configuration, IProgressMonitor monitor) {
-		LaunchConfigurationHelper.synchronizeManifests(configuration, getConfigurationDirectory(configuration));
-		monitor.done();
-	}
-
-	/**
-	 * Clears the workspace prior to launching if the workspace exists and the option to clear it is turned on. Also
-	 * clears the configuration area if that option is chosen.
-	 * 
-	 * @param configuration the launch configuration
-	 * @param monitor the progress monitor
-	 * @throws CoreException if unable to retrieve launch attribute values
-	 * @since 3.3
-	 */
-	protected void clear(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
-		String workspace = LaunchArgumentsHelper.getWorkspaceLocation(configuration);
-		// Clear workspace and prompt, if necessary
-		if (!LauncherUtils.clearWorkspace(configuration, workspace, new SubProgressMonitor(monitor, 1))) {
-			monitor.setCanceled(true);
-			return;
-		}
-
-		// clear config area, if necessary
-		if (configuration.getAttribute(IPDELauncherConstants.CONFIG_CLEAR_AREA, false))
-			CoreUtility.deleteContent(getConfigurationDirectory(configuration));
-	}
-
-	/**
-	 * Checks if the Automated Management of Dependencies option is turned on. If so, it makes aure all manifests are
-	 * updated with the correct dependencies.
-	 * 
-	 * @param configuration the launch configuration
-	 * @param monitor a progress monitor
-	 */
-	protected void validateProjectDependencies(ILaunchConfiguration configuration, IProgressMonitor monitor) {
-		LauncherUtils.validateProjectDependencies(configuration, monitor);
-	}
-
-	/**
-	 * Validates inter-bundle dependencies automatically prior to launching if that option is turned on.
-	 * 
-	 * @param configuration the launch configuration
-	 * @param monitor a progress monitor
-	 */
-	protected void validatePluginDependencies(ILaunchConfiguration configuration, IProgressMonitor monitor) throws CoreException {
-		EclipsePluginValidationOperation op = new EclipsePluginValidationOperation(configuration);
-		LaunchPluginValidator.runValidationOperation(op, monitor);
-	}
-}
diff --git a/org.eclipse.swtbot.eclipse/build.properties b/org.eclipse.swtbot.eclipse/build.properties
index 83b8d3e..aff4051 100644
--- a/org.eclipse.swtbot.eclipse/build.properties
+++ b/org.eclipse.swtbot.eclipse/build.properties
@@ -10,10 +10,12 @@
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot.eclipse/feature.properties b/org.eclipse.swtbot.eclipse/feature.properties
new file mode 100644
index 0000000..b3dd40d
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse/feature.properties
@@ -0,0 +1,140 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c) 2007-2010 Ketan Padegaonkar and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	Ketan Padegaonkar - initial API and implementation
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.eclipse/feature.xml b/org.eclipse.swtbot.eclipse/feature.xml
index 3014d8d..022c2d4 100644
--- a/org.eclipse.swtbot.eclipse/feature.xml
+++ b/org.eclipse.swtbot.eclipse/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.swtbot.eclipse"
       label="SWTBot for Eclipse Testing (incubation)"
-      version="2.0.0.qualifier"
+      version="2.0.5.qualifier"
       provider-name="Eclipse.org"
       plugin="org.eclipse.swtbot.eclipse.ui">
 
@@ -10,83 +10,12 @@
       SWTBot for testing eclipse based plugins and applications (incubation)
    </description>
 
-   <copyright url="http://eclipse.org/">
-      Copyright (c) 2007, 2008 Ketan Padegaonkar 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:
-Ketan Padegaonkar - initial API and implementation
+   <copyright>
+      %copyright
    </copyright>
 
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-
-Eclipse Foundation Software User Agreement
-March 17, 2005
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-   
-Applicable Licenses
-   
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-   
-* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-  and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
- 
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:
-
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-  
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html) 
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is permitted.
-   
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
+   <license url="%licenseURL">
+      %license
    </license>
 
    <url>
@@ -97,23 +26,27 @@
          id="org.eclipse.swtbot"
          version="0.0.0"/>
 
+   <includes
+         id="org.eclipse.swtbot.forms"
+         version="0.0.0"/>
+
    <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.swtbot.swt.finder"/>
-      <import plugin="org.hamcrest"/>
+      <import plugin="org.eclipse.osgi"/>
       <import plugin="org.junit4"/>
       <import plugin="org.apache.log4j"/>
-      <import plugin="org.eclipse.pde.junit.runtime"/>
-      <import plugin="org.eclipse.jdt.junit"/>
-      <import plugin="org.eclipse.pde.ui"/>
-      <import plugin="org.eclipse.jdt.core"/>
-      <import plugin="org.eclipse.jdt.launching"/>
-      <import plugin="org.eclipse.debug.ui"/>
+      <import plugin="org.eclipse.core.commands"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.ui.workbench"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.hamcrest"/>
+      <import plugin="org.eclipse.ui.editors"/>
+      <import plugin="org.eclipse.swtbot.swt.finder"/>
+      <import plugin="org.eclipse.swtbot.junit4_x"/>
+      <import plugin="org.eclipse.equinox.app"/>
       <import plugin="org.eclipse.jdt.junit.runtime"/>
-      <import plugin="org.eclipse.jdt.ui"/>
-      <import plugin="org.eclipse.ui.intro"/>
-      <import plugin="org.eclipse.ui.intro.universal"/>
+      <import plugin="org.eclipse.ui.ide"/>
    </requires>
 
    <plugin
@@ -124,14 +57,7 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.swtbot.eclipse.spy"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swtbot.eclipse.ui"
+         id="org.eclipse.swtbot.go"
          download-size="0"
          install-size="0"
          version="0.0.0"
@@ -144,4 +70,11 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.swtbot.eclipse.spy"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/org.eclipse.swtbot.eclipse/license.html b/org.eclipse.swtbot.eclipse/license.html
index c6af966..c184ca3 100644
--- a/org.eclipse.swtbot.eclipse/license.html
+++ b/org.eclipse.swtbot.eclipse/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
    For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
 
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,23 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
 </ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/org.eclipse.swtbot.eclipse/pom.xml b/org.eclipse.swtbot.eclipse/pom.xml
new file mode 100644
index 0000000..679dfe7
--- /dev/null
+++ b/org.eclipse.swtbot.eclipse/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.eclipse</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.recorder.test/.classpath b/org.eclipse.swtbot.forms.finder.test/.classpath
similarity index 100%
rename from org.eclipse.swtbot.swt.recorder.test/.classpath
rename to org.eclipse.swtbot.forms.finder.test/.classpath
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.forms.finder.test/.project
similarity index 92%
rename from org.eclipse.swtbot.swt.recorder/.project
rename to org.eclipse.swtbot.forms.finder.test/.project
index d2190e0..746b608 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.forms.finder.test/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.swtbot.forms.finder.test</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.forms.finder.test/.settings/org.eclipse.jdt.core.prefs
similarity index 91%
rename from org.eclipse.swtbot.eclipse.dsl.test/.settings/org.eclipse.jdt.core.prefs
rename to org.eclipse.swtbot.forms.finder.test/.settings/org.eclipse.jdt.core.prefs
index 6091fcc..ff6e525 100644
--- a/org.eclipse.swtbot.eclipse.dsl.test/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.swtbot.forms.finder.test/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Tue Jan 13 09:06:46 IST 2009
+#Tue Mar 01 22:21:58 PST 2011
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
diff --git a/org.eclipse.swtbot.forms.finder.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.forms.finder.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8739e84
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: SWTBot Forms Tests
+Bundle-SymbolicName: org.eclipse.swtbot.forms.finder.test;singleton:=true
+Bundle-Version: 2.0.5.qualifier
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.swt,
+ org.eclipse.jface,
+ org.eclipse.swt.examples,
+ org.eclipse.swtbot.swt.finder,
+ org.apache.log4j;bundle-version="[1.2.13,1.3.0)",
+ org.junit4,
+ org.hamcrest,
+ org.eclipse.swtbot.junit4_x,
+ org.eclipse.swtbot.forms.finder,
+ org.eclipse.ui.forms,
+ org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.swtbot.eclipse.finder,
+ org.eclipse.ui.forms.examples;bundle-version="3.1.100"
+Bundle-Vendor: Eclipse SWTBot
diff --git a/org.eclipse.swtbot.forms.finder.test/build.properties b/org.eclipse.swtbot.forms.finder.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.swtbot.forms.finder.test/pom.xml b/org.eclipse.swtbot.forms.finder.test/pom.xml
new file mode 100644
index 0000000..529a928
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/pom.xml
@@ -0,0 +1,80 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot.plugins</groupId>
+	<artifactId>org.eclipse.swtbot.forms.finder.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.swtbot</groupId>
+		<artifactId>parent</artifactId>
+		<version>2.0.5-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<properties>
+		<!-- tycho.testArgLine repeated to re-use the configuration for argLine for jacoco agent -->
+		<uitest.vmparams>${tycho.testArgLine} -Xms64m -Xmx1024m -XX:MaxPermSize=128M</uitest.vmparams>
+	</properties>
+	<profiles>
+		<profile>
+			<id>skip-ui-tests</id>
+			<activation>
+				<property>
+					<name>skip-ui-tests</name>
+				</property>
+			</activation>
+			<properties>
+				<maven.test.skip>true</maven.test.skip>
+			</properties>
+		</profile>
+		<profile>
+			<id>macosx</id>
+			<activation>
+				<os>
+					<name>mac os x</name>
+					<family>mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams} -XstartOnFirstThread</ui.test.vmargs>
+			</properties>
+		</profile>
+		<profile>
+			<id>other-os</id>
+			<activation>
+				<os>
+					<name>not-mac</name>
+					<family>!mac</family>
+				</os>
+			</activation>
+			<properties>
+				<ui.test.vmargs>${uitest.vmparams}</ui.test.vmargs>
+			</properties>
+		</profile>
+	</profiles>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<argLine>${ui.test.vmargs}</argLine>
+					<useUIHarness>true</useUIHarness>
+					<useUIThread>false</useUIThread>
+					<product>org.eclipse.sdk.ide</product>
+					<application>org.eclipse.ui.ide.workbench</application>
+					<testSuite>org.eclipse.swtbot.forms.finder.test</testSuite>
+					<testClass>org.eclipse.swtbot.forms.finder.test.AllTests</testClass>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/AllTests.java b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/AllTests.java
new file mode 100644
index 0000000..33dd134
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/AllTests.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.forms.finder.test;
+
+import org.eclipse.swtbot.forms.finder.test.widgets.SWTBotHyperlinkTest;
+import org.eclipse.swtbot.forms.finder.test.widgets.SWTBotImageHyperlinkTest;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJUnit4Suite;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+@RunWith(SWTBotJUnit4Suite.class)
+@SuiteClasses({
+	SWTBotHyperlinkTest.class,
+	SWTBotImageHyperlinkTest.class,
+	})
+public class AllTests {
+
+}
diff --git a/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/AbstractSWTBotFormsTest.java b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/AbstractSWTBotFormsTest.java
new file mode 100644
index 0000000..07bf008
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/AbstractSWTBotFormsTest.java
@@ -0,0 +1,90 @@
+/*******************************************************************************

+ * Copyright (c) 2010 Ketan Padegaonkar 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:

+ *     Ketan Padegaonkar - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.swtbot.forms.finder.test.widgets;

+

+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;

+

+import java.util.List;

+

+import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;

+import org.eclipse.swtbot.eclipse.finder.finders.WorkbenchContentsFinder;

+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;

+import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;

+import org.eclipse.swtbot.forms.finder.SWTFormsBot;

+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;

+import org.eclipse.swtbot.swt.finder.results.VoidResult;

+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;

+import org.eclipse.ui.IWorkbenchWindow;

+import org.eclipse.ui.PartInitException;

+import org.eclipse.ui.actions.ActionFactory;

+import org.junit.After;

+import org.junit.BeforeClass;

+

+public abstract class AbstractSWTBotFormsTest {

+

+	protected static SWTFormsBot		bot			= new SWTFormsBot();

+	protected static SWTWorkbenchBot	workbench	= new SWTWorkbenchBot();

+

+	@BeforeClass

+	public static void beforeClass() {

+		closeWelcomePage();

+		closeAllViews();

+		showFormsView();

+	}

+

+	private static void showFormsView() {

+		syncExec(new VoidResult() {

+			public void run() {

+				IWorkbenchWindow window = new WorkbenchContentsFinder().activeWorkbenchWindow();

+				try {

+					window.getActivePage().showView("org.eclipse.ui.forms.examples.views.FormView");

+					ActionFactory.MAXIMIZE.create(window).run();

+				} catch (PartInitException e) {

+					throw new RuntimeException(e);

+				}

+			}

+		});

+	}

+

+	private static void closeAllViews() {

+		List<SWTBotView> views = workbench.views();

+		for (SWTBotView view : views) {

+			view.close();

+		}

+	}

+

+	private static void closeWelcomePage() {

+		try {

+			SWTBotPreferences.TIMEOUT = 0;

+			System.setProperty("org.eclipse.swtbot.search.timeout", "0");

+			workbench.viewByTitle("Welcome").close();

+		} catch (WidgetNotFoundException e) {

+			// do nothing

+		} finally {

+			SWTBotPreferences.TIMEOUT = 5000;

+		}

+	}

+

+	@After

+	public void tearDown() throws Exception {

+		saveAndCloseAllEditors();

+	}

+

+	/**

+	 * @throws WidgetNotFoundException

+	 */

+	private void saveAndCloseAllEditors() {

+		List<? extends SWTBotEditor> editors = workbench.editors();

+		for (SWTBotEditor editor : editors) {

+			editor.saveAndClose();

+		}

+	}

+}

diff --git a/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotHyperlinkTest.java b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotHyperlinkTest.java
new file mode 100644
index 0000000..78f0801
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotHyperlinkTest.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Chris Aniszczyk 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:
+ *     Chris Aniszczyk <caniszczyk@gmail.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.forms.finder.test.widgets;
+
+import static org.eclipse.swtbot.swt.finder.SWTBotAssert.assertMatchesRegex;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withRegex;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.swtbot.forms.finder.widgets.SWTBotHyperlink;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.junit.Test;
+
+public class SWTBotHyperlinkTest extends AbstractSWTBotFormsTest {
+
+	@Test
+	public void findHyperlink() throws Exception {
+		String text = "This is an example of a form that is much longer and will need to wrap.";
+		SWTBotHyperlink link = bot.hyperlink(text);
+		assertNotNull(link);
+		assertEquals(text, link.getText());
+		assertEquals(Hyperlink.class, link.widget.getClass());
+	}
+
+	@Test
+	public void canFindHyperlinkWithRegex() throws Exception {
+		String text = "example of a form .* is much longer";
+		SWTBotHyperlink link = new SWTBotHyperlink((Hyperlink) bot.widget(withRegex(text)));
+		assertNotNull(link);
+		assertMatchesRegex(text, link.getText());
+		assertEquals(Hyperlink.class, link.widget.getClass());
+	}
+
+}
diff --git a/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotImageHyperlinkTest.java b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotImageHyperlinkTest.java
new file mode 100644
index 0000000..62d1cc8
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder.test/src/org/eclipse/swtbot/forms/finder/test/widgets/SWTBotImageHyperlinkTest.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Chris Aniszczyk 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:
+ *     Chris Aniszczyk <caniszczyk@gmail.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.forms.finder.test.widgets;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withRegex;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.swtbot.forms.finder.widgets.SWTBotImageHyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.junit.Test;
+
+public class SWTBotImageHyperlinkTest extends AbstractSWTBotFormsTest {
+
+	@Test
+	public void findImageHyperlinkWithNoImage() throws Exception {
+		String text = "Image link with no image";
+		SWTBotImageHyperlink link = bot.imageHyperlink(text);
+		assertNotNull(link);
+		assertEquals(text, link.getText());
+		assertEquals(ImageHyperlink.class, link.widget.getClass());
+	}
+	
+	@Test
+	public void canFindImageHyperlinkWithNoImageByRegex() throws Exception {
+		String text = "link with no";
+		SWTBotImageHyperlink link = new SWTBotImageHyperlink((ImageHyperlink) bot.widget(withRegex(text)));
+
+		assertNotNull(link);
+		assertEquals("Image link with no image", link.getText());
+		assertEquals(ImageHyperlink.class, link.widget.getClass());
+	}
+	
+	
+	@Test
+	public void findImageHyperlinkWithImage() throws Exception {
+		String text = "Link with image and text";
+		SWTBotImageHyperlink link = bot.imageHyperlink(text);
+		assertNotNull(link);
+		assertEquals(text, link.getText());
+		assertEquals(ImageHyperlink.class, link.widget.getClass());
+	}
+	
+	@Test
+	public void canFindImageHyperlinkWithImageByRegex() throws Exception {
+		String text = "with image";
+		SWTBotImageHyperlink link = new SWTBotImageHyperlink((ImageHyperlink) bot.widget(withRegex(text)));
+
+		assertNotNull(link);
+		assertEquals("Link with image and text", link.getText());
+		assertEquals(ImageHyperlink.class, link.widget.getClass());
+	}
+}
diff --git a/org.eclipse.swtbot.swt.recorder/.classpath b/org.eclipse.swtbot.forms.finder/.classpath
similarity index 100%
rename from org.eclipse.swtbot.swt.recorder/.classpath
rename to org.eclipse.swtbot.forms.finder/.classpath
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.forms.finder/.project
similarity index 92%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.swtbot.forms.finder/.project
index d2190e0..291566c 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.forms.finder/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.swtbot.forms.finder</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.swt.recorder/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.forms.finder/.settings/org.eclipse.jdt.core.prefs
similarity index 92%
rename from org.eclipse.swtbot.swt.recorder/.settings/org.eclipse.jdt.core.prefs
rename to org.eclipse.swtbot.forms.finder/.settings/org.eclipse.jdt.core.prefs
index a79c255..7f61127 100644
--- a/org.eclipse.swtbot.swt.recorder/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.swtbot.forms.finder/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Tue Dec 16 23:22:35 IST 2008
+#Mon May 03 03:39:51 CDT 2010
 eclipse.preferences.version=1
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
diff --git a/org.eclipse.swtbot.forms.finder/.settings/org.moreunit.prefs b/org.eclipse.swtbot.forms.finder/.settings/org.moreunit.prefs
new file mode 100644
index 0000000..cf12973
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/.settings/org.moreunit.prefs
@@ -0,0 +1,6 @@
+#Tue Mar 01 21:55:27 PST 2011
+eclipse.preferences.version=1
+org.moreunit.prefixes=
+org.moreunit.test_type=junit4
+org.moreunit.unitsourcefolder=org.eclipse.swtbot.forms.finder\:src\:org.eclipse.swtbot.forms.finder.test\:src
+org.moreunit.useprojectsettings=true
diff --git a/org.eclipse.swtbot.forms.finder/META-INF/MANIFEST.MF b/org.eclipse.swtbot.forms.finder/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..aee2cc0
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.swtbot.forms.finder
+Bundle-Version: 2.0.5.qualifier
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: org.eclipse.swtbot.swt.finder,
+ org.hamcrest.core;bundle-version="1.1.0"
+Import-Package: org.apache.log4j;version="[1.2.13,1.3.0)",
+ org.eclipse.jface,
+ org.eclipse.jface.bindings,
+ org.eclipse.swt,
+ org.eclipse.swt.graphics,
+ org.eclipse.swt.widgets,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.forms.editor,
+ org.eclipse.ui.forms.events,
+ org.eclipse.ui.forms.widgets
+Export-Package: org.eclipse.swtbot.forms.finder,
+ org.eclipse.swtbot.forms.finder.widgets
+Bundle-Vendor: Eclipse SWTBot
+Bundle-Name: SWTBot Forms (Incubation)
diff --git a/org.eclipse.swtbot.forms.finder/build.properties b/org.eclipse.swtbot.forms.finder/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.swtbot.forms.finder/pom.xml b/org.eclipse.swtbot.forms.finder/pom.xml
new file mode 100644
index 0000000..caf218a
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.forms.finder</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/SWTFormsBot.java b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/SWTFormsBot.java
new file mode 100644
index 0000000..f4605f7
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/SWTFormsBot.java
@@ -0,0 +1,324 @@
+// Generated source. DO NOT MODIFY.
+// To add new widgets, please see README file in the generator plugin.
+package org.eclipse.swtbot.forms.finder;
+
+
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.forms.finder.widgets.SWTBotHyperlink;
+import org.eclipse.swtbot.forms.finder.widgets.SWTBotImageHyperlink;
+import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.ChildrenControlFinder;
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.finders.Finder;
+import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.hamcrest.Matcher;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.inGroup;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withId;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
+
+
+/**
+ * SWTFormsBot is a {@link SWTBot} with capabilities for testing eclipse forms.
+ *
+ * @see {@link SWTBot} - SWTBot for usage examples.
+ */
+public class SWTFormsBot extends SWTBot {
+
+	/**
+	 * Constructs a bot.
+	 */
+	public SWTFormsBot() {
+		this(new ControlFinder(), new MenuFinder());
+	}
+
+	/**
+	 * Constructs a bot that will match the contents of the given parentWidget.
+	 * 
+	 * @param parent the parent
+	 */
+	public SWTFormsBot(Widget parent) {
+		this(new ChildrenControlFinder(parent), new MenuFinder());
+	}
+	/**
+	 * Constructs an instance of the bot using the given control finder and menu finder.
+	 * 
+	 * @param controlFinder the {@link ControlFinder} used to identify and find controls.
+	 * @param menuFinder the {@link MenuFinder} used to find menu items.
+	 */
+	public SWTFormsBot(ControlFinder controlFinder, MenuFinder menuFinder) {
+		this(new Finder(controlFinder, menuFinder));
+	}
+
+	/**
+	 * Constructs a bot with the given finder.
+	 * 
+	 * @param finder the finder.
+	 */
+	public SWTFormsBot(Finder finder) {
+		super(finder);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlink(String mnemonicText) {
+		return hyperlink(mnemonicText, 0);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlink(String mnemonicText, int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class), withMnemonic(mnemonicText));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlinkWithId(String key, String value) {
+		return hyperlinkWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlinkWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class), withId(key, value));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlinkWithId(String value) {
+		return hyperlinkWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlinkWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class), withId(value));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlinkInGroup(String inGroup) {
+		return hyperlinkInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlinkInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class), inGroup(inGroup));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotHyperlink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlink() {
+		return hyperlink(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlink(int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotHyperlink hyperlinkInGroup(String mnemonicText, String inGroup) {
+		return hyperlinkInGroup(mnemonicText, inGroup, 0);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotHyperlink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotHyperlink hyperlinkInGroup(String mnemonicText, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Hyperlink.class), withMnemonic(mnemonicText), inGroup(inGroup));
+		return new SWTBotHyperlink((Hyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlink(String mnemonicText) {
+		return imageHyperlink(mnemonicText, 0);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlink(String mnemonicText, int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class), withMnemonic(mnemonicText));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlinkWithId(String key, String value) {
+		return imageHyperlinkWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlinkWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class), withId(key, value));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlinkWithId(String value) {
+		return imageHyperlinkWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlinkWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class), withId(value));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlinkInGroup(String inGroup) {
+		return imageHyperlinkInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlinkInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class), inGroup(inGroup));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlink() {
+		return imageHyperlink(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlink(int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotImageHyperlink imageHyperlinkInGroup(String mnemonicText, String inGroup) {
+		return imageHyperlinkInGroup(mnemonicText, inGroup, 0);
+	}
+
+	/**
+	 * @param mnemonicText the mnemonicText on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotImageHyperlink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotImageHyperlink imageHyperlinkInGroup(String mnemonicText, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(ImageHyperlink.class), withMnemonic(mnemonicText), inGroup(inGroup));
+		return new SWTBotImageHyperlink((ImageHyperlink) widget(matcher, index), matcher);
+	}
+
+
+
+}
diff --git a/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotHyperlink.java b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotHyperlink.java
new file mode 100644
index 0000000..0b8f12e
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotHyperlink.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Chris Aniszczyk 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:
+ *     Chris Aniszczyk <caniszczyk@gmail.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.forms.finder.widgets;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swtbot.swt.finder.ReferenceBy;
+import org.eclipse.swtbot.swt.finder.SWTBotWidget;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
+import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.hamcrest.SelfDescribing;
+
+/**
+ * This represents a {@link Hyperlink} widget.
+ * 
+ * @author Chris Aniszczyk &lt;caniszczyk [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+@SWTBotWidget(clasz = Hyperlink.class, preferredName = "hyperlink", referenceBy = { ReferenceBy.MNEMONIC })
+public class SWTBotHyperlink extends AbstractSWTBotControl<Hyperlink> {
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotHyperlink(Hyperlink w) throws WidgetNotFoundException {
+		super(w);
+	}
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @param description the description of the widget, this will be reported by {@link #toString()}
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotHyperlink(Hyperlink w, SelfDescribing description) throws WidgetNotFoundException {
+		super(w, description);
+	}
+
+	public AbstractSWTBot<Hyperlink> click() {
+		return click(true);
+	}
+
+	/**
+	 * Clicks on the hyperlink with the specified text.
+	 * 
+	 * @param hyperlinkText the text of the hyperlink in case there are more than one hyperlinks.
+	 * @return itself.
+	 */
+	public AbstractSWTBot<Hyperlink> click(String hyperlinkText) {
+		log.debug(MessageFormat.format("Clicking on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		String text = getText();
+		boolean isText = text.contains(">" + hyperlinkText + "<");
+		Assert.isLegal(isText, "Link does not contain text (" + hyperlinkText + "). It contains (" + text + ")");
+
+		hyperlinkText = extractHyperlinkTextOrHREF(hyperlinkText, text);
+		notify(SWT.Selection, createHyperlinkEvent(hyperlinkText));
+
+		log.debug(MessageFormat.format("Clicked on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		return click(true);
+	}
+
+	private String extractHyperlinkTextOrHREF(String hyperlinkText, String text) {
+		Pattern pattern = Pattern.compile(".*<[aA] [hH][rR][eE][fF]\\s*=\\s*['\"](.*)['\"]>" + hyperlinkText + "</[aA]>.*");
+		Matcher matcher = pattern.matcher(text);
+		return matcher.find() ? matcher.group(1) : hyperlinkText;
+	}
+
+	private Event createHyperlinkEvent(String hyperlinkText) {
+		Event e = createEvent();
+		e.text = hyperlinkText;
+		return e;
+	}
+}
diff --git a/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotImageHyperlink.java b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotImageHyperlink.java
new file mode 100644
index 0000000..742ae73
--- /dev/null
+++ b/org.eclipse.swtbot.forms.finder/src/org/eclipse/swtbot/forms/finder/widgets/SWTBotImageHyperlink.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Chris Aniszczyk 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:
+ *     Chris Aniszczyk <caniszczyk@gmail.com> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.forms.finder.widgets;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swtbot.swt.finder.ReferenceBy;
+import org.eclipse.swtbot.swt.finder.SWTBotWidget;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
+import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.hamcrest.SelfDescribing;
+
+/**
+ * This represents a {@link ImageHyperlink} widget.
+ * 
+ * @author Chris Aniszczyk &lt;caniszczyk [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+@SWTBotWidget(clasz = ImageHyperlink.class, preferredName = "imageHyperlink", referenceBy = { ReferenceBy.MNEMONIC })
+public class SWTBotImageHyperlink extends AbstractSWTBotControl<ImageHyperlink> {
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotImageHyperlink(ImageHyperlink w) throws WidgetNotFoundException {
+		super(w);
+	}
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @param description the description of the widget, this will be reported by {@link #toString()}
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotImageHyperlink(ImageHyperlink w, SelfDescribing description) throws WidgetNotFoundException {
+		super(w, description);
+	}
+	
+	public AbstractSWTBot<ImageHyperlink> click() {
+		return click(true);
+	}
+
+	/**
+	 * Return the ImageHyperlink's image or <code>null</code>.
+	 * 
+	 * @return the image of the image hyperlink or <code>null</code>.
+	 */
+	public Image image() {
+		return syncExec(new Result<Image>() {
+			public Image run() {
+				return widget.getImage();
+			}
+		});
+	}
+	
+	/**
+	 * Return the ImageHyperlink's hover image or <code>null</code>.
+	 * 
+	 * @return the hover image of the image hyperlink or <code>null</code>.
+	 */
+	public Image hoverImage() {
+		return syncExec(new Result<Image>() {
+			public Image run() {
+				return widget.getHoverImage();
+			}
+		});
+	}
+	
+	/**
+	 * Return the ImageHyperlink's active image or <code>null</code>.
+	 * 
+	 * @return the active image of the image hyperlink or <code>null</code>.
+	 */
+	public Image activeImage() {
+		return syncExec(new Result<Image>() {
+			public Image run() {
+				return widget.getActiveImage();
+			}
+		});
+	}
+
+	/**
+	 * Clicks on the image hyperlink with the specified text.
+	 * 
+	 * @param hyperlinkText the text of the image hyperlink in case there are more than one hyperlinks.
+	 * @return itself.
+	 */
+	public AbstractSWTBot<ImageHyperlink> click(String hyperlinkText) {
+		log.debug(MessageFormat.format("Clicked on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		String text = getText();
+		boolean isText = text.contains(">" + hyperlinkText + "<");
+		Assert.isLegal(isText, "Link does not contain text (" + hyperlinkText + "). It contains (" + text + ")");
+
+		hyperlinkText = extractHyperlinkTextOrHREF(hyperlinkText, text);
+		notify(SWT.Selection, createHyperlinkEvent(hyperlinkText));
+
+		log.debug(MessageFormat.format("Clicked on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		return click(true);
+	}
+
+	private String extractHyperlinkTextOrHREF(String hyperlinkText, String text) {
+		Pattern pattern = Pattern.compile(".*<[aA] [hH][rR][eE][fF]\\s*=\\s*['\"](.*)['\"]>" + hyperlinkText + "</[aA]>.*");
+		Matcher matcher = pattern.matcher(text);
+		return matcher.find() ? matcher.group(1) : hyperlinkText;
+	}
+
+	private Event createHyperlinkEvent(String hyperlinkText) {
+		Event e = createEvent();
+		e.text = hyperlinkText;
+		return e;
+	}
+}
diff --git a/org.eclipse.swtbot.recording/.project b/org.eclipse.swtbot.forms/.project
similarity index 88%
copy from org.eclipse.swtbot.recording/.project
copy to org.eclipse.swtbot.forms/.project
index 6329529..4cf8475 100644
--- a/org.eclipse.swtbot.recording/.project
+++ b/org.eclipse.swtbot.forms/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.recording</name>
+	<name>org.eclipse.swtbot.forms</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.recording/build.properties b/org.eclipse.swtbot.forms/build.properties
similarity index 72%
copy from org.eclipse.swtbot.recording/build.properties
copy to org.eclipse.swtbot.forms/build.properties
index 83b8d3e..3bf4cca 100644
--- a/org.eclipse.swtbot.recording/build.properties
+++ b/org.eclipse.swtbot.forms/build.properties
@@ -1,19 +1,21 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2009 Mariot Chauvin 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:
-#     Ketan Padegaonkar - initial API and implementation
+#     Mariot Chauvin - initial API and implementation
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot.recording/epl-v10.html b/org.eclipse.swtbot.forms/epl-v10.html
similarity index 100%
rename from org.eclipse.swtbot.recording/epl-v10.html
rename to org.eclipse.swtbot.forms/epl-v10.html
diff --git a/org.eclipse.swtbot.forms/feature.properties b/org.eclipse.swtbot.forms/feature.properties
new file mode 100644
index 0000000..26c6239
--- /dev/null
+++ b/org.eclipse.swtbot.forms/feature.properties
@@ -0,0 +1,141 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c)  2004, 2009 MAKE Technologies Inc and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	MAKE Technologies Inc - initial API and implementation\n\
+ 	Mariot Chauvin (Obeo) -  SWTBot contribution\n
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.forms/feature.xml b/org.eclipse.swtbot.forms/feature.xml
new file mode 100644
index 0000000..b59b5c4
--- /dev/null
+++ b/org.eclipse.swtbot.forms/feature.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.swtbot.forms"
+      label="SWTBot for Eclipse Forms Testing (incubation)"
+      version="2.0.5.qualifier"
+      provider-name="Eclipse.org"
+      plugin="org.eclipse.swtbot.eclipse.ui">
+
+   <description url="http://eclipse.org/">
+      SWTBot for testing Eclipse Forms based plugins and applications (incubation)
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <url>
+      <update label="SWTBot update site" url="http://download.eclipse.org/technology/swtbot/update-site"/>
+   </url>
+
+   <includes
+         id="org.eclipse.swtbot"
+         version="0.0.0"/>
+
+   <requires>
+      <import plugin="org.junit"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.ui"/>
+      <import plugin="org.eclipse.ui.ide"/>
+      <import plugin="org.eclipse.swtbot.swt.finder"/>
+      <import plugin="org.hamcrest"/>
+      <import plugin="org.apache.log4j"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.swtbot.forms.finder"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.swtbot.forms/license.html b/org.eclipse.swtbot.forms/license.html
new file mode 100644
index 0000000..c184ca3
--- /dev/null
+++ b/org.eclipse.swtbot.forms/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.swtbot.forms/pom.xml b/org.eclipse.swtbot.forms/pom.xml
new file mode 100644
index 0000000..4c458c0
--- /dev/null
+++ b/org.eclipse.swtbot.forms/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.forms</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.generator.test/META-INF/MANIFEST.MF
index 6d3b978..1d798c5 100644
--- a/org.eclipse.swtbot.generator.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.generator.test/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: Generator Test Plug-in (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.generator.test
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Require-Bundle: org.eclipse.swtbot.swt.finder,
  org.hamcrest,
diff --git a/org.eclipse.swtbot.generator.test/pom.xml b/org.eclipse.swtbot.generator.test/pom.xml
new file mode 100644
index 0000000..7eb50ca
--- /dev/null
+++ b/org.eclipse.swtbot.generator.test/pom.xml
@@ -0,0 +1,20 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot.tests</groupId>
+	<artifactId>org.eclipse.swtbot.generator.test</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.swtbot</groupId>
+		<artifactId>parent</artifactId>
+		<version>2.0.5-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/MethodGeneratorTest.java b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/MethodGeneratorTest.java
index 3aa18b3..50ff6c7 100644
--- a/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/MethodGeneratorTest.java
+++ b/org.eclipse.swtbot.generator.test/src/org/eclipse/swtbot/generator/MethodGeneratorTest.java
@@ -17,9 +17,12 @@
 import static org.junit.Assert.assertEquals;
 
 import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swtbot.swt.finder.ReferenceBy;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 import org.junit.Before;
 import org.junit.Test;
@@ -34,6 +37,7 @@
 	private MethodGenerator	withTextInGroup;
 	private MethodGenerator	withStyleWithTextInGroup;
 	private MethodGenerator	withStyle;
+	private MethodGenerator	withSubclassedWidgets;
 
 	@Test
 	public void generatesMethodArgumentsGivenASingleReference() throws Exception {
@@ -47,14 +51,14 @@
 
 	@Test
 	public void generatesMethodContentsWithIndexGivenASingleReference() throws Exception {
-		assertEquals("	@SuppressWarnings(\"unchecked\")\n" + "	public SWTBotButton buttonInGroup(String inGroup, int index) {\n"
+		assertEquals("	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + "	public SWTBotButton buttonInGroup(String inGroup, int index) {\n"
 				+ "		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup));\n"
 				+ "		return new SWTBotButton((Button) widget(matcher, index), matcher);\n" + "	}\n", inGroup.methodContentsWithIndex());
 	}
 
 	@Test
 	public void generatesMethodContentsWithIndexGivenTwoReferences() throws Exception {
-		assertEquals("	@SuppressWarnings(\"unchecked\")\n"
+		assertEquals("	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n"
 				+ "	public SWTBotButton buttonInGroup(String text, String inGroup, int index) {\n"
 				+ "		Matcher matcher = allOf(widgetOfType(Button.class), withText(text), inGroup(inGroup));\n"
 				+ "		return new SWTBotButton((Button) widget(matcher, index), matcher);\n" + "	}\n", withTextInGroup
@@ -64,7 +68,7 @@
 	@Test
 	public void generatesMethodContentsWithIndexAndStyleGivenTwoReferences() throws Exception {
 		assertEquals(
-				"	@SuppressWarnings(\"unchecked\")\n"
+				"	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n"
 						+ "	public SWTBotTree treeInGroup(String text, String inGroup, int index) {\n"
 						+ "		Matcher matcher = allOf(widgetOfType(Tree.class), withText(text), inGroup(inGroup), withStyle(SWT.FOO_STYLE, \"SWT.FOO_STYLE\"));\n"
 						+ "		return new SWTBotTree((Tree) widget(matcher, index), matcher);\n" + "	}\n", withStyleWithTextInGroup
@@ -73,7 +77,7 @@
 
 	@Test
 	public void generatesMethodContentsWithStyleWithNoReferences() throws Exception {
-		assertEquals("	@SuppressWarnings(\"unchecked\")\n" + "	public SWTBotTree tree(int index) {\n"
+		assertEquals("	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + "	public SWTBotTree tree(int index) {\n"
 				+ "		Matcher matcher = allOf(widgetOfType(Tree.class), withStyle(SWT.FOO_STYLE, \"SWT.FOO_STYLE\"));\n"
 				+ "		return new SWTBotTree((Tree) widget(matcher, index), matcher);\n" + "	}\n", withStyle.methodContentsWithIndex());
 	}
@@ -89,6 +93,16 @@
 		assertEquals("	public SWTBotButton buttonInGroup(String text, String inGroup) {\n" + "		return buttonInGroup(text, inGroup, 0);\n"
 				+ "	}\n", withTextInGroup.methodContents());
 	}
+	
+	@Test
+	public void generatesMethodContentsWithSubclassedTypes() throws Exception {
+		assertEquals("	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" + 
+				"	public SWTBotToolbarButton toolbarToggleButtonInGroup(String text, String inGroup, int index) {\n" + 
+				"		Matcher matcher = allOf(widgetOfType(ToolItem.class), withText(text), inGroup(inGroup), withStyle(SWT.FOO_STYLE, \"SWT.FOO_STYLE\"));\n" + 
+				"		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);\n" + 
+				"	}\n" + 
+				"", withSubclassedWidgets.methodContentsWithIndex());
+	}
 
 	@Test
 	public void generatesImports() throws Exception {
@@ -98,11 +112,14 @@
 
 	@Before
 	public void setUp() throws Exception {
-		inGroup = new MethodGenerator(SWTBotButton.class, Button.class, "button", "SWT.NONE", ReferenceBy.IN_GROUP);
-		withTextInGroup = new MethodGenerator(SWTBotButton.class, Button.class, "button", "SWT.NONE", ReferenceBy.TEXT,
+		inGroup = new MethodGenerator(SWTBotButton.class, SWTBotButton.class, Button.class, "button", "SWT.NONE", ReferenceBy.IN_GROUP);
+		withTextInGroup = new MethodGenerator(SWTBotButton.class, SWTBotButton.class, Button.class, "button", "SWT.NONE", ReferenceBy.TEXT,
 				ReferenceBy.IN_GROUP);
-		withStyle = new MethodGenerator(SWTBotTree.class, Tree.class, "tree", "SWT.FOO_STYLE", ReferenceBy.NONE);
-		withStyleWithTextInGroup = new MethodGenerator(SWTBotTree.class, Tree.class, "tree", "SWT.FOO_STYLE", ReferenceBy.TEXT,
+		withStyle = new MethodGenerator(SWTBotTree.class, SWTBotTree.class, Tree.class, "tree", "SWT.FOO_STYLE", ReferenceBy.NONE);
+		withStyleWithTextInGroup = new MethodGenerator(SWTBotTree.class, SWTBotTree.class, Tree.class, "tree", "SWT.FOO_STYLE", ReferenceBy.TEXT,
+				ReferenceBy.IN_GROUP);
+		
+		withSubclassedWidgets = new MethodGenerator(SWTBotToolbarButton.class, SWTBotToolbarPushButton.class, ToolItem.class, "toolbarToggleButton", "SWT.FOO_STYLE", ReferenceBy.TEXT,
 				ReferenceBy.IN_GROUP);
 	}
 
diff --git a/org.eclipse.swtbot.generator/META-INF/MANIFEST.MF b/org.eclipse.swtbot.generator/META-INF/MANIFEST.MF
index 0500e77..8c709f3 100644
--- a/org.eclipse.swtbot.generator/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.generator/META-INF/MANIFEST.MF
@@ -2,14 +2,15 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Code Generator Plug-in (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.generator
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ClassPath: .
 Export-Package: org.eclipse.swtbot.generator
 Import-Package: com.thoughtworks.qdox;version="1.6.3",
  org.eclipse.swt.widgets,
  org.eclipse.swtbot.eclipse.finder,
+ org.eclipse.swtbot.forms.finder.widgets,
  org.eclipse.swtbot.swt.finder,
  org.eclipse.swtbot.swt.finder.utils,
  org.hamcrest.generator.config;version="1.1.0"
diff --git a/org.eclipse.swtbot.generator/README.txt b/org.eclipse.swtbot.generator/README.txt
new file mode 100644
index 0000000..e0871f5
--- /dev/null
+++ b/org.eclipse.swtbot.generator/README.txt
@@ -0,0 +1,58 @@
+The SWTBot generator plugin
+===========================
+
+1. What is this plugin?
+
+  This plugin contains some sources to generate key parts of the SWTBot 
+  source. The `SWTBot' class and two classes named `WidgetMatcherFactory'
+  are generated using this plugin.
+
+
+
+2. Why would one generate these classes?
+
+  For two reasons:
+  * consistency and error-free source - all the methods look exactly the 
+    same and are generated by a program
+  * no need to keep track of methods on these classes when adding support
+    for new widgets or matchers
+
+
+
+3. What do I need to do if I want to add a new widget to SWTBot?
+
+  Four things:
+  * Create an SWTBotMyWidget class (see SWTBotButton for an example)
+  * Add an annotation `@SWTBotWidget' to the new class. This annotation
+    describes what prefix and and suffixes should be generated for accessing
+    this widget. More on this annotation later.
+  * Edit widgets.xml and add the name of your class
+  * Run the class `SWTBotGeneratorMain'
+
+
+
+4. What do I need to do if I want to add a new accessor method to SWTBot?
+
+  If SWTBot already has support for the widget, but is missing an accessor of
+  the form <widget>withSomeproperty(arguments), then change the annotation on
+  the SWTBot<widget> class and execute `SWTBotGeneratorMain'.
+
+
+
+5. What do I need to do if I want to add support for a new matcher?
+
+  Four things:
+  * Create a Matcher class (see WithStyle/WithText for example)
+  * Ensure that there is an @Factory method on the class
+  * Edit swtbot-matchers.xml or swtbot-eclipse-matchers.xml as the case may be
+  * Run the class `MatcherGeneratorMain'
+
+
+
+6. What is this @SWTBotWidget annotation about?
+
+  This annotation marks a SWTBot widget so the generator and other tools can
+  recognize it. This annotation is primarily used to describe the convinience
+  API that should be generated for a class annotated with the specified widget.
+
+  See the javadoc on the annotation for more detail and examples.
diff --git a/org.eclipse.swtbot.generator/pom.xml b/org.eclipse.swtbot.generator/pom.xml
new file mode 100644
index 0000000..eccf808
--- /dev/null
+++ b/org.eclipse.swtbot.generator/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.generator</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/HamcrestFactoryWriter.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/HamcrestFactoryWriter.java
index b5842df..4a53e1e 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/HamcrestFactoryWriter.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/HamcrestFactoryWriter.java
@@ -15,6 +15,8 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.eclipse.swtbot.swt.finder.utils.FileUtils;
+
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
@@ -26,16 +28,19 @@
 	private final PrintWriter	output;
 
 	private final String		newLine	= "\n"; //$NON-NLS-1$
+	private final String	superClass;
 
-	public HamcrestFactoryWriter(String packageName, String shortClassName, FileWriter fileWriter) {
+	public HamcrestFactoryWriter(String packageName, String shortClassName, String superClass, FileWriter fileWriter) {
 		this.packageName = packageName;
 		this.shortClassName = shortClassName;
+		this.superClass = superClass;
 		output = new PrintWriter(fileWriter);
 
 	}
 
 	public void writeHeader(Set<String> imports) {
-		output.append("// Generated source.").append(newLine); //$NON-NLS-1$
+		output.append("// Generated source. DO NOT MODIFY.").append(newLine); //$NON-NLS-1$
+		output.append("// To add new widgets, please see README file in the generator plugin.").append(newLine); //$NON-NLS-1$
 		output.append("package ").append(packageName).append(';').append(newLine); //$NON-NLS-1$
 		output.append(newLine);
 		output.append(newLine);
@@ -45,47 +50,20 @@
 	public void beginClassDefinition() {
 		output.append(newLine);
 		output.append(newLine);
-		output.append("/**\n" + //$NON-NLS-1$
-				" * This class contains convenience API to find widgets in SWTBot.\n" + //$NON-NLS-1$
-				" * Most users would start off as follows: \n" + //$NON-NLS-1$
-				" * \n" + //$NON-NLS-1$
-				" * <pre>\n" + //$NON-NLS-1$
-				" *    SWTBot bot = new SWTBot();\n" + //$NON-NLS-1$
-				" *    \n" + //$NON-NLS-1$
-				" *    bot.button(&quot;hello world&quot;).click();\n" + //$NON-NLS-1$
-				" *    \n" + //$NON-NLS-1$
-				" *    // in case you have two edit buttons in two different groups\n" + //$NON-NLS-1$
-				" *    // say an edit button in the &quot;Address&quot; section,\n" + //$NON-NLS-1$
-				" *    // and another in &quot;Bank Account&quot; section, you can do the following\n" + //$NON-NLS-1$
-				" *    // to click on the &quot;Edit&quot; button on the &quot;Bank Account&quot; section.\n" + //$NON-NLS-1$
-				" *    // This is the recommended way to use SWTBot, instead of finding widgets based on its index.\n" + //$NON-NLS-1$
-				" *    bot.buttonInGroup(&quot;Edit&quot;, &quot;Bank Account&quot;).click();\n" + //$NON-NLS-1$
-				" * </pre>\n" + //$NON-NLS-1$
-				" * \n" + //$NON-NLS-1$
-				" * For finding widgets using custom matchers:\n" + //$NON-NLS-1$
-				" * \n" + //$NON-NLS-1$
-				" * <pre>\n" + //$NON-NLS-1$
-				" *    SWTBot bot = new SWTBot();\n" + //$NON-NLS-1$
-				" *    //\n" + //$NON-NLS-1$
-				" *    // find a button within the currently active shell:\n" + //$NON-NLS-1$
-				" *    //\n" + //$NON-NLS-1$
-				" *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher)); // or\n" + //$NON-NLS-1$
-				" *    SWTBotButton button = new SWTBotButton((Button)bot.widget(aMatcher, 3)); // for the 4th widget\n" + //$NON-NLS-1$
-				" *    //\n" + //$NON-NLS-1$
-				" *    // to find a button within a particular parent composite:\n" + //$NON-NLS-1$
-				" *    //\n" + //$NON-NLS-1$
-				" *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, parentComposite)); //or\n" + //$NON-NLS-1$
-				" *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, parentComposite, 3)); //for the 4th widget\n" + //$NON-NLS-1$
-				" * </pre>\n" + //$NON-NLS-1$
-				" *\n" + //$NON-NLS-1$
-				" * @version $Id$\n" + //$NON-NLS-1$
-				" */\n"); //$NON-NLS-1$
-		output.append("public class ").append(shortClassName).append(" extends SWTBotFactory {").append(newLine).append(newLine); //$NON-NLS-1$ //$NON-NLS-2$
+
+		output.append(FileUtils.read("templates/" + shortClassName + "/javadoc").trim()); //$NON-NLS-1$
+		output.append(newLine);
+		output.append("public class ").append(shortClassName).append(" extends "+ superClass + " {").append(newLine).append(newLine); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
 
 
 	public void writeFooter() {
+		output.append(newLine);
+		output.append(FileUtils.read("templates/" + shortClassName + "/additionalMethods")); //$NON-NLS-1$
+
+		output.append(newLine);
+		
 		output.append('}').append(newLine);
 	}
 
@@ -104,26 +82,8 @@
 	private void writeImports(Set<String> imports) {
 
 		imports = new TreeSet<String>(imports);
+		imports.addAll(FileUtils.readlines("templates/" + shortClassName + "/imports"));
 
-		imports.add("import org.eclipse.swt.SWT"); //$NON-NLS-1$
-
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withId"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withLabel"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.inGroup"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withStyle"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withTooltip"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType"); //$NON-NLS-1$
-		imports.add("import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf"); //$NON-NLS-1$
-		imports.add("import org.eclipse.swtbot.swt.finder.finders.ControlFinder"); //$NON-NLS-1$
-		imports.add("import org.eclipse.swtbot.swt.finder.finders.ChildrenControlFinder"); //$NON-NLS-1$
-		imports.add("import org.eclipse.swtbot.swt.finder.finders.Finder"); //$NON-NLS-1$
-		imports.add("import org.eclipse.swtbot.swt.finder.finders.MenuFinder"); //$NON-NLS-1$
-		imports.add("import org.eclipse.swt.widgets.Widget"); //$NON-NLS-1$
-
-		imports.add("import org.hamcrest.Matcher"); //$NON-NLS-1$
 
 		for (String importz : imports) {
 			output.append(importz).append(";").append(newLine); //$NON-NLS-1$
@@ -135,7 +95,7 @@
 		output.append("	/**\n" +
 				"	 * Constructs a bot.\n" +
 				"	 */\n" +
-				"	public SWTBot() {\n" +
+				"	public " + shortClassName + "() {\n" +
 				"		this(new ControlFinder(), new MenuFinder());\n" +
 				"	}\n" +
 				"\n" +
@@ -144,7 +104,7 @@
 				"	 * \n" + 
 				"	 * @param parent the parent\n" + 
 				"	 */\n" + 
-				"	public SWTBot(Widget parent) {\n" + 
+				"	public " + shortClassName + "(Widget parent) {\n" + 
 				"		this(new ChildrenControlFinder(parent), new MenuFinder());\n" + 
 				"	}\n" +
 				"	/**\n" +
@@ -153,7 +113,7 @@
 				"	 * @param controlFinder the {@link ControlFinder} used to identify and find controls.\n" +
 				"	 * @param menuFinder the {@link MenuFinder} used to find menu items.\n" +
 				"	 */\n" +
-				"	public SWTBot(ControlFinder controlFinder, MenuFinder menuFinder) {\n" +
+				"	public " + shortClassName + "(ControlFinder controlFinder, MenuFinder menuFinder) {\n" +
 				"		this(new Finder(controlFinder, menuFinder));\n" +
 				"	}\n" +
 				"\n" +
@@ -162,7 +122,7 @@
 				"	 * \n" +
 				"	 * @param finder the finder.\n" +
 				"	 */\n" +
-				"	public SWTBot(Finder finder) {\n" +
+				"	public " + shortClassName + "(Finder finder) {\n" +
 				"		super(finder);\n" +
 				"	}\n\n");
 	}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MatcherGeneratorMain.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MatcherGeneratorMain.java
index 5b0df84..5e2c047 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MatcherGeneratorMain.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MatcherGeneratorMain.java
@@ -24,6 +24,8 @@
  */
 public class MatcherGeneratorMain {
 
+	private static final String		newLine	= "\n"; //$NON-NLS-1$
+
 	public static void main(String[] args) {
 		try {
 			org.hamcrest.generator.config.XmlConfigurator.main(new String[] { "swtbot-matchers.xml", "../org.eclipse.swtbot.swt.finder/src", //$NON-NLS-1$ //$NON-NLS-2$
@@ -51,8 +53,12 @@
 
 		BufferedWriter writer = new BufferedWriter(new FileWriter(
 						"../org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/matchers/WidgetMatcherFactory.java")); //$NON-NLS-1$
+		writer.append("// Generated source. DO NOT MODIFY.").append(newLine); //$NON-NLS-1$
+		writer.append("// To add new new methods, please see README file in the generator plugin.").append(newLine); //$NON-NLS-1$
+
 		while (reader.ready()) {
 			String line = reader.readLine();
+			line = line.replaceAll("^// Generated source.$", "");
 			line = line.replaceAll("public class WidgetMatcherFactory_Original \\{", //$NON-NLS-1$
 					"public abstract class WidgetMatcherFactory extends org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory {"); //$NON-NLS-1$
 			writer.write(line);
@@ -73,8 +79,12 @@
 
 		BufferedWriter writer = new BufferedWriter(new FileWriter(
 				"../org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactory.java")); //$NON-NLS-1$
+		writer.append("// Generated source. DO NOT MODIFY.").append(newLine); //$NON-NLS-1$
+		writer.append("// To add new new methods, please see README file in the generator plugin.").append(newLine); //$NON-NLS-1$
+
 		while (reader.ready()) {
 			String line = reader.readLine();
+			line = line.replaceAll("^// Generated source.$", "");
 			line = line.replaceAll("public class WidgetMatcherFactory_Original \\{", "public abstract class WidgetMatcherFactory {"); //$NON-NLS-1$ //$NON-NLS-2$
 			writer.write(line);
 			writer.write("\n"); //$NON-NLS-1$
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodFactory.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodFactory.java
index 2ad0a48..6602d22 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodFactory.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodFactory.java
@@ -25,15 +25,15 @@
  */
 public class MethodFactory {
 
-	public static ArrayList<String> methods(SWTBotWidget annotation, Class<?> returnType, Class<? extends Widget> widgetType, String methodPrefix) {
+	public static ArrayList<String> methods(SWTBotWidget annotation, Class<?> returnType, Class<?> creationType, Class<? extends Widget> widgetType, String methodPrefix) {
 		ArrayList<String> result = new ArrayList<String>();
 
 		List<List<ReferenceBy>> references = getReferenceCombinations(annotation);
 		for (List<ReferenceBy> list : references) {
-			result.add(new MethodGenerator(returnType, widgetType, methodPrefix, annotation.style().name(), list).commentContents());
-			result.add(new MethodGenerator(returnType, widgetType, methodPrefix, annotation.style().name(), list).methodContents());
-			result.add(new MethodGenerator(returnType, widgetType, methodPrefix, annotation.style().name(), list).commentContentsWithIndex());
-			result.add(new MethodGenerator(returnType, widgetType, methodPrefix, annotation.style().name(), list).methodContentsWithIndex());
+			result.add(new MethodGenerator(returnType, creationType, widgetType, methodPrefix, annotation.style().name(), list).commentContents());
+			result.add(new MethodGenerator(returnType, creationType, widgetType, methodPrefix, annotation.style().name(), list).methodContents());
+			result.add(new MethodGenerator(returnType, creationType, widgetType, methodPrefix, annotation.style().name(), list).commentContentsWithIndex());
+			result.add(new MethodGenerator(returnType, creationType, widgetType, methodPrefix, annotation.style().name(), list).methodContentsWithIndex());
 		}
 		return result;
 	}
@@ -49,7 +49,7 @@
 		ArrayList<String> result = new ArrayList<String>();
 		List<List<ReferenceBy>> references = getReferenceCombinations(annotation);
 		for (List<ReferenceBy> list : references) {
-			result.addAll(new MethodGenerator(returnType, widgetType, methodPrefix, annotation.style().name(), list).imports());
+			result.addAll(new MethodGenerator(returnType, null, widgetType, methodPrefix, annotation.style().name(), list).imports());
 		}
 		return result;
 	}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodGenerator.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodGenerator.java
index 6913c02..1489d64 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodGenerator.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/MethodGenerator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -29,17 +29,20 @@
 	private final String		methodNamePrefix;
 	private final Class<?>		widgetType;
 	private final String		style;
+	private final Class<?>	creationType;
 
-	public MethodGenerator(Class<?> returnType, Class<?> widgetType, String methodNamePrefix, String style, List<ReferenceBy> list) {
+	public MethodGenerator(Class<?> returnType, Class<?> creationType, Class<?> widgetType, String methodNamePrefix, String style, List<ReferenceBy> list) {
 		this.returnType = returnType;
+		this.creationType = creationType;
 		this.widgetType = widgetType;
 		this.methodNamePrefix = methodNamePrefix;
 		this.style = style;
 		this.list = list.toArray(new ReferenceBy[] {});
 	}
 
-	public MethodGenerator(Class<?> returnType, Class<?> widgetType, String methodNamePrefix, String style, ReferenceBy... list) {
+	public MethodGenerator(Class<?> returnType, Class<?> creationType, Class<?> widgetType, String methodNamePrefix, String style, ReferenceBy... list) {
 		this.returnType = returnType;
+		this.creationType = creationType;
 		this.widgetType = widgetType;
 		this.methodNamePrefix = methodNamePrefix;
 		this.style = style;
@@ -60,10 +63,10 @@
 	}
 
 	public String methodContentsWithIndex() {
-		String result = "	@SuppressWarnings(\"unchecked\")\n"; //$NON-NLS-1$
+		String result = "	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n"; //$NON-NLS-1$
 		result += "	public " + ClassUtils.simpleClassName(returnType) + " " + methodName() + methodArgsWithIndex() + " {\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		result += "		Matcher matcher = allOf(" + instanceOf() + (otherMatchers().length() > 0 ? ", " : "") + otherMatchers() + ");\n"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-		result += "		return new " + ClassUtils.simpleClassName(returnType) + "((" + ClassUtils.simpleClassName(widgetType) //$NON-NLS-1$ //$NON-NLS-2$
+		result += "		return new " + ClassUtils.simpleClassName(creationType) + "((" + ClassUtils.simpleClassName(widgetType) //$NON-NLS-1$ //$NON-NLS-2$
 				+ ") widget(matcher, index), matcher);\n"; //$NON-NLS-1$
 		result += "	}\n"; //$NON-NLS-1$
 		return result;
@@ -81,7 +84,7 @@
 		String string = ""; //$NON-NLS-1$
 		string += params();
 		string += returnStatement();
-		string += ".\n"; //$NON-NLS-1$
+		string += throwsStatement();
 		return comment(string);
 	}
 
@@ -90,16 +93,21 @@
 		string += params();
 		string += "@param index the index of the widget.\n"; //$NON-NLS-1$
 		string += returnStatement();
-		string += ".\n"; //$NON-NLS-1$
+		string += throwsStatement();
+		string += "\n"; //$NON-NLS-1$
 		return comment(string);
 	}
 
+	private String throwsStatement() {
+		return "@throws WidgetNotFoundException if the widget is not found or is disposed.\n";
+	}
+
 	private String returnStatement() {
 		String string = "@return a {@link " + ClassUtils.simpleClassName(returnType) + "}"; //$NON-NLS-1$ //$NON-NLS-2$
 		for (ReferenceBy ref : list) {
 			string += " " + ref.describeJavaDoc(); //$NON-NLS-1$
 		}
-		return string;
+		return string + ".\n";
 	}
 
 	private String params() {
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorFactoryReader.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorFactoryReader.java
index 993aee8..de9442d 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorFactoryReader.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorFactoryReader.java
@@ -36,7 +36,14 @@
 		if (annotation == null)
 			return new ArrayList<String>();
 
-		return MethodFactory.methods(annotation, constructor.getDeclaringClass(), annotation.clasz(), annotation.preferredName());
+		Class<?> returnType;
+
+		returnType = annotation.returnType();
+		if (returnType == Object.class)
+			returnType = constructor.getDeclaringClass();
+
+		Class<?> creationType = constructor.getDeclaringClass();
+		return MethodFactory.methods(annotation, returnType, creationType, annotation.clasz(), annotation.preferredName());
 	}
 
 	public Collection<? extends String> getImports() {
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorMain.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorMain.java
index 3d95a75..a37e709 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorMain.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/SWTBotGeneratorMain.java
@@ -20,7 +20,8 @@
 
 	public static void main(String[] args) {
 		try {
-			XmlConfigurator.main("widgets.xml", "org.eclipse.swtbot.swt.finder.SWTBot", new File("../org.eclipse.swtbot.swt.finder/src" ));
+			XmlConfigurator.main("widgets.xml", "org.eclipse.swtbot.swt.finder.SWTBot", "SWTBotFactory", new File("../org.eclipse.swtbot.swt.finder/src" ));
+			XmlConfigurator.main("widgets-forms.xml", "org.eclipse.swtbot.forms.finder.SWTFormsBot", "SWTBot", new File("../org.eclipse.swtbot.forms.finder/src" ));
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
diff --git a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/XmlConfigurator.java b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/XmlConfigurator.java
index a5d7ad4..7a851c1 100644
--- a/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/XmlConfigurator.java
+++ b/org.eclipse.swtbot.generator/src/org/eclipse/swtbot/generator/XmlConfigurator.java
@@ -59,7 +59,7 @@
 		sugarConfiguration.addImports(new SWTBotGeneratorFactoryReader(className));
 	}
 
-	public static void main(String configFile, String fullClassName, File outputDir) throws Exception {
+	public static void main(String configFile, String fullClassName, String superClass, File outputDir) throws Exception {
 
 		String fileName = fullClassName.replace('.', File.separatorChar) + ".java"; //$NON-NLS-1$
 		int dotIndex = fullClassName.lastIndexOf("."); //$NON-NLS-1$
@@ -76,7 +76,7 @@
 
 		SugarGenerator sugarGenerator = new SugarGenerator();
 		try {
-			sugarGenerator.addWriter(new HamcrestFactoryWriter(packageName, shortClassName, new FileWriter(outputFile)));
+			sugarGenerator.addWriter(new HamcrestFactoryWriter(packageName, shortClassName, superClass, new FileWriter(outputFile)));
 			sugarGenerator.addWriter(new QuickReferenceWriter(System.out));
 
 			XmlConfigurator xmlConfigurator = new XmlConfigurator(sugarGenerator, XmlConfigurator.class.getClassLoader());
diff --git a/org.eclipse.swtbot.generator/swtbot-matchers.xml b/org.eclipse.swtbot.generator/swtbot-matchers.xml
index 89f0bf4..b4acfb6 100644
--- a/org.eclipse.swtbot.generator/swtbot-matchers.xml
+++ b/org.eclipse.swtbot.generator/swtbot-matchers.xml
@@ -5,6 +5,7 @@
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithMnemonic" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithRegex" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithText" />
+	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithMessage" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithStyle" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithTooltip" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WithId" />
@@ -13,4 +14,5 @@
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.WidgetOfType" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.InUIThread" />
 	<factory class="org.eclipse.swtbot.swt.finder.matchers.AllOf" />
+	<factory class="org.eclipse.swtbot.swt.finder.matchers.AnyOf" />
 </matchers>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/templates/SWTBot/additionalMethods b/org.eclipse.swtbot.generator/templates/SWTBot/additionalMethods
new file mode 100644
index 0000000..6aed077
--- /dev/null
+++ b/org.eclipse.swtbot.generator/templates/SWTBot/additionalMethods
@@ -0,0 +1,3 @@
+	private Matcher<? extends Widget> withLabel(String label) {
+		return WidgetMatcherFactory.withLabel(label, finder);
+	}
diff --git a/org.eclipse.swtbot.generator/templates/SWTBot/imports b/org.eclipse.swtbot.generator/templates/SWTBot/imports
new file mode 100644
index 0000000..c746a2c
--- /dev/null
+++ b/org.eclipse.swtbot.generator/templates/SWTBot/imports
@@ -0,0 +1,19 @@
+import org.eclipse.swt.SWT
+import org.eclipse.swt.widgets.Widget
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException
+import org.eclipse.swtbot.swt.finder.finders.ChildrenControlFinder
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder
+import org.eclipse.swtbot.swt.finder.finders.Finder
+import org.eclipse.swtbot.swt.finder.finders.MenuFinder
+import org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton
+import org.hamcrest.Matcher
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.inGroup
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withId
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMessage
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withStyle
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withTooltip
diff --git a/org.eclipse.swtbot.generator/templates/SWTBot/javadoc b/org.eclipse.swtbot.generator/templates/SWTBot/javadoc
new file mode 100644
index 0000000..247ad31
--- /dev/null
+++ b/org.eclipse.swtbot.generator/templates/SWTBot/javadoc
@@ -0,0 +1,35 @@
+/**
+ * This class contains convenience API to find widgets in SWTBot.
+ * Most users would start off as follows: 
+ * 
+ * <pre>
+ *    SWTBot bot = new SWTBot();
+ *    
+ *    bot.button(&quot;hello world&quot;).click();
+ *    
+ *    // in case you have two edit buttons in two different groups
+ *    // say an edit button in the &quot;Address&quot; section,
+ *    // and another in &quot;Bank Account&quot; section, you can do the following
+ *    // to click on the &quot;Edit&quot; button on the &quot;Bank Account&quot; section.
+ *    // This is the recommended way to use SWTBot, instead of finding widgets based on its index.
+ *    bot.buttonInGroup(&quot;Edit&quot;, &quot;Bank Account&quot;).click();
+ * </pre>
+ * 
+ * For finding widgets using custom matchers:
+ * 
+ * <pre>
+ *    SWTBot bot = new SWTBot();
+ *    //
+ *    // find a button within the currently active shell:
+ *    //
+ *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher)); // or
+ *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, 3)); // for the 4th widget
+ *    //
+ *    // to find a button within a particular parent composite:
+ *    //
+ *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, parentComposite)); //or
+ *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, parentComposite, 3)); //for the 4th widget
+ * </pre>
+ *
+ * @version $Id$
+ */
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.dsl.test/src/removeMe.txt b/org.eclipse.swtbot.generator/templates/SWTFormsBot/additionalMethods
similarity index 100%
rename from org.eclipse.swtbot.eclipse.dsl.test/src/removeMe.txt
rename to org.eclipse.swtbot.generator/templates/SWTFormsBot/additionalMethods
diff --git a/org.eclipse.swtbot.generator/templates/SWTFormsBot/imports b/org.eclipse.swtbot.generator/templates/SWTFormsBot/imports
new file mode 100644
index 0000000..0bc719e
--- /dev/null
+++ b/org.eclipse.swtbot.generator/templates/SWTFormsBot/imports
@@ -0,0 +1,13 @@
+import org.eclipse.swt.widgets.Widget
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException
+import org.eclipse.swtbot.swt.finder.finders.ChildrenControlFinder
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder
+import org.eclipse.swtbot.swt.finder.finders.Finder
+import org.eclipse.swtbot.swt.finder.finders.MenuFinder
+import org.hamcrest.Matcher
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.inGroup
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withId
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic
+import org.eclipse.swtbot.swt.finder.SWTBot
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/templates/SWTFormsBot/javadoc b/org.eclipse.swtbot.generator/templates/SWTFormsBot/javadoc
new file mode 100644
index 0000000..186ad8b
--- /dev/null
+++ b/org.eclipse.swtbot.generator/templates/SWTFormsBot/javadoc
@@ -0,0 +1,5 @@
+/**
+ * SWTFormsBot is a {@link SWTBot} with capabilities for testing eclipse forms.
+ *
+ * @see {@link SWTBot} - SWTBot for usage examples.
+ */
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/widgets-forms.xml b/org.eclipse.swtbot.generator/widgets-forms.xml
new file mode 100644
index 0000000..c28b403
--- /dev/null
+++ b/org.eclipse.swtbot.generator/widgets-forms.xml
@@ -0,0 +1,4 @@
+<widgets>
+	<widget class="org.eclipse.swtbot.forms.finder.widgets.SWTBotHyperlink" />
+	<widget class="org.eclipse.swtbot.forms.finder.widgets.SWTBotImageHyperlink" />
+</widgets>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.generator/widgets.xml b/org.eclipse.swtbot.generator/widgets.xml
index 11dc5cb..0b82fe2 100644
--- a/org.eclipse.swtbot.generator/widgets.xml
+++ b/org.eclipse.swtbot.generator/widgets.xml
@@ -1,5 +1,6 @@
 <widgets>
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotButton" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotArrowButton" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotRadio" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToggleButton" />
@@ -16,12 +17,16 @@
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotDateTime" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton" />
-	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarCheckboxButton" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarToggleButton" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarRadioButton" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotLink" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotSpinner" />
 	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotSlider" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotBrowser" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotScale" />
+	<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotExpandBar" />
 	<!--
 		<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotExpandBar" />
 		<widget class="org.eclipse.swtbot.swt.finder.widgets.SWTBotShell" />
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.go/.project
similarity index 68%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.swtbot.go/.project
index d2190e0..97a3608 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.go/.project
@@ -1,16 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.swtbot.go</name>
 	<comment></comment>
 	<projects>
 	</projects>
 	<buildSpec>
 		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.pde.ManifestBuilder</name>
 			<arguments>
 			</arguments>
@@ -23,6 +18,5 @@
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
 </projectDescription>
diff --git a/org.eclipse.swtbot.go/.settings/org.eclipse.pde.core.prefs b/org.eclipse.swtbot.go/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..988f45e
--- /dev/null
+++ b/org.eclipse.swtbot.go/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,5 @@
+#Thu Apr 08 19:06:32 PDT 2010
+eclipse.preferences.version=1
+pluginProject.equinox=false
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.swtbot.swt.spy/LICENSE.EPL b/org.eclipse.swtbot.go/LICENSE.EPL
similarity index 100%
rename from org.eclipse.swtbot.swt.spy/LICENSE.EPL
rename to org.eclipse.swtbot.go/LICENSE.EPL
diff --git a/org.eclipse.swtbot.go/META-INF/MANIFEST.MF b/org.eclipse.swtbot.go/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5959d63
--- /dev/null
+++ b/org.eclipse.swtbot.go/META-INF/MANIFEST.MF
@@ -0,0 +1,17 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: SWTBot Go Convenience Plugin (Incubation)
+Bundle-SymbolicName: org.eclipse.swtbot.go
+Bundle-Version: 2.0.5.qualifier
+Require-Bundle: org.eclipse.swtbot.eclipse.core;visibility:=reexport,
+ org.eclipse.swtbot.eclipse.finder;visibility:=reexport,
+ org.eclipse.swtbot.swt.finder;visibility:=reexport,
+ org.eclipse.swtbot.junit4_x;visibility:=reexport,
+ org.hamcrest;visibility:=reexport,
+ org.junit4;visibility:=reexport,
+ org.eclipse.core.runtime;visibility:=reexport,
+ org.apache.log4j;visibility:=reexport,
+ org.eclipse.swt;visibility:=reexport,
+ org.eclipse.ui;visibility:=reexport
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-Vendor: Eclipse.org - SWTBot
diff --git a/org.eclipse.swtbot.swt.spy/about.html b/org.eclipse.swtbot.go/about.html
similarity index 100%
rename from org.eclipse.swtbot.swt.spy/about.html
rename to org.eclipse.swtbot.go/about.html
diff --git a/org.eclipse.swtbot.swt.recorder.test/build.properties b/org.eclipse.swtbot.go/build.properties
similarity index 71%
copy from org.eclipse.swtbot.swt.recorder.test/build.properties
copy to org.eclipse.swtbot.go/build.properties
index a060787..bc434f9 100644
--- a/org.eclipse.swtbot.swt.recorder.test/build.properties
+++ b/org.eclipse.swtbot.go/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -8,7 +8,8 @@
 # Contributors:
 #     Ketan Padegaonkar - initial API and implementation
 ###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
+bin.includes = LICENSE.EPL,\
+               META-INF/,\
+               about.html
+src.includes = LICENSE.EPL,\
+               about.html
diff --git a/org.eclipse.swtbot.go/pom.xml b/org.eclipse.swtbot.go/pom.xml
new file mode 100644
index 0000000..56e54c1
--- /dev/null
+++ b/org.eclipse.swtbot.go/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.go</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.recording/.project b/org.eclipse.swtbot.ide/.project
similarity index 88%
rename from org.eclipse.swtbot.recording/.project
rename to org.eclipse.swtbot.ide/.project
index 6329529..9183e8b 100644
--- a/org.eclipse.swtbot.recording/.project
+++ b/org.eclipse.swtbot.ide/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.recording</name>
+	<name>org.eclipse.swtbot.ide</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.recording/build.properties b/org.eclipse.swtbot.ide/build.properties
similarity index 78%
rename from org.eclipse.swtbot.recording/build.properties
rename to org.eclipse.swtbot.ide/build.properties
index 83b8d3e..8dd2b12 100644
--- a/org.eclipse.swtbot.recording/build.properties
+++ b/org.eclipse.swtbot.ide/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -10,10 +10,12 @@
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot.recording/epl-v10.html b/org.eclipse.swtbot.ide/epl-v10.html
similarity index 100%
copy from org.eclipse.swtbot.recording/epl-v10.html
copy to org.eclipse.swtbot.ide/epl-v10.html
diff --git a/org.eclipse.swtbot.ide/feature.properties b/org.eclipse.swtbot.ide/feature.properties
new file mode 100644
index 0000000..b3dd40d
--- /dev/null
+++ b/org.eclipse.swtbot.ide/feature.properties
@@ -0,0 +1,140 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c) 2007-2010 Ketan Padegaonkar and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	Ketan Padegaonkar - initial API and implementation
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.ide/feature.xml b/org.eclipse.swtbot.ide/feature.xml
new file mode 100644
index 0000000..fb921cf
--- /dev/null
+++ b/org.eclipse.swtbot.ide/feature.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.swtbot.ide"
+      label="SWTBot IDE Features (incubation)"
+      version="2.0.5.qualifier"
+      provider-name="Eclipse.org"
+      plugin="org.eclipse.swtbot.eclipse.ui">
+
+   <description url="http://eclipse.org/">
+      SWTBot IDE support (incubation)
+   </description>
+
+   <copyright>
+      %copyright
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <url>
+      <update label="SWTBot update site" url="http://download.eclipse.org/technology/swtbot/update-site"/>
+   </url>
+
+   <requires>
+      <import plugin="org.eclipse.core.runtime"/>
+      <import plugin="org.eclipse.jface"/>
+      <import plugin="org.eclipse.osgi"/>
+      <import plugin="org.eclipse.swt"/>
+      <import plugin="org.eclipse.ui.workbench"/>
+      <import plugin="org.eclipse.core.resources"/>
+      <import plugin="org.eclipse.core.jobs"/>
+      <import plugin="org.eclipse.equinox.preferences"/>
+      <import plugin="org.eclipse.debug.core"/>
+      <import plugin="org.eclipse.debug.ui"/>
+      <import plugin="org.eclipse.jdt.core"/>
+      <import plugin="org.eclipse.jdt.junit"/>
+      <import plugin="org.eclipse.jdt.launching"/>
+      <import plugin="org.eclipse.jdt.ui"/>
+      <import plugin="org.eclipse.pde.core"/>
+      <import plugin="org.eclipse.pde.ui"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.swtbot.eclipse.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.swtbot.eclipse.spy"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.eclipse.swtbot.ide/license.html b/org.eclipse.swtbot.ide/license.html
new file mode 100644
index 0000000..c184ca3
--- /dev/null
+++ b/org.eclipse.swtbot.ide/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/org.eclipse.swtbot.ide/pom.xml b/org.eclipse.swtbot.ide/pom.xml
new file mode 100644
index 0000000..440f674
--- /dev/null
+++ b/org.eclipse.swtbot.ide/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot.ide</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.recorder/.classpath b/org.eclipse.swtbot.junit4_x/.classpath
similarity index 100%
copy from org.eclipse.swtbot.swt.recorder/.classpath
copy to org.eclipse.swtbot.junit4_x/.classpath
diff --git a/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_5 b/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF
similarity index 66%
rename from org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_5
rename to org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF
index 96b4ad8..c1fa5e3 100644
--- a/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_5
+++ b/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF
@@ -2,13 +2,14 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot JUnit 4.x Runners (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.junit4_x
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: org.eclipse.swtbot.swt.finder.junit
 Import-Package: org.apache.log4j;version="1.2.12",
  org.eclipse.swt.widgets,
  org.eclipse.swtbot.swt.finder,
  org.eclipse.swtbot.swt.finder.utils,
- org.junit.runner.notification;version="4.5.0",
- org.junit.runners;version="4.5.0"
+ org.junit.runner.notification;version="4.8.0",
+ org.junit.runners;version="4.8.0",
+ org.junit.runners.model;version="4.8.0"
diff --git a/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_3 b/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_3
deleted file mode 100644
index 2bea1ad..0000000
--- a/org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_3
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot JUnit 4.x Runners (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.junit4_x
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.swtbot.swt.finder.junit
-Import-Package: org.apache.log4j;version="1.2.12",
- org.eclipse.swt.widgets,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.utils,
- org.junit.internal.runners;version="4.3.1",
- org.junit.runner.notification;version="4.3.1",
- org.junit.runners;version="4.3.1"
diff --git a/org.eclipse.swtbot.junit4_x/_build.properties.junit4_3 b/org.eclipse.swtbot.junit4_x/_build.properties.junit4_3
deleted file mode 100644
index 6ff9958..0000000
--- a/org.eclipse.swtbot.junit4_x/_build.properties.junit4_3
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = junit4_3/,\
-           src/
-output.. = bin/
-bin.includes = META-INF/MANIFEST.MF,\
-               .,\
-               junit4_3/,\
-               src/,\
-               about.html,\
-               LICENSE.EPL
diff --git a/org.eclipse.swtbot.junit4_x/_build.properties.junit4_5 b/org.eclipse.swtbot.junit4_x/_build.properties.junit4_5
deleted file mode 100644
index ed5c4d7..0000000
--- a/org.eclipse.swtbot.junit4_x/_build.properties.junit4_5
+++ /dev/null
@@ -1,9 +0,0 @@
-source.. = junit4_5/,\
-           src/
-output.. = bin/
-bin.includes = META-INF/MANIFEST.MF,\
-               .,\
-               junit4_5/,\
-               src/,\
-               about.html,\
-               LICENSE.EPL
diff --git a/org.eclipse.swtbot.junit4_x/_classpath.junit4_3 b/org.eclipse.swtbot.junit4_x/_classpath.junit4_3
deleted file mode 100644
index f8b5dfc..0000000
--- a/org.eclipse.swtbot.junit4_x/_classpath.junit4_3
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="junit4_3"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.junit4_x/_classpath.junit4_5 b/org.eclipse.swtbot.junit4_x/_classpath.junit4_5
deleted file mode 100644
index 17f499e..0000000
--- a/org.eclipse.swtbot.junit4_x/_classpath.junit4_5
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="junit4_5"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.swt.recorder.test/build.properties b/org.eclipse.swtbot.junit4_x/build.properties
similarity index 73%
rename from org.eclipse.swtbot.swt.recorder.test/build.properties
rename to org.eclipse.swtbot.junit4_x/build.properties
index a060787..8d76440 100644
--- a/org.eclipse.swtbot.swt.recorder.test/build.properties
+++ b/org.eclipse.swtbot.junit4_x/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -10,5 +10,8 @@
 ###############################################################################
 source.. = src/
 output.. = bin/
-bin.includes = META-INF/,\
-               .
+bin.includes = META-INF/MANIFEST.MF,\
+               .,\
+               src/,\
+               about.html,\
+               LICENSE.EPL
diff --git a/org.eclipse.swtbot.junit4_x/junit4_3/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java b/org.eclipse.swtbot.junit4_x/junit4_3/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java
deleted file mode 100644
index a1966f7..0000000
--- a/org.eclipse.swtbot.junit4_x/junit4_3/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 SWTBot Committers 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:
- *     Hans Schwaebli - initial API and implementation (Bug 259787)
- *     Toby Weston  - initial API and implementation (Bug 259787)
- *******************************************************************************/
-package org.eclipse.swtbot.swt.finder.junit;
-
-import org.junit.internal.runners.TestClassRunner;
-import org.junit.runner.notification.RunListener;
-import org.junit.runner.notification.RunNotifier;
-
-
-/**
- * A runner that captures screenshots on test failures. If you wish to launch your application for your tests use
- * {@link SWTBotApplicationLauncherClassRunner}. Clients are supposed to subclass this. Typical usage is:
- *
- * <pre>
- * &#064;RunWith(SWTBotJunit4ClassRunner.class)
- * public class FooTest {
- * 	&#064;Test
- * 	public void canSendEmail() {
- * 	}
- * }
- * </pre>
- *
- * @author Hans Schwaebli (Bug 259787)
- * @author Toby Weston (Bug 259787)
- * @version $Id$
- * @see SWTBotApplicationLauncherClassRunner
- * @noextend This class is not intended to be subclassed by clients.
- * @noinstantiate This class is not intended to be instantiated by clients.
- */
-public class SWTBotJunit4ClassRunner extends TestClassRunner {
-
-	/**
-	 * Creates a SWTBotRunner to run {@code klass}
-	 *
-	 * @throws Exception if the test class is malformed.
-	 */
-	public SWTBotJunit4ClassRunner(Class<?> klass) throws Exception {
-		super(klass);
-	}
-
-	public void run(RunNotifier notifier) {
-		RunListener failureSpy = new ScreenshotCaptureListener();
-		notifier.removeListener(failureSpy); // remove existing listeners that could be added by suite or class runners
-		notifier.addListener(failureSpy);
-		try {
-			super.run(notifier);
-		} finally {
-			notifier.removeListener(failureSpy);
-		}
-	}
-
-}
diff --git a/org.eclipse.swtbot.junit4_x/pom.xml b/org.eclipse.swtbot.junit4_x/pom.xml
new file mode 100644
index 0000000..6492557
--- /dev/null
+++ b/org.eclipse.swtbot.junit4_x/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.junit4_x</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJUnit4Suite.java b/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJUnit4Suite.java
index 8eabfdf..8ededb5 100644
--- a/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJUnit4Suite.java
+++ b/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJUnit4Suite.java
@@ -13,6 +13,7 @@
 import org.junit.runner.notification.RunListener;
 import org.junit.runner.notification.RunNotifier;
 import org.junit.runners.Suite;
+import org.junit.runners.model.RunnerBuilder;
 
 /**
  * A suite runner that captures screenshots on test failures. Clients are not supposed to subclass this. Typical usage is:
@@ -28,11 +29,18 @@
  * @version $Id:
  * @noextend This class is not intended to be subclassed by clients.
  * @noinstantiate This class is not intended to be instantiated by clients.
+ * @deprecated Please use {@link Suite} instead. <code>@RunWith(Suite.class)</code>
  */
 public final class SWTBotJUnit4Suite extends Suite {
 	
+	public SWTBotJUnit4Suite(Class<?> klass, RunnerBuilder builder) throws Exception {
+		super(klass, builder);
+		System.err.println("This class has been deprecated, please use org.junit.runners.Suite.class instead.");
+	}
+
 	public SWTBotJUnit4Suite(Class<?> klass, Class<?>[] annotatedClasses) throws Exception {
 		super(klass, annotatedClasses);
+		System.err.println("This class has been deprecated, please use org.junit.runners.Suite.class instead.");
 	}
 
 	/**
diff --git a/org.eclipse.swtbot.junit4_x/junit4_5/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java b/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java
similarity index 100%
rename from org.eclipse.swtbot.junit4_x/junit4_5/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java
rename to org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/SWTBotJunit4ClassRunner.java
diff --git a/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/ScreenshotCaptureListener.java b/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/ScreenshotCaptureListener.java
index ea09b5d..3955979 100644
--- a/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/ScreenshotCaptureListener.java
+++ b/org.eclipse.swtbot.junit4_x/src/org/eclipse/swtbot/swt/finder/junit/ScreenshotCaptureListener.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 SWTBot Committers and others.
+ * Copyright (c) 2010 SWTBot Committers 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
@@ -10,8 +10,6 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.junit;
 
-import java.io.File;
-
 import org.apache.log4j.Logger;
 import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
@@ -41,7 +39,6 @@
 			int maximumScreenshots = SWTBotPreferences.MAX_ERROR_SCREENSHOT_COUNT;
 			String fileName = SWTBotPreferences.SCREENSHOTS_DIR + "/" + failure.getTestHeader() + "." + SWTBotPreferences.SCREENSHOT_FORMAT.toLowerCase(); //$NON-NLS-1$
 			if (++screenshotCounter <= maximumScreenshots) {
-				new File("screenshots").mkdirs(); //$NON-NLS-1$ 
 				captureScreenshot(fileName);
 			} else {
 				log.info("No screenshot captured for '" + failure.getTestHeader() + "' because maximum number of screenshots reached: " //$NON-NLS-1$ 
diff --git a/org.eclipse.swtbot.recording/feature.xml b/org.eclipse.swtbot.recording/feature.xml
deleted file mode 100644
index 2c61146..0000000
--- a/org.eclipse.swtbot.recording/feature.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.swtbot.recording"
-      label="SWTBot Recording Feature - Experimental (incubation)"
-      version="2.0.0.qualifier"
-      provider-name="Eclipse.org">
-
-   <description url="http://eclipse.org/">
-      Recording of SWTBot Tests - Experimental (incubation)
-   </description>
-
-   <copyright url="http://eclipse.org/">
-      Copyright (c) 2007, 2008 Ketan Padegaonkar 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:
-Ketan Padegaonkar - initial API and implementation
-   </copyright>
-
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-
-Eclipse Foundation Software User Agreement
-March 17, 2005
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-   
-Applicable Licenses
-   
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-   
-* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-  and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
- 
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:
-
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-  
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html) 
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is permitted.
-   
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
-   </license>
-
-   <url>
-      <update label="SWTBot update site" url="http://download.eclipse.org/technology/swtbot/update-site"/>
-   </url>
-
-   <includes
-         id="org.eclipse.swtbot"
-         version="0.0.0"/>
-
-   <requires>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swtbot.swt.finder"/>
-      <import plugin="org.apache.log4j"/>
-      <import plugin="org.hamcrest"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.swtbot.swt.recorder"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.swtbot.swt.recorder.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/org.eclipse.swtbot.recording/license.html b/org.eclipse.swtbot.recording/license.html
deleted file mode 100644
index c6af966..0000000
--- a/org.eclipse.swtbot.recording/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/org.eclipse.swtbot.releng/MakingARelease.HOWTO b/org.eclipse.swtbot.releng/MakingARelease.HOWTO
index 9d138ce..2c767f6 100644
--- a/org.eclipse.swtbot.releng/MakingARelease.HOWTO
+++ b/org.eclipse.swtbot.releng/MakingARelease.HOWTO
@@ -6,49 +6,23 @@
 1. Change the property "Bundle-Version" in all MANIFEST.MF files. This property should be of the form X.Y.Z.qualifier
 2. Change the version in feature.xml
 3. Change the property "plugin.version.primary" to X.Y.Z in org.eclipse.swtbot.releng/build.xml
-4. Change the property "plugin.suffix" to ${svn.version}-SUFFIX (suffix can be alpha, beta, or none at all)
+4. Change the property "plugin.suffix" to ${git.version}-SUFFIX (suffix can be alpha, beta, or none at all)
 5. Check in the code
 
 Tag/switch the release:
 ================
-1. Tag the release at the location svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/tags/X.Y.Z-SUFFIX
-     # svn copy svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/trunk svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/tags/X.Y.Z-SUFFIX
+1. Tag the release using a name like '2.0.1.20101106_1831-73ca7af'
+     # git tag -a -m 'Tag for revision 2.0.1' '2.0.1.20101106_1831-73ca7af'
 2. Switch to the new tag:
-     # svn switch svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/tags/X.Y.Z-SUFFIX
+     # git co 2.0.1.20101106_1831-73ca7af
 
 For uploading update site:
 ==============================
-1. Set the ant property "remote.path" to a location where the build will be uploaded via rsync.
-2. Set the property "has.archives" to true
-3. Set the property "update.site.base.url" to http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/galileo/dev-build/update-site or http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/ganymede/dev-build/update-site depending on the build type.
-4. Set the property "remote.path" to "kpadegaonka@build.eclipse.org:/home/groups/s/sw/swtbot/htdocs/artifacts/X.Y.Z/"
-5. Run the "cruise-upload" ant target. This target will run the complete build, generate artifacts, update site etc. and upload the file via rsync
-
-For a local update site:
-========================
-1. Set the property "has.archives" to false
-2. -removed-
-3. -removed-
-4. Run the ant target "create-update-site"
-5. Check in the following artifacts into svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/artifacts/X.Y.Z:
-  a. coverage
-  b. junit
-  c. update-site
-  d. apidocs
-6. Upload the artifacts to the build.eclipse.org. These files include the actual plugins, a zip of the update site, and an MD5SUM of all the files.
+See SWTBOT_ROOT/tools/README.textile
 
 Release Notes:
 ==============
-1. Type the release notes at http://eclipse.org/wiki/Release_Notes_-_X.Y.Z (replace X.Y.Z with the actual version numbers). Ensure that the page is locked for editing.
-2. Navigate to http://eclipse.org/wiki/Releases
-  a. Add links for:
-    i. release notes http://eclipse.org/wiki/Release_Notes_-_X.Y.Z
-    ii. SVN repository tag svn+ssh://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/tags/X.Y.Z
-    iii. The location to javadocs api http://eclipse.org/artifacts/X.Y.Z/apidocs
-    iv. The location to JUnit results http://eclipse.org/artifacts/X.Y.Z/junit
-    v. The location to Code Coverage Reports http://eclipse.org/artifacts/X.Y.Z/coverage
-3. Navigate to http://eclipse.org/wiki/MediaWiki:Sidebar and edit the release notes link to "Release Notes - X.Y.Z"
-4. Update the news section on http://eclipse.org/wiki/Main_Page
+These are generated as part of the releng process. See README.textile from SWTBOT_ROOT/tools/README.textile.
 
 Make a blog entry:
 ==================
diff --git a/org.eclipse.swtbot.releng/allElements.xml b/org.eclipse.swtbot.releng/allElements.xml
index b77a91e..c78891c 100644
--- a/org.eclipse.swtbot.releng/allElements.xml
+++ b/org.eclipse.swtbot.releng/allElements.xml
@@ -16,12 +16,7 @@
 
 		<ant antfile="${genericTargets}" target="${target}">
 			<property name="type" value="feature" />
-			<property name="id" value="org.eclipse.swtbot.test" />
-		</ant>
-
-		<ant antfile="${genericTargets}" target="${target}">
-			<property name="type" value="feature" />
-			<property name="id" value="org.eclipse.swtbot.recording" />
+			<property name="id" value="org.eclipse.swtbot.ide" />
 		</ant>
 
 		<ant antfile="${genericTargets}" target="${target}">
@@ -36,8 +31,24 @@
 
 		<ant antfile="${genericTargets}" target="${target}">
 			<property name="type" value="feature" />
-			<property name="id" value="org.eclipse.swtbot.eclipse.test" />
+			<property name="id" value="org.eclipse.swtbot.eclipse.test.junit3" />
 		</ant>
+
+		<ant antfile="${genericTargets}" target="${target}">
+			<property name="type" value="feature" />
+			<property name="id" value="org.eclipse.swtbot.eclipse.test.junit4" />
+		</ant>
+
+		<ant antfile="${genericTargets}" target="${target}">
+			<property name="type" value="feature" />
+			<property name="id" value="org.eclipse.swtbot.forms" />
+		</ant>
+
+		<ant antfile="${genericTargets}" target="${target}">
+			<property name="type" value="feature" />
+			<property name="id" value="org.eclipse.swtbot.test" />
+		</ant>
+
 	</target>
 
 	<!-- ===================================================================== -->
@@ -55,10 +66,6 @@
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
 	</target>
 
-	<target name="assemble.org.eclipse.swtbot.recording">
-		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
-	</target>
-
 	<target name="assemble.org.eclipse.swtbot.eclipse">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
 	</target>
@@ -67,7 +74,19 @@
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
 	</target>
 
-	<target name="assemble.org.eclipse.swtbot.eclipse.test">
+	<target name="assemble.org.eclipse.swtbot.eclipse.test.junit3">
+		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
+	</target>
+
+	<target name="assemble.org.eclipse.swtbot.eclipse.test.junit4">
+		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
+	</target>
+
+	<target name="assemble.org.eclipse.swtbot.ide">
+		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
+	</target>
+
+	<target name="assemble.org.eclipse.swtbot.forms">
 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}" />
 	</target>
 </project>
diff --git a/org.eclipse.swtbot.releng/build-conf/e36.properties b/org.eclipse.swtbot.releng/build-conf/e36.properties
new file mode 100644
index 0000000..2da3d44
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/e36.properties
@@ -0,0 +1,11 @@
+## The location from where eclipse SDK will be downloaded in case there's none in the releng/externals directory
+## Don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
+## for locations of the eclipse SDKs
+## see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
+
+eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.6-201006080911/
+
+eclipse.buildId = 3.6
+eclipse.qualifier = e36
+
+update.site.base.url = http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/helios/dev-build/update-site
diff --git a/org.eclipse.swtbot.releng/build-conf/e37.properties b/org.eclipse.swtbot.releng/build-conf/e37.properties
new file mode 100644
index 0000000..680768e
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/e37.properties
@@ -0,0 +1,11 @@
+## The location from where eclipse SDK will be downloaded in case there's none in the releng/externals directory
+## Don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
+## for locations of the eclipse SDKs
+## see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
+
+eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.7-201106131736/
+
+eclipse.buildId = 3.7
+eclipse.qualifier = e37
+
+update.site.base.url = http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/indigo/dev-build/update-site
diff --git a/org.eclipse.swtbot.releng/build-conf/e42.properties b/org.eclipse.swtbot.releng/build-conf/e42.properties
new file mode 100644
index 0000000..14741bc
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/e42.properties
@@ -0,0 +1,11 @@
+## The location from where eclipse SDK will be downloaded in case there's none in the releng/externals directory
+## Don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
+## for locations of the eclipse SDKs
+## see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
+
+eclipse.sdk.url = http://download.eclipse.org/eclipse/downloads/drops4/S-4.2RC1-201205182145/
+
+eclipse.buildId = 4.2RC1
+eclipse.qualifier = e42
+
+update.site.base.url = http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/juno/dev-build/update-site
diff --git a/org.eclipse.swtbot.releng/build-conf/gef34.properties b/org.eclipse.swtbot.releng/build-conf/gef34.properties
new file mode 100644
index 0000000..bc43d29
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/gef34.properties
@@ -0,0 +1,6 @@
+
+# the url for the gef sdk, without a trailing slash
+eclipse.gef.sdk.url = http://archive.eclipse.org/tools/gef/downloads/drops/R-3.4.2-200902171642
+
+# the name of the sdk archive to download from the url above
+eclipse.gef.sdk.archive = GEF-runtime-3.4.2.zip
diff --git a/org.eclipse.swtbot.releng/build-conf/gef35.properties b/org.eclipse.swtbot.releng/build-conf/gef35.properties
new file mode 100644
index 0000000..bc43d29
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/gef35.properties
@@ -0,0 +1,6 @@
+
+# the url for the gef sdk, without a trailing slash
+eclipse.gef.sdk.url = http://archive.eclipse.org/tools/gef/downloads/drops/R-3.4.2-200902171642
+
+# the name of the sdk archive to download from the url above
+eclipse.gef.sdk.archive = GEF-runtime-3.4.2.zip
diff --git a/org.eclipse.swtbot.releng/build-conf/gef36.properties b/org.eclipse.swtbot.releng/build-conf/gef36.properties
new file mode 100644
index 0000000..2f68f21
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/gef36.properties
@@ -0,0 +1,6 @@
+
+# the url for the gef sdk, without a trailing slash
+eclipse.gef.sdk.url = http://www.eclipse.org/downloads/download.php?file=/tools/gef/downloads/drops/3.6.2/R201102251600
+
+# the name of the sdk archive to download from the url above
+eclipse.gef.sdk.archive = GEF-runtime-3.6.2.zip&r=1
diff --git a/org.eclipse.swtbot.releng/build-conf/gef37.properties b/org.eclipse.swtbot.releng/build-conf/gef37.properties
new file mode 100644
index 0000000..9eab706
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/gef37.properties
@@ -0,0 +1,6 @@
+
+# the url for the gef sdk, without a trailing slash
+eclipse.gef.sdk.url = http://www.eclipse.org/downloads/download.php?file=/tools/gef/downloads/drops/3.7.2/R201201171043
+
+# the name of the sdk archive to download from the url above
+eclipse.gef.sdk.archive = GEF-runtime-3.7.2.zip&r=1
diff --git a/org.eclipse.swtbot.releng/build-conf/gef42.properties b/org.eclipse.swtbot.releng/build-conf/gef42.properties
new file mode 100644
index 0000000..bc2eeb3
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/gef42.properties
@@ -0,0 +1,6 @@
+
+# the url for the gef sdk, without a trailing slash
+eclipse.gef.sdk.url = http://www.eclipse.org/downloads/download.php?file=/tools/gef/downloads/drops/3.8.0/S201205200846
+
+# the name of the sdk archive to download from the url above
+eclipse.gef.sdk.archive = GEF-runtime-3.8.0RC1.zip&r=1
diff --git a/org.eclipse.swtbot.releng/build-conf/linux.gtk.ppc.properties b/org.eclipse.swtbot.releng/build-conf/linux.gtk.ppc.properties
new file mode 100644
index 0000000..e15b100
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/linux.gtk.ppc.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-linux-gtk-ppc.tar.gz
diff --git a/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86.properties b/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86.properties
new file mode 100644
index 0000000..9349833
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-linux-gtk.tar.gz
diff --git a/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86_64.properties b/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86_64.properties
new file mode 100644
index 0000000..7db4fcc
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/linux.gtk.x86_64.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-linux-gtk-x86_64.tar.gz
diff --git a/org.eclipse.swtbot.releng/build-conf/macosx.carbon.x86.properties b/org.eclipse.swtbot.releng/build-conf/macosx.carbon.x86.properties
new file mode 100644
index 0000000..26ff06f
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/macosx.carbon.x86.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-macosx-carbon.tar.gz
diff --git a/org.eclipse.swtbot.releng/build-conf/macosx.cocoa.x86_64.properties b/org.eclipse.swtbot.releng/build-conf/macosx.cocoa.x86_64.properties
new file mode 100644
index 0000000..f0a26ce
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/macosx.cocoa.x86_64.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-macosx-cocoa-x86_64.tar.gz
diff --git a/org.eclipse.swtbot.releng/build-conf/win32.win32.x86.properties b/org.eclipse.swtbot.releng/build-conf/win32.win32.x86.properties
new file mode 100644
index 0000000..457d31d
--- /dev/null
+++ b/org.eclipse.swtbot.releng/build-conf/win32.win32.x86.properties
@@ -0,0 +1 @@
+eclipse.sdk.archive = eclipse-SDK-${eclipse.buildId}-win32.zip
diff --git a/org.eclipse.swtbot.releng/build.default.properties b/org.eclipse.swtbot.releng/build.default.properties
index 71e4d1d..02ab20f 100644
--- a/org.eclipse.swtbot.releng/build.default.properties
+++ b/org.eclipse.swtbot.releng/build.default.properties
@@ -1,8 +1,5 @@
-eclipse.gef.sdk.url = http://eclipse.ialto.org/tools/gef/downloads/drops/3.4.2/R200902171642/
-eclipse.gef.sdk.archive = GEF-runtime-3.4.2.zip
-
 update-site-location = ${basedir}/artifacts/update-site
 
-has.archives = false
+eclipse.3.4.location = ${basedir}/eclipse
 
-eclipse.3.4.location = ${basedir}/eclipse
\ No newline at end of file
+has.archives = false
diff --git a/org.eclipse.swtbot.releng/build.developer.properties.sample b/org.eclipse.swtbot.releng/build.developer.properties.sample
index c288d7b..bc8e7a7 100644
--- a/org.eclipse.swtbot.releng/build.developer.properties.sample
+++ b/org.eclipse.swtbot.releng/build.developer.properties.sample
@@ -1,38 +1,8 @@
 # see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
+
 os = macosx
-ws = carbon
-arch = x86
+ws = cocoa
+arch = x86_64
 
-## uncomment one of the two below:
-
-##
-## to use eclipse 3.5 uncomment the lines below
-##
-#eclipse.sdk.archive = eclipse-SDK-3.5-macosx-carbon.tar.gz
-#eclipse.buildId = 3.5
-#eclipse.qualifier = e35
-
-##
-## to use eclipse 3.4 uncomment the lines below
-##
-#eclipse.buildId = 3.4.2
-#eclipse.sdk.archive = eclipse-SDK-3.4.2-macosx-carbon.tar.gz
-#eclipse.qualifier = e34
-
-## The location from where eclipse SDK will be downloaded in case there's none in the releng/externals directory
-## Don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-## for locations of the eclipse SDKs
-## see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# eclipse.sdk.url = http://ftp.jaist.ac.jp/pub/eclipse/eclipse/downloads/drops/R-3.4-200806172000
-
-
-has.archives = true
-
-# either a relative or absolute location relative to the update site, *no trailing slash* please.
-update.site.base.url = http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/galileo/dev-build/update-site
-#update.site.base.url = http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/ganymede/dev-build/update-site
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
-
+# provide 35, 36 or 37
+eclipse.version = 37
diff --git a/org.eclipse.swtbot.releng/build.properties.template b/org.eclipse.swtbot.releng/build.properties.template
index 5890eeb..6802d40 100644
--- a/org.eclipse.swtbot.releng/build.properties.template
+++ b/org.eclipse.swtbot.releng/build.properties.template
@@ -118,8 +118,8 @@
 
 #Parallel compilation, requires flattenedDependencies=true
 parallelCompilation = true
-parallelThreadCount = 
-parallelThreadsPerProcessor = 
+parallelThreadCount = 3
+parallelThreadsPerProcessor = 2
 
 #Set to true if you want the output to be ready for an update jar (no site.xml generated)
 #outputUpdateJars = false
@@ -169,7 +169,7 @@
 
 #The value to be used for the qualifier of a plugin or feature when you want to override the value computed by pde.
 #The value will only be applied to plugin or features indicating build.properties, qualifier = context
-forceContextQualifier=svn-version
+forceContextQualifier=git-version
 
 #Enable / disable the generation of a suffix for the features that use .qualifier.
 #The generated suffix is computed according to the content of the feature
diff --git a/org.eclipse.swtbot.releng/build.xml b/org.eclipse.swtbot.releng/build.xml
index fea4b67..d527552 100644
--- a/org.eclipse.swtbot.releng/build.xml
+++ b/org.eclipse.swtbot.releng/build.xml
@@ -1,14 +1,37 @@
 <project name="org.eclipse.swtbot.releng" default="all" basedir=".">
 
+	<!-- load up the properties for cruise agents based on their hostnames, if available -->
+	<exec executable="hostname" outputproperty="hostname" />
+	<property file="host-conf/build.${hostname}.properties" />
+
+  	<!-- in case users provide an eclipse.version, load it before anything else! -->
+	<property file="build-conf/e${eclipse.version}.properties" />
+	<!-- Load up the basic properties -->
 	<property file="build.developer.properties" />
+
+	<!-- Load up the eclipse version specific properties -->
+	<available file="build-conf/e${eclipse.version}.properties" property="eclipse-conf-available" />
+	<fail unless="eclipse-conf-available" message="Could not find file 'build-conf/e${eclipse.version}.properties'" />
+	<property file="build-conf/e${eclipse.version}.properties" />
+
+	<!-- Load up the platform specific properties -->
+	<available file="build-conf/${os}.${ws}.${arch}.properties" property="build-conf-available" />
+	<fail unless="build-conf-available" message="Could not find file 'build-conf/${os}.${ws}.${arch}.properties'" />
+	<property file="build-conf/${os}.${ws}.${arch}.properties" />
+
+	<!-- Load up the gef specific properties -->
+	<available file="build-conf/gef${eclipse.version}.properties" property="gef-conf-available" />
+	<fail unless="gef-conf-available" message="Could not find file 'build-conf/gef${eclipse.version}.properties'" />
+	<property file="build-conf/gef${eclipse.version}.properties" />
+
 	<property file="build.default.properties" />
 	<import file="check-prerequisites.xml" />
 
-	<property name="plugin.version.primary" value="2.0.0" />
+	<property name="plugin.version.primary" value="2.0.5" />
 
-	<!-- automagically generate build numbers from svn -->
-	<property name="svn.version" value="1" />
-	<property name="plugin.suffix" value="${svn.version}-dev-${eclipse.qualifier}" />
+	<!-- automagically generate build numbers from git -->
+	<property name="git.version" value="1" />
+	<property name="plugin.suffix" value="${git.version}-dev-${eclipse.qualifier}" />
 	<property name="buildId" value="${plugin.suffix}" />
 	<property name="eclipse-target" value="${basedir}/../eclipse" />
 
@@ -17,7 +40,7 @@
 	<property name="plugin.prefix" value="org.eclipse.swtbot" />
 	<property name="feature.id" value="${plugin.prefix}" />
 	<property name="feature.id.test" value="${feature.id}.test" />
-
+	<property name="extra.jvm.options" value="-server" />
 
 	<property name="test-sandbox" value="${basedir}/test-sandbox" />
 
@@ -44,13 +67,13 @@
 	<target name="create-version-files" description="create a java file containing the version number of swtbot and other information">
 		<copy filtering="true" overwrite="true" file="../org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java" tofile="target/plugins/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java">
 			<filterset>
-				<filter token="svn.version" value="${all.buildId}"/>
+				<filter token="git.version" value="${all.buildId}"/>
 			</filterset>
 		</copy>
 
 		<copy filtering="true" overwrite="true" file="../org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java"  tofile="target/plugins/org.eclipse.swtbot.eclipse.finder/src/org/eclipse/swtbot/eclipse/finder/SWTBotInfo.java">
 			<filterset>
-				<filter token="svn.version" value="${all.buildId}"/>
+				<filter token="git.version" value="${all.buildId}"/>
 			</filterset>
 		</copy>
 	</target>
@@ -72,10 +95,12 @@
 				<!-- list all your features here -->
 				<include name="${feature.id}/**" />
 				<include name="${feature.id.test}/**" />
+				<include name="org.eclipse.swtbot.forms/**" />
 				<include name="org.eclipse.swtbot.eclipse/**" />
-				<include name="org.eclipse.swtbot.eclipse.test/**" />
-				<include name="org.eclipse.swtbot.recording/**" />
+				<include name="org.eclipse.swtbot.eclipse.test.junit3/**" />
+				<include name="org.eclipse.swtbot.eclipse.test.junit4/**" />
 				<include name="org.eclipse.swtbot.eclipse.gef/**" />
+				<include name="org.eclipse.swtbot.ide/**" />
 			</fileset>
 		</sync>
 	</target>
@@ -90,15 +115,18 @@
 				<!-- include plugins here -->
 				<include name="${plugin.prefix}*/**" />
 				<include name="org.eclipse.swt.examples/**" />
+				<include name="org.eclipse.ui.forms.examples/**" />
 				<include name="org.apache.*/**" />
 				<!-- remember to exclude features in case you are using wildcards -->
 				<exclude name="org.eclipse.swtbot.releng/**" />
 				<exclude name="${feature.id}/**" />
 				<exclude name="${feature.id.test}/**" />
+				<exclude name="org.eclipse.swtbot.forms/**" />
 				<exclude name="org.eclipse.swtbot.eclipse/**" />
-				<include name="org.eclipse.swtbot.eclipse.test/**" />
-				<exclude name="org.eclipse.swtbot.recording/**" />
 				<exclude name="org.eclipse.swtbot.eclipse.gef/**" />
+				<exclude name="org.eclipse.swtbot.eclipse.test.junit3/**" />
+				<exclude name="org.eclipse.swtbot.eclipse.test.junit4/**" />
+				<exclude name="org.eclipse.swtbot.ide/**" />
 				<!-- the update site -->
 				<exclude name="org.eclipse.swtbot.updatesite/**" />
 				<!-- also exclude the generated class files -->
@@ -107,32 +135,7 @@
 		</sync>
 	</target>
 
-	<target name="make-substitutions-4.5" if="isJunit4.5">
-		<!-- make substitutions in the eclipse-ui plugin. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=274083#c5 -->
-		<copy file="../org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_5" tofile="../org.eclipse.swtbot.eclipse.ui/build.properties" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_5" tofile="../org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_5" tofile="../org.eclipse.swtbot.eclipse.ui/.classpath" overwrite="true" />
-
-		<!-- make substitutions in the junit plugin -->
-		<copy file="../org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_5" tofile="../org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.junit4_x/_build.properties.junit4_5" tofile="../org.eclipse.swtbot.junit4_x/build.properties" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.junit4_x/_classpath.junit4_5" tofile="../org.eclipse.swtbot.junit4_x/.classpath" overwrite="true" />
-	</target>
-
-	<target name="make-substitutions-4.3" unless="isJunit4.5">
-		<!-- make substitutions in the eclipse-ui plugin. See https://bugs.eclipse.org/bugs/show_bug.cgi?id=274083#c5 -->
-		<copy file="../org.eclipse.swtbot.eclipse.ui/_build.properties.eclipse_3_4" tofile="../org.eclipse.swtbot.eclipse.ui/build.properties" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.eclipse.ui/META-INF/_MANIFEST.MF_eclipse_3_4" tofile="../org.eclipse.swtbot.eclipse.ui/META-INF/MANIFEST.MF" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.eclipse.ui/_classpath.eclipse_3_4" tofile="../org.eclipse.swtbot.eclipse.ui/.classpath" overwrite="true" />
-
-		<!-- make substitutions in the junit plugin -->
-		<copy file="../org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF_junit4_3" tofile="../org.eclipse.swtbot.junit4_x/META-INF/MANIFEST.MF" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.junit4_x/_build.properties.junit4_3" tofile="../org.eclipse.swtbot.junit4_x/build.properties" overwrite="true" />
-		<copy file="../org.eclipse.swtbot.junit4_x/_classpath.junit4_3" tofile="../org.eclipse.swtbot.junit4_x/.classpath" overwrite="true" />
-	</target>
-
-	<target name="make-substitutions" depends="guess-junit-version, make-substitutions-4.5, make-substitutions-4.3" />
-
+	
 	<target name="extract-eclipse">
 		<condition property="setupTarget" value="setup-zip">
 			<contains string="${eclipse.sdk.archive}" substring=".zip" />
@@ -173,7 +176,6 @@
 		</unzip>
 
 		<antcall target="initialize-environment" />
-		<antcall target="make-substitutions" />
 	</target>
 
 	<target name="printjvm">
@@ -189,6 +191,7 @@
 	</target>
 
 	<target name="pde-build" depends="copy-all" description="runs the pde build">
+
 		<java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true" dir="${basedir}">
 			<arg value="-application" />
 			<arg value="org.eclipse.ant.core.antRunner" />
@@ -265,6 +268,7 @@
 			<arg value="-Dos=${os}" />
 			<arg value="-Dws=${ws}" />
 			<arg value="-Darch=${arch}" />
+			<arg value="-Dextra.jvm.options=${extra.jvm.options}" />
 
 			<!-- one each for each feature that is built -->
 			<arg value="-Dfeature.id=${feature.id}" />
@@ -278,8 +282,6 @@
 
 			<!-- properties containing the plugin directory name including version number -->
 			<arg value="-Dorg.eclipse.swtbot.swt.finder.test=org.eclipse.swtbot.swt.finder.test_${all.buildId}" />
-			<arg value="-Dorg.eclipse.swtbot.swt.recorder.test=org.eclipse.swtbot.swt.recorder.test_${all.buildId}" />
-			<arg value="-Dorg.eclipse.swtbot.swt.recorder.ui.test=org.eclipse.swtbot.swt.recorder.ui.test_${all.buildId}" />
 			<arg value="-Dorg.eclipse.swtbot.eclipse.finder.test=org.eclipse.swtbot.eclipse.finder.test_${all.buildId}" />
 			<!-- <arg value="-Danother.plugin.test=another.plugin.test_1.0.0" /> -->
 
@@ -320,9 +322,6 @@
 		<ant dir="../${plugin.prefix}.updatesite" inheritall="false">
 			<property name="eclipse.location" value="${eclipse.3.4.location}" />
 			<property name="buildId" value="${all.buildId}" />
-			<property name="plugin.prefix" value="${plugin.prefix}" />
-			<property name="feature.id" value="${feature.id}" />
-			<property name="feature.id.test" value="${feature.id.test}" />
 			<property name="update-site-location" value="${update-site-location}" />
 			<property name="has.archives" value="${has.archives}" />
 			<property name="update.site.base.url" value="${update.site.base.url}" />
@@ -351,9 +350,12 @@
 		<copy todir="artifacts/to-upload" includeemptydirs="false">
 			<fileset dir="artifacts">
 				<include name="org.eclipse.swtbot-${all.buildId}.zip" />
+				<include name="org.eclipse.swtbot.forms-${all.buildId}.zip" />
 				<include name="org.eclipse.swtbot.eclipse-${all.buildId}.zip" />
-				<include name="org.eclipse.swtbot.eclipse.test-${all.buildId}.zip" />
+				<include name="org.eclipse.swtbot.eclipse.test.junit3-${all.buildId}.zip" />
+				<include name="org.eclipse.swtbot.eclipse.test.junit4-${all.buildId}.zip" />
 				<include name="org.eclipse.swtbot.eclipse.gef-${all.buildId}.zip" />
+				<include name="org.eclipse.swtbot.ide-${all.buildId}.zip" />
 			</fileset>
 		</copy>
 
@@ -374,10 +376,9 @@
 		</zip>
 
 		<copy-test-reports plugin.id="org.eclipse.swtbot.swt.finder.test" />
+		<copy-test-reports plugin.id="org.eclipse.swtbot.forms.finder.test" />
 		<copy-test-reports plugin.id="org.eclipse.swtbot.generator.test" />
 		<copy-test-reports plugin.id="org.eclipse.swtbot.eclipse.finder.test" />
-		<copy-test-reports plugin.id="org.eclipse.swtbot.swt.recorder.test" />
-		<copy-test-reports plugin.id="org.eclipse.swtbot.swt.recorder.ui.test" />
 
 	</target>
 
diff --git a/org.eclipse.swtbot.releng/check-prerequisites.xml b/org.eclipse.swtbot.releng/check-prerequisites.xml
index 940734c..4dc06ef 100644
--- a/org.eclipse.swtbot.releng/check-prerequisites.xml
+++ b/org.eclipse.swtbot.releng/check-prerequisites.xml
@@ -1,9 +1,5 @@
 <project>
 
-	<!-- load up the properties for cruise agents based on their hostnames, if available -->
-	<exec executable="hostname" outputproperty="hostname" />
-	<property file="host-conf/build.${hostname}.properties" />
-
 	<import file="download-dependencies.xml" />
 
 	<taskdef resource="net/sf/antcontrib/antlib.xml">
@@ -65,61 +61,26 @@
 	</target>
 
 	<target name="check-conditions" depends="download-dependencies, check-windows-preconditions, check-other-preconditions">
-		<check.executable executable="svn" />
+		<check.executable executable="git" />
 		<available file="build.developer.properties" property="build.developer.properties.available" />
 		<available file="host-conf/build.${hostname}.properties" property="build.developer.properties.available" />
 		<fail unless="build.developer.properties.available">Could not find the file "build.developer.properties", or host-conf/build.${hostname}.properties. Please create the file using "build.developer.properties.sample" as the starting point.</fail>
 	</target>
 
-	<target name="guess-junit-version">
-		<echo>Guessing plugin version of org.junit4.</echo>
-		<for param="junit-version-file">
-			<dirset dir="../eclipse/plugins/" includes="org.junit4_*" />
-			<sequential>
-				<propertyregex property="junit4-build-version" input="@{junit-version-file}" regexp="org.junit4_(.*)" select="\1" />
-			</sequential>
-		</for>
-		<condition property="isJunit4.5">
-			<contains string="${junit4-build-version}" substring="4.5" />
-		</condition>
-		<fail unless="junit4-build-version" message="Could not find org.junit4 in target eclipse" />
-		<echo>Plugin version of org.junit is "${junit4-build-version}"</echo>
-		<echo>isJunit4.5: ${isJunit4.5}</echo>
-	</target>
+	<target name="initialize-environment" depends="guess-pde-build-version, create-build-properties-from-template" />
 
-	<target name="initialize-environment" depends="guess-junit-version, guess-pde-build-version, create-build-properties-from-template" />
+	<delete file=".git.properties" />
+	<touch file=".git.properties" />
 
-	<delete file=".git.svn.properties" />
-	<touch file=".git.svn.properties" />
-	<!-- guess svn revision -->
-	<exec executable="git" output=".git.svn.properties" dir=".." failifexecutionfails="false" failonerror="false">
-		<arg line="svn info" />
+	<!-- guess git revision -->
+	<exec executable="git" output=".git.properties" dir=".." failifexecutionfails="false" failonerror="false">
+		<arg line="log --pretty=format:'git.version=%h' -1" />
 	</exec>
+  <tstamp prefix="now"><format timezone="utc" pattern="yyyyMMdd_hhmm" property="now"/></tstamp>
 
-	<!-- prefix all properties with "svn." and replace spaces to make the keys unique -->
-	<loadproperties srcfile=".git.svn.properties">
-		<filterchain>
-			<prefixlines prefix="svn." />
-			<deletecharacters chars="\ " />
-		</filterchain>
-	</loadproperties>
+  <replace file=".git.properties" token="git.version=" value="git.version=${now.now}-"/>
+	<loadproperties srcfile=".git.properties" />
 
-	<delete file=".svn.properties" />
-	<touch file=".svn.properties" />
-	<!-- guess svn revision -->
-	<exec executable="svn" output=".svn.properties" dir=".." failifexecutionfails="false" failonerror="false">
-		<arg value="info" />
-	</exec>
-
-	<!-- prefix all properties with "svn." and replace spaces to make the keys unique -->
-	<loadproperties srcfile=".svn.properties">
-		<filterchain>
-			<prefixlines prefix="svn." />
-			<deletecharacters chars="\ " />
-		</filterchain>
-	</loadproperties>
-
-	<property name="svn.version" value="${svn.LastChangedRev}" />
-	<fail unless="svn.version" message="could not determine svn version number" />
+	<fail unless="git.version" message="could not determine git version number" />
 
 </project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.releng/download-dependencies.xml b/org.eclipse.swtbot.releng/download-dependencies.xml
index 423d894..285adf3 100644
--- a/org.eclipse.swtbot.releng/download-dependencies.xml
+++ b/org.eclipse.swtbot.releng/download-dependencies.xml
@@ -7,7 +7,7 @@
 
 		<available file="externals/libs/purge.jar" property="ant-purge-lib-available" />
 		<available file="externals/libs/ant-contrib-1.0b3.jar" property="ant-contrib-lib-available" />
-		<available file="externals/libs/cobertura-1.9" property="ant-cobertura-lib-available" />
+		<available file="externals/libs/cobertura-1.9.4.1" property="ant-cobertura-lib-available" />
 	</target>
 
 	<target name="download-purge-task" unless="ant-purge-lib-available">
@@ -25,10 +25,10 @@
 
 
 	<target name="download-ant-cobertura-task" unless="ant-cobertura-lib-available">
-		<get dest="externals/libs/cobertura-1.9-bin.tar.gz" src="http://downloads.sourceforge.net/sourceforge/cobertura/cobertura-1.9-bin.tar.gz" verbose="true" usetimestamp="true" />
+		<get dest="externals/libs/cobertura-1.9.4.1-bin.tar.gz" src="http://downloads.sourceforge.net/sourceforge/cobertura/cobertura-1.9.4.1-bin.tar.gz" verbose="true" usetimestamp="true" />
 
-		<untar src="externals/libs/cobertura-1.9-bin.tar.gz" dest="externals/libs" compression="gzip"/>
-		<delete file="externals/libs/cobertura-1.9-bin.tar.gz"/>
+		<untar src="externals/libs/cobertura-1.9.4.1-bin.tar.gz" dest="externals/libs" compression="gzip"/>
+		<delete file="externals/libs/cobertura-1.9.4.1-bin.tar.gz"/>
 	</target>
 
 	<target name="download-ant-libs" depends="download-purge-task, download-ant-contrib-task, download-ant-cobertura-task" />
diff --git a/org.eclipse.swtbot.releng/host-conf/build.build.properties b/org.eclipse.swtbot.releng/host-conf/build.build.properties
index 9c74dc0..a92d819 100644
--- a/org.eclipse.swtbot.releng/host-conf/build.build.properties
+++ b/org.eclipse.swtbot.releng/host-conf/build.build.properties
@@ -1,11 +1,9 @@
 #properties file for eclipse build server
-
 os = linux
 ws = gtk
 arch = ppc
 
+eclipse.version = 35
 
 has.archives = false
 update-site-location = artifacts/update-site
-
-eclipse.qualifier = e34
diff --git a/org.eclipse.swtbot.releng/host-conf/build.tw-studios.corporate.thoughtworks.com.properties b/org.eclipse.swtbot.releng/host-conf/build.tw-studios.corporate.thoughtworks.com.properties
deleted file mode 100644
index 307b97d..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.tw-studios.corporate.thoughtworks.com.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = macosx
-ws = carbon
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-macosx-carbon.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-02.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-02.properties
deleted file mode 100644
index f7331e0..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-02.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = linux
-ws = gtk
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-linux-gtk.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-03.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-03.properties
deleted file mode 100644
index f7331e0..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-03.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = linux
-ws = gtk
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-linux-gtk.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-04.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-04.properties
deleted file mode 100644
index f7331e0..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-04.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = linux
-ws = gtk
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-linux-gtk.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-05.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-05.properties
deleted file mode 100644
index f7331e0..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-opensuse32-05.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = linux
-ws = gtk
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-linux-gtk.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-ubuntu64-01.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-ubuntu64-01.properties
deleted file mode 100644
index 5659226..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-ubuntu64-01.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = linux
-ws = gtk
-arch = x86_64
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-linux-gtk-x86_64.tar.gz
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-01.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-xp-01.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-01.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-02.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-xp-02.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-02.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-03.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-xp-03.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-03.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-04.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-xp-04.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-04.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-05.properties b/org.eclipse.swtbot.releng/host-conf/build.twist-xp-05.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twist-xp-05.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/host-conf/build.twistcrwin.properties b/org.eclipse.swtbot.releng/host-conf/build.twistcrwin.properties
deleted file mode 100644
index aebd904..0000000
--- a/org.eclipse.swtbot.releng/host-conf/build.twistcrwin.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-# see http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500/srcIncludedBuildInstructions.html#build_platforms for valid values
-os = win32
-ws = win32
-arch = x86
-
-update-site-location = ${basedir}/artifacts/update-site
-eclipse.sdk.archive = eclipse-SDK-3.4.2-win32.zip
-
-eclipse.buildId = 3.4.2
-eclipse.qualifier = e34
-
-# don't add the trailing file name, the file name is automatically appended based on eclipse.sdk.archive
-# for locations of the eclipse SDKs
-# see http://download.eclipse.org/eclipse/downloads/ and http://archive.eclipse.org/eclipse/downloads/index.php
-
-# for eclipse 3.4
-eclipse.sdk.url = http://mirror.in.th/eclipse/eclipse/downloads/drops/R-3.4.2-200902111700
-
-# for eclipse 3.3
-#eclipse.sdk.url = http://archive.eclipse.org/eclipse/downloads/drops/R-3.3-200706251500
-
-
-eclipse3.4.home = /Volumes/data/eclipse-installs/eclipse-3.4
-
-has.archives = false
-
-rsync.opts = --delete-after
-remote.path = kpadegaonkar,swtbot@web.sf.net:/home/groups/s/sw/swtbot/htdocs/artifacts/2.0-eclipse
diff --git a/org.eclipse.swtbot.releng/javadoc.xml b/org.eclipse.swtbot.releng/javadoc.xml
index c3356de..877b023 100644
--- a/org.eclipse.swtbot.releng/javadoc.xml
+++ b/org.eclipse.swtbot.releng/javadoc.xml
@@ -1,28 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project default="javadoc">
 
-	<target name="check-package-list">
-		<available file="javadoc/eclipse-package-list/package-list" property="package-list-available" />
-		<available file="javadoc/java-package-list/package-list" property="package-list-available" />
-	</target>
-
-	<target name="fetch-package-list" unless="package-list-available">
-		<delete dir="javadoc" />
-		<mkdir dir="javadoc/eclipse-package-list" />
-		<mkdir dir="javadoc/java-package-list" />
-		<get dest="javadoc/eclipse-package-list/package-list" src="http://help.eclipse.org/help33/topic/org.eclipse.platform.doc.isv/reference/api/package-list" />
-		<get dest="javadoc/java-package-list/package-list" src="http://java.sun.com/j2se/1.5.0/docs/api/package-list" />
-	</target>
-
-	<target name="javadoc" depends="check-package-list,fetch-package-list">
+	<target name="javadoc">
+		<property name="junit.dir" value="junit4_5"/>
+		
 		<delete dir="artifacts/apidocs" />
 		<javadoc destdir="artifacts/apidocs" access="protected" author="true" splitindex="true" use="true" version="true" source="1.5" doctitle="SWTBot API Documentation" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" useexternalfile="true" packagenames="
-
+				org.eclipse.swtbot.swt.finder.junit,
+			
 				org.eclipse.swtbot.eclipse.gef.finder,
 				org.eclipse.swtbot.eclipse.gef.finder.finders,
 				org.eclipse.swtbot.eclipse.gef.finder.matchers,
 				org.eclipse.swtbot.eclipse.gef.finder.widgets,
 
+				org.eclipse.swtbot.forms.finder,
+				org.eclipse.swtbot.forms.finder.widgets,
+
 				org.eclipse.swtbot.eclipse.finder,
 			 	org.eclipse.swtbot.eclipse.finder.exceptions,
 			 	org.eclipse.swtbot.eclipse.finder.finders,
@@ -43,9 +36,12 @@
 				org.eclipse.swtbot.swt.finder.widgets">
 			<sourcepath>
 				<dirset dir="../">
+					<include name="org.eclipse.swtbot.forms.finder/src" />
 					<include name="org.eclipse.swtbot.swt.finder/src" />
 					<include name="org.eclipse.swtbot.eclipse.finder/src" />
 					<include name="org.eclipse.swtbot.eclipse.gef.finder/src" />
+					<include name="org.eclipse.swtbot.junit4_x/src" />
+					<include name="org.eclipse.swtbot.junit4_x/${junit.dir}" />
 				</dirset>
 			</sourcepath>
 			<classpath>
@@ -65,8 +61,9 @@
 					<include name="**/org.eclipse.gef*.jar" />
 				</fileset>
 			</classpath>
-			<link href="http://help.eclipse.org/help33/topic/org.eclipse.platform.doc.isv/reference/api" offline="true" packagelistloc="javadoc/eclipse-package-list" />
+			<link href="http://help.eclipse.org/helios/topic/org.eclipse.platform.doc.isv/reference/api" offline="true" packagelistloc="javadoc/eclipse-package-list" />
 			<link href="http://java.sun.com/j2se/1.5.0/docs/api/" offline="true" packagelistloc="javadoc/java-package-list" />
+			<link href="http://kentbeck.github.com/junit/javadoc/latest/" offline="true" packagelistloc="javadoc/junit-package-list" />
 		</javadoc>
 	</target>
 </project>
diff --git a/org.eclipse.swtbot.releng/javadoc/eclipse-package-list/package-list b/org.eclipse.swtbot.releng/javadoc/eclipse-package-list/package-list
new file mode 100644
index 0000000..854f26a
--- /dev/null
+++ b/org.eclipse.swtbot.releng/javadoc/eclipse-package-list/package-list
@@ -0,0 +1,218 @@
+org.eclipse.ant.core
+org.eclipse.compare
+org.eclipse.compare.contentmergeviewer
+org.eclipse.compare.patch
+org.eclipse.compare.rangedifferencer
+org.eclipse.compare.structuremergeviewer
+org.eclipse.core.commands
+org.eclipse.core.commands.common
+org.eclipse.core.commands.contexts
+org.eclipse.core.commands.operations
+org.eclipse.core.databinding
+org.eclipse.core.databinding.beans
+org.eclipse.core.databinding.conversion
+org.eclipse.core.databinding.observable
+org.eclipse.core.databinding.observable.list
+org.eclipse.core.databinding.observable.map
+org.eclipse.core.databinding.observable.masterdetail
+org.eclipse.core.databinding.observable.set
+org.eclipse.core.databinding.observable.value
+org.eclipse.core.databinding.util
+org.eclipse.core.databinding.validation
+org.eclipse.core.expressions
+org.eclipse.core.filebuffers
+org.eclipse.core.filebuffers.manipulation
+org.eclipse.core.filesystem
+org.eclipse.core.filesystem.provider
+org.eclipse.core.net.proxy
+org.eclipse.core.resources
+org.eclipse.core.resources.mapping
+org.eclipse.core.resources.refresh
+org.eclipse.core.resources.team
+org.eclipse.core.runtime
+org.eclipse.core.runtime.adaptor
+org.eclipse.core.runtime.content
+org.eclipse.core.runtime.dynamichelpers
+org.eclipse.core.runtime.jobs
+org.eclipse.core.runtime.model
+org.eclipse.core.runtime.preferences
+org.eclipse.core.runtime.spi
+org.eclipse.core.variables
+org.eclipse.debug.core
+org.eclipse.debug.core.commands
+org.eclipse.debug.core.model
+org.eclipse.debug.core.sourcelookup
+org.eclipse.debug.core.sourcelookup.containers
+org.eclipse.debug.ui
+org.eclipse.debug.ui.actions
+org.eclipse.debug.ui.console
+org.eclipse.debug.ui.contexts
+org.eclipse.debug.ui.memory
+org.eclipse.debug.ui.sourcelookup
+org.eclipse.equinox.app
+org.eclipse.equinox.http.jetty
+org.eclipse.equinox.http.registry
+org.eclipse.equinox.http.servlet
+org.eclipse.equinox.jsp.jasper
+org.eclipse.equinox.jsp.jasper.registry
+org.eclipse.help
+org.eclipse.help.browser
+org.eclipse.help.search
+org.eclipse.help.standalone
+org.eclipse.help.ui
+org.eclipse.help.ui.browser
+org.eclipse.jface.action
+org.eclipse.jface.bindings
+org.eclipse.jface.bindings.keys
+org.eclipse.jface.bindings.keys.formatting
+org.eclipse.jface.commands
+org.eclipse.jface.contentassist
+org.eclipse.jface.contexts
+org.eclipse.jface.databinding.swt
+org.eclipse.jface.databinding.viewers
+org.eclipse.jface.databinding.wizard
+org.eclipse.jface.dialogs
+org.eclipse.jface.fieldassist
+org.eclipse.jface.layout
+org.eclipse.jface.menus
+org.eclipse.jface.operation
+org.eclipse.jface.preference
+org.eclipse.jface.resource
+org.eclipse.jface.text
+org.eclipse.jface.text.contentassist
+org.eclipse.jface.text.formatter
+org.eclipse.jface.text.hyperlink
+org.eclipse.jface.text.information
+org.eclipse.jface.text.link
+org.eclipse.jface.text.presentation
+org.eclipse.jface.text.projection
+org.eclipse.jface.text.quickassist
+org.eclipse.jface.text.reconciler
+org.eclipse.jface.text.revisions
+org.eclipse.jface.text.rules
+org.eclipse.jface.text.source
+org.eclipse.jface.text.source.projection
+org.eclipse.jface.text.templates
+org.eclipse.jface.text.templates.persistence
+org.eclipse.jface.util
+org.eclipse.jface.viewers
+org.eclipse.jface.viewers.deferred
+org.eclipse.jface.window
+org.eclipse.jface.wizard
+org.eclipse.jsch.core
+org.eclipse.jsch.ui
+org.eclipse.ltk.core.refactoring
+org.eclipse.ltk.core.refactoring.history
+org.eclipse.ltk.core.refactoring.model
+org.eclipse.ltk.core.refactoring.participants
+org.eclipse.ltk.ui.refactoring
+org.eclipse.ltk.ui.refactoring.actions
+org.eclipse.ltk.ui.refactoring.history
+org.eclipse.ltk.ui.refactoring.model
+org.eclipse.osgi.service.datalocation
+org.eclipse.osgi.util
+org.eclipse.search.core.text
+org.eclipse.search.ui
+org.eclipse.search.ui.actions
+org.eclipse.search.ui.text
+org.eclipse.swt
+org.eclipse.swt.accessibility
+org.eclipse.swt.awt
+org.eclipse.swt.browser
+org.eclipse.swt.custom
+org.eclipse.swt.dnd
+org.eclipse.swt.events
+org.eclipse.swt.graphics
+org.eclipse.swt.layout
+org.eclipse.swt.ole.win32
+org.eclipse.swt.opengl
+org.eclipse.swt.printing
+org.eclipse.swt.program
+org.eclipse.swt.widgets
+org.eclipse.team.core
+org.eclipse.team.core.diff
+org.eclipse.team.core.diff.provider
+org.eclipse.team.core.history
+org.eclipse.team.core.history.provider
+org.eclipse.team.core.mapping
+org.eclipse.team.core.mapping.provider
+org.eclipse.team.core.subscribers
+org.eclipse.team.core.synchronize
+org.eclipse.team.core.variants
+org.eclipse.team.ui
+org.eclipse.team.ui.history
+org.eclipse.team.ui.mapping
+org.eclipse.team.ui.synchronize
+org.eclipse.text.edits
+org.eclipse.text.undo
+org.eclipse.ui
+org.eclipse.ui.about
+org.eclipse.ui.actions
+org.eclipse.ui.activities
+org.eclipse.ui.application
+org.eclipse.ui.branding
+org.eclipse.ui.browser
+org.eclipse.ui.cheatsheets
+org.eclipse.ui.commands
+org.eclipse.ui.console
+org.eclipse.ui.console.actions
+org.eclipse.ui.contentassist
+org.eclipse.ui.contexts
+org.eclipse.ui.dialogs
+org.eclipse.ui.editors.text
+org.eclipse.ui.editors.text.templates
+org.eclipse.ui.fieldassist
+org.eclipse.ui.forms
+org.eclipse.ui.forms.editor
+org.eclipse.ui.forms.events
+org.eclipse.ui.forms.widgets
+org.eclipse.ui.handlers
+org.eclipse.ui.help
+org.eclipse.ui.ide
+org.eclipse.ui.ide.dialogs
+org.eclipse.ui.ide.fileSystem
+org.eclipse.ui.ide.undo
+org.eclipse.ui.intro
+org.eclipse.ui.intro.config
+org.eclipse.ui.intro.universal
+org.eclipse.ui.keys
+org.eclipse.ui.menus
+org.eclipse.ui.model
+org.eclipse.ui.navigator
+org.eclipse.ui.navigator.resources
+org.eclipse.ui.operations
+org.eclipse.ui.part
+org.eclipse.ui.plugin
+org.eclipse.ui.preferences
+org.eclipse.ui.presentations
+org.eclipse.ui.progress
+org.eclipse.ui.services
+org.eclipse.ui.statushandlers
+org.eclipse.ui.swt
+org.eclipse.ui.testing
+org.eclipse.ui.texteditor
+org.eclipse.ui.texteditor.link
+org.eclipse.ui.texteditor.quickdiff
+org.eclipse.ui.texteditor.rulers
+org.eclipse.ui.texteditor.spelling
+org.eclipse.ui.texteditor.templates
+org.eclipse.ui.themes
+org.eclipse.ui.views
+org.eclipse.ui.views.bookmarkexplorer
+org.eclipse.ui.views.contentoutline
+org.eclipse.ui.views.framelist
+org.eclipse.ui.views.markers
+org.eclipse.ui.views.navigator
+org.eclipse.ui.views.properties
+org.eclipse.ui.views.properties.tabbed
+org.eclipse.ui.views.tasklist
+org.eclipse.ui.wizards
+org.eclipse.ui.wizards.datatransfer
+org.eclipse.ui.wizards.newresource
+org.eclipse.update.configuration
+org.eclipse.update.configurator
+org.eclipse.update.core
+org.eclipse.update.core.model
+org.eclipse.update.operations
+org.eclipse.update.search
+org.eclipse.update.standalone
diff --git a/org.eclipse.swtbot.releng/javadoc/java-package-list/package-list b/org.eclipse.swtbot.releng/javadoc/java-package-list/package-list
new file mode 100644
index 0000000..4878336
--- /dev/null
+++ b/org.eclipse.swtbot.releng/javadoc/java-package-list/package-list
@@ -0,0 +1,166 @@
+java.applet
+java.awt
+java.awt.color
+java.awt.datatransfer
+java.awt.dnd
+java.awt.event
+java.awt.font
+java.awt.geom
+java.awt.im
+java.awt.im.spi
+java.awt.image
+java.awt.image.renderable
+java.awt.print
+java.beans
+java.beans.beancontext
+java.io
+java.lang
+java.lang.annotation
+java.lang.instrument
+java.lang.management
+java.lang.ref
+java.lang.reflect
+java.math
+java.net
+java.nio
+java.nio.channels
+java.nio.channels.spi
+java.nio.charset
+java.nio.charset.spi
+java.rmi
+java.rmi.activation
+java.rmi.dgc
+java.rmi.registry
+java.rmi.server
+java.security
+java.security.acl
+java.security.cert
+java.security.interfaces
+java.security.spec
+java.sql
+java.text
+java.util
+java.util.concurrent
+java.util.concurrent.atomic
+java.util.concurrent.locks
+java.util.jar
+java.util.logging
+java.util.prefs
+java.util.regex
+java.util.zip
+javax.accessibility
+javax.activity
+javax.crypto
+javax.crypto.interfaces
+javax.crypto.spec
+javax.imageio
+javax.imageio.event
+javax.imageio.metadata
+javax.imageio.plugins.bmp
+javax.imageio.plugins.jpeg
+javax.imageio.spi
+javax.imageio.stream
+javax.management
+javax.management.loading
+javax.management.modelmbean
+javax.management.monitor
+javax.management.openmbean
+javax.management.relation
+javax.management.remote
+javax.management.remote.rmi
+javax.management.timer
+javax.naming
+javax.naming.directory
+javax.naming.event
+javax.naming.ldap
+javax.naming.spi
+javax.net
+javax.net.ssl
+javax.print
+javax.print.attribute
+javax.print.attribute.standard
+javax.print.event
+javax.rmi
+javax.rmi.CORBA
+javax.rmi.ssl
+javax.security.auth
+javax.security.auth.callback
+javax.security.auth.kerberos
+javax.security.auth.login
+javax.security.auth.spi
+javax.security.auth.x500
+javax.security.cert
+javax.security.sasl
+javax.sound.midi
+javax.sound.midi.spi
+javax.sound.sampled
+javax.sound.sampled.spi
+javax.sql
+javax.sql.rowset
+javax.sql.rowset.serial
+javax.sql.rowset.spi
+javax.swing
+javax.swing.border
+javax.swing.colorchooser
+javax.swing.event
+javax.swing.filechooser
+javax.swing.plaf
+javax.swing.plaf.basic
+javax.swing.plaf.metal
+javax.swing.plaf.multi
+javax.swing.plaf.synth
+javax.swing.table
+javax.swing.text
+javax.swing.text.html
+javax.swing.text.html.parser
+javax.swing.text.rtf
+javax.swing.tree
+javax.swing.undo
+javax.transaction
+javax.transaction.xa
+javax.xml
+javax.xml.datatype
+javax.xml.namespace
+javax.xml.parsers
+javax.xml.transform
+javax.xml.transform.dom
+javax.xml.transform.sax
+javax.xml.transform.stream
+javax.xml.validation
+javax.xml.xpath
+org.ietf.jgss
+org.omg.CORBA
+org.omg.CORBA.DynAnyPackage
+org.omg.CORBA.ORBPackage
+org.omg.CORBA.TypeCodePackage
+org.omg.CORBA.portable
+org.omg.CORBA_2_3
+org.omg.CORBA_2_3.portable
+org.omg.CosNaming
+org.omg.CosNaming.NamingContextExtPackage
+org.omg.CosNaming.NamingContextPackage
+org.omg.Dynamic
+org.omg.DynamicAny
+org.omg.DynamicAny.DynAnyFactoryPackage
+org.omg.DynamicAny.DynAnyPackage
+org.omg.IOP
+org.omg.IOP.CodecFactoryPackage
+org.omg.IOP.CodecPackage
+org.omg.Messaging
+org.omg.PortableInterceptor
+org.omg.PortableInterceptor.ORBInitInfoPackage
+org.omg.PortableServer
+org.omg.PortableServer.CurrentPackage
+org.omg.PortableServer.POAManagerPackage
+org.omg.PortableServer.POAPackage
+org.omg.PortableServer.ServantLocatorPackage
+org.omg.PortableServer.portable
+org.omg.SendingContext
+org.omg.stub.java.rmi
+org.w3c.dom
+org.w3c.dom.bootstrap
+org.w3c.dom.events
+org.w3c.dom.ls
+org.xml.sax
+org.xml.sax.ext
+org.xml.sax.helpers
diff --git a/org.eclipse.swtbot.releng/javadoc/junit-package-list/package-list b/org.eclipse.swtbot.releng/javadoc/junit-package-list/package-list
new file mode 100644
index 0000000..8171efb
--- /dev/null
+++ b/org.eclipse.swtbot.releng/javadoc/junit-package-list/package-list
@@ -0,0 +1,18 @@
+org.hamcrest
+org.hamcrest.core
+org.hamcrest.internal
+org.junit
+org.junit.experimental
+org.junit.experimental.categories
+org.junit.experimental.max
+org.junit.experimental.results
+org.junit.experimental.runners
+org.junit.experimental.theories
+org.junit.experimental.theories.suppliers
+org.junit.matchers
+org.junit.rules
+org.junit.runner
+org.junit.runner.manipulation
+org.junit.runner.notification
+org.junit.runners
+org.junit.runners.model
diff --git a/org.eclipse.swtbot.releng/make-release.rb b/org.eclipse.swtbot.releng/make-release.rb
new file mode 100755
index 0000000..61df39e
--- /dev/null
+++ b/org.eclipse.swtbot.releng/make-release.rb
@@ -0,0 +1,71 @@
+#!/usr/bin/env ruby
+
+require 'rubygems'
+require 'rake'
+require 'fileutils'
+require 'optparse'
+require 'open-uri'
+
+class Release
+  def self.run(args)
+    if args.empty?
+      puts "Usage: #{$0} VERSION
+      VERSION: major.minor.patch"
+      exit(-1)
+    end
+    
+    @now = Time.at(`git log -1 --format='%ct'`.to_i).utc
+    @version = args.first
+    puts "Fetching revision available on the download site..."
+    uri = URI.parse("http://download.eclipse.org/technology/swtbot/helios/dev-build/RELEASE_NOTES.txt")
+    puts "Reading #{uri}"
+
+    @available_revision = open(uri).readlines.grep(/ rev\(.*\) /).first.gsub(/RELEASE NOTES v(.*) rev\((.*)\) \(.*\)/, '\2').strip
+
+    @current_head = `git log --pretty='%H' -1`.strip
+
+    puts "Revision on the download site: #{@available_revision}"
+    puts "Generating revision log since  #{@available_revision} to HEAD(#{@current_head})"
+
+    @revision_log = `git log --reverse --pretty='%h - by %cn on %cd%n%w(80, 4, 4)%B\n' --date=short #{@available_revision}..#{@current_head}`
+
+    @revision_log += "\n\n"
+    @revision_log += open(uri).read
+
+    FileUtils.rm_rf('to-upload')
+    FileUtils.rm_rf('target')
+    
+    build_swtbot(36, 'helios')
+    build_swtbot(37, 'indigo')
+  end
+
+  def self.release_notes(dir)
+    File.open("#{dir}/RELEASE_NOTES.txt", 'w') do |f|
+      title = "RELEASE NOTES v#{@version} rev(#{@current_head[0..6]}) (#{@now.strftime('%b %d, %Y')})"
+      f.puts(title)
+      f.puts("=" * title.length)
+      f.puts("")
+      f.puts(@revision_log)
+    end
+  end
+
+  #version=35, code_name=galileo
+  #version=36, code_name=helios
+  #version=37, code_name=indigo
+  def self.build_swtbot(version, code_name)
+
+    FileUtils.rm_rf("to-upload/#{code_name}")
+    FileUtils.mkdir_p("to-upload/#{code_name}/dev-build")
+    release_notes("to-upload/#{code_name}/dev-build")
+
+    sh("ant materialize-workspace -Declipse.version=#{version} -Dhas.archives=true")
+    extra_jvm_opts = "-Dextra.jvm.options='#{ENV['JAVA_OPTS']}'" if ENV['JAVA_OPTS']
+    sh("ant cruise -Declipse.version=#{version} -Dhas.archives=true #{extra_jvm_opts} -Dnow.now=#{@now.strftime('%Y%m%d_%H%M')}")
+    FileUtils.rm_rf("to-upload/#{code_name}")
+    FileUtils.mkdir_p("to-upload/#{code_name}")
+    FileUtils.mv("artifacts/to-upload", "to-upload/#{code_name}/dev-build")
+    release_notes("to-upload/#{code_name}/dev-build")
+  end
+end
+
+Release.run(ARGV)
diff --git a/org.eclipse.swtbot.releng/make-release.sh b/org.eclipse.swtbot.releng/make-release.sh
deleted file mode 100755
index 3505be0..0000000
--- a/org.eclipse.swtbot.releng/make-release.sh
+++ /dev/null
@@ -1,31 +0,0 @@
-#!/bin/bash
-
-rm -rf artifacts target
-
-# usage: build_swtbot <eclipse-version> <eclipse-major.minor-version> <eclipse-release-name>
-# e.g.: build_swtbot 3.5.1 35 galileo
-# e.g.: build_swtbot 3.4 34 ganymede
-function build_swtbot(){
-	ant materialize-workspace \
-		"-Dupdate.site.base.url=http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/$3/dev-build/update-site" \
-		"-Declipse.sdk.archive=eclipse-SDK-$1-macosx-carbon.tar.gz" \
-		"-Declipse.buildId=$1" \
-		"-Dhas.archives=true" \
-		"-Declipse.qualifier=$2"
-
-	ant cruise \
-		"-Dupdate.site.base.url=http://www.eclipse.org/downloads/download.php?r=1&amp;file=/technology/swtbot/$3/dev-build/update-site" \
-		"-Declipse.sdk.archive=eclipse-SDK-$1-macosx-carbon.tar.gz" \
-		"-Declipse.buildId=$1" \
-		"-Dhas.archives=true" \
-		"-Declipse.qualifier=$2"
-
-	rm -rf to-upload/$3
-	mkdir to-upload/$3
-	mv artifacts/to-upload to-upload/$3/dev-build
-}
-
-build_swtbot 3.4.2 e34 ganymede
-build_swtbot 3.5 e35 galileo
-
-# rsync --delete-after --partial --progress --archive to-upload build.eclipse.org:
diff --git a/org.eclipse.swtbot.releng/readme.txt b/org.eclipse.swtbot.releng/readme.txt
index 0ec6d27..6382f4f 100644
--- a/org.eclipse.swtbot.releng/readme.txt
+++ b/org.eclipse.swtbot.releng/readme.txt
@@ -1,15 +1,15 @@
 To build/run/test SWTBot from source and command-line you need to do the following:
 
 Install Subversion Command-Line Client, Ant and Info-ZIP. Add them into your environment's command execution path.
-Verify that you can execute these commands on your command-line: svn, ant, unzip.
+Verify that you can execute these commands on your command-line: git, ant, unzip.
 
 Checkout code:
- $ svn co http://dev.eclipse.org/svnroot/technology/org.eclipse.swtbot/trunk swtbot
+ $ git clone http://git.eclipse.org/gitroot/swtbot/org.eclipse.swtbot.git swtbot
  $ cd swtbot/org.eclipse.swtbot.releng
 
 Edit some properties file for your platform:
  $ cp build.developer.properties.sample build.developer.properties
- $ vi build.developer.properties (Change the os, ws arch parameters)
+ $ vi build.developer.properties (Change the os, ws, arch and eclipse.version parameters)
 
 Copy the Eclipse SDK archive which you want to use into: /org.eclipse.swtbot.releng/externals
 
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.finder.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.finder.test.xml
index 65858c0..8d94fdd 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.finder.test.xml
+++ b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.finder.test.xml
@@ -1,23 +1,49 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <project name="testsuite" default="run" basedir=".">
     <property name="eclipse-home" value="${basedir}\..\.." />
+    <property name="plugin-under-test" value="org.eclipse.swtbot.eclipse.finder" />
     <property name="plugin-name" value="org.eclipse.swtbot.eclipse.finder.test" />
     <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/library.xml"/>
 
-    <target name="init">
-        <tstamp />
-        <delete>
-            <fileset dir="${eclipse-home}" includes="org*.xml" />
-        </delete>
-    </target>
+	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
+	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
+
+	<property name="cobertura.data.file" value="${basedir}/${plugin-name}.ser" />
+	
+	<target name="init">
+		<tstamp />
+		<delete>
+			<fileset dir="${eclipse-home}" includes="org*.xml" />
+		</delete>
+	</target>
+
+	<path id="cobertura.classpath">
+		<fileset dir="${build.base}/../externals/libs/cobertura-1.9.4.1">
+			<include name="cobertura.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
+
+	<target name="instrument">
+		<delete file="${cobertura.data.file}" />
+
+		<cobertura-instrument datafile="${cobertura.data.file}">
+			<fileset dir="${eclipse-home}/plugins">
+				<include name="${plugin-under-test}_${all.buildId}.jar" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
 
     <target name="suite">
 
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
-			<os family="mac"/>
+    	<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar">
+			<os family="mac" />
 		</condition>
 
-		<property name="jvmOption" value=""></property>
+		<property name="jvmOption" value="-Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar" />
+
 
     	<property name="temp-workspace" value="workspace" />
         <delete dir="${temp-workspace}" quiet="true" />
@@ -31,13 +57,16 @@
             <property name="testApplication" value="org.eclipse.ui.ide.workbench" />
             <property name="plugin-name" value="${plugin-name}" />
             <property name="classname" value="org.eclipse.swtbot.eclipse.finder.AllTests" />
-            <property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption}" />
+            <property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption} ${extra.jvm.options}" />
         </ant>
     </target>
 
-    <target name="cleanup" />
+	<target name="test-coverage">
+		<cobertura-report format="html" destdir="${build.instrumentation.reports.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+		<cobertura-report format="xml" destdir="${build.instrumentation.reports.xml.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+	</target>
 
-    <target name="run" depends="init,suite,cleanup">
+	<target name="run" depends="init, instrument, suite, test-coverage">
         <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
             <property name="includes" value="*.xml" />
             <property name="output-file" value="${plugin-name}.xml" />
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.ui.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.ui.test.xml
index 96118aa..bdd2472 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.ui.test.xml
+++ b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.eclipse.ui.test.xml
@@ -1,47 +1,81 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <project name="testsuite" default="run" basedir=".">
-    <property name="eclipse-home" value="${basedir}\..\.." />
-    <property name="plugin-name" value="org.eclipse.swtbot.eclipse.ui.test" />
+	<property name="eclipse-home" value="${basedir}\..\.." />
+    <property name="plugin-under-test" value="org.eclipse.swtbot.eclipse.ui" />
+	<property name="plugin-name" value="org.eclipse.swtbot.eclipse.ui.test" />
 	<!--property name="library-file" value="../../library.xml" /-->
-    <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/library.xml"/>
-	
-    <target name="init">
-        <tstamp />
-        <delete>
-            <fileset dir="${eclipse-home}" includes="org*.xml" />
-        </delete>
-    </target>
+	<property name="library-file" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/library.xml" />
 
-    <target name="suite">
-    	
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
-			<os family="mac"/>
+	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
+	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
+
+	<property name="cobertura.data.file" value="${basedir}/${plugin-name}.ser" />
+	<target name="init">
+		<tstamp />
+		<delete>
+			<fileset dir="${eclipse-home}" includes="org*.xml" />
+		</delete>
+	</target>
+
+	<path id="cobertura.classpath">
+		<fileset dir="${build.base}/../externals/libs/cobertura-1.9.4.1">
+			<include name="cobertura.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
+
+	<target name="instrument">
+		<delete file="${cobertura.data.file}" />
+
+		<cobertura-instrument datafile="${cobertura.data.file}">
+			<fileset dir="${eclipse-home}/plugins">
+				<include name="${plugin-under-test}_${all.buildId}.jar" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
+
+	<target name="suite">
+
+		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar">
+			<os family="mac" />
 		</condition>
+
+		<property name="jvmOption" value="-Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar" />
+
+		<property name="temp-workspace" value="workspace" />
+		<delete dir="${temp-workspace}" quiet="true" />
+
+		<!-- remove junit3 fragment -->
+		<delete dir="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit3.headless_${all.buildId}" />
+		<delete dir="${eclipse-home}/plugins" includes="org.eclipse.swtbot.ant.optional.junit3_${all.buildId}.jar" />
+
+		<ant target="swtbot-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${temp-workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.swtbot.eclipse.ui.test.AllTests" />
+			<property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption} ${extra.jvm.options}" />
+		</ant>
 		
-		<property name="jvmOption" value=""></property>
-		
-    	<property name="temp-workspace" value="workspace" />
-        <delete dir="${temp-workspace}" quiet="true" />
-    	
-    	<!-- remove junit3 fragment -->
-    	<delete dir="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit3.headless_${all.buildId}" />
-    	<delete dir="${eclipse-home}/plugins" includes="org.eclipse.swtbot.ant.optional.junit3_${all.buildId}.jar"/>
+		<ant target="swtbot-test" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="data-dir" value="${temp-workspace}" />
+			<property name="plugin-name" value="${plugin-name}" />
+			<property name="classname" value="org.eclipse.swtbot.eclipse.ui.functional.AllTests" />
+			<property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption} ${extra.jvm.options}" />
+		</ant>
+	</target>
 
-    	<ant target="swtbot-test" antfile="${library-file}" dir="${eclipse-home}">
-            <property name="data-dir" value="${temp-workspace}" />
-            <property name="plugin-name" value="${plugin-name}" />
-            <property name="classname" value="org.eclipse.swtbot.eclipse.ui.test.AllTests" />
-            <property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption}" />
-        </ant>
-    </target>
+	<target name="test-coverage">
+		<cobertura-report format="html" destdir="${build.instrumentation.reports.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+		<cobertura-report format="xml" destdir="${build.instrumentation.reports.xml.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+	</target>
 
-    <target name="cleanup" />
-
-    <target name="run" depends="init,suite,cleanup">
-        <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
-            <property name="includes" value="*.xml" />
-            <property name="output-file" value="${plugin-name}.xml" />
-        </ant>
-    </target>
+	<target name="run" depends="init, instrument, suite, test-coverage">
+		<ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+			<property name="includes" value="*.xml" />
+			<property name="output-file" value="${plugin-name}.xml" />
+		</ant>
+	</target>
 
 </project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.forms.finder.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.forms.finder.test.xml
new file mode 100644
index 0000000..0586365
--- /dev/null
+++ b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.forms.finder.test.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<project name="testsuite" default="run" basedir=".">
+    <property name="eclipse-home" value="${basedir}\..\.." />
+    <property name="plugin-under-test" value="org.eclipse.swtbot.forms.finder" />
+    <property name="plugin-name" value="org.eclipse.swtbot.forms.finder.test" />
+    <property name="library-file" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/library.xml"/>
+
+	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
+	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
+
+	<property name="cobertura.data.file" value="${basedir}/${plugin-name}.ser" />
+	
+	<target name="init">
+		<tstamp />
+		<delete>
+			<fileset dir="${eclipse-home}" includes="org*.xml" />
+		</delete>
+	</target>
+
+	<path id="cobertura.classpath">
+		<fileset dir="${build.base}/../externals/libs/cobertura-1.9.4.1">
+			<include name="cobertura.jar" />
+			<include name="lib/**/*.jar" />
+		</fileset>
+	</path>
+
+	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
+
+	<target name="instrument">
+		<delete file="${cobertura.data.file}" />
+
+		<cobertura-instrument datafile="${cobertura.data.file}">
+			<fileset dir="${eclipse-home}/plugins">
+				<include name="${plugin-under-test}_${all.buildId}.jar" />
+			</fileset>
+		</cobertura-instrument>
+	</target>
+
+    <target name="suite">
+
+    	<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts -Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar">
+			<os family="mac" />
+		</condition>
+
+		<property name="jvmOption" value="-Dnet.sourceforge.cobertura.datafile=${cobertura.data.file} -Xbootclasspath/p:${build.base}/../externals/libs/cobertura-1.9.4.1/cobertura.jar" />
+
+
+    	<property name="temp-workspace" value="workspace" />
+        <delete dir="${temp-workspace}" quiet="true" />
+
+    	<!-- remove junit3 fragment -->
+    	<delete dir="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit3.headless_${all.buildId}" />
+    	<delete dir="${eclipse-home}/plugins" includes="org.eclipse.swtbot.ant.optional.junit3_${all.buildId}.jar"/>
+
+    	<ant target="swtbot-test" antfile="${library-file}" dir="${eclipse-home}">
+            <property name="data-dir" value="${temp-workspace}" />
+            <property name="testApplication" value="org.eclipse.ui.ide.workbench" />
+            <property name="plugin-name" value="${plugin-name}" />
+            <property name="classname" value="org.eclipse.swtbot.forms.finder.test.AllTests" />
+            <property name="vmargs" value=" -Xms128M -Xmx368M -XX:MaxPermSize=256M ${jvmOption} ${extra.jvm.options}" />
+        </ant>
+    </target>
+
+	<target name="test-coverage">
+		<cobertura-report format="html" destdir="${build.instrumentation.reports.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+		<cobertura-report format="xml" destdir="${build.instrumentation.reports.xml.dir}" srcdir="${build.base}/plugins/${plugin-under-test}/src" datafile="${cobertura.data.file}" />
+	</target>
+
+	<target name="run" depends="init, instrument, suite, test-coverage">
+        <ant target="collect" antfile="${library-file}" dir="${eclipse-home}">
+            <property name="includes" value="*.xml" />
+            <property name="output-file" value="${plugin-name}.xml" />
+        </ant>
+    </target>
+
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.generator.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.generator.test.xml
index ca617b7..e0f7c2e 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.generator.test.xml
+++ b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.generator.test.xml
@@ -10,7 +10,7 @@
 	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
 
 	<path id="cobertura.classpath">
-		<fileset dir="${build.base}/../externals/libs/cobertura-1.9">
+		<fileset dir="${build.base}/../externals/libs/cobertura-1.9.4.1">
 			<include name="cobertura.jar" />
 			<include name="lib/**/*.jar" />
 		</fileset>
@@ -31,6 +31,8 @@
 			<include name="org.eclipse.jface_*.jar" />
 			<include name="org.eclipse.core.commands_*.jar" />
 			<include name="org.junit4_*/junit*.jar" />
+			<!-- org.junit4_4.x.y was renamed to org.junit_4.x.y -->
+			<include name="org.junit_4*/junit*.jar" />
 			<include name="org.eclipse.swtbot*" />
 			<include name="org.apache.log4j_1.2.*.jar" />
 			<include name="org.hamcrest*.jar" />
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.finder.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.finder.test.xml
index 18c4061..4a388e7 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.finder.test.xml
+++ b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.finder.test.xml
@@ -3,14 +3,14 @@
 	<echo>${eclipse-home}</echo>
 	<property name="plugin-name" value="${ant.project.name}" />
 
-	<property name="cobertura.data.file" value="cobertura.ser" />
+	<property name="cobertura.data.file" value="cobertura.swt.finder.ser" />
 	<property name="junit.reports.xml.dir" value="${results.dir}/${plugin-name}/junit/xml" />
 	<property name="junit.reports.html.dir" value="${results.dir}/${plugin-name}/junit/html" />
 	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
 	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
 
 	<path id="cobertura.classpath">
-		<fileset dir="${build.base}/../externals/libs/cobertura-1.9">
+		<fileset dir="${build.base}/../externals/libs/cobertura-1.9.4.1">
 			<include name="cobertura.jar" />
 			<include name="lib/**/*.jar" />
 		</fileset>
@@ -31,6 +31,8 @@
 			<include name="org.eclipse.jface_*.jar" />
 			<include name="org.eclipse.core.commands_*.jar" />
 			<include name="org.junit4_*/junit*.jar" />
+			<!-- org.junit4_4.x.y was renamed to org.junit_4.x.y -->
+			<include name="org.junit_4*/junit*.jar" />
 			<include name="org.eclipse.swtbot*" />
 			<include name="org.apache.log4j_1.2.*.jar" />
 			<include name="org.hamcrest*.jar" />
@@ -61,7 +63,7 @@
 	<target name="test">
 		<mkdir dir="${junit.reports.xml.dir}" />
 
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
+		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts ${extra.jvm.options}">
 			<os family="mac" />
 		</condition>
 
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.test.xml
deleted file mode 100644
index 1f24482..0000000
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.test.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<project name="org.eclipse.swtbot.swt.recorder.test" default="all" basedir=".">
-	<property name="eclipse-home" value="${basedir}/../.." />
-	<echo>${eclipse-home}</echo>
-	<property name="plugin-name" value="${ant.project.name}" />
-
-	<property name="cobertura.data.file" value="cobertura.ser" />
-	<property name="junit.reports.xml.dir" value="${results.dir}/${plugin-name}/junit/xml" />
-	<property name="junit.reports.html.dir" value="${results.dir}/${plugin-name}/junit/html" />
-	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
-	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
-
-	<path id="cobertura.classpath">
-		<fileset dir="${build.base}/../externals/libs/cobertura-1.9">
-			<include name="cobertura.jar" />
-			<include name="lib/**/*.jar" />
-		</fileset>
-	</path>
-	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
-
-	<path id="test.classpath">
-		<pathelement location="build/instrumented" />
-		<pathelement location="build/classes" />
-		<pathelement location="." />
-	</path>
-
-	<path id="plugin.dependencies.classpath">
-		<fileset dir="${eclipse-home}/plugins">
-			<include name="org.eclipse.swt.examples_${all.buildId}.jar" />
-			<include name="org.eclipse.swt.*.jar" />
-			<include name="org.eclipse.equinox.common_*.jar" />
-			<include name="org.eclipse.jface_*.jar" />
-			<include name="org.eclipse.core.commands_*.jar" />
-			<include name="org.junit4_*/junit*.jar" />
-			<include name="org.eclipse.swtbot*" />
-			<include name="org.apache.log4j_1.2.*.jar" />
-			<include name="org.hamcrest*.jar" />
-		</fileset>
-		<pathelement location="${eclipse-home}/plugins/org.eclipse.swtbot.swt.finder.test_${all.buildId}" />
-	</path>
-
-	<target name="init">
-		<tstamp />
-		<delete dir="build/instrumented" />
-	</target>
-
-	<target name="instrument">
-		<delete file="${cobertura.data.file}" />
-		<mkdir dir="build/instrumented" />
-		<mkdir dir="build/classes" />
-
-		<unzip dest="build/classes" src="${eclipse-home}/plugins/org.eclipse.swtbot.swt.recorder_${all.buildId}.jar" />
-
-		<cobertura-instrument todir="build/instrumented" datafile="${cobertura.data.file}">
-			<fileset dir="build/classes" />
-		</cobertura-instrument>
-	</target>
-
-	<target name="test">
-		<mkdir dir="${junit.reports.xml.dir}" />
-
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
-			<os family="mac" />
-		</condition>
-
-		<property name="jvmOption" value="" />
-
-		<junit fork="true" forkmode="once" timeout="1200000" printsummary="yes" haltonfailure="no" haltonerror="no" failureproperty="junit.failure" errorproperty="junit.failure">
-			<sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.data.file}" />
-
-			<classpath refid="test.classpath" />
-			<classpath refid="plugin.dependencies.classpath" />
-			<classpath refid="cobertura.classpath" />
-
-			<formatter type="xml" />
-			<formatter type="plain" usefile="false" />
-
-			<batchtest fork="yes" todir="${junit.reports.xml.dir}">
-				<fileset dir="${basedir}">
-					<include name="**/*Test.class" />
-					<exclude name="**/AllTests.class" />
-					<exclude name="**/*Abstract*.class" />
-				</fileset>
-			</batchtest>
-
-			<jvmarg line="${jvmOption}" />
-			<!-- -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -->
-
-		</junit>
-
-		<mkdir dir="${junit.reports.html.dir}" />
-		<junitreport todir="${junit.reports.xml.dir}">
-			<fileset dir="${junit.reports.xml.dir}">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${junit.reports.html.dir}" />
-		</junitreport>
-		<echo>Test reports available at: ${junit.reports.html.dir}/index.html</echo>
-		<fail message="Tests failed: check test reports." if="junit.failure" />
-	</target>
-
-	<target name="test-coverage" depends="instrument, test">
-		<cobertura-report format="html" destdir="${build.instrumentation.reports.dir}" srcdir="${build.base}/plugins/org.eclipse.swtbot.swt.recorder/src" datafile="${cobertura.data.file}" />
-		<cobertura-report format="xml" destdir="${build.instrumentation.reports.xml.dir}" srcdir="${build.base}/plugins/org.eclipse.swtbot.swt.recorder/src" datafile="${cobertura.data.file}" />
-	</target>
-
-	<target name="all" depends="init, test-coverage" />
-
-	<macrodef name="echo-fileset">
-		<attribute name="filesetref" />
-		<sequential>
-			<pathconvert pathsep="${line.separator}|   |-- " property="@{filesetref}.echopath" refid="@{filesetref}" />
-
-			<echo message="|-- @{filesetref} classpath" />
-			<echo message="|   |" />
-			<echo message="|   |-- ${@{filesetref}.echopath}" />
-		</sequential>
-	</macrodef>
-</project>
diff --git a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.ui.test.xml b/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.ui.test.xml
deleted file mode 100644
index c3cdb2f..0000000
--- a/org.eclipse.swtbot.releng/test-sandbox/org.eclipse.swtbot.swt.recorder.ui.test.xml
+++ /dev/null
@@ -1,106 +0,0 @@
-<project name="org.eclipse.swtbot.swt.recorder.ui.test" default="all" basedir=".">
-	<property name="eclipse-home" value="${basedir}/../.." />
-	<echo>${eclipse-home}</echo>
-	<property name="plugin-name" value="${ant.project.name}" />
-
-	<property name="cobertura.data.file" value="cobertura.ser" />
-	<property name="junit.reports.xml.dir" value="${results.dir}/${plugin-name}/junit/xml" />
-	<property name="junit.reports.html.dir" value="${results.dir}/${plugin-name}/junit/html" />
-	<property name="build.instrumentation.reports.dir" value="${results.dir}/${plugin-name}/coverage/html" />
-	<property name="build.instrumentation.reports.xml.dir" value="${results.dir}/${plugin-name}/coverage/xml" />
-
-	<path id="cobertura.classpath">
-		<fileset dir="${build.base}/../externals/libs/cobertura-1.9">
-			<include name="cobertura.jar" />
-			<include name="lib/**/*.jar" />
-		</fileset>
-	</path>
-	<taskdef classpathref="cobertura.classpath" resource="tasks.properties" />
-
-	<path id="test.classpath">
-		<pathelement location="build/instrumented" />
-		<pathelement location="build/classes" />
-		<pathelement location="." />
-	</path>
-
-	<path id="plugin.dependencies.classpath">
-		<fileset dir="${eclipse-home}/plugins">
-			<include name="org.eclipse.swt.examples_${all.buildId}.jar" />
-			<include name="org.eclipse.swt.*.jar" />
-			<include name="org.eclipse.equinox.common_*.jar" />
-			<include name="org.eclipse.jface_*.jar" />
-			<include name="org.eclipse.core.commands_*.jar" />
-			<include name="org.junit4_*/junit*.jar" />
-			<include name="org.eclipse.swtbot*" />
-			<include name="org.apache.log4j_1.2.*.jar" />
-			<include name="org.hamcrest*.jar" />
-		</fileset>
-	</path>
-
-	<target name="init">
-		<tstamp />
-		<delete dir="build/instrumented" />
-	</target>
-
-	<target name="instrument">
-		<delete file="${cobertura.data.file}" />
-		<mkdir dir="build/instrumented" />
-		<mkdir dir="build/classes" />
-
-		<unzip dest="build/classes" src="${eclipse-home}/plugins/org.eclipse.swtbot.swt.recorder.ui_${all.buildId}.jar" />
-
-		<cobertura-instrument todir="build/instrumented" datafile="${cobertura.data.file}">
-			<fileset dir="build/classes" />
-		</cobertura-instrument>
-	</target>
-
-	<target name="test">
-		<mkdir dir="${junit.reports.xml.dir}" />
-
-		<condition property="jvmOption" value="-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts">
-			<os family="mac" />
-		</condition>
-
-		<property name="jvmOption" value="" />
-
-		<junit fork="true" forkmode="once" timeout="1200000" printsummary="yes" haltonfailure="no" haltonerror="no" failureproperty="junit.failure" errorproperty="junit.failure">
-			<sysproperty key="net.sourceforge.cobertura.datafile" file="${cobertura.data.file}" />
-
-			<classpath refid="test.classpath" />
-			<classpath refid="plugin.dependencies.classpath" />
-			<classpath refid="cobertura.classpath" />
-
-			<formatter type="xml" />
-			<formatter type="plain" usefile="false" />
-
-			<batchtest fork="yes" todir="${junit.reports.xml.dir}">
-				<fileset dir="${basedir}">
-					<include name="**/*Test.class" />
-					<exclude name="**/AllTests.class" />
-					<exclude name="**/*Abstract*.class" />
-				</fileset>
-			</batchtest>
-
-			<jvmarg line="${jvmOption}" />
-			<!-- -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -->
-
-		</junit>
-
-		<mkdir dir="${junit.reports.html.dir}" />
-		<junitreport todir="${junit.reports.xml.dir}">
-			<fileset dir="${junit.reports.xml.dir}">
-				<include name="TEST-*.xml" />
-			</fileset>
-			<report format="frames" todir="${junit.reports.html.dir}" />
-		</junitreport>
-		<echo>Test reports available at: ${junit.reports.html.dir}/index.html</echo>
-		<fail message="Tests failed: check test reports." if="junit.failure" />
-	</target>
-
-	<target name="test-coverage" depends="instrument, test">
-		<cobertura-report format="html" destdir="${build.instrumentation.reports.dir}" srcdir="${build.base}/plugins/org.eclipse.swtbot.swt.recorder.ui/src" datafile="${cobertura.data.file}" />
-		<cobertura-report format="xml" destdir="${build.instrumentation.reports.xml.dir}" srcdir="${build.base}/plugins/org.eclipse.swtbot.swt.recorder.ui/src" datafile="${cobertura.data.file}" />
-	</target>
-
-	<target name="all" depends="init, test-coverage" />
-</project>
diff --git a/org.eclipse.swtbot.releng/test-sandbox/passFail.xsl b/org.eclipse.swtbot.releng/test-sandbox/passFail.xsl
index 568329e..40173b6 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/passFail.xsl
+++ b/org.eclipse.swtbot.releng/test-sandbox/passFail.xsl
@@ -1,23 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="text"/>
-     <xsl:template match="/">
-<xsl:apply-templates select="testsuites/testsuite"/>
-     </xsl:template>
-<xsl:template match="testsuite">
-<xsl:choose>
- <xsl:when test="@errors > 0 or @failures > 0">
-  <xsl:text>
-	test.status=failed
-	test.failed=true
-  </xsl:text>
- </xsl:when>
- <xsl:otherwise>
-  <xsl:text>
-	test.status=passed
-	test.passed=true
-  </xsl:text>
- </xsl:otherwise>
-</xsl:choose>
-</xsl:template>
+<xsl:stylesheet version="1.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:output method="text" />
+	<xsl:template match="/">
+		<xsl:apply-templates select="testsuites/testsuite" />
+	</xsl:template>
+	<xsl:template match="testsuite">
+		<xsl:choose>
+			<xsl:when test="@errors > 0 or @failures > 0">
+				<xsl:text>
+					test.failed=true
+  				</xsl:text>
+			</xsl:when>
+		</xsl:choose>
+	</xsl:template>
 </xsl:stylesheet>
diff --git a/org.eclipse.swtbot.releng/test-sandbox/test.xml b/org.eclipse.swtbot.releng/test-sandbox/test.xml
index e6ddeed..4b18496 100644
--- a/org.eclipse.swtbot.releng/test-sandbox/test.xml
+++ b/org.eclipse.swtbot.releng/test-sandbox/test.xml
@@ -24,8 +24,6 @@
 			<contains string="${runtimeArchive}" substring=".tar.gz" />
 		</condition>
 		<antcall target="${setupTarget}" />
-		<antcall target="configureTeamTest" />
-		<antcall target="configureDeltaPack" />
 	</target>
 
 	<!--setup for zip archives-->
@@ -189,55 +187,6 @@
 		</condition>
 	</target>
 
-	<target name="setJVMProperties" depends="setJVMfromUserSpecified">
-		<!--enable tests requiring 1.5 or 1.6 vms to run if running vm level detected matches required execution environment-->
-		<condition property="J2SE-5.0" value="${java.home}/bin/java">
-			<or>
-				<equals arg1="${ant.java.version}" arg2="1.5" />
-				<equals arg1="${ant.java.version}" arg2="1.6" />
-			</or>
-		</condition>
-		<condition property="J2SE-6.0" value="${java.home}/bin/java">
-			<equals arg1="${ant.java.version}" arg2="1.6" />
-		</condition>
-	</target>
-
-	<target name="setJVMfromUserSpecified" if="jvm">
-		<exec executable="${jvm}" outputproperty="javaversion">
-			<arg line="-version" />
-		</exec>
-		<echo message="java version of ${jvm} is ${javaversion}" />
-		<condition property="J2SE-6.0" value="${jvm}">
-			<contains string="${javaversion}" substring="java version &quot;1.6" />
-		</condition>
-		<condition property="J2SE-5.0" value="${jvm}">
-			<or>
-				<contains string="${javaversion}" substring="java version &quot;1.6" />
-				<contains string="${javaversion}" substring="java version &quot;1.5" />
-			</or>
-		</condition>
-		<echo message="J2SE-6.0:  ${J2SE-6.0}" />
-		<echo message="J2SE-5.0:  ${J2SE-5.0}" />
-	</target>
-
-	<target name="configureTeamTest" if="teamcvs">
-		<!-- Fill in cvs repository information -->
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@user@" value="${cvs_user}" />
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@password@" value="${cvs_password}" />
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@host@" value="${cvs_host}" />
-		<replace file="${eclipse-home}/plugins/${org.eclipse.team.tests.cvs.core}/repository.properties" token="@root@" value="${cvs_root}" />
-	</target>
-
-	<target name="configureDeltaPack" if="pdebuild">
-		<property name="deltapackArchive" value="eclipse-RCP-${buildId}-delta-pack.zip" />
-		<property name="installDeltapack" value="${install}/deltapack" />
-		<mkdir dir="${installDeltapack}" />
-		<exec dir="." executable="unzip">
-			<arg line="-o -qq ${deltapackArchive} -d ${installDeltapack}" />
-		</exec>
-	</target>
-
-
 	<macrodef name="runTests">
 		<attribute name="testPlugin" />
 		<attribute name="testPluginsRequired" default="" />
@@ -276,7 +225,19 @@
 		<available file="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit3.headless_${all.buildId}/JUNIT.XSL" property="junit.xsl" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit3.headless_${all.buildId}/JUNIT.XSL" />
 		<available file="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/JUNIT.XSL" property="junit.xsl" value="${eclipse-home}/plugins/org.eclipse.swtbot.eclipse.junit4.headless_${all.buildId}/JUNIT.XSL" />
 		
-		<style style="${junit.xsl}" in="${junit.reports.xml.dir}/index.xml" out="${junit.reports.html.dir}/index.html" />
+		<mkdir dir="${junit.reports.html.dir}/screenshots" />
+		<move todir="${junit.reports.html.dir}/screenshots" failonerror="false">
+			<fileset dir="${junit-report-output}/screenshots" includes="*.*" />
+		</move>
+
+		<xslt style="${junit.xsl}" in="${junit.reports.xml.dir}/index.xml" out="${junit.reports.html.dir}/index.html">
+			<param name="screenshot_dir" expression="screenshots"/>
+			<!--
+			Only use this if you've set SWTBotPreferences#SCREENSHOT_FORMAT preference
+			Optional: possible values are bmp, gif, ico, jpeg, jpg, png or tiff
+			<param name="screenshot_format" expression="jpeg"/>
+			-->
+		</xslt>
 		
 		<xslt in="${junit.reports.xml.dir}/index.xml" out="./passFail.txt" style="passFail.xsl" />
 		<property file="passFail.txt" />
@@ -308,18 +269,6 @@
 		</antcall>
 	</target>
 
-	<target name="test-recorder" depends="setup">
-		<antcall target="core-tests">
-			<param name="testPlugin" value="org.eclipse.swtbot.swt.recorder.test" />
-		</antcall>
-	</target>
-
-	<target name="test-recorder-ui" depends="setup">
-		<antcall target="core-tests">
-			<param name="testPlugin" value="org.eclipse.swtbot.swt.recorder.ui.test" />
-		</antcall>
-	</target>
-
 	<target name="test-generator" depends="setup">
 		<antcall target="core-tests">
 			<param name="testPlugin" value="org.eclipse.swtbot.generator.test" />
@@ -330,11 +279,15 @@
 		<runTests testPlugin="org.eclipse.swtbot.eclipse.finder.test" />
 	</target>
 
+	<target name="test-forms">
+		<runTests testPlugin="org.eclipse.swtbot.forms.finder.test" />
+	</target>
+
 	<target name="test-eclipse-ui">
 		<runTests testPlugin="org.eclipse.swtbot.eclipse.ui.test" />
 	</target>
 
-	<target name="all" depends="test-finder, test-recorder-ui, test-recorder, test-generator, test-eclipse-finder, test-eclipse-ui" />
+	<target name="all" depends="test-finder, test-forms, test-eclipse-finder, test-eclipse-ui, test-generator" />
 
 </project>
 
diff --git a/org.eclipse.swtbot.swt.demo/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.demo/META-INF/MANIFEST.MF
index ff1ac60..55ace85 100644
--- a/org.eclipse.swtbot.swt.demo/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.swt.demo/META-INF/MANIFEST.MF
@@ -2,9 +2,9 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot Demo Plug-in (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.swt.demo;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-Activator: org.eclipse.swtbot.swt.demo.Activator
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ClassPath: .
diff --git a/org.eclipse.swtbot.swt.demo/build.properties b/org.eclipse.swtbot.swt.demo/build.properties
index b605729..96b1ee6 100644
--- a/org.eclipse.swtbot.swt.demo/build.properties
+++ b/org.eclipse.swtbot.swt.demo/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -16,10 +16,5 @@
                LICENSE.EPL,\
                src/
 source.. = src/
-src.includes = src/,\
-               build.properties,\
-               META-INF/,\
-               .project,\
-               .classpath,\
-               LICENSE.EPL,\
+src.includes = LICENSE.EPL,\
                about.html
diff --git a/org.eclipse.swtbot.swt.demo/pom.xml b/org.eclipse.swtbot.swt.demo/pom.xml
new file mode 100644
index 0000000..a032e09
--- /dev/null
+++ b/org.eclipse.swtbot.swt.demo/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.swt.demo</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.recorder.test/.classpath b/org.eclipse.swtbot.swt.finder.test.keyboards/.classpath
similarity index 100%
copy from org.eclipse.swtbot.swt.recorder.test/.classpath
copy to org.eclipse.swtbot.swt.finder.test.keyboards/.classpath
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.swtbot.swt.finder.test.keyboards/.project
similarity index 90%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.swtbot.swt.finder.test.keyboards/.project
index d2190e0..505e6fc 100644
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.swtbot.swt.finder.test.keyboards</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/LICENSE.EPL b/org.eclipse.swtbot.swt.finder.test.keyboards/LICENSE.EPL
similarity index 100%
rename from org.eclipse.swtbot.swt.recorder.ui.test/LICENSE.EPL
rename to org.eclipse.swtbot.swt.finder.test.keyboards/LICENSE.EPL
diff --git a/org.eclipse.swtbot.swt.finder.test.keyboards/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.finder.test.keyboards/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..df813ed
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Dummy keyboards layouts for Testing
+Bundle-SymbolicName: org.eclipse.swtbot.swt.finder.test.keyboards
+Bundle-Version: 2.0.5.qualifier
+Bundle-Vendor: Eclipse.org
+Fragment-Host: org.eclipse.swtbot.swt.finder;bundle-version="2.0.5"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/about.html b/org.eclipse.swtbot.swt.finder.test.keyboards/about.html
similarity index 100%
rename from org.eclipse.swtbot.swt.recorder.ui.test/about.html
rename to org.eclipse.swtbot.swt.finder.test.keyboards/about.html
diff --git a/org.eclipse.swtbot.swt.finder.test.keyboards/build.properties b/org.eclipse.swtbot.swt.finder.test.keyboards/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.swtbot.swt.finder.test.keyboards/pom.xml b/org.eclipse.swtbot.swt.finder.test.keyboards/pom.xml
new file mode 100644
index 0000000..652d12c
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.test</groupId>
+  <artifactId>org.eclipse.swtbot.swt.finder.test.keyboards</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/BAZ.keyboard b/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/BAZ.keyboard
new file mode 100644
index 0000000..a2191a6
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/BAZ.keyboard
@@ -0,0 +1 @@
+# shift + t
diff --git a/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/MAC_FOOBAR.keyboard b/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/MAC_FOOBAR.keyboard
new file mode 100644
index 0000000..a8b3ecd
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test.keyboards/src/com/foo/bar/MAC_FOOBAR.keyboard
@@ -0,0 +1 @@
+* shift + Y
diff --git a/org.eclipse.swtbot.swt.finder.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.finder.test/META-INF/MANIFEST.MF
index b1914e1..d4ddbcd 100644
--- a/org.eclipse.swtbot.swt.finder.test/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.swt.finder.test/META-INF/MANIFEST.MF
@@ -2,23 +2,16 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot SWT Control Finder plugin (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.swt.finder.test;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Require-Bundle: org.eclipse.swt,
  org.eclipse.jface,
  org.eclipse.swt.examples,
  org.eclipse.swtbot.swt.finder,
- org.apache.log4j;version="1.2.12",
- org.junit4,
+ org.apache.log4j;bundle-version="[1.2.13,1.3.0)",
  org.hamcrest,
- org.eclipse.swtbot.junit4_x
+ org.eclipse.swtbot.junit4_x,
+ org.junit;bundle-version="[4.8.0,5.0.0)"
 Bundle-ActivationPolicy: lazy
 Bundle-ClassPath: .
-Export-Package: org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.alltests,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.resolvers,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.widgets
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.swtbot.swt.finder.test/build.properties b/org.eclipse.swtbot.swt.finder.test/build.properties
index 9bc59bd..cb11aff 100644
--- a/org.eclipse.swtbot.swt.finder.test/build.properties
+++ b/org.eclipse.swtbot.swt.finder.test/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -13,12 +13,7 @@
                LICENSE.EPL,\
                about.html,\
                src/
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               build.properties,\
-               src/,\
+src.includes = LICENSE.EPL,\
                about.html
 source.. = src/
 jars.compile.order = .
diff --git a/org.eclipse.swtbot.swt.finder.test/pom.xml b/org.eclipse.swtbot.swt.finder.test/pom.xml
new file mode 100644
index 0000000..2a20db9
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/pom.xml
@@ -0,0 +1,44 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot.plugins</groupId>
+	<artifactId>org.eclipse.swtbot.swt.finder.test</artifactId>
+	<packaging>eclipse-test-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.swtbot</groupId>
+		<artifactId>parent</artifactId>
+		<version>2.0.5-SNAPSHOT</version>
+		<relativePath>../pom.xml</relativePath>
+	</parent>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-surefire-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<!-- tycho.testArgLine repeated to re-use the configuration for argLine for jacoco agent -->
+					<argLine>${tycho.testArgLine} -Xms64m -Xmx1024m -XX:MaxPermSize=128M</argLine>
+					<useUIHarness>true</useUIHarness>
+					<useUIThread>true</useUIThread>
+					<product>org.eclipse.sdk.ide</product>
+					<application>org.eclipse.ui.ide.workbench</application>
+					<dependencies>
+						<dependency>
+							<type>p2-installable-unit</type>
+							<artifactId>org.eclipse.swtbot.swt.finder.test.keyboards</artifactId>
+							<version>0.0.0</version>
+						</dependency>
+					</dependencies>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+
+</project>
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/ReferenceByTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/ReferenceByTest.java
index 21703a2..a6f2e31 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/ReferenceByTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/ReferenceByTest.java
@@ -14,6 +14,7 @@
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.ID_VALUE;
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.IN_GROUP;
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.LABEL;
+import static org.eclipse.swtbot.swt.finder.ReferenceBy.MESSAGE;
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.MNEMONIC;
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.NONE;
 import static org.eclipse.swtbot.swt.finder.ReferenceBy.TEXT;
@@ -104,10 +105,11 @@
 	@Test
 	public void generatesCombinations() throws Exception {
 		List<List<ReferenceBy>> combinations = ReferenceBy.getCombinations(ReferenceBy.values());
-		assertEquals(12, combinations.size());
+		assertEquals(13, combinations.size());
 		assertTrue(combinations.contains(Arrays.asList(TEXT)));
 		assertTrue(combinations.contains(Arrays.asList(LABEL)));
 		assertTrue(combinations.contains(Arrays.asList(TOOLTIP)));
+		assertTrue(combinations.contains(Arrays.asList(MESSAGE)));
 		assertTrue(combinations.contains(Arrays.asList(IN_GROUP)));
 		assertTrue(combinations.contains(Arrays.asList(MNEMONIC)));
 		assertTrue(combinations.contains(Arrays.asList(NONE)));
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/RunUIThreadRule.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/RunUIThreadRule.java
new file mode 100644
index 0000000..2090e7a
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/RunUIThreadRule.java
@@ -0,0 +1,150 @@
+package org.eclipse.swtbot.swt.finder;
+
+import java.util.List;
+
+import org.eclipse.swt.widgets.Display;
+import org.junit.rules.MethodRule;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+import org.junit.runners.model.TestClass;
+
+public class RunUIThreadRule implements MethodRule {
+
+	private final Thread	uiThread		= Thread.currentThread();
+	private Thread			testThread;
+	private Display			display;
+	private boolean			waitForDisplay	= true;
+	private Throwable		testException;
+	private final Object	testObject;
+
+	public RunUIThreadRule(Object testObject) {
+		this.testObject = testObject;
+	}
+
+	public Statement apply(final Statement testStatement, FrameworkMethod method, final Object target) {
+		return new Statement() {
+			@Override
+			public void evaluate() throws Throwable {
+				// Fork Test Thread
+				testThread = new Thread(createTestRunnable(testStatement), "test");
+				testThread.start();
+				// Run UI thread
+				runUiThread();
+			}
+
+		};
+
+	}
+
+	private Runnable createTestRunnable(final Statement testStatement) {
+		return new Runnable() {
+			public void run() {
+				runTestThread(testStatement);
+			}
+		};
+	}
+
+	// Test Thread
+	private void runTestThread(final Statement testStatement) {
+		try {
+			waitForDisplay();
+			waitForEventLoop();
+			testStatement.evaluate();
+		} catch (Throwable e) {
+			testException = e;
+		} finally {
+			disposeDisplay();
+		}
+	}
+
+	private void waitForDisplay() throws InterruptedException {
+		while ((display = Display.findDisplay(uiThread)) == null && waitForDisplay) {
+			Thread.sleep(10);
+		}
+		if (display == null) {
+			throw new RuntimeException("@UIThread methods need to create a Display!");
+		}
+	}
+
+	private void waitForEventLoop() {
+		display.syncExec(new Runnable() {
+			public void run() {
+				// no-op, wait for sync
+			}
+		});
+	}
+
+	private void disposeDisplay() {
+		if (display != null && !display.isDisposed()) {
+			display.syncExec(new Runnable() {
+				public void run() {
+					display.dispose();
+				}
+			});
+		}
+	}
+
+	// UI Thread
+
+	private void runUiThread() throws Throwable {
+		try {
+			// Run all methods annotated with @UIThread
+			for (FrameworkMethod frameworkMethod : uiThreadMethods()) {
+				frameworkMethod.invokeExplosively(testObject);
+			}
+		} finally {
+			// Get the Display created by the @UIThread methods
+			display = Display.getCurrent();
+
+			// If the UI thread never created a Display, we need to tell the
+			// test thread to stop looking for it.
+			if (display == null) {
+				waitForDisplay = false;
+			}
+
+			// Running the event loop in the @UIThread method is optional. If
+			// the test doesn't run it, we do. It can also happen that the
+			// @UIThread method finishes with an undisposed display. In this
+			// case we also need to run the event loop to dispose the
+			// Display properly.
+			runEventLoop();
+		}
+
+		// Wait for the test thread to finish
+		testThread.join();
+
+		// Rethrow any test exception that could not be thrown directly
+		if (testException != null) {
+			throw testException;
+		}
+
+	}
+
+	private List<FrameworkMethod> uiThreadMethods() {
+		return new TestClass(testObject.getClass()).getAnnotatedMethods(UIThread.class);
+	}
+
+	/**
+	 * Runs the event loop very carefully to make sure the Display can be disposed in every case. This can never throw
+	 * an Exception, if an exception bubbles up to the Event thread, it's only stored.
+	 */
+	private void runEventLoop() {
+		while (display != null && !display.isDisposed()) {
+			try {
+				// Rescue Measure: if the test thread dies and leaves the
+				// Display behind
+				if (!testThread.isAlive()) {
+					display.dispose();
+				}
+				if (!display.readAndDispatch()) {
+					display.sleep();
+				}
+			} catch (Exception e) {
+				// An Exception that occurs from the event loop is recorded.
+				// It's not allowed to disrupt the event loop, because an event
+				// loop needs to be present to properly dispose the Display.
+				testException = e;
+			}
+		}
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBot2Test.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBot2Test.java
index 7979c23..a82e21c 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBot2Test.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBot2Test.java
@@ -13,9 +13,10 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertEnabled;
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertNotEnabled;
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertSameWidget;
-import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertTextContains;
+import static org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable.syncExec;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.swt.SWT;
@@ -24,10 +25,12 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.eclipse.swtbot.swt.finder.utils.Traverse;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
 import org.junit.Test;
 
@@ -35,9 +38,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBot2Test extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBot2Test extends AbstractControlExampleTest {
 
 	@Test
 	public void findsTextBox() throws Exception {
@@ -100,24 +101,26 @@
 		bot.button("One").traverse(Traverse.TAB_NEXT);
 
 		SWTBotText textInGroup = bot.textInGroup("Listeners");
-
-		assertTextContains("Traverse [31]: TraverseEvent{Button {One} ", textInGroup);
-		assertTextContains("data=null character='\\0' keyCode=0 stateMask=0 doit=true detail=16}", textInGroup);
-		assertTextContains("FocusOut [16]: FocusEvent{Button {One} time=", textInGroup);
-		assertTextContains("FocusIn [15]: FocusEvent{Button {Two} time=", textInGroup);
+		assertEventMatches(textInGroup, "Traverse [31]: TraverseEvent{Button {One} time=60232779 data=null character='\\0' keyCode=0 stateMask=0 doit=true detail=16}");
+		assertEventMatches(textInGroup, "FocusOut [16]: FocusEvent{Button {One} time=60232779 data=null}");
+		assertEventMatches(textInGroup, "FocusIn [15]: FocusEvent{Button {Two} time=60232779 data=null}");
 		assertTrue(bot.button("Two").isActive());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
-		bot.tabItem("Button").activate();
+	@Test
+	public void findsGetsIdOfAControl() throws Exception {
+		final SWTBotButton button = bot.button("Two");
+		assertNull(button.getId());
+		syncExec(new VoidResult() {
+			public void run() {
+				button.widget.setData(SWTBotPreferences.DEFAULT_KEY, "foo");
+			}
+		});
+		assertEquals("foo", button.getId());
 	}
 
-	public void tearDown() throws Exception {
-		super.tearDown();
-		bot.checkBox("Listen").deselect();
-		bot.button("Clear").click();
+	public void prepareExample() throws Exception {
+		bot.tabItem("Button").activate();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTest.java
index 9e1dbd3..469e13f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTest.java
@@ -18,6 +18,7 @@
 
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractMenuExampleTest;
 import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 import org.eclipse.swtbot.swt.finder.widgets.TimeoutException;
@@ -85,12 +86,12 @@
 
 	@Test
 	public void getsAllShells() throws Exception {
-		assertEquals(7, bot.shells().length);
+		assertEquals(2, bot.shells().length);
 	}
 
 	@Test
 	public void findsShellsById() throws Exception {
-		final SWTBotShell shell = bot.shell("SWT Clipboard");
+		final SWTBotShell shell = bot.shell("Address Book - Untitled");
 		UIThreadRunnable.syncExec(new VoidResult() {
 			public void run() {
 				shell.widget.setData("foo-shell", "bar");
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTestCaseTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTestCaseTest.java
index e1cbaf5..549b712 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTestCaseTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/SWTBotTestCaseTest.java
@@ -28,6 +28,7 @@
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
 import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotTest;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
+import org.junit.Before;
 import org.junit.Test;
 
 public class SWTBotTestCaseTest extends AbstractSWTBotTest {
@@ -136,8 +137,8 @@
 		assertMatchesRegex("n", bot.button("One"));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Button").activate();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/UIThread.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/UIThread.java
new file mode 100644
index 0000000..b467514
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/UIThread.java
@@ -0,0 +1,12 @@
+package org.eclipse.swtbot.swt.finder;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface UIThread {
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Controls.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Controls.java
deleted file mode 100644
index f2591d6..0000000
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Controls.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.swtbot.swt.finder.alltests;
-
-import org.eclipse.swt.examples.addressbook.AddressBook;
-import org.eclipse.swt.examples.clipboard.ClipboardExample;
-import org.eclipse.swt.examples.controlexample.ControlExample;
-import org.eclipse.swt.examples.controlexample.CustomControlExample;
-import org.eclipse.swt.examples.dnd.DNDExample;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class Controls {
-
-	private static Controls		instance;
-	public CustomControlExample	customControlExample;
-	public Shell				customControlShell;
-	public ControlExample		controlExample;
-	public Display				display;
-	public Shell				controlShell;
-	public Thread				UIThread;
-	public AddressBook			menuExample;
-	public Shell				menuShell;
-	public ClipboardExample		clipboardExample;
-	public Shell				clipboardExampleShell;
-	public Shell				dndShell;
-	public DNDExample			dndExample;
-
-	public static Controls getInstance() {
-		if (instance == null) {
-			instance = new Controls();
-			try {
-				new Setup().initialize(instance);
-			} catch (Exception e) {
-				throw new RuntimeException("Could not create example controls.");
-			}
-		}
-		return instance;
-	}
-}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Setup.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Setup.java
deleted file mode 100644
index 5ad4de2..0000000
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/alltests/Setup.java
+++ /dev/null
@@ -1,170 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.swtbot.swt.finder.alltests;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.examples.addressbook.AddressBook;
-import org.eclipse.swt.examples.clipboard.ClipboardExample;
-import org.eclipse.swt.examples.controlexample.ControlExample;
-import org.eclipse.swt.examples.controlexample.CustomControlExample;
-import org.eclipse.swt.examples.dnd.DNDExample;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class Setup {
-
-	private Controls	controls;
-
-	public void setUp() throws Exception {
-		final boolean hasSetup[] = new boolean[] { false };
-
-		if (shouldRunInSeparateThread())
-			createUIThread(hasSetup);
-		else
-			_setup(hasSetup);
-		while (!hasSetup[0])
-			Thread.sleep(100);
-	}
-
-	/**
-	 * @param hasSetup
-	 */
-	private void createUIThread(final boolean[] hasSetup) {
-		if ((controls.UIThread == null) || !controls.UIThread.isAlive()) {
-			controls.UIThread = new Thread("UI Thread") {
-				public void run() {
-					_setup(hasSetup);
-					while ((controls.display != null) && !controls.display.isDisposed())
-						if (!controls.display.readAndDispatch())
-							controls.display.sleep();
-				}
-			};
-			controls.UIThread.start();
-		} else
-			hasSetup[0] = true;
-	}
-
-	/**
-	 * @param hasSetup
-	 */
-	private void _setup(final boolean[] hasSetup) {
-		createDisplay();
-		createShell();
-		createExample();
-		openShells();
-		hasSetup[0] = true;
-	}
-
-	protected void openShells() {
-		controls.controlShell.open();
-		controls.customControlShell.open();
-		controls.menuShell.open();
-		controls.dndShell.open();
-	}
-
-	protected boolean shouldRunInSeparateThread() {
-		return true;
-	}
-
-	/**
-	 * Subclasses may override to create a shell.
-	 */
-	protected void createShell() {
-		if ((controls.controlShell == null) || controls.controlShell.isDisposed()) {
-			controls.controlShell = new Shell(controls.display, SWT.SHELL_TRIM);
-			controls.controlShell.setLayout(new FillLayout());
-			controls.controlShell.setText(ControlExample.getResourceString("window.title"));
-		}
-
-		if ((controls.menuShell == null) || controls.menuShell.isDisposed()) {
-			controls.menuShell = new Shell(controls.display, SWT.SHELL_TRIM);
-			controls.menuShell.setLayout(new FillLayout());
-			controls.menuShell.setText("Address Book - Untitled");
-		}
-
-		if ((controls.customControlShell == null) || controls.customControlShell.isDisposed()) {
-			controls.customControlShell = new Shell(controls.display, SWT.SHELL_TRIM);
-			controls.customControlShell.setLayout(new FillLayout());
-			controls.customControlShell.setText(ControlExample.getResourceString("custom.window.title"));
-		}
-
-		if ((controls.clipboardExampleShell == null) || controls.clipboardExampleShell.isDisposed()) {
-			controls.clipboardExampleShell = new Shell(controls.display, SWT.SHELL_TRIM);
-			controls.clipboardExampleShell.setLayout(new FillLayout());
-			controls.clipboardExampleShell.setText(ControlExample.getResourceString("custom.window.title"));
-		}
-
-		if ((controls.dndShell == null) || controls.dndShell.isDisposed()) {
-			controls.dndShell = new Shell(controls.display, SWT.SHELL_TRIM);
-			controls.dndShell.setText("DND shell");
-			controls.dndShell.setLayout(new FillLayout());
-		}
-
-	}
-
-	/**
-	 * Subclasses may override to create a display.
-	 */
-	protected void createDisplay() {
-		if ((controls.display == null) || controls.display.isDisposed()) {
-			controls.display = Display.getDefault();
-			controls.controlShell = null;
-			controls.controlExample = null;
-		}
-	}
-
-	/**
-	 * Creates the standard {@link ControlExample} shell, subclasses may override.
-	 */
-	protected void createExample() {
-		if ((controls.controlExample == null) || controls.controlExample.getTabFolder().isDisposed()) {
-			controls.controlExample = new ControlExample(controls.controlShell);
-			ControlExample.setShellSize(controls.controlExample, controls.controlShell);
-		}
-
-		if ((controls.customControlExample == null) || controls.customControlExample.getTabFolder().isDisposed()) {
-			controls.customControlExample = new CustomControlExample(controls.customControlShell);
-			ControlExample.setShellSize(controls.customControlExample, controls.customControlShell);
-		}
-
-		if ((controls.menuExample == null) || controls.menuExample.table.isDisposed()) {
-			controls.menuExample = new AddressBook();
-			controls.menuExample.open(controls.menuShell);
-		}
-
-		if ((controls.clipboardExample == null) || controls.clipboardExample.copyRtfText.isDisposed()) {
-			controls.clipboardExample = new ClipboardExample();
-			controls.clipboardExample.open(controls.clipboardExampleShell);
-		}
-
-		if ((controls.dndExample == null) || controls.dndExample.defaultParent.isDisposed()) {
-			controls.dndExample = new DNDExample();
-			controls.dndExample.open(controls.dndShell);
-		}
-
-	}
-
-	/**
-	 * @param controls
-	 * @throws Exception
-	 */
-	public void initialize(Controls controls) throws Exception {
-		this.controls = controls;
-		setUp();
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/AbstractSWTTestCase.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/AbstractSWTTestCase.java
deleted file mode 100644
index bccafd9..0000000
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/AbstractSWTTestCase.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.finder.finders;
-
-import static org.hamcrest.Matchers.containsString;
-
-import org.apache.log4j.Logger;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.examples.addressbook.AddressBook;
-import org.eclipse.swt.examples.clipboard.ClipboardExample;
-import org.eclipse.swt.examples.controlexample.ControlExample;
-import org.eclipse.swt.examples.controlexample.CustomControlExample;
-import org.eclipse.swt.examples.dnd.DNDExample;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.alltests.Controls;
-import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
-import org.eclipse.swtbot.swt.finder.results.WidgetResult;
-import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
-import org.hamcrest.Description;
-import org.hamcrest.Matcher;
-import org.hamcrest.StringDescription;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.runner.RunWith;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-@RunWith(SWTBotJunit4ClassRunner.class)
-public abstract class AbstractSWTTestCase {
-
-	static {
-		// System.setProperty(LogFactory.DIAGNOSTICS_DEST_PROPERTY, "STDOUT");
-		System.setProperty("org.eclipse.swt.internal.carbon.smallFonts", "");
-		System.setProperty("org.eclipse.swtbot.keyboard.interval", "80");
-	}
-	public static final Display					display					= Controls.getInstance().display;
-	public static final Shell					controlShell			= Controls.getInstance().controlShell;
-	public static final ControlExample			controlExample			= Controls.getInstance().controlExample;
-
-	public static final Shell					menuShell				= Controls.getInstance().menuShell;
-	public static final AddressBook				menuExample				= Controls.getInstance().menuExample;
-
-	public static final Shell					customControlShell		= Controls.getInstance().customControlShell;
-	public static final CustomControlExample	customControlExample	= Controls.getInstance().customControlExample;
-
-	public static final Shell					clipboardExampleShell	= Controls.getInstance().clipboardExampleShell;
-	public static final ClipboardExample		clipboardExample		= Controls.getInstance().clipboardExample;
-
-	public static final Shell					dndShell				= Controls.getInstance().dndShell;
-	public static final DNDExample				dndExample				= Controls.getInstance().dndExample;
-
-	public static final Thread					UIThread				= Controls.getInstance().UIThread;
-
-	protected final Logger						log;
-	protected SWTBot							bot;
-
-	public AbstractSWTTestCase() {
-		super();
-		log = Logger.getLogger(getClass());
-	}
-
-	@Before
-	public void setUp() throws Exception {
-		bot = new SWTBot();
-		// log.debug(MessageFormat.format("Executing test: {0}#{1}", getClass(), getName()));
-		log.debug(MessageFormat.format("Activating shell: {0}", SWTUtils.toString(getFocusShell())));
-		SWTBotShell shell = new SWTBotShell(getFocusShell());
-		shell.activate();
-		shell.setFocus();
-		//
-		// display.syncExec(new Runnable() {
-		// public void run() {
-		// new SWTBot
-		// getFocusShell().setActive();
-		// }
-		// });
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		// log.debug(MessageFormat.format("Finished executing test: {0}#{1}", getClass(), getName()));
-	}
-
-	protected Shell getFocusShell() {
-		return controlShell;
-	}
-
-	protected static boolean contains(String needle, String hayStack) {
-		return (hayStack.indexOf(needle) >= 0);
-	}
-
-	protected Shell createShell(final String text) {
-		return UIThreadRunnable.syncExec(new WidgetResult<Shell>() {
-			public Shell run() {
-				Shell shell = new Shell(display);
-				shell.setText(text);
-				shell.setLayout(new GridLayout(1, false));
-				shell.open();
-				return shell;
-			}
-		});
-	}
-
-	protected Table createTable(final Shell shell) {
-		return UIThreadRunnable.syncExec(new WidgetResult<Table>() {
-			public Table run() {
-				Table table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION);
-				table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-				table.setLinesVisible(true);
-				table.setHeaderVisible(true);
-
-				for (int i = 0; i < table.getColumnCount(); i++) {
-					table.getColumn(i).pack();
-				}
-				shell.layout(true);
-				return table;
-			}
-		});
-	}
-
-	protected void assertEventMatches(final SWTBotText listeners, String expected) {
-		expected = expected.replaceAll("time=-?\\d+", "time=SOME_TIME_AGO").replaceAll("x=\\d+", "x=X_CO_ORDINATE").replaceAll("y=\\d+", "y=Y_CO_ORDINATE");
-		final Matcher<String> matcher = containsString(expected);
-		bot.waitUntil(new DefaultCondition() {
-
-			private String	text;
-
-			public boolean test() throws Exception {
-				text = listeners.getText();
-				String listenersText = text.replaceAll("time=-?\\d+", "time=SOME_TIME_AGO").replaceAll("x=\\d+", "x=X_CO_ORDINATE").replaceAll("y=\\d+", "y=Y_CO_ORDINATE");
-				return matcher.matches(listenersText);
-			}
-
-			public String getFailureMessage() {
-				Description description = new StringDescription();
-				description.appendText("\nExpected:\n").appendDescriptionOf(matcher).appendText("\ngot:\n").appendValue(text).appendText("\n");
-				return description.toString();
-			}
-		});
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ChildrenControlFinderTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ChildrenControlFinderTest.java
index e71f3eb..4bb2db5 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ChildrenControlFinderTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ChildrenControlFinderTest.java
@@ -25,14 +25,16 @@
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.hamcrest.Matcher;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Cedric Chabanois &lt;cchabanois [at] no-log [dot] org&gt;
  * @version $Id$
  */
-public class ChildrenControlFinderTest extends AbstractSWTTestCase {
+public class ChildrenControlFinderTest extends AbstractControlExampleTest {
 
 	@SuppressWarnings("unchecked")
 	// varargs and generics doesn't mix well!
@@ -85,8 +87,8 @@
 		});
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		new SWTBot().tabItem("Button").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinder2Test.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinder2Test.java
index f0cc07c..1637773 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinder2Test.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinder2Test.java
@@ -18,10 +18,10 @@
 import java.util.List;
 
 import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.TabFolder;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TreePath;
 import org.hamcrest.Matcher;
 import org.junit.Test;
@@ -30,14 +30,12 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class ControlFinder2Test extends AbstractSWTTestCase {
-
-	private ControlFinder	finder;
+public class ControlFinder2Test extends AbstractCustomControlExampleTest {
 
 	@Test
 	public void findsAllTabItem() throws Exception {
 		selectCTabFolder();
-		List<CTabItem> tabItems = finder.findControls(widgetOfType(CTabItem.class));
+		List<CTabItem> tabItems = controlFinder.findControls(widgetOfType(CTabItem.class));
 		assertEquals(3, tabItems.size());
 	}
 
@@ -47,28 +45,19 @@
 	public void getsControlPath() throws Exception {
 		selectCTabFolder();
 		Matcher<CTabItem> withText = withText("CTabItem 1");
-		List<CTabItem> labels = finder.findControls(allOf(widgetOfType(CTabItem.class), withText));
+		List<CTabItem> labels = controlFinder.findControls(allOf(widgetOfType(CTabItem.class), withText));
 		Widget w = labels.get(0);
-		TreePath path = finder.getPath(w);
+		TreePath path = controlFinder.getPath(w);
 		assertEquals(8, path.getSegmentCount());
 	}
 
 	private void selectCTabFolder() {
 		UIThreadRunnable.syncExec(display, new VoidResult() {
 			public void run() {
-				List<TabFolder> findControls = finder.findControls(widgetOfType(TabFolder.class));
+				List<TabFolder> findControls = controlFinder.findControls(widgetOfType(TabFolder.class));
 				TabFolder folder = findControls.get(0);
 				folder.setSelection(2);
 			}
 		});
 	}
-
-	public void setUp() throws Exception {
-		super.setUp();
-		finder = new ControlFinder();
-	}
-
-	protected Shell getFocusShell() {
-		return customControlShell;
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinderTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinderTest.java
index f896731..e09af5f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinderTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/ControlFinderTest.java
@@ -27,39 +27,38 @@
 import org.eclipse.swt.widgets.TabItem;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TreePath;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTabItem;
 import org.hamcrest.Matcher;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class ControlFinderTest extends AbstractSWTTestCase {
-
-	private ControlFinder	finder;
+public class ControlFinderTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsAGroup() throws Exception {
-		final List<Group> frames = finder.findControls(widgetOfType(Group.class));
+		final List<Group> frames = controlFinder.findControls(widgetOfType(Group.class));
 		assertEquals(12, frames.size());
 		assertText("Image Buttons", frames.get(2));
 	}
 
 	@Test
 	public void findsAllTabItem() throws Exception {
-		List<TabItem> tabItems = finder.findControls(widgetOfType(TabItem.class));
+		List<TabItem> tabItems = controlFinder.findControls(widgetOfType(TabItem.class));
 		assertEquals(24, tabItems.size());
 	}
 
 	@Test
 	public void findsAShell() throws Exception {
-		List<Shell> shells = finder.findShells("SWT Controls");
+		List<Shell> shells = controlFinder.findShells("SWT Controls");
 		assertFalse(shells.isEmpty());
 		assertEquals(1, shells.size());
-		assertEquals(controlShell, shells.get(0));
+		assertEquals(shell, shells.get(0));
 	}
 
 	@SuppressWarnings("unchecked")
@@ -67,11 +66,11 @@
 	@Test
 	public void findsATabItem() throws Exception {
 		Matcher<TabItem> withText = withText("Dialog");
-		List<TabItem> tabItems = finder.findControls(allOf(widgetOfType(TabItem.class), withText));
+		List<TabItem> tabItems = controlFinder.findControls(allOf(widgetOfType(TabItem.class), withText));
 		final TabItem items[] = new TabItem[] { null };
 		display.syncExec(new Runnable() {
 			public void run() {
-				items[0] = ((TabFolder) controlShell.getChildren()[0]).getItems()[5];
+				items[0] = ((TabFolder) shell.getChildren()[0]).getItems()[5];
 			}
 		});
 
@@ -81,7 +80,7 @@
 
 	@Test
 	public void findsText() throws Exception {
-		List<Text> textBoxes = finder.findControls(widgetOfType(Text.class));
+		List<Text> textBoxes = controlFinder.findControls(widgetOfType(Text.class));
 		assertEquals(1, textBoxes.size());
 	}
 
@@ -90,7 +89,7 @@
 	@Test
 	public void findsTwoButtons() throws Exception {
 		Matcher<Button> withText = withText("One");
-		final List<Button> buttons = finder.findControls(allOf(widgetOfType(Button.class), withText));
+		final List<Button> buttons = controlFinder.findControls(allOf(widgetOfType(Button.class), withText));
 		assertEquals(2, buttons.size());
 		assertText("One", buttons.get(0));
 		assertText("One", buttons.get(1));
@@ -101,9 +100,9 @@
 	@Test
 	public void getsControlPath() throws Exception {
 		Matcher<Button> withText = withText("One");
-		List<Button> labels = finder.findControls(allOf(widgetOfType(Button.class), withText));
+		List<Button> labels = controlFinder.findControls(allOf(widgetOfType(Button.class), withText));
 		Widget w = labels.get(0);
-		TreePath path = finder.getPath(w);
+		TreePath path = controlFinder.getPath(w);
 		assertEquals(7, path.getSegmentCount());
 	}
 
@@ -112,8 +111,8 @@
 	@Test
 	public void getsControlPathToTabItem() throws Exception {
 		Matcher<TabItem> withText = withText("Dialog");
-		List<TabItem> tabItems = finder.findControls(allOf(widgetOfType(TabItem.class), withText));
-		TreePath path = finder.getPath(tabItems.get(0));
+		List<TabItem> tabItems = controlFinder.findControls(allOf(widgetOfType(TabItem.class), withText));
+		TreePath path = controlFinder.getPath(tabItems.get(0));
 		assertEquals(3, path.getSegmentCount());
 	}
 
@@ -122,25 +121,24 @@
 	@Test
 	public void getsOnlyVisibleControls() throws Exception {
 		// use the default tab
-		List<Text> textBoxesOnButtonTab = finder.findControls(widgetOfType(Text.class));
+		List<Text> textBoxesOnButtonTab = controlFinder.findControls(widgetOfType(Text.class));
 		assertEquals(1, textBoxesOnButtonTab.size());
 		assertText("", textBoxesOnButtonTab.get(0));
 
 		// switch to another tab
 		Matcher<TabItem> withText = withText("Text");
-		List<TabItem> tabItems = finder.findControls(allOf(widgetOfType(TabItem.class), withText));
+		List<TabItem> tabItems = controlFinder.findControls(allOf(widgetOfType(TabItem.class), withText));
 		new SWTBotTabItem(tabItems.get(0)).activate();
 
 		// should get different tabs this time
-		List<Text> textBoxesOnTextTab = finder.findControls(widgetOfType(Text.class));
+		List<Text> textBoxesOnTextTab = controlFinder.findControls(widgetOfType(Text.class));
 		assertEquals(2, textBoxesOnTextTab.size());
 		assertNotSameWidget(textBoxesOnButtonTab.get(0), textBoxesOnTextTab.get(0));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		finder = new ControlFinder();
-		new SWTBot().tabItem("Button").activate();
+	@Before
+	public void prepareExample() throws Exception {
+		bot.tabItem("Button").activate();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/MenuFinderTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/MenuFinderTest.java
index 7fffe33..dfb1a88 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/MenuFinderTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/MenuFinderTest.java
@@ -21,7 +21,7 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTException;
 import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swtbot.swt.finder.AbstractMenuExampleTest;
+import org.eclipse.swtbot.swt.finder.test.AbstractMenuExampleTest;
 import org.junit.Test;
 
 /**
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/PathGeneratorTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/PathGeneratorTest.java
index 819fd83..abc90b8 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/PathGeneratorTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/finders/PathGeneratorTest.java
@@ -19,6 +19,7 @@
 
 import org.eclipse.swt.widgets.TabItem;
 import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TreePath;
 import org.hamcrest.Matcher;
 import org.junit.Test;
@@ -27,16 +28,13 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class PathGeneratorTest extends AbstractSWTTestCase {
+public class PathGeneratorTest extends AbstractControlExampleTest {
 
-	private ControlFinder	finder;
-
-	@SuppressWarnings("unchecked")
-	// varargs and generics doesn't mix well!
 	@Test
+	@SuppressWarnings("unchecked")
 	public void generatesStringFromPath() throws Exception {
 		Matcher<TabItem> withText = withText("Dialog");
-		List<TabItem> tabItems = finder.findControls(allOf(widgetOfType(TabItem.class), withText));
+		List<TabItem> tabItems = controlFinder.findControls(allOf(widgetOfType(TabItem.class), withText));
 		Widget widget = tabItems.get(0);
 		String string = new PathGenerator().getPathAsString(widget);
 		assertEquals("//Shell/-1//TabFolder/0//TabItem/5", string);
@@ -48,20 +46,15 @@
 		assertEquals(null, path);
 	}
 
-	@SuppressWarnings("unchecked")
-	// varargs and generics doesn't mix well!
 	@Test
+	@SuppressWarnings("unchecked")
 	public void getsPathFromString() throws Exception {
 		TreePath path = new PathGenerator().getPathFromString("//Shell/0//TabFolder/0//TabItem/5", display);
 		Matcher<TabItem> withText = withText("Dialog");
-		List<TabItem> tabItems = finder.findControls(allOf(widgetOfType(TabItem.class), withText));
-		TreePath expected = finder.getPath(tabItems.get(0));
+		List<TabItem> tabItems = controlFinder.findControls(allOf(widgetOfType(TabItem.class), withText));
+		TreePath expected = controlFinder.getPath(tabItems.get(0));
 
 		assertEquals(expected, path);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		finder = new ControlFinder();
-	}
-}
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardTest.java
index 4a7d293..d96b911 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardTest.java
@@ -13,11 +13,13 @@
 import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
+@Ignore
 public class AWTKeyboardTest extends AbstractKeyboardTest {
 
 	@BeforeClass
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
index a6fb215..aa3921a 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/AbstractKeyboardTest.java
@@ -10,19 +10,20 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.keyboard;
 
+import static org.eclipse.swtbot.swt.finder.utils.SWTUtils.isMac;
+
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public abstract class AbstractKeyboardTest extends AbstractSWTTestCase {
+public abstract class AbstractKeyboardTest extends AbstractCustomControlExampleTest {
 
 	private SWTBotStyledText styledText;
 	private SWTBotText listeners;
@@ -328,9 +329,8 @@
 		assertEventMatches(listeners, "KeyUp [2]: KeyEvent{StyledText {} time=17901071 data=null character='\\0' keyCode=65536 stateMask=65536 doit=true}");
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		keyboard = new Keyboard();
 		bot.tabItem("StyledText").activate();
 		bot.checkBox("Horizontal Fill").select();
@@ -343,15 +343,6 @@
 		listeners = bot.textInGroup("Listeners");
 	}
 
-	protected Shell getFocusShell() {
-		return customControlShell;
-	}
-
-	private static boolean isMac() {
-		String swtPlatform = SWT.getPlatform();
-		return ("carbon".equals(swtPlatform) || "cocoa".equals(swtPlatform));
-	}
-
 	private static boolean isWin32() {
 		String swtPlatform = SWT.getPlatform();
 		return ("win32".equals(swtPlatform));
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactoryTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactoryTest.java
index acfdf59..059cb18 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactoryTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactoryTest.java
@@ -12,14 +12,15 @@
 
 import static org.junit.Assert.assertEquals;
 
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class KeyboardFactoryTest extends AbstractSWTTestCase {
+public class KeyboardFactoryTest extends AbstractSWTShellTest {
 
 	@Test
 	public void createsKeyboardForAWTKeyboardStrategy() throws Exception {
@@ -33,7 +34,12 @@
 
 	@Test
 	public void createsKeyboardForMockKeyboardStrategy() throws Exception {
-		assertEquals(MockKeyboardStrategy.class, new KeyboardFactory(MockKeyboardStrategy.class.getName()).strategyClass);
+		assertEquals(MockKeyboardStrategy.class, new KeyboardFactory(MockKeyboardStrategy.class).strategyClass);
+	}
+
+	@Override
+	protected void createUI(Composite parent) {
+		
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardTest.java
index f26207a..47844cb 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardTest.java
@@ -13,11 +13,13 @@
 import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
+@Ignore
 public class SWTKeyboardTest extends AbstractKeyboardTest {
 
 	@BeforeClass
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AllOfTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AllOfTest.java
new file mode 100644
index 0000000..aee90ab
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AllOfTest.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ *
+ */
+public class AllOfTest {
+	@Test
+	public void testShouldAnswerTrueIfAllMatcherMatches() throws Exception {
+		MyMatcher matcher1 = new MyMatcher(true);
+		MyMatcher matcher2 = new MyMatcher(true);
+		assertTrue(allOf(matcher1, matcher2).matches(null));
+		assertTrue(matcher1.matched);
+		assertTrue(matcher2.matched);
+	}
+
+	@Test
+	public void testShouldAnswerFalseIfAnyMatchersDoesNotMatch() throws Exception {
+		MyMatcher matcher1 = new MyMatcher(true);
+		MyMatcher matcher2 = new MyMatcher(false);
+		assertFalse(allOf(matcher1, matcher2).matches(null));
+		assertTrue(matcher1.matched);
+		assertTrue(matcher2.matched);
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AnyOfTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AnyOfTest.java
new file mode 100644
index 0000000..7e21b69
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/AnyOfTest.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.anyOf;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public class AnyOfTest {
+
+	@Test
+	public void testShouldAnswerTrueIfAnyMatcherMatches() throws Exception {
+		MyMatcher matcher1 = new MyMatcher(true);
+		MyMatcher matcher2 = new MyMatcher(false);
+		assertTrue(anyOf(matcher1, matcher2).matches(null));
+		assertTrue(matcher1.matched);
+		assertFalse(matcher2.matched);
+	}
+
+	@Test
+	public void testShouldAnswerFalseIfNoMatchersMatche() throws Exception {
+		MyMatcher matcher1 = new MyMatcher(false);
+		MyMatcher matcher2 = new MyMatcher(false);
+		assertFalse(anyOf(matcher1, matcher2).matches(null));
+		assertTrue(matcher1.matched);
+		assertTrue(matcher2.matched);
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MessageMatcherTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MessageMatcherTest.java
new file mode 100644
index 0000000..ca605dd
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MessageMatcherTest.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMessage;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.hamcrest.Matcher;
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public class MessageMatcherTest {
+
+	@Test
+	public void doesNotMatchObjectsWithNoGetMessageMethod() throws Exception {
+		Matcher matcher = withMessage("Some Text");
+		assertFalse(matcher.matches(new Object()));
+	}
+
+	@Test
+	public void doesNotMatchObjectsWithNullGetMessage() throws Exception {
+		Matcher matcher = withMessage("Some Text");
+		assertFalse(matcher.matches(new ObjectWithGetMessage(null)));
+	}
+
+	@Test
+	public void doesNotMatchMessage() throws Exception {
+		Matcher matcher = withMessage("Some Text");
+		assertFalse(matcher.matches(new ObjectWithGetMessage("Some Other Text")));
+	}
+
+	@Test
+	public void matchMessage() throws Exception {
+		Matcher matcher = withMessage("Some Text");
+		assertTrue(matcher.matches(new ObjectWithGetMessage("Some Text")));
+	}
+
+
+	@Test
+	public void getsToString() throws Exception {
+		Matcher matcher = withMessage("Some Text");
+		assertEquals("with message 'Some Text'", matcher.toString());
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MyMatcher.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MyMatcher.java
new file mode 100644
index 0000000..e750d14
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/MyMatcher.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import org.hamcrest.Description;
+
+final class MyMatcher<T> extends AbstractMatcher<T> {
+
+	private final boolean	toAnswer;
+	boolean					matched;
+
+	public MyMatcher(boolean toAnswer) {
+		this.toAnswer = toAnswer;
+	}
+
+	public void describeTo(Description description) {
+
+	}
+
+	@Override
+	protected boolean doMatch(Object item) {
+		this.matched = true;
+		return toAnswer;
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/ObjectWithGetMessage.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/ObjectWithGetMessage.java
new file mode 100644
index 0000000..f7f2194
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/ObjectWithGetMessage.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Brock Janiczak - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+public class ObjectWithGetMessage {
+	private final String	message;
+
+	/**
+	 * @param message
+	 */
+	public ObjectWithGetMessage(String message) {
+		this.message = message;
+	}
+
+	public String getMessage() {
+		return message;
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/TextLabelMatcherTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/TextLabelMatcherTest.java
index 26cb758..5c6dd32 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/TextLabelMatcherTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/TextLabelMatcherTest.java
@@ -13,26 +13,18 @@
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withLabel;
 import static org.junit.Assert.assertEquals;
 
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class TextLabelMatcherTest extends AbstractSWTTestCase {
+public class TextLabelMatcherTest extends AbstractControlExampleTest{
 
 	@Test
 	public void getsToString() throws Exception {
 		assertEquals("with label (with mnemonic 'SomeLabel')", withLabel("SomeLabel").toString());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-	}
-
-	protected Shell getFocusShell() {
-		return clipboardExampleShell;
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactoryTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactoryTest.java
index 97627c2..00bed48 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactoryTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactoryTest.java
@@ -26,53 +26,49 @@
 
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractClipboardExampleTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class WidgetMatcherFactoryTest extends AbstractSWTTestCase {
-
-	private ControlFinder	controlFinder;
+public class WidgetMatcherFactoryTest extends AbstractClipboardExampleTest {
 
 	@Test
 	public void matchesControlsWithLabel() throws Exception {
-		List findControls = controlFinder.findControls(withLabel("TextTransfer:"));
+		List findControls = finder.findControls(withLabel("TextTransfer:", finder));
 		assertText("some\n" + "plain\n" + "text", (Widget) findControls.get(0));
 		assertText("Copy", (Widget) findControls.get(1));
 	}
 
 	@Test
 	public void matchesControlsWithRegex() throws Exception {
-		List findControls = controlFinder.findControls(withRegex(".*Transfer.*"));
+		List findControls = finder.findControls(withRegex(".*Transfer.*"));
 		assertThat(findControls.size(), is(8));
 	}
 
 	@Test
 	public void matchesControlsWithText() throws Exception {
-		List findControls = controlFinder.findControls(withText("some\n" + "plain\n" + "text"));
+		List findControls = finder.findControls(withText("some\n" + "plain\n" + "text"));
 		assertThat(findControls.size(), is(1));
 		assertThat(findControls.get(0), is(Text.class));
 	}
 
 	@Test
 	public void matchesControlsWithTextIgnoringCase() throws Exception {
-		List findControls = controlFinder.findControls(withTextIgnoringCase("SOME\n" + "plain\n" + "TeXt"));
+		List findControls = finder.findControls(withTextIgnoringCase("SOME\n" + "plain\n" + "TeXt"));
 		assertThat(findControls.size(), is(1));
 		assertThat(findControls.get(0), is(Text.class));
 	}
 
 	@Test
 	public void matchesControlsInGroup() throws Exception {
-		List findControls = controlFinder.findControls(inGroup("Paste To:"));
+		List findControls = finder.findControls(inGroup("Paste To:"));
 		assertThat(findControls.size(), is(12));
 		assertThat(findControls.get(0), is(Label.class));
 		assertThat(findControls.get(1), is(Text.class));
@@ -82,7 +78,7 @@
 
 	@Test
 	public void findsControlsById() throws Exception {
-		final Text text = (Text) bot.widget(allOf(withLabel("TextTransfer:"), inGroup("Copy From:")));
+		final Text text = (Text) bot.widget(allOf(withLabel("TextTransfer:", finder), inGroup("Copy From:")));
 		UIThreadRunnable.syncExec(new VoidResult() {
 			public void run() {
 				text.setData("foo-text", "bar");
@@ -91,13 +87,4 @@
 		assertSameWidget(text, bot.widget(withId("foo-text", "bar")));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		controlFinder = new ControlFinder();
-	}
-
-	protected Shell getFocusShell() {
-		return clipboardExampleShell;
-	}
-
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WithItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WithItemTest.java
new file mode 100644
index 0000000..1c1ff76
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/matchers/WithItemTest.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText;
+import static org.junit.Assert.assertEquals;
+
+import org.eclipse.swt.widgets.Item;
+import org.hamcrest.StringDescription;
+import org.junit.Test;
+
+public class WithItemTest {
+
+	@Test
+	public void testDescription() throws Exception {
+		WithItem<Item> withItem = WithItem.withItem(withText("foo"));
+		assertEquals("with item matching (with text 'foo')", StringDescription.toString(withItem));
+
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractBrowserExampleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractBrowserExampleTest.java
new file mode 100644
index 0000000..4592481
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractBrowserExampleTest.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import org.eclipse.swt.examples.browserexample.BrowserExample;
+import org.eclipse.swt.examples.controlexample.ControlExample;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public abstract class AbstractBrowserExampleTest extends AbstractSWTShellTest {
+
+	protected ControlExample	controlExample;
+
+	@Override
+	protected final void createUI(Composite parent) {
+		shell.setText("Browser Shell");
+		new BrowserExample(parent, false);
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractClipboardExampleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractClipboardExampleTest.java
new file mode 100644
index 0000000..82e0ea7
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractClipboardExampleTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import org.eclipse.swt.examples.clipboard.ClipboardExample;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public abstract class AbstractClipboardExampleTest extends AbstractSWTShellTest {
+
+	protected ClipboardExample	example;
+
+	@Override
+	protected final void createUI(Composite parent) {
+		example = new ClipboardExample();
+		example.open(shell);
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractControlExampleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractControlExampleTest.java
new file mode 100644
index 0000000..cfeeba1
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractControlExampleTest.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import org.eclipse.swt.examples.controlexample.ControlExample;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public abstract class AbstractControlExampleTest extends AbstractSWTShellTest {
+
+	protected ControlExample	controlExample;
+
+	@Override
+	protected final void createUI(Composite parent) {
+		shell.setText(ControlExample.getResourceString("window.title"));
+		controlExample = new ControlExample(parent);
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractCustomControlExampleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractCustomControlExampleTest.java
new file mode 100644
index 0000000..9851dd4
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractCustomControlExampleTest.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import org.eclipse.swt.examples.controlexample.ControlExample;
+import org.eclipse.swt.examples.controlexample.CustomControlExample;
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public abstract class AbstractCustomControlExampleTest extends AbstractSWTShellTest {
+
+	@Override
+	protected final void createUI(Composite parent) {
+		shell.setText(ControlExample.getResourceString("custom.window.title"));
+		new CustomControlExample(shell);
+	}
+	
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/AbstractMenuExampleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractMenuExampleTest.java
similarity index 62%
rename from org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/AbstractMenuExampleTest.java
rename to org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractMenuExampleTest.java
index cfa72c6..ad05a2d 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/AbstractMenuExampleTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractMenuExampleTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2010 Ketan Padegaonkar 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
@@ -8,33 +8,32 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *******************************************************************************/
-package org.eclipse.swtbot.swt.finder;
+package org.eclipse.swtbot.swt.finder.test;
 
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swt.examples.addressbook.AddressBook;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
+import org.junit.Before;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public abstract class AbstractMenuExampleTest extends AbstractSWTTestCase {
+public abstract class AbstractMenuExampleTest extends AbstractSWTShellTest {
 
-	protected MenuFinder	menuFinder;
+	protected MenuFinder menuFinder;
+	protected AddressBook addressBook;
 
-	/**
-	 * 
-	 */
-	public AbstractMenuExampleTest() {
-		super();
-	}
-
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
 		menuFinder = new MenuFinder();
 	}
 
-	protected Shell getFocusShell() {
-		return menuShell;
-	};
-}
+	@Override
+	protected void createUI(Composite parent) {
+		shell.setText("Address Book - Untitled");
+		addressBook = new AddressBook();
+		addressBook.open(shell);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTShellTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTShellTest.java
new file mode 100644
index 0000000..a904416
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTShellTest.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import static org.hamcrest.Matchers.containsString;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swtbot.swt.finder.UIThread;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.StringDescription;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public abstract class AbstractSWTShellTest extends AbstractSWTTest {
+
+	protected static final String SHELL_TEXT = "Test shell";
+	protected Display display;
+	protected Shell shell;
+
+	@UIThread
+	public final void runUIThread() {
+		display = Display.getDefault();
+
+		shell = new Shell(display, SWT.SHELL_TRIM);
+		shell.setLayout(new FillLayout());
+		shell.setText(SHELL_TEXT);
+
+		createUI(shell);
+		shell.open();
+	}
+
+	protected abstract void createUI(Composite parent);
+
+	//TODO: move into some Assert class
+	protected void assertEventMatches(final SWTBotText listeners, String expected) {
+		expected = expected.replaceAll("time=-?\\d+", "time=SOME_TIME_AGO").replaceAll("x=\\d+", "x=X_CO_ORDINATE").replaceAll("y=\\d+", "y=Y_CO_ORDINATE");
+		final Matcher<String> matcher = containsString(expected);
+		bot.waitUntil(new DefaultCondition() {
+
+			private String	text;
+
+			public boolean test() throws Exception {
+				text = listeners.getText();
+				// keyLocation was added in 3.6, we don't care about it for the tests
+				String listenersText = text.replaceAll("time=-?\\d+", "time=SOME_TIME_AGO").replaceAll("x=\\d+", "x=X_CO_ORDINATE").replaceAll("y=\\d+", "y=Y_CO_ORDINATE").replaceAll("keyLocation=\\d+ ", "");
+				return matcher.matches(listenersText);
+			}
+
+			public String getFailureMessage() {
+				Description description = new StringDescription();
+				description.appendText("\nExpected:\n").appendDescriptionOf(matcher).appendText("\ngot:\n").appendValue(text).appendText("\n");
+				return description.toString();
+			}
+		});
+	}
+
+
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTTest.java
new file mode 100644
index 0000000..2c7ddfd
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/test/AbstractSWTTest.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2010,2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.test;
+
+import org.apache.log4j.Logger;
+import org.eclipse.swtbot.swt.finder.RunUIThreadRule;
+import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.finders.Finder;
+import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
+import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.MethodRule;
+import org.junit.runner.RunWith;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
+
+/**
+ *
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+@RunWith(SWTBotJunit4ClassRunner.class)
+public abstract class AbstractSWTTest {
+
+	static {
+		java.lang.System.setProperty("org.eclipse.swt.internal.carbon.smallFonts", "");
+	}
+
+	protected final Logger	log	= Logger.getLogger(getClass());
+	protected SWTBot		bot;
+	protected ControlFinder	controlFinder;
+	protected Finder		finder;
+	protected MenuFinder	menuFinder;
+
+	@Rule
+	public MethodRule runner = new MethodRule(){
+		public Statement apply(Statement base, FrameworkMethod method, Object target) {
+			return new RunUIThreadRule(target).apply(base, method, target);
+		}
+	};
+
+	@Before
+	public final void setupSWTBot() {
+		bot = new SWTBot();
+		controlFinder = new ControlFinder();
+		menuFinder = new MenuFinder();
+		finder = new Finder(controlFinder, menuFinder);
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/ClassUtilsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/ClassUtilsTest.java
index a751553..44893c1 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/ClassUtilsTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/ClassUtilsTest.java
@@ -30,6 +30,11 @@
 		assertEquals("ClassUtilsTest", ClassUtils.simpleClassName(this));
 		assertEquals("ClassUtilsTest$MyClass", ClassUtils.simpleClassName(MyClass.class));
 		assertEquals("ClassUtilsTest$MyClass", ClassUtils.simpleClassName(new MyClass()));
+		assertEquals("FooClass", ClassUtils.simpleClassName("com.example.FooClass"));
+		assertEquals("FooClass$InnerClass", ClassUtils.simpleClassName("com.example.FooClass$InnerClass"));
 		assertEquals("", ClassUtils.simpleClassName((Object) null));
+		assertEquals("", ClassUtils.simpleClassName(""));
+		assertEquals("", ClassUtils.simpleClassName((Class) null));
 	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/CredentialsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/CredentialsTest.java
new file mode 100644
index 0000000..7826ea8
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/CredentialsTest.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.utils;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class CredentialsTest extends TestCase {
+
+	@Test
+	public void testEquals() {
+		assertEquals(new Credentials(null, null), new Credentials(null, null));
+		assertEquals(new Credentials("foo", null), new Credentials("foo", null));
+		assertEquals(new Credentials(null, "foo"), new Credentials(null, "foo"));
+		assertEquals(new Credentials("foo", "bar"), new Credentials("foo", "bar"));
+
+		assertFalse(new Credentials("foo", null).equals(new Credentials("foo", "bar")));
+		assertFalse(new Credentials(null, "bar").equals(new Credentials("foo", "bar")));
+	}
+
+	@Test
+	public void testHashCode() {
+		assertEquals(new Credentials(null, null).hashCode(), new Credentials(null, null).hashCode());
+		assertEquals(new Credentials("foo", null).hashCode(), new Credentials("foo", null).hashCode());
+		assertEquals(new Credentials(null, "foo").hashCode(), new Credentials(null, "foo").hashCode());
+		assertEquals(new Credentials("foo", "bar").hashCode(), new Credentials("foo", "bar").hashCode());
+
+		assertFalse(new Credentials("foo", null).hashCode() == new Credentials("foo", "bar").hashCode());
+		assertFalse(new Credentials(null, "bar").hashCode() == new Credentials("foo", "bar").hashCode());
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/FileUtilsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/FileUtilsTest.java
new file mode 100644
index 0000000..06adc2d
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/FileUtilsTest.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.utils;
+
+import static org.eclipse.swtbot.swt.finder.SWTBotAssert.assertContains;
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+
+import org.junit.AfterClass;
+import org.junit.Test;
+
+public class FileUtilsTest {
+
+	private static final File	FILE	= new File("somefile.txt");
+
+	@Test
+	public void canWriteToAFile() throws Exception {
+		FileUtils.write("some text", FILE);
+		String read = FileUtils.read(FILE.toURL());
+		assertEquals("some text", read);
+	}
+
+	@Test
+	public void canReadFromFile() throws Exception {
+		String read = FileUtils.read("somefile.txt");
+		assertContains("some text", read);
+	}
+
+	@Test
+	public void canReadFromURL() throws Exception {
+		String read = FileUtils.read(FILE.toURL());
+		assertContains("some text", read);
+	}
+
+	@AfterClass
+	public static void cleanup() {
+		File file = FILE;
+		if (file.exists())
+			file.delete();
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMapTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMapTest.java
index ef948ed..5ea2446 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMapTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMapTest.java
@@ -13,7 +13,7 @@
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasItems;
-import static org.hamcrest.Matchers.nullValue;
+import static org.hamcrest.Matchers.is;
 
 import org.junit.Test;
 
@@ -27,7 +27,7 @@
 
 	@Test
 	public void mapsMultipleValuesToAKey() throws Exception {
-		assertThat(map.getCollection("key"), nullValue());
+		assertThat(map.getCollection("key").size(), is(0));
 		map.put("key", "value1");
 		assertThat(map.getCollection("key"), hasItems("value1"));
 		map.put("key", "value2");
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/PositionTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/PositionTest.java
index 357dc09..86bb49e 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/PositionTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/PositionTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008-2010 Ketan Padegaonkar 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
@@ -33,7 +33,17 @@
 		assertFalse(position.equals(""));
 	}
 
+	@Test
+	public void equalsAndHashCodeNegative() throws Exception {
+		assertFalse(new Position(1, 10).equals(new Position(2, 10)));
+		assertFalse(new Position(1, 10).equals(new Position(1, 20)));
+
+		assertFalse(new Position(1, 10).hashCode() == new Position(2, 10).hashCode());
+		assertFalse(new Position(1, 10).hashCode() == new Position(1, 20).hashCode());
+	}
+
 	private Position position() {
 		return new Position(1, 10);
 	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/SWTUtilsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/SWTUtilsTest.java
index 960a9b8..d8ee4c1 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/SWTUtilsTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/SWTUtilsTest.java
@@ -11,21 +11,25 @@
 package org.eclipse.swtbot.swt.finder.utils;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
 
+import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTUtilsTest extends AbstractSWTTestCase {
+public class SWTUtilsTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsRightIndexOfControlInParentWithNoParent() throws Exception {
-		assertEquals(-1, SWTUtils.widgetIndex(controlShell));
+		assertEquals(-1, SWTUtils.widgetIndex(shell));
 	}
 
 	@Test
@@ -52,10 +56,25 @@
 	}
 
 	@Test
+	public void getsCorrectStyle() throws Exception {
+		assertTrue(SWTUtils.hasStyle(bot.button("One").widget, SWT.PUSH));
+		assertTrue(SWTUtils.hasStyle(bot.radio("SWT.RADIO").widget, SWT.RADIO));
+		assertTrue(SWTUtils.hasStyle(bot.checkBox("SWT.FLAT").widget, SWT.CHECK));
+
+		assertTrue(SWTUtils.hasStyle(bot.checkBox("SWT.FLAT").widget, SWT.NONE));
+		assertFalse(SWTUtils.hasStyle(null, SWT.CHECK));
+	}
+
+	@Test
 	public void previousWidgetOnFirstWidget() throws Exception {
 		assertSame(null, SWTUtils.previousWidget(getChildren()[0]));
 	}
 
+	@Before
+	public void prepareExample() throws Exception {
+		bot.tabItem("Button").activate();
+	}
+
 	@Test
 	public void getsToString() throws Exception {
 		assertEquals("TabFolder {}", SWTUtils.toString(controlExample.getTabFolder()));
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/TreePathTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/TreePathTest.java
new file mode 100644
index 0000000..8380ca1
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/utils/TreePathTest.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class TreePathTest {
+
+	@Test
+	public void canPopLastElementFromTreePath() throws Exception {
+		TreePath treePath = new TreePath(1, 2, 3, 4);
+		assertEquals(4, treePath.pop());
+		assertEquals(3, treePath.getSegmentCount());
+		assertEquals(new TreePath(1, 2, 3), treePath);
+	}
+	
+	@Test
+	public void popsNothingIfTreePathIsEmpty() throws Exception {
+		TreePath treePath = new TreePath();
+		assertNull(treePath.pop());
+		assertEquals(0, treePath.getSegmentCount());
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellClosesTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellClosesTest.java
index d9c0fb0..e511b02 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellClosesTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellClosesTest.java
@@ -15,9 +15,9 @@
 import static org.hamcrest.Matchers.greaterThan;
 import static org.hamcrest.Matchers.lessThan;
 
-import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 import org.junit.Test;
 
@@ -25,10 +25,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class ShellClosesTest extends AbstractSWTTestCase {
-
-	private static final String	TEXT	= "this should close in a while" + ShellClosesTest.class.getSimpleName();
-	private Shell				shell;
+public class ShellClosesTest extends AbstractSWTShellTest {
 
 	@SuppressWarnings("unchecked")
 	@Test
@@ -42,10 +39,8 @@
 		assertThat(time, allOf(lessThan(5000), greaterThan(200)));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		shell = createShell(TEXT);
-
+	@Override
+	protected void createUI(Composite parent) {
 		new Thread(new Runnable() {
 			public void run() {
 				try {
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellIsActiveTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellIsActiveTest.java
index 875627d..0a803c9 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellIsActiveTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/ShellIsActiveTest.java
@@ -15,45 +15,31 @@
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.lessThan;
 
-import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class ShellIsActiveTest extends AbstractSWTTestCase {
-
-	private static final String	TEXT	= "this should close in a while" + ShellIsActiveTest.class.getSimpleName();
-	private Shell				shell;
+public class ShellIsActiveTest extends AbstractSWTShellTest {
 
 	@SuppressWarnings("unchecked")
 	@Test
 	public void waitsForShellToBecomeActive() throws Exception {
 
 		long start = System.currentTimeMillis();
-		new SWTBot().waitUntil(Conditions.shellIsActive(TEXT));
+		new SWTBot().waitUntil(Conditions.shellIsActive(SHELL_TEXT));
 		long end = System.currentTimeMillis();
 
 		int time = (int) (end - start);
 		assertThat(time, allOf(lessThan(200), greaterThanOrEqualTo(0)));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		shell = createShell(TEXT);
-
-		new Thread(new Runnable() {
-			public void run() {
-				try {
-					Thread.sleep(200);
-				} catch (InterruptedException niceTry) {
-				}
-				new SWTBotShell(shell).close();
-			}
-		}).start();
+	@Override
+	protected void createUI(Composite parent) {
 	}
+	
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TableHasRowsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TableHasRowsTest.java
index b64929b..cb628b6 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TableHasRowsTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TableHasRowsTest.java
@@ -14,12 +14,14 @@
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
 import org.junit.Test;
 
@@ -27,9 +29,8 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class TableHasRowsTest extends AbstractSWTTestCase {
+public class TableHasRowsTest extends AbstractSWTShellTest {
 
-	private static final String	TEXT	= "this should close in a while - " + TableHasRowsTest.class.getSimpleName();
 	private Table				table;
 
 	@Test
@@ -40,16 +41,22 @@
 		assertTrue(Conditions.tableHasRows(new SWTBotTable(table), 50).test());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		table = createTable(createShell(TEXT));
-	}
+	@Override
+	protected void createUI(Composite parent) {
+		shell.setLayout(new GridLayout());
+		
+		table = new Table(shell, SWT.SINGLE | SWT.FULL_SELECTION);
+		table.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+		table.setLinesVisible(true);
+		table.setHeaderVisible(true);
 
-	public void tearDown() throws Exception {
-		super.tearDown();
-		new SWTBot().shell(TEXT).close();
+		for (int i = 0; i < table.getColumnCount(); i++) {
+			table.getColumn(i).pack();
+		}
+		
+		shell.layout(true);
 	}
-
+	
 	private void keepAddingRowsInTable(final Table table, final int rows) {
 		UIThreadRunnable.syncExec(new VoidResult() {
 			public void run() {
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRowsTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRowsTest.java
new file mode 100644
index 0000000..740859e
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRowsTest.java
@@ -0,0 +1,101 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Jesper S Møller - initial API and implementation 
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.waits;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.results.WidgetResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
+import org.junit.Test;
+
+/**
+ * @author Jesper Steen Moeller &lt;jesper [at] selskabet [dot] org&gt;
+ */
+public class TreeHasRowsTest extends AbstractSWTShellTest {
+
+	private static final String	TEXT	= "this should close in a while - " + TreeHasRowsTest.class.getSimpleName();
+	private Tree				tree;
+
+	@Test
+	public void waitsForTreeToContainRows() throws Exception {
+		keepAddingRowsInTree(tree, 49);
+		assertFalse(Conditions.treeHasRows(new SWTBotTree(tree), 50).test());
+		keepAddingRowsInTree(tree, 1);
+		assertTrue(Conditions.treeHasRows(new SWTBotTree(tree), 50).test());
+	}
+
+	private void keepAddingRowsInTree(final Tree Tree, final int rows) {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				for (int i = 0; i < rows; i++) {
+					new TreeItem(Tree, SWT.NONE).setText("item " + i);
+				}
+			}
+		});
+	}
+
+	@Override
+	protected void createUI(Composite parent) {
+		tree = createTree(createShell(TEXT));
+	}
+
+	protected static boolean isMac() {
+		return (isCarbon() || isCocoa());
+	}
+
+	private static boolean isCarbon() {
+		return "carbon".equals(SWT.getPlatform());
+	}
+
+	protected static boolean isCocoa() {
+		return SWT.getPlatform().equals("cocoa");
+	}
+
+	private Shell createShell(final String text) {
+		return UIThreadRunnable.syncExec(new WidgetResult<Shell>() {
+			public Shell run() {
+				Shell shell = new Shell(Display.getCurrent());
+				shell.setText(text);
+				shell.setLayout(new GridLayout(1, false));
+				shell.open();
+				return shell;
+			}
+		});
+	}
+
+	private Tree createTree(final Shell shell) {
+		return UIThreadRunnable.syncExec(new WidgetResult<Tree>() {
+			public Tree run() {
+				Tree tree = new Tree(shell, SWT.SINGLE);
+				tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+				tree.setLinesVisible(true);
+				tree.setHeaderVisible(true);
+
+				shell.layout(true);
+				return tree;
+			}
+		});
+	}
+
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForShellTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForShellTest.java
index 888bada..b85f0f6 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForShellTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForShellTest.java
@@ -16,9 +16,14 @@
 import static org.hamcrest.Matchers.greaterThanOrEqualTo;
 import static org.hamcrest.Matchers.lessThan;
 
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.UIThread;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.WidgetResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTTest;
 import org.hamcrest.Matcher;
 import org.junit.Test;
 
@@ -26,17 +31,19 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class WaitForShellTest extends AbstractSWTTestCase {
+public class WaitForShellTest extends AbstractSWTTest {
 
-	private static final String	TEXT	= "this should close in a while - " + WaitForShellTest.class.getSimpleName();
+	private static final String	TEXT	= "Test shell";
 
+	@UIThread
+	public void runUIThread() {
+		new Display();
+	}
+	
 	@SuppressWarnings("unchecked")
 	@Test
 	public void waitsForShellToAppear() throws Exception {
 		createShellAfter(100);
-
-		destroyShellAfter(600);
-
 		long start = System.currentTimeMillis();
 		Matcher<Shell> withText = withText(TEXT);
 		new SWTBot().waitUntil(Conditions.waitForShell(withText));
@@ -46,18 +53,18 @@
 		assertThat(time, allOf(lessThan(800), greaterThanOrEqualTo(450)));
 	}
 
-	private void destroyShellAfter(int delay) {
-		new Thread(new DelayedExecutionRunnable(new Runnable() {
-			public void run() {
-				new SWTBot().shell(TEXT).close();
-			}
-		}, delay)).start();
-	}
-
 	private void createShellAfter(int delay) {
 		new Thread(new DelayedExecutionRunnable(new Runnable() {
 			public void run() {
-				createShell(TEXT);
+				UIThreadRunnable.syncExec(new WidgetResult<Shell>() {
+					public Shell run() {
+						Shell shell = new Shell(Display.getDefault());
+						shell.setText(TEXT);
+						shell.setLayout(new GridLayout(1, false));
+						shell.open();
+						return shell;
+					}
+				});
 			}
 		}, delay)).start();
 	}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForWidgetInParentTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForWidgetInParentTest.java
index 38d575a..5af0586 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForWidgetInParentTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/waits/WaitForWidgetInParentTest.java
@@ -17,7 +17,7 @@
 import static org.junit.Assert.assertFalse;
 
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.hamcrest.BaseMatcher;
 import org.hamcrest.Description;
 import org.junit.Test;
@@ -26,13 +26,13 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class WaitForWidgetInParentTest extends AbstractSWTTestCase {
+public class WaitForWidgetInParentTest extends AbstractControlExampleTest {
 
 	@Test
 	public void waitsForWidgetToAppearInParent() throws Exception {
 		long start = System.currentTimeMillis();
 
-		WaitForObjectCondition condition = Conditions.waitForWidget(new EvaluateTrueAfterAWhile(500), getFocusShell());
+		WaitForObjectCondition condition = Conditions.waitForWidget(new EvaluateTrueAfterAWhile(500), shell);
 		new SWTBot().waitUntil(condition);
 		long end = System.currentTimeMillis();
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBotTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBotTest.java
index 1ca615a..8b95aaf 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBotTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBotTest.java
@@ -15,9 +15,9 @@
 
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.WidgetResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.junit.Test;
 
 /**
@@ -25,7 +25,7 @@
  * @version $Id$
  */
 @SuppressWarnings("all")
-public class AbstractSWTBotTest extends AbstractSWTTestCase {
+public class AbstractSWTBotTest extends AbstractControlExampleTest {
 
 	@Test
 	public void throwsExceptionOnNullObjectPassedIntoConstructor() throws Exception {
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButtonTest.java
new file mode 100644
index 0000000..87a7ad1
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButtonTest.java
@@ -0,0 +1,80 @@
+/*******************************************************************************
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertTextContains;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
+import static org.eclipse.swtbot.swt.finder.utils.SWTUtils.hasStyle;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.List;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public class SWTBotArrowButtonTest extends AbstractControlExampleTest {
+
+	private long	oldTimeout;
+
+	@Before
+	public void lowerTimeout() {
+		this.oldTimeout = SWTBotPreferences.TIMEOUT;
+		SWTBotPreferences.TIMEOUT = 2000;
+	}
+
+	@After
+	public void resetTimeout() {
+		SWTBotPreferences.TIMEOUT = oldTimeout;
+	}
+
+	@Test
+	public void findsArrowButtons() throws Exception {
+		assertEquals(Button.class, bot.arrowButton(0).widget.getClass());
+		assertTrue(hasStyle(bot.arrowButton(0).widget, SWT.ARROW));
+	}
+
+	@Test
+	public void clicksArrowButton() throws Exception {
+		try {
+			List<Text> findControls = new ControlFinder().findControls(widgetOfType(Text.class));
+			SWTBotText text = new SWTBotText(findControls.get(0));
+			text.setText("");
+			assertFalse(bot.checkBox("Listen").isChecked());
+			bot.checkBox("Listen").click();
+			assertTrue(bot.checkBox("Listen").isChecked());
+			bot.arrowButton(0).click();
+			assertTextContains("Selection [13]: SelectionEvent{Button {}", text);
+		} finally {
+			bot.checkBox("Listen").click();
+			bot.button("Clear").click();
+		}
+	}
+
+	@Before
+	public void prepareExample() throws Exception {
+		bot.tabItem("Button").activate();
+		bot.radio("SWT.ARROW").click();
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowserTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowserTest.java
new file mode 100644
index 0000000..6a45b3d
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowserTest.java
@@ -0,0 +1,78 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Red Hat, Inc. 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:
+ *     Libor Zoubek, Red Hat - initial API and implementation
+ *     Ketan Padegaonkar - cleanup to conform to SWTBot standards
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import static org.eclipse.swtbot.swt.finder.SWTBotAssert.assertContains;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.eclipse.swtbot.swt.finder.test.AbstractBrowserExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.Ignore;
+import org.junit.Test;
+
+/**
+ * @author Libor Zoubek &lt;lzoubek [at] redhat [dot] com&gt;
+ */
+@Ignore
+public class SWTBotBrowserTest extends AbstractBrowserExampleTest {
+
+	@Test
+	public void findBrowser() throws Exception {
+		SWTBotBrowser browser = bot.browser();
+		assertNotNull(browser);
+	}
+
+	@Test
+	public void navigation() throws Exception {
+		SWTBotBrowser browser = bot.browser();
+		assertNotNull(browser);
+		assertFalse(browser.isBackEnabled());
+		assertFalse(browser.isForwardEnabled());
+		browser.setUrl("http://www.eclipse.org");
+		assertContains("Eclipse", browser.getText());
+		browser.setUrl("http://www.eclipse.org/swtbot/");
+		assertContains("swtbot", browser.getUrl());
+		assertTrue(browser.isBackEnabled());
+		assertFalse(browser.isForwardEnabled());
+		browser.back();
+		assertContains("eclipse", browser.getUrl());
+		assertTrue(browser.isForwardEnabled());
+		assertFalse(browser.isBackEnabled());
+	}
+
+	@Test(expected = TimeoutException.class)
+	public void smallTimeout() throws Exception {
+		long oldTimeout = SWTBotPreferences.TIMEOUT;
+		try {
+			SWTBotPreferences.TIMEOUT = 10;
+			SWTBotBrowser browser = bot.browser();
+			assertNotNull(browser);
+			browser.setUrl("http://www.eclipse.org");
+			assertContains("Eclipse", browser.getText());
+		} finally {
+			SWTBotPreferences.TIMEOUT = oldTimeout;
+		}
+	}
+
+	@Test
+	public void executeJavaScript() throws Exception {
+		SWTBotBrowser browser = bot.browser();
+		assertNotNull(browser);
+		browser.setUrl("http://www.eclipse.org");
+		assertContains("Eclipse", browser.getText());
+		browser.execute("document.getElementsByTagName('body')[0].innerHTML='<p>JavaScript works</p>';");
+		assertContains("JavaScript works", browser.getText());
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButtonTest.java
index 2435bae..0ee6f5a 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButtonTest.java
@@ -13,17 +13,15 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotButtonTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotButtonTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsButtons() throws Exception {
@@ -56,10 +54,10 @@
 		assertNotNull(bot.button("One").foregroundColor());
 	}
 
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
 		bot.tabItem("Button").activate();
+		bot.radio("SWT.PUSH").click();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCComboTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCComboTest.java
index 242364d..8d13364 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCComboTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCComboTest.java
@@ -16,18 +16,15 @@
 import static org.junit.Assert.fail;
 
 import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Cedric Chabanois &lt;cchabanois [at] no-log [dot] org&gt;
  * @version $Id$
  */
-public class SWTBotCComboTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotCComboTest extends AbstractCustomControlExampleTest {
 
 	@Test
 	public void findCCombo() throws Exception {
@@ -108,16 +105,11 @@
 		assertEquals(Combo.LIMIT, ccombo.textLimit());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("CCombo").activate();
 		bot.checkBox("SWT.FLAT").deselect();
 		bot.checkBox("SWT.READ_ONLY").deselect();
 	}
 
-	protected Shell getFocusShell() {
-		return customControlShell;
-	}
-
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCLabelTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCLabelTest.java
index ccc803f..fce41a9 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCLabelTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCLabelTest.java
@@ -14,18 +14,15 @@
 import static org.junit.Assert.assertNotNull;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotCLabelTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotCLabelTest extends AbstractCustomControlExampleTest {
 
 	@Test
 	public void findsCLabel() throws Exception {
@@ -51,14 +48,9 @@
 		assertNotNull(bot.clabel("One").image());
 	}
 
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
 		bot.tabItem("CLabel").activate();
 	}
 
-	protected Shell getFocusShell() {
-		return customControlShell;
-	}
-
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItemTest.java
index fa561bf..e74d516 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItemTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItemTest.java
@@ -13,8 +13,7 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotAssert.pass;
 import static org.junit.Assert.fail;
 
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -22,11 +21,10 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotCTabItemTest extends AbstractSWTTestCase {
+public class SWTBotCTabItemTest extends AbstractCustomControlExampleTest {
 
 	@Before
-	public void setUp() throws Exception {
-		super.setUp();
+	public void prepareExample() throws Exception {
 		bot.tabItem("CTabFolder").activate();
 		bot.checkBox("SWT.CLOSE").deselect();
 		bot.checkBox("SWT.CLOSE").select();
@@ -51,8 +49,4 @@
 		}
 	}
 
-	protected Shell getFocusShell() {
-		return customControlShell;
-	}
-
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBoxTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBoxTest.java
index 0bf230e..67ae9de 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBoxTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBoxTest.java
@@ -21,19 +21,33 @@
 import java.util.List;
 
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotCheckBoxTest extends AbstractSWTTestCase {
+public class SWTBotCheckBoxTest extends AbstractControlExampleTest {
 
-	private SWTBot	bot;
+
+	private long	oldTimeout;
+
+	@Before
+	public void lowerTimeout() {
+		this.oldTimeout = SWTBotPreferences.TIMEOUT;
+		SWTBotPreferences.TIMEOUT = 2000;
+	}
+
+	@After
+	public void resetTimeout() {
+		SWTBotPreferences.TIMEOUT = oldTimeout;
+	}
 
 	@Test
 	public void clicksCheckBox() throws Exception {
@@ -84,10 +98,9 @@
 			pass();
 		}
 	}
-
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Button").activate();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotComboTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotComboTest.java
index 607ac82..49515ed 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotComboTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotComboTest.java
@@ -4,13 +4,14 @@
  * 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:
  *     Ketan Padegaonkar - initial API and implementation
  *     Cédric Chabanois - http://swtbot.org/bugzilla/show_bug.cgi?id=17
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
+import static org.eclipse.swtbot.swt.finder.utils.SWTUtils.isCocoa;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -19,17 +20,15 @@
 import java.util.Arrays;
 import java.util.List;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotComboTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotComboTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsCombo() throws Exception {
@@ -96,6 +95,27 @@
 	}
 
 	@Test
+	public void typeAndVerifiesTextInCombo() throws Exception {
+		bot.checkBox("SWT.READ_ONLY").deselect();
+
+		bot.checkBox("Listen").select();
+		bot.button("Clear").click();
+
+		SWTBotCombo comboBox = bot.comboBoxInGroup("Combo");
+		comboBox.setText("");
+		comboBox.typeText("New typed Text");
+		assertEquals("New typed Text", comboBox.getText());
+
+		if (!isCocoa())
+			assertEventMatches(bot.textInGroup("Listeners"), "KeyDown [1]: KeyEvent{Combo {} time=490981104 data=null character='\\0' keyCode=131072 stateMask=0 doit=true}");
+		assertEventMatches(bot.textInGroup("Listeners"), "KeyDown [1]: KeyEvent{Combo {} time=490981272 data=null character='N' keyCode=110 stateMask=131072 doit=true}");
+		assertEventMatches(bot.textInGroup("Listeners"), "Verify [25]: VerifyEvent{Combo {} time=490981272 data=null character='N' keyCode=110 stateMask=131072 doit=true start=0 end=0 text=N}");
+		assertEventMatches(bot.textInGroup("Listeners"), "KeyUp [2]: KeyEvent{Combo {N} time=490981352 data=null character='N' keyCode=110 stateMask=131072 doit=true}");
+		if (!isCocoa())
+			assertEventMatches(bot.textInGroup("Listeners"), "KeyUp [2]: KeyEvent{Combo {N} time=490981457 data=null character='\\0' keyCode=131072 stateMask=131072 doit=true}");
+	}
+
+	@Test
 	public void throwsExceptionInCaseOfChangeTextOfReadOnlyCombo() throws Exception {
 		bot.checkBox("SWT.READ_ONLY").select();
 		SWTBotCombo comboBox = bot.comboBoxInGroup("Combo");
@@ -109,9 +129,8 @@
 		}
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Combo").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTimeTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTimeTest.java
index 1ec9677..b865ae8 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTimeTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTimeTest.java
@@ -20,17 +20,16 @@
 import java.util.Date;
 
 import org.eclipse.swt.widgets.DateTime;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotDateTimeTest extends AbstractSWTTestCase {
+public class SWTBotDateTimeTest extends AbstractControlExampleTest {
 
-	private SWTBot			bot;
 	private SWTBotDateTime	dateTime;
 
 	@Test
@@ -51,6 +50,39 @@
 	}
 
 	@Test
+	public void shouldHandleInvalidDates() throws Exception {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(0);
+		calendar.set(2011, 1, 3, 0, 0, 0);
+		Date expected = calendar.getTime();
+		assertFalse(expected.equals(dateTime.getDate()));
+		dateTime.setDate(expected);
+
+		calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(0);
+		calendar.set(2010, 11, 31, 0, 0, 0);
+		dateTime.setDate(calendar.getTime());
+		assertEquals(calendar.getTime(), dateTime.getDate());
+	}
+
+	@Test
+	public void bug347824() throws Exception {
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(0);
+		calendar.set(2011, Calendar.MAY, 31, 0, 0, 0);
+		Date expected = calendar.getTime();
+		assertFalse(expected.equals(dateTime.getDate()));
+		dateTime.setDate(expected);
+		assertEquals(expected, dateTime.getDate());
+		
+		calendar = Calendar.getInstance();
+		calendar.setTimeInMillis(0);
+		calendar.set(2010, Calendar.SEPTEMBER, 28, 0, 0, 0);
+		dateTime.setDate(calendar.getTime());
+		assertEquals(calendar.getTime(), dateTime.getDate());
+	}
+	
+	@Test
 	public void sendsNotification() throws Exception {
 		bot.checkBox("Listen").click();
 		SWTBotDateTime dateTime = bot.dateTimeInGroup("DateTime");
@@ -64,9 +96,8 @@
 		assertThat(text, containsString(" data=null item=null detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=null doit=true}"));
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("DateTime").activate();
 		dateTime = bot.dateTimeInGroup("DateTime");
 	}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBarTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBarTest.java
new file mode 100644
index 0000000..f664d90
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBarTest.java
@@ -0,0 +1,98 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class SWTBotExpandBarTest extends AbstractControlExampleTest {
+
+	@Test
+	public void shouldGetExpandItemCount() throws Exception {
+		assertEquals(2, bot.expandBar().itemCount());
+	}
+
+	@Test
+	public void shouldGetExpandedAndCollapsedItemCount() throws Exception {
+		SWTBotExpandBar expandBar = bot.expandBar();
+		assertEquals(1, expandBar.expandedItemCount());
+		assertEquals(1, expandBar.collapsedItemCount());
+	}
+
+	@Test
+	public void shouldExpandAnItem() throws Exception {
+		SWTBotExpandBar expandBar = bot.expandBar();
+		SWTBotExpandItem item1 = expandBar.expandItem("What is your favorite button?");
+		SWTBotExpandItem item2 = expandBar.expandItem("What is your favorite icon?");
+		assertEquals(2, expandBar.expandedItemCount());
+		assertEquals(0, expandBar.collapsedItemCount());
+
+		assertTrue(item1.isExpanded());
+		assertTrue(item2.isExpanded());
+
+		assertFalse(item1.isCollapsed());
+		assertFalse(item2.isCollapsed());
+	}
+
+	@Test
+	public void shouldCollapseAnItem() throws Exception {
+		SWTBotExpandBar expandBar = bot.expandBar();
+		SWTBotExpandItem item1 = expandBar.collapseItem("What is your favorite button?");
+		SWTBotExpandItem item2 = expandBar.collapseItem("What is your favorite icon?");
+		assertEquals(0, expandBar.expandedItemCount());
+		assertEquals(2, expandBar.collapsedItemCount());
+
+		assertFalse(item1.isExpanded());
+		assertFalse(item2.isExpanded());
+
+		assertTrue(item1.isCollapsed());
+		assertTrue(item2.isCollapsed());
+	}
+
+	@Test
+	public void shouldGetAllExpandBarItems() throws Exception {
+		List<SWTBotExpandItem> items = bot.expandBar().getAllItems();
+		assertEquals(2, items.size());
+		assertEquals("What is your favorite button?", items.get(0).getText());
+		assertEquals("What is your favorite icon?", items.get(1).getText());
+	}
+
+	@Test
+	public void shouldThrowExceptionWhenItemIsNotFound() throws Exception {
+		try {
+			bot.expandBar().getExpandItem(withText("some text"));
+			fail("Expected WNFE");
+		} catch (WidgetNotFoundException e) {
+			assertEquals("Could not find widget.", e.getMessage());
+			assertEquals("Timeout after: 5000 ms.: Could not find widget matching: (of type 'ExpandItem' and with text 'some text')", e
+					.getCause().getMessage());
+		}
+	}
+
+	@Before
+	public void prepareExample() throws Exception {
+		bot.tabItem("ExpandBar").activate();
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLabelTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLabelTest.java
index 4cf558e..a7b443b 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLabelTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLabelTest.java
@@ -14,17 +14,15 @@
 import static org.junit.Assert.assertNotNull;
 
 import org.eclipse.swt.SWT;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotLabelTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotLabelTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsLabel() throws Exception {
@@ -45,9 +43,8 @@
 		assertNotNull(bot.label("").image());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Label").activate();
 		bot.checkBox("Horizontal Fill").select();
 	}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLinkTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLinkTest.java
index b2160dd..6458920 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLinkTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLinkTest.java
@@ -10,14 +10,15 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotLinkTest extends AbstractSWTTestCase {
+public class SWTBotLinkTest extends AbstractControlExampleTest {
 
 	private SWTBotText	listeners;
 
@@ -33,7 +34,7 @@
 	public void clicksOnALinkWithHyperlinkTextAndHREF() throws Exception {
 		SWTBotLink link = bot.link();
 		link.click("SWT");
-		assertEventMatches(listeners, "MouseDown [3]: MouseEvent{Link {Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt\">SWT</A> homepage or <a>Foo</a>.} time=1561910868 data=null button=1 stateMask=0 x=234 y=10 count=1}"); 	
+		assertEventMatches(listeners, "MouseDown [3]: MouseEvent{Link {Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt\">SWT</A> homepage or <a>Foo</a>.} time=1561910868 data=null button=1 stateMask=0 x=234 y=10 count=1}");
 		assertEventMatches(listeners, "Selection [13]: SelectionEvent{Link {Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt\">SWT</A> homepage or <a>Foo</a>.} time=1561910872 data=null item=null detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=www.eclipse.org\\swt doit=true}");
 		assertEventMatches(listeners, "MouseUp [4]: MouseEvent{Link {Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt\">SWT</A> homepage or <a>Foo</a>.} time=1561910872 data=null button=1 stateMask=524288 x=234 y=10 count=1}");
 	}
@@ -47,8 +48,8 @@
 		assertEventMatches(listeners, "MouseUp [4]: MouseEvent{Link {Visit the <A HREF=\"www.eclipse.org\">Eclipse.org</A> project and the <A HREF=\"www.eclipse.org\\swt\">SWT</A> homepage or <a>Foo</a>.} time=1561910872 data=null button=1 stateMask=524288 x=234 y=10 count=1}");
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Link").activate();
 		bot.checkBox("Listen").select();
 		bot.button("Clear").click();
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotListTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotListTest.java
index 2d58d9d..3a40474 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotListTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotListTest.java
@@ -18,14 +18,15 @@
 
 import org.eclipse.swt.widgets.List;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotListTest extends AbstractSWTTestCase {
+public class SWTBotListTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsAListWithoutLabel() throws Exception {
@@ -154,9 +155,8 @@
 		}
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("List").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest.java
index f35ad0e..e09dd74 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest.java
@@ -18,8 +18,7 @@
 
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swtbot.swt.finder.AbstractMenuExampleTest;
-import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.test.AbstractMenuExampleTest;
 import org.junit.Test;
 
 /**
@@ -28,8 +27,6 @@
  */
 public class SWTBotMenuTest extends AbstractMenuExampleTest {
 
-	private SWTBot	bot;
-
 	@Test
 	public void findsMenus() throws Exception {
 		assertText("&File", bot.menu("File").widget);
@@ -45,11 +42,11 @@
 	public void clicksSubMenus() throws Exception {
 		display.syncExec(new Runnable() {
 			public void run() {
-				menuExample
+				addressBook
 						.addAddressBook(new String[] { "last2", "first", "business phone", "home phone", "email@addres.ss", "fax number" });
-				menuExample
+				addressBook
 						.addAddressBook(new String[] { "last6", "first", "business phone", "home phone", "email@addres.ss", "fax number" });
-				menuExample
+				addressBook
 						.addAddressBook(new String[] { "last4", "first", "business phone", "home phone", "email@addres.ss", "fax number" });
 			}
 		});
@@ -63,7 +60,7 @@
 		final TableItem[][] treeItems = new TableItem[][] { null };
 		display.syncExec(new Runnable() {
 			public void run() {
-				treeItems[0] = menuExample.getTreeItems();
+				treeItems[0] = addressBook.getTreeItems();
 			}
 		});
 		TableItem[] tableItems = treeItems[0];
@@ -76,7 +73,7 @@
 
 		display.syncExec(new Runnable() {
 			public void run() {
-				treeItems[0] = menuExample.getTreeItems();
+				treeItems[0] = addressBook.getTreeItems();
 			}
 		});
 
@@ -86,8 +83,4 @@
 		assertText("last2", tableItems[2]);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest2.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest2.java
index 655e205..d749cd8 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest2.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenuTest2.java
@@ -14,14 +14,17 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
-public class SWTBotMenuTest2 extends AbstractSWTTestCase {
+public class SWTBotMenuTest2 extends AbstractControlExampleTest {
 
 	private SWTBotText	listeners;
 
 	@Test
+	@Ignore("Broken on cocoa")
 	public void clicksCheckMenus() throws Exception {
 		SWTBotMenu menu = bot.menu("Cascade").menu("Check");
 		assertFalse(menu.isChecked());
@@ -30,8 +33,8 @@
 		assertTextContains("Selection [13]: SelectionEvent{MenuItem {&Check	Ctrl+Shift+C}", listeners);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Menu").activate();
 		listeners = bot.textInGroup("Listeners");
 
@@ -56,25 +59,4 @@
 		bot.shell("Title:0").activate();
 	}
 
-	public void tearDown() throws Exception {
-		bot.shell("SWT Controls").activate();
-		bot.button("Close All Shells").click();
-
-		bot.checkBox("SWT.BAR").deselect();
-		bot.checkBox("SWT.DROP_DOWN").deselect();
-
-		bot.checkBox("SWT.CASCADE").deselect();
-		bot.checkBox("SWT.CHECK").deselect();
-		bot.checkBox("SWT.PUSH").deselect();
-		bot.checkBox("SWT.RADIO").deselect();
-		bot.checkBox("SWT.SEPARATOR").deselect();
-
-		bot.checkBox("Images").deselect();
-		bot.checkBox("Accelerators").deselect();
-		bot.checkBox("Mnemonics").deselect();
-		bot.checkBox("Sub-Sub-Menu").deselect();
-		bot.checkBox("Sub-Menu").deselect();
-
-		super.tearDown();
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java
index 44e394c..9ef81bf 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotPopupMenuTest.java
@@ -19,16 +19,17 @@
 import static org.junit.Assert.assertNotNull;
 
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotPopupMenuTest extends AbstractSWTTestCase {
+public class SWTBotPopupMenuTest extends AbstractControlExampleTest {
 
-	private SWTBot		bot;
 	private SWTBotShell	popupShell;
 	private SWTBotShell	activeShell;
 
@@ -62,8 +63,8 @@
 		assertTextContains("Selection [13]: SelectionEvent{MenuItem {Push} time=", bot.textInGroup("Listeners").widget);
 	}
 
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
 		bot = new SWTBot();
 		activeShell = bot.activeShell();
 		bot.tabItem("Menu").activate();
@@ -85,6 +86,7 @@
 		popupShell.activate();
 	}
 
+	@After
 	public void tearDown() throws Exception {
 		popupShell.close();
 		bot.button("Close All Shells").click();
@@ -101,7 +103,5 @@
 		bot.checkBox("Sub-Sub-Menu").deselect();
 		bot.checkBox("Sub-Menu").deselect();
 		bot.checkBox("SWT.BAR").deselect();
-
-		super.tearDown();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadioTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadioTest.java
index 255281f..2887ad1 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadioTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadioTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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
@@ -10,57 +10,74 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
-import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertTextContains;
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.pass;
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.util.List;
-
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotRadioTest extends AbstractSWTTestCase {
+public class SWTBotRadioTest extends AbstractControlExampleTest {
 
-	private SWTBot	bot;
+	private long	oldTimeout;
+	private SWTBotText	listeners;
 
-	@Test
-	public void clicksCheckBox() throws Exception {
-		try {
-			List<Text> findControls = new ControlFinder().findControls(widgetOfType(Text.class));
-			SWTBotText text = new SWTBotText(findControls.get(0));
-			text.setText("");
+	@Before
+	public void lowerTimeout() {
+		this.oldTimeout = SWTBotPreferences.TIMEOUT;
+		SWTBotPreferences.TIMEOUT = 2000;
+	}
 
-			bot.checkBox("Listen").click();
-			bot.button("One").click();
-			assertTextContains("Selection [13]: SelectionEvent{Button {One}", text);
-		} finally {
-			bot.checkBox("Listen").click();
-			bot.button("Clear").click();
-		}
+	@After
+	public void resetTimeout() {
+		SWTBotPreferences.TIMEOUT = oldTimeout;
 	}
 
 	@Test
-	public void doesNotMatchRadioButtons() throws Exception {
+	public void clicksCheckBox() throws Exception {
+		bot.radio("Three").click();
+		listeners.setText("");
+
+		bot.radio("One").click();
+		assertEventMatches(listeners, "Activate [26]: ShellEvent{Button {One} time=557343275 data=null doit=true}");
+		assertEventMatches(listeners, "MouseDown [3]: MouseEvent{Button {One} time=557343275 data=null button=1 stateMask=0 x=31 y=13 count=1}");
+		assertEventMatches(listeners, "MouseUp [4]: MouseEvent{Button {One} time=557343275 data=null button=1 stateMask=524288 x=31 y=12 count=1}");
+		assertEventMatches(listeners, "Selection [13]: SelectionEvent{Button {One} time=557343275 data=null item=null detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=null doit=true}");
+	}
+
+	@Test
+	public void clickingOneRadioDeselectsOthers() throws Exception {
+		bot.radio("One").click();
+		listeners.setText("");
+		bot.radio("Two").click();
+		assertEventMatches(listeners, "Deactivate [27]: ShellEvent{Button {One} time=557347515 data=null doit=true}");
+		assertEventMatches(listeners, "Activate [26]: ShellEvent{Button {Two} time=557347515 data=null doit=true}");
+		assertEventMatches(listeners, "MouseDown [3]: MouseEvent{Button {Two} time=557347515 data=null button=1 stateMask=0 x=16 y=13 count=1}");
+		assertEventMatches(listeners, "MouseUp [4]: MouseEvent{Button {Two} time=557347515 data=null button=1 stateMask=524288 x=16 y=13 count=1}");
+		assertEventMatches(listeners, "Selection [13]: SelectionEvent{Button {One} time=557347515 data=null item=null detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=null doit=true}");
+		assertEventMatches(listeners, "Selection [13]: SelectionEvent{Button {Two} time=557347515 data=null item=null detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=null doit=true}");
+	}
+
+	@Test
+	public void doesNotMatchCheckboxButtons() throws Exception {
 		try {
-			assertNull(bot.checkBox("SWT.PUSH").widget);
+			assertNull(bot.radio("SWT.FLAT").widget);
 			fail("Expecting WidgetNotFoundException");
 		} catch (WidgetNotFoundException e) {
 			pass();
 		}
 		try {
-			assertNull(bot.checkBox("Preferred").widget);
+			assertNull(bot.radio("Horizontal Fill").widget);
 			fail("Expecting WidgetNotFoundException");
 		} catch (WidgetNotFoundException e) {
 			pass();
@@ -70,13 +87,13 @@
 	@Test
 	public void doesNotMatchRegularButtons() throws Exception {
 		try {
-			assertNull(bot.checkBox("One").widget);
+			assertNull(bot.radio("Clear").widget);
 			fail("Expecting WidgetNotFoundException");
 		} catch (WidgetNotFoundException e) {
 			pass();
 		}
 		try {
-			assertNull(bot.checkBox("Change").widget);
+			assertNull(bot.radio("Select Listeners").widget);
 			fail("Expecting WidgetNotFoundException");
 		} catch (WidgetNotFoundException e) {
 			pass();
@@ -101,10 +118,13 @@
 		assertFalse(bot.radio("SWT.CHECK").isSelected());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Button").activate();
+		bot.radio("SWT.RADIO").click();
+		listeners = bot.textInGroup("Listeners");
+		bot.checkBox("Listen").select();
+		bot.button("Clear").click();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScaleTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScaleTest.java
new file mode 100644
index 0000000..6976232
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScaleTest.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2011 SWTBot Committers 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:
+ *     John Cortell - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
+import org.junit.Test;
+
+public class SWTBotScaleTest extends AbstractControlExampleTest {
+
+	@Test
+	public void findsScale() throws Exception {
+		assertNotNull(bot.scale().widget);
+	}
+
+	@Test
+	public void findsScaleInGroup() throws Exception {
+		assertNotNull(bot.scaleInGroup("Scale").widget);
+	}
+
+	@Test
+	public void shouldGetValue() throws Exception {
+		bot.spinnerInGroup("Selection").setSelection(42);
+		assertEquals(42, bot.scaleInGroup("Scale").getValue());
+	}
+
+	@Test
+	public void shouldSetValue() throws Exception {
+		bot.scaleInGroup("Scale").setValue(24);
+		assertEquals(24, bot.scaleInGroup("Scale").getValue());
+	}
+
+	@Test
+	public void shouldGetMinimumAndMaximum() throws Exception {
+		bot.spinnerInGroup("Minimum").setSelection(5);
+		bot.spinnerInGroup("Maximum").setSelection(45);
+
+		assertEquals(5, bot.scaleInGroup("Scale").getMinimum());
+		assertEquals(45, bot.scaleInGroup("Scale").getMaximum());
+	}
+
+	@Test
+	public void shouldGetIncrementAndPageIncrement() throws Exception {
+		bot.spinnerInGroup("Increment").setSelection(7);
+		bot.spinnerInGroup("Page Increment").setSelection(15);
+
+		assertEquals(7, bot.scaleInGroup("Scale").getIncrement());
+		assertEquals(15, bot.scaleInGroup("Scale").getPageIncrement());
+	}
+
+
+	@Before
+	public void prepareExample() throws Exception {
+		bot.tabItem("Scale").activate();
+		bot.spinnerInGroup("Selection").setSelection(0);
+		bot.spinnerInGroup("Minimum").setSelection(0);
+		bot.spinnerInGroup("Maximum").setSelection(100);
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShellTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShellTest.java
index 23f4b26..036f8ef 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShellTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShellTest.java
@@ -12,31 +12,51 @@
 
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertSameWidget;
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.pass;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.fail;
 
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotShellTest extends AbstractSWTTestCase {
+public class SWTBotShellTest extends AbstractSWTShellTest {
 
-	private SWTBot	bot;
+	private static final String TITLE = "Address Book - Untitled";
 	private Shell	shell3;
 	private Shell	shell2;
 	private Shell	shell4;
 
+	@Override
+	protected void createUI(Composite parent) {
+		shell.setText(TITLE);
+
+		shell4 = new Shell(display);
+		shell4.setText("shell4");
+		shell4.open();
+
+		shell2 = new Shell(shell4);
+		shell2.setText("shell2");
+		shell2.open();
+
+		shell3 = new Shell(display);
+		shell3.setText("shell3");
+		shell3.open();
+	}
+
 	@Test
 	public void findsShell() throws Exception {
-		assertSameWidget(menuShell, bot.shell("Address Book - Untitled").widget);
+		assertSameWidget(shell, bot.shell(TITLE).widget);
 	}
 
 	@Test
@@ -61,9 +81,9 @@
 	public void closesShell() throws Exception {
 		UIThreadRunnable.asyncExec(display, new VoidResult() {
 			public void run() {
-				Shell shell = new Shell(controlShell);
-				shell.setText("some shell");
-				shell.open();
+				Shell someShell = new Shell(shell);
+				someShell.setText("some shell");
+				someShell.open();
 			}
 		});
 		bot.shell("some shell").activate();
@@ -85,38 +105,20 @@
 		assertSameWidget(shell2.widget, activeShell.widget);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
-		UIThreadRunnable.asyncExec(display, new VoidResult() {
-			public void run() {
-				shell4 = new Shell(display);
-				shell4.setText("shell4");
-				shell4.open();
-
-				shell2 = new Shell(shell4);
-				shell2.setText("shell2");
-				shell2.open();
-
-				shell3 = new Shell(display);
-				shell3.setText("shell3");
-				shell3.open();
-			}
-		});
+	@Test
+	public void getsAllShells() throws Exception {
+		assertEquals(4, bot.shells().length);
 	}
 
-	public void tearDown() throws Exception {
-		new SWTBotShell(shell2).close();
-		new SWTBotShell(shell3).close();
-		new SWTBotShell(shell4).close();
-		UIThreadRunnable.syncExec(display, new VoidResult() {
+	@Test
+	public void findsShellsById() throws Exception {
+		UIThreadRunnable.syncExec(new VoidResult() {
 			public void run() {
-				shell2.dispose();
-				shell3.dispose();
-				shell4.dispose();
+				shell.setData("foo-shell", "bar");
 			}
 		});
-		super.tearDown();
+
+		assertSame(shell, bot.shellWithId("foo-shell", "bar").widget);
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSliderTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSliderTest.java
index 9fbf157..d344d37 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSliderTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSliderTest.java
@@ -13,14 +13,15 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Yann N. Dauphin
  * @version $Id$
  */
-public class SWTBotSliderTest extends AbstractSWTTestCase {
+public class SWTBotSliderTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsSlider() throws Exception {
@@ -38,8 +39,8 @@
 		assertEquals(11, bot.sliderInGroup("Slider").getSelection());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Slider").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinnerTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinnerTest.java
index 0d5f3e9..46b20ef 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinnerTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinnerTest.java
@@ -13,17 +13,15 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Yann N. Dauphin
  * @version $Id$
  */
-public class SWTBotSpinnerTest extends AbstractSWTTestCase {
-
-	SWTBot	bot	= new SWTBot();
+public class SWTBotSpinnerTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsSpinner() throws Exception {
@@ -41,8 +39,8 @@
 		assertEquals(11, bot.spinner().getSelection());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Spinner").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledTextTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledTextTest.java
index a194e45..a141248 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledTextTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledTextTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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
@@ -22,20 +22,18 @@
 import org.eclipse.swt.custom.StyleRange;
 import org.eclipse.swt.custom.StyledText;
 import org.eclipse.swt.graphics.GlyphMetrics;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractCustomControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.Position;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotStyledTextTest extends AbstractSWTTestCase {
+public class SWTBotStyledTextTest extends AbstractCustomControlExampleTest {
 
-	private SWTBot				bot;
 	private SWTBotStyledText	styledText;
 
 	@Test
@@ -145,6 +143,17 @@
 	}
 
 	@Test
+	public void getsTabs() {
+		assertEquals(4, styledText.getTabs());
+		try {
+			setTabs(15);
+			assertEquals(15, styledText.getTabs());
+		} finally {
+			setTabs(4);
+		}
+	}
+
+	@Test
 	public void getsBullet() throws Exception {
 
 		styledText.setText("hello world\n" + "it is a very good day today\n" + "good bye world\n" + "it was nice to meet you");
@@ -163,9 +172,8 @@
 		assertTrue(styledText.hasBulletOnCurrentLine());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.shell("SWT Custom Controls").activate();
 		bot.tabItem("StyledText").activate();
 		styledText = bot.styledTextInGroup("StyledText");
@@ -173,7 +181,13 @@
 		bot.checkBox("Vertical Fill").select();
 	}
 
-	protected Shell getFocusShell() {
-		return customControlShell;
+	private void setTabs(final int tabSize) {
+		display.syncExec(new Runnable() {
+			public void run() {
+				StyledText t = styledText.widget;
+				t.setTabs(tabSize);
+			}
+		});
 	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItemTest.java
index 700383d..5fa102a 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItemTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItemTest.java
@@ -19,9 +19,8 @@
 import java.util.List;
 
 import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.hamcrest.Matcher;
 import org.junit.Test;
 
@@ -29,8 +28,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTabItemTest extends AbstractSWTTestCase {
-	final SWTBot	bot	= new SWTBot();
+public class SWTBotTabItemTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsTabs() throws Exception {
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableClickTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableClickTest.java
index 6176db6..da0c8c8 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableClickTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableClickTest.java
@@ -7,19 +7,18 @@
  * 
  * Contributors:
  *     Cedric Chabanois - initial API and implementation
+ *     Mickael Istria (PetalsLink) - Fix bug 362476
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
 import static org.junit.Assert.assertEquals;
 
 import org.eclipse.jface.snippets.viewers.Snippet009CellEditors;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.UIThread;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTTest;
 import org.junit.Test;
 
 /**
@@ -27,14 +26,11 @@
  * @version $Id$
  * @since 1.2
  */
-public class SWTBotTableClickTest extends AbstractSWTTestCase {
-
-	private SWTBot		bot;
-	private SWTBotTable	table;
-	private Shell		snippetCellEditorShell;
+public class SWTBotTableClickTest extends AbstractSWTTest {
 
 	@Test
 	public void clickOnCell() throws Exception {
+		SWTBotTable table = bot.table();
 		table.click(0, 0);
 		bot.sleep(1000);
 		bot.text("0", 0).setText("101");
@@ -43,33 +39,14 @@
 		bot.sleep(1000);
 		assertEquals("Item 101", table.cell(0, 0));
 	}
-
-	protected Shell getFocusShell() {
-		return snippetCellEditorShell;
-	}
-
-	public void setUp() throws Exception {
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				snippetCellEditorShell = new Shell(display, SWT.SHELL_TRIM);
-				snippetCellEditorShell.setLayout(new FillLayout());
-				snippetCellEditorShell.setText("Snippet cell editor");
-				new Snippet009CellEditors(snippetCellEditorShell);
-				snippetCellEditorShell.open();
-			}
-		});
-		super.setUp();
-		bot = new SWTBot();
-		table = bot.table();
-	}
-
-	public void tearDown() throws Exception {
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				snippetCellEditorShell.close();
-			}
-		});
-		super.tearDown();
+	
+	@UIThread
+	public void runUIThread() {
+		Display display = Display.getDefault();
+		Shell shell = new Shell(display);
+		shell.setLayout(new FillLayout());
+		new Snippet009CellEditors(shell);
+		shell.open ();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumnTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumnTest.java
index 1be8818..8ed207f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumnTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumnTest.java
@@ -16,17 +16,16 @@
 
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTableColumnTest extends AbstractSWTTestCase {
+public class SWTBotTableColumnTest extends AbstractControlExampleTest {
 
-	private SWTBot		bot;
 	private SWTBotTable	table;
 
 	@Test
@@ -48,9 +47,8 @@
 		assertTextContains("data=null button=1 stateMask=524288 x=0 y=0 count=1}", text);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Table").activate();
 		bot.radio("SWT.MULTI").click();
 		bot.checkBox("Header Visible").select();
@@ -58,9 +56,4 @@
 		bot.button("Clear").click();
 		table = bot.tableInGroup("Table");
 	}
-
-	public void tearDown() throws Exception {
-		bot.checkBox("Listen").deselect();
-		super.tearDown();
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableDoubleClickTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableDoubleClickTest.java
index 607e8dc..a907ab9 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableDoubleClickTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableDoubleClickTest.java
@@ -7,17 +7,16 @@
  * 
  * Contributors:
  *     Cedric Chabanois - initial API and implementation
+ *     Mickael Istria (PetalsLink) - Fix bug 362476
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
 import org.eclipse.jface.snippets.viewers.Snippet052DoubleClickCellEditor;
-import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.UIThread;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTTest;
 import org.junit.Test;
 
 /**
@@ -25,44 +24,22 @@
  * @version $Id$
  * @since 1.2
  */
-public class SWTBotTableDoubleClickTest extends AbstractSWTTestCase {
-
-	private SWTBot		bot;
-	private SWTBotTable	table;
-	private Shell		snippetCellEditorShell;
+public class SWTBotTableDoubleClickTest extends AbstractSWTTest {
 
 	@Test
 	public void doubleClickOnCell() throws Exception {
-		table.doubleClick(0, 0);
+		bot.table().doubleClick(0, 0);
 		bot.text("Column 1 => Item 0", 0);
 	}
 
-	protected Shell getFocusShell() {
-		return snippetCellEditorShell;
-	}
+	@UIThread
+	public void runUIThread() {
+		Display display = Display.getDefault();
 
-	public void setUp() throws Exception {
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				snippetCellEditorShell = new Shell(display, SWT.SHELL_TRIM);
-				snippetCellEditorShell.setLayout(new FillLayout());
-				snippetCellEditorShell.setText("Snippet cell editor");
-				new Snippet052DoubleClickCellEditor(snippetCellEditorShell);
-				snippetCellEditorShell.open();
-			}
-		});
-		super.setUp();
-		bot = new SWTBot();
-		table = bot.table();
-	}
-
-	public void tearDown() throws Exception {
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				snippetCellEditorShell.close();
-			}
-		});
-		super.tearDown();
+		Shell shell = new Shell(display);
+		shell.setLayout(new FillLayout());
+		new Snippet052DoubleClickCellEditor(shell);
+		shell.open();
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItemTest.java
index 8573b45..3880b10 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItemTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItemTest.java
@@ -17,14 +17,15 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Vincent MAHE &lt;vmahe [at] free [dot]fr&gt;
  * @version $Id$
  */
-public class SWTBotTableItemTest extends AbstractSWTTestCase {
+public class SWTBotTableItemTest extends AbstractControlExampleTest {
 
 	private SWTBotTable	table;
 	private SWTBotText	listeners;
@@ -118,8 +119,8 @@
 		assertTextContains("Selection [13]: SelectionEvent{Table {} ", listeners);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Table").activate();
 		bot.checkBox("Horizontal Fill").select();
 		bot.checkBox("Vertical Fill").select();
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest.java
index 577a18a..4df23e2 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest.java
@@ -17,19 +17,18 @@
 import java.util.ArrayList;
 
 import org.eclipse.swt.widgets.Table;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TableCollection;
 import org.eclipse.swtbot.swt.finder.utils.TableRow;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTableTest extends AbstractSWTTestCase {
+public class SWTBotTableTest extends AbstractControlExampleTest {
 
-	private SWTBot		bot;
 	private SWTBotTable	table;
 
 	@Test
@@ -255,9 +254,8 @@
 		assertEquals("Index:3", tableItem.getText());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Table").activate();
 		table = bot.tableInGroup("Table");
 	}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest2.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest2.java
index a50d36e..4b37df0 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest2.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableTest2.java
@@ -13,18 +13,17 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertText;
 import static org.junit.Assert.assertEquals;
 
-import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractMenuExampleTest;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTableTest2 extends AbstractSWTTestCase {
+public class SWTBotTableTest2 extends AbstractMenuExampleTest {
 
 	private static final String	FIRST_NAME	= "First Name";
 	private static final String	LAST_NAME	= "Last Name";
@@ -68,17 +67,13 @@
 		table = bot.table();
 	}
 
-	protected Shell getFocusShell() {
-		return menuShell;
-	}
-
 	private void populateData() {
 		display.syncExec(new Runnable() {
 			public void run() {
-				menuExample.clearAddressbook();
-				menuExample.addAddressBook(row1());
-				menuExample.addAddressBook(row2());
-				menuExample.addAddressBook(row3());
+				addressBook.clearAddressbook();
+				addressBook.addAddressBook(row1());
+				addressBook.addAddressBook(row2());
+				addressBook.addAddressBook(row3());
 			}
 		});
 	}
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTextTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTextTest.java
index b1279cf..c76a68b 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTextTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTextTest.java
@@ -13,23 +13,16 @@
 
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertText;
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertTextContains;
-import static org.junit.Assert.assertEquals;
 
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTextTest extends AbstractSWTTestCase {
-
-	SWTBot	bot	= new SWTBot();
+public class SWTBotTextTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsTextBoxInGroup() throws Exception {
@@ -56,34 +49,14 @@
 	@Test
 	public void typesText() throws Exception {
 		final SWTBotText text = bot.textInGroup("Text");
-		final StringBuffer buffer = new StringBuffer();
 		text.setText("");
 
-		final KeyListener listener = new KeyListener() {
-			public void keyReleased(KeyEvent e) {
-			}
-
-			public void keyPressed(KeyEvent e) {
-				if (e.character != 0)
-					buffer.append(e.character);
-			}
-		};
-
-		UIThreadRunnable.syncExec(new VoidResult() {
-			public void run() {
-				text.widget.addKeyListener(listener);
-			}
-		});
-
 		text.typeText("Type This 123");
 		assertTextContains("Type This 123", text.widget);
-
-		assertEquals("Type This 123", buffer.toString());
-
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Text").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButtonTest.java
index 2201615..4f94760 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButtonTest.java
@@ -21,35 +21,47 @@
 import java.util.List;
 
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToggleButtonTest extends AbstractSWTTestCase {
+public class SWTBotToggleButtonTest extends AbstractControlExampleTest {
 
-	private SWTBot	bot;
+	private long	oldTimeout;
+
+	@Before
+	public void lowerTimeout() {
+		this.oldTimeout = SWTBotPreferences.TIMEOUT;
+		SWTBotPreferences.TIMEOUT = 2000;
+	}
+
+	@After
+	public void resetTimeout() {
+		SWTBotPreferences.TIMEOUT = oldTimeout;
+	}
 
 	@Test
 	public void clicksToggleButton() throws Exception {
 		try {
 			List<Text> findControls = new ControlFinder().findControls(widgetOfType(Text.class));
 			SWTBotText text = new SWTBotText(findControls.get(0));
+			bot.checkBox("Listen").select();
 			text.setText("");
-			assertFalse(bot.checkBox("Listen").isChecked());
-			bot.checkBox("Listen").click();
 
 			assertFalse(bot.toggleButton("One").isPressed());
 			bot.toggleButton("One").click();
 			assertTrue(bot.toggleButton("One").isPressed());
 			assertTextContains("Selection [13]: SelectionEvent{Button {One}", text);
 		} finally {
-			bot.checkBox("Listen").click();
+			bot.checkBox("Listen").deselect();
 			bot.button("Clear").click();
 		}
 	}
@@ -86,15 +98,10 @@
 		}
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Button").activate();
 		bot.radio("SWT.TOGGLE").click();
 	}
 	
-	public void tearDown() throws Exception {
-		super.tearDown();
-		bot.radio("SWT.PUSH").click();
-	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonTest.java
index a64e3d7..2ad37b7 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonTest.java
@@ -21,18 +21,17 @@
 import java.util.List;
 
 import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToolbarDropDownButtonTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotToolbarDropDownButtonTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsToolBarButtonWithIndex() throws Exception {
@@ -54,6 +53,7 @@
 	}
 
 	@Test
+	@Ignore("Broken on cocoa")
 	public void getsAllMenuItems() throws Exception {
 		List<? extends SWTBotMenu> menuItems = bot.toolbarDropDownButton("Drop Down").menuItems(any(MenuItem.class));
 		menuItems.get(0).click();
@@ -61,6 +61,7 @@
 	}
 
 	@Test
+	@Ignore
 	public void clicksADropDownMenuItem() throws Exception {
 		SWTBotToolbarDropDownButton button = bot.toolbarDropDownButton("Drop Down");
 		try {
@@ -73,9 +74,8 @@
 		button.menuItem("Kiwi").click();
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("ToolBar").activate();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonWithToolTipTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonWithToolTipTest.java
index a6b2551..2c6e7b7 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonWithToolTipTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButtonWithToolTipTest.java
@@ -16,18 +16,17 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.pass;
 import static org.junit.Assert.fail;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToolbarDropDownButtonWithToolTipTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotToolbarDropDownButtonWithToolTipTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsToolBarButtonWithIndex() throws Exception {
@@ -49,6 +48,7 @@
 	}
 
 	@Test
+	@Ignore
 	public void clicksADropDownMenuItem() throws Exception {
 		SWTBotToolbarDropDownButton button = bot.toolbarDropDownButtonWithTooltip("SWT.DROP_DOWN");
 		try {
@@ -61,9 +61,8 @@
 		button.menuItem("Kiwi").click();
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("ToolBar").activate();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonTest.java
index 72473fa..4f01f38 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonTest.java
@@ -17,20 +17,33 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
+import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToolbarPushButtonTest extends AbstractSWTTestCase {
+public class SWTBotToolbarPushButtonTest extends AbstractControlExampleTest {
 
-	private SWTBot	bot;
+	private long	oldTimeout;
+
+	@Before
+	public void lowerTimeout() {
+		this.oldTimeout = SWTBotPreferences.TIMEOUT;
+		SWTBotPreferences.TIMEOUT = 2000;
+	}
+
+	@After
+	public void resetTimeout() {
+		SWTBotPreferences.TIMEOUT = oldTimeout;
+	}
 
 	@Test
 	public void findsToolBarPushButtons() throws Exception {
@@ -96,9 +109,8 @@
 		}
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void activateTab() throws Exception {
 		bot.tabItem("ToolBar").activate();
 	}
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonWithToolTipTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonWithToolTipTest.java
index 53cb670..7605c41 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonWithToolTipTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButtonWithToolTipTest.java
@@ -12,13 +12,11 @@
 
 import static org.junit.Assert.assertEquals;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
-public class SWTBotToolbarPushButtonWithToolTipTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotToolbarPushButtonWithToolTipTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsToolBarButtonWithToolTipBasedOnIndex() throws Exception {
@@ -56,9 +54,8 @@
 		assertEquals("SWT.RADIO", toolTipText);
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("ToolBar").activate();
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButtonTest.java
index b59d75f..84e06ef 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButtonTest.java
@@ -13,8 +13,8 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertNotSameWidget;
 import static org.junit.Assert.assertTrue;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -22,9 +22,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToolbarRadioButtonTest extends AbstractSWTTestCase {
-
-	private SWTBot	bot;
+public class SWTBotToolbarRadioButtonTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsToolBarButtonWithIndex() throws Exception {
@@ -73,17 +71,10 @@
 		assertTrue(checked != button.isChecked());
 	}
 
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
 		bot.tabItem("ToolBar").activate();
 		bot.checkBox("Listen").select();
 	}
 
-	public void tearDown() throws Exception {
-		super.tearDown();
-		bot.radio("SWT.HORIZONTAL").click(); // reset the ui
-		bot.checkBox("Listen").deselect();
-	}
-
-}
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButtonTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButtonTest.java
index 26b3118..8830e6e 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButtonTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButtonTest.java
@@ -13,8 +13,8 @@
 import static org.eclipse.swtbot.swt.finder.SWTBotTestCase.assertNotSameWidget;
 import static org.junit.Assert.assertTrue;
 
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -22,8 +22,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotToolbarToggleButtonTest extends AbstractSWTTestCase {
-	private SWTBot	bot;
+public class SWTBotToolbarToggleButtonTest extends AbstractControlExampleTest {
 
 	@Test
 	public void findsToolBarButtonWithIndex() throws Exception {
@@ -72,17 +71,10 @@
 		assertTrue(checked != button.isChecked());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("ToolBar").activate();
 		bot.checkBox("Listen").select();
 	}
 
-	public void tearDown() throws Exception {
-		super.tearDown();
-		bot.radio("SWT.HORIZONTAL").click(); // reset the ui
-		bot.checkBox("Listen").deselect();
-	}
-
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTrayItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTrayItemTest.java
index 79c5a7c..43cdf9f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTrayItemTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTrayItemTest.java
@@ -14,32 +14,40 @@
 import static org.junit.Assert.assertTrue;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Tray;
 import org.eclipse.swt.widgets.TrayItem;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
 import org.eclipse.swtbot.swt.finder.results.WidgetResult;
+import org.eclipse.swtbot.swt.finder.test.AbstractSWTShellTest;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 
-public class SWTBotTrayItemTest extends AbstractSWTTestCase {
+public class SWTBotTrayItemTest extends AbstractSWTShellTest {
 
 	private Menu	tray_item_menu;
 	private Tray	tray;
 
+	@Override
+	protected void createUI(Composite parent) {
+	}
+
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
 		tray = getSystemTray();
 		createTrayItems();
 	}
 
+	@After
 	public void tearDown() throws Exception {
 		destroyTrayItems();
-		super.tearDown();
 	}
 
 	@Test
@@ -66,6 +74,7 @@
 	}
 
 	@Test
+	@Ignore
 	public void menuCanBeAccessedOnTrayItem() {
 		bot.trayItem(2).menu("Menu").click();
 		assertTrue(menuSelected);
@@ -79,7 +88,7 @@
 
 	private final Listener	popupMenu				= new Listener() {
 														public void handleEvent(Event event) {
-															tray_item_menu = new Menu(controlShell, SWT.POP_UP);
+															tray_item_menu = new Menu(shell, SWT.POP_UP);
 															MenuItem item = new MenuItem(tray_item_menu, SWT.PUSH);
 															item.setText("Menu");
 															item.addListener(SWT.Selection, menuSelectedListener);
@@ -136,4 +145,5 @@
 	public class SystemTrayNotSupportedException extends RuntimeException {
 		private static final long	serialVersionUID	= 1053812131263043591L;
 	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItemTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItemTest.java
index 036ffc7..7438374 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItemTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItemTest.java
@@ -19,8 +19,9 @@
 import static org.junit.Assert.fail;
 
 import org.eclipse.swtbot.swt.finder.exceptions.AssertionFailedException;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TableRow;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
@@ -28,7 +29,7 @@
  * @author Ketan Patel
  * @version $Id$
  */
-public class SWTBotTreeItemTest extends AbstractSWTTestCase {
+public class SWTBotTreeItemTest extends AbstractControlExampleTest {
 
 	private SWTBotTree	tree;
 	private SWTBotText	listeners;
@@ -38,9 +39,10 @@
 		SWTBotTreeItem node = tree.expandNode("Node 2").expandNode("Node 2.2").expandNode("Node 2.2.1");
 		bot.button("Clear").click();
 		node.contextMenu("getItem(Point) on mouse coordinates").click();
-		assertTextContains("Selection [13]: SelectionEvent{Tree {} ", listeners);
-		assertTextContains("MenuDetect [35]: Event {type=35 Tree {}", listeners);
-		assertTextContains("getItem(Point(Point {", listeners);
+		assertEventMatches(listeners, "MenuDetect [35]: Event {type=35 Tree {} time=175982645 data=null x=148 y=195 width=0 height=0 detail=0}");
+		assertEventMatches(listeners, "MouseDown [3]: MouseEvent{Tree {} time=175982645 data=null button=3 stateMask=0 x=122 y=81 count=1}");
+		assertEventMatches(listeners, "Selection [13]: SelectionEvent{Tree {} time=175985221 data=null item=TreeItem {Node 2.2.1} detail=0 x=0 y=0 width=0 height=0 stateMask=0 text=null doit=true}");
+		assertEventMatches(listeners, "getItem(Point(Point {");
 	}
 
 	@Test
@@ -233,10 +235,19 @@
 		assertTextContains("MouseDoubleClick [8]: MouseEvent{Tree {} ", listeners);
 		assertTextContains("DefaultSelection [14]: SelectionEvent{Tree {} ", listeners);
 		assertTextContains("MouseUp [4]: MouseEvent{Tree {} ", listeners);
+		assertTextContains("button=1", listeners);
+	}
+	
+	@Test
+	public void canExpandANodeUsingVarArgs() throws Exception {
+		SWTBotTreeItem node = tree.getTreeItem("Node 2").expand();
+		node = node.expandNode("Node 2.2", "Node 2.2.1");
+
+		assertEquals(7, tree.visibleRowCount());
 	}
 
-	public void setUp() throws Exception {
-		super.setUp();
+	@Before
+	public void prepareExample() throws Exception {
 		bot.tabItem("Tree").activate();
 		bot.checkBox("Horizontal Fill").select();
 		bot.checkBox("Vertical Fill").select();
diff --git a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeTest.java b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeTest.java
index 419e4f4..6de933f 100644
--- a/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeTest.java
+++ b/org.eclipse.swtbot.swt.finder.test/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -18,19 +18,24 @@
 
 import java.util.ArrayList;
 
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
+import org.eclipse.swtbot.swt.finder.exceptions.AssertionFailedException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.test.AbstractControlExampleTest;
 import org.eclipse.swtbot.swt.finder.utils.TableCollection;
 import org.eclipse.swtbot.swt.finder.utils.TableRow;
+import org.junit.Before;
 import org.junit.Test;
 
 /**
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-public class SWTBotTreeTest extends AbstractSWTTestCase {
+public class SWTBotTreeTest extends AbstractControlExampleTest {
 
 	private SWTBot		bot;
 	private SWTBotTree	tree;
@@ -187,17 +192,43 @@
 	}
 
 	@Test
+	public void clicksOnANodeInAColumn() throws Exception {
+		bot.checkBox("Multiple Columns").select();
+		bot.checkBox("Listen").select();
+		final SWTBotTreeItem node = bot.tree().expandNode("Node 2", true);
+		bot.button("Clear").click();
+		Rectangle columnBounds = getColumnBounds(node, 2);
+		int targetX = columnBounds.x +(columnBounds.width/2);
+		int targetY = columnBounds.y + (columnBounds.height/2);
+		node.click(2);
+		SWTBotText listener = bot.textInGroup("Listeners");
+		assertTextContains("MouseDown [3]: MouseEvent{Tree {}", listener);
+		assertTextContains("Selection [13]: SelectionEvent{Tree {}", listener);
+		assertTextContains("item=TreeItem {Node 2}", listener);
+		assertTextContains("x=" + targetX +" y=" + targetY, listener);
+		assertTextContains("MouseUp [4]: MouseEvent{Tree {}", listener);
+	}
+	
+	private Rectangle getColumnBounds(final SWTBotTreeItem node, final int columnIndex) {
+		 return UIThreadRunnable.syncExec(new Result<Rectangle>() {
+				public Rectangle run() {
+					return node.widget.getBounds(2);
+				}
+			});
+	}
+	
+	@Test
 	public void clicksOnANode() throws Exception {
 		bot.checkBox("Listen").select();
 		SWTBotTreeItem node = bot.tree().expandNode("Node 3").expandNode("Node 3.1");
 		bot.button("Clear").click();
 		node.click();
 		SWTBotText listener = bot.textInGroup("Listeners");
-		assertTextContains("MouseDown [3]: MouseEvent{Tree {}", listener);
-		assertTextContains("Selection [13]: SelectionEvent{Tree {}", listener);
-		assertTextContains("item=TreeItem {Node 3.1}", listener);
-		assertTextContains("MouseUp [4]: MouseEvent{Tree {}", listener);
+		assertEventMatches(listener, "MouseDown [3]: MouseEvent{Tree {} time=174577490 data=null button=1 stateMask=0 x=104 y=54 count=1}");
+		assertEventMatches(listener, "Selection [13]: SelectionEvent{Tree {} time=174577490 data=null item=TreeItem {Node 3.1} detail=0 x=0 y=0 width=0 height=0 stateMask=524288 text=null doit=true}");
+		assertEventMatches(listener, "MouseUp [4]: MouseEvent{Tree {} time=174577490 data=null button=1 stateMask=524288 x=104 y=54 count=1}");
 	}
+	
 
 	@Test
 	public void doubleClicksOnANode() throws Exception {
@@ -215,8 +246,21 @@
 		assertTextContains("MouseDoubleClick [8]: MouseEvent{Tree {} ", listener);
 	}
 
+	@Test
+	public void expandANodePath() throws Exception {
+		SWTBotTree tree = bot.treeInGroup("Tree");
+
+		tree.expandNode("Node 2", "Node 2.2", "Node 2.2.1");
+		assertEquals(7, tree.visibleRowCount());
+	}
+
+	@Test(expected=AssertionFailedException.class)
+	public void expandEmptyPath() throws Exception {
+		bot.tree().expandNode();
+	}
+	
+	@Before
 	public void setUp() throws Exception {
-		super.setUp();
 		bot = new SWTBot();
 		bot.tabItem("Tree").activate();
 		bot.checkBox("Listen").deselect();
diff --git a/org.eclipse.swtbot.swt.finder/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.finder/META-INF/MANIFEST.MF
index a3dea62..d36d7b7 100644
--- a/org.eclipse.swtbot.swt.finder/META-INF/MANIFEST.MF
+++ b/org.eclipse.swtbot.swt.finder/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: SWTBot SWT Control Finder plugin (incubation)
 Bundle-SymbolicName: org.eclipse.swtbot.swt.finder;singleton:=true
-Bundle-Version: 2.0.0.qualifier
+Bundle-Version: 2.0.5.qualifier
 Bundle-ActivationPolicy: lazy
 Bundle-ClassPath: .
 Export-Package: org.eclipse.swtbot.swt.finder,
@@ -16,16 +16,18 @@
  org.eclipse.swtbot.swt.finder.utils.internal,
  org.eclipse.swtbot.swt.finder.waits,
  org.eclipse.swtbot.swt.finder.widgets
-Bundle-Vendor: Eclipse.org
+Bundle-Vendor: Eclipse.org - SWTBot
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Eclipse-BuddyPolicy: registered
-Import-Package: junit.framework;version="4.3.0",
- org.apache.log4j;version="1.2.13",
+Import-Package: junit.framework;version="4.5.0",
+ org.apache.log4j;version="[1.2.13,1.3.0)",
  org.eclipse.jface.bindings.keys,
  org.eclipse.swt,
+ org.eclipse.swt.browser,
  org.eclipse.swt.custom,
  org.eclipse.swt.events,
  org.eclipse.swt.graphics,
  org.eclipse.swt.widgets,
- org.hamcrest;version="1.1.0",
- org.junit;version="4.3.0"
+ org.junit;version="4.5.0"
+Require-Bundle: org.hamcrest.core;bundle-version="1.1.0",
+ org.hamcrest;bundle-version="1.1.0"
diff --git a/org.eclipse.swtbot.swt.finder/build.properties b/org.eclipse.swtbot.swt.finder/build.properties
index 22e22f7..80d9812 100644
--- a/org.eclipse.swtbot.swt.finder/build.properties
+++ b/org.eclipse.swtbot.swt.finder/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar and others.
+# Copyright (c) 2010 Ketan Padegaonkar 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
@@ -13,11 +13,6 @@
                LICENSE.EPL,\
                about.html,\
                src/
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               build.properties,\
-               src/,\
+src.includes = LICENSE.EPL,\
                about.html
 source.. = src/
diff --git a/org.eclipse.swtbot.swt.finder/pom.xml b/org.eclipse.swtbot.swt.finder/pom.xml
new file mode 100644
index 0000000..2163aeb
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.swtbot.swt.finder</artifactId>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/ReferenceBy.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/ReferenceBy.java
index 59362d2..4f0ebfa 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/ReferenceBy.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/ReferenceBy.java
@@ -23,8 +23,8 @@
  */
 public enum ReferenceBy {
 	TEXT(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
-			return other != LABEL && other != TOOLTIP && other != MNEMONIC;
+		public boolean isCompatibleWith(ReferenceBy other) {
+			return other != LABEL && other != TOOLTIP && other != MNEMONIC && other != MESSAGE;
 		}
 
 		public String matcherMethod() {
@@ -36,8 +36,8 @@
 		}
 	},
 	MNEMONIC(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
-			return other != LABEL && other != TOOLTIP && other != TEXT;
+		public boolean isCompatibleWith(ReferenceBy other) {
+			return other != LABEL && other != TOOLTIP && other != TEXT && other != MESSAGE;
 		}
 
 		public String matcherMethod() {
@@ -53,8 +53,8 @@
 		}
 	},
 	LABEL(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
-			return other != TEXT && other != TOOLTIP && other != MNEMONIC;
+		public boolean isCompatibleWith(ReferenceBy other) {
+			return other != TEXT && other != TOOLTIP && other != MNEMONIC && other != MESSAGE;
 		}
 
 		public String matcherMethod() {
@@ -62,16 +62,25 @@
 		}
 	},
 	TOOLTIP(90) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
-			return other != TEXT && other != LABEL && other != MNEMONIC;
+		public boolean isCompatibleWith(ReferenceBy other) {
+			return other != TEXT && other != LABEL && other != MNEMONIC  && other != MESSAGE;
 		}
 
 		public String matcherMethod() {
 			return "withTooltip(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
 		}
 	},
+	MESSAGE(90) {
+		public boolean isCompatibleWith(ReferenceBy other) {
+			return other != TEXT && other != LABEL && other != MNEMONIC && other != TOOLTIP && other != IN_GROUP;
+		}
+
+		public String matcherMethod() {
+			return "withMessage(" + argumentName() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
+		}
+	},
 	ID_KEY_VALUE(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
+		public boolean isCompatibleWith(ReferenceBy other) {
 			return false;
 		}
 
@@ -96,7 +105,7 @@
 		}
 	},
 	ID_VALUE(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
+		public boolean isCompatibleWith(ReferenceBy other) {
 			return false;
 		}
 
@@ -121,7 +130,7 @@
 		}
 	},
 	NONE(100) {
-		protected boolean isCompatibleWith(ReferenceBy other) {
+		public boolean isCompatibleWith(ReferenceBy other) {
 			return false;
 		}
 
@@ -156,7 +165,7 @@
 		this.priority = priority;
 	}
 
-	protected boolean isCompatibleWith(ReferenceBy other) {
+	public boolean isCompatibleWith(ReferenceBy other) {
 		return true;
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBot.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBot.java
index 81c72a5..e9ec04a 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBot.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBot.java
@@ -1,8 +1,10 @@
-// Generated source.
+// Generated source. DO NOT MODIFY.
+// To add new widgets, please see README file in the generator plugin.
 package org.eclipse.swtbot.swt.finder;
 
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
 import org.eclipse.swt.custom.CCombo;
 import org.eclipse.swt.custom.CLabel;
 import org.eclipse.swt.custom.CTabItem;
@@ -10,9 +12,11 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Combo;
 import org.eclipse.swt.widgets.DateTime;
+import org.eclipse.swt.widgets.ExpandBar;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Link;
 import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Scale;
 import org.eclipse.swt.widgets.Slider;
 import org.eclipse.swt.widgets.Spinner;
 import org.eclipse.swt.widgets.TabItem;
@@ -21,10 +25,14 @@
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.finders.ChildrenControlFinder;
 import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
 import org.eclipse.swtbot.swt.finder.finders.Finder;
 import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
+import org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotArrowButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotBrowser;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotCCombo;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotCLabel;
@@ -32,10 +40,12 @@
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotCombo;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotDateTime;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotExpandBar;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotLabel;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotLink;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotList;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotRadio;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotScale;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotSlider;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotSpinner;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotStyledText;
@@ -44,17 +54,17 @@
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotText;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToggleButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarButton;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarToggleButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarDropDownButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarPushButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarRadioButton;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotToolbarToggleButton;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 import org.hamcrest.Matcher;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.inGroup;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withId;
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withLabel;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMessage;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withStyle;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText;
@@ -86,7 +96,7 @@
  *    // find a button within the currently active shell:
  *    //
  *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher)); // or
- *    SWTBotButton button = new SWTBotButton((Button)bot.widget(aMatcher, 3)); // for the 4th widget
+ *    SWTBotButton button = new SWTBotButton((Button) bot.widget(aMatcher, 3)); // for the 4th widget
  *    //
  *    // to find a button within a particular parent composite:
  *    //
@@ -135,6 +145,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithLabel(String label) {
 		return buttonWithLabel(label, 0);
@@ -144,8 +155,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -154,6 +166,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton button(String mnemonicText) {
 		return button(mnemonicText, 0);
@@ -163,8 +176,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton button(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -173,6 +187,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithTooltip(String tooltip) {
 		return buttonWithTooltip(tooltip, 0);
@@ -182,8 +197,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -193,6 +209,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithId(String key, String value) {
 		return buttonWithId(key, value, 0);
@@ -203,8 +220,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(key, value), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -213,6 +231,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithId(String value) {
 		return buttonWithId(value, 0);
@@ -222,8 +241,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(value), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -232,6 +252,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonInGroup(String inGroup) {
 		return buttonInGroup(inGroup, 0);
@@ -241,8 +262,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -250,6 +272,7 @@
 
 	/**
 	 * @return a {@link SWTBotButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton button() {
 		return button(0);
@@ -258,8 +281,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton button(int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -269,6 +293,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithLabelInGroup(String label, String inGroup) {
 		return buttonWithLabelInGroup(label, inGroup, 0);
@@ -279,8 +304,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -290,6 +316,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonInGroup(String mnemonicText, String inGroup) {
 		return buttonInGroup(mnemonicText, inGroup, 0);
@@ -300,8 +327,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -311,6 +339,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotButton buttonWithTooltipInGroup(String tooltip, String inGroup) {
 		return buttonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -321,8 +350,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotButton buttonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotButton((Button) widget(matcher, index), matcher);
@@ -330,7 +360,180 @@
 
 	/**
 	 * @param label the label on the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithLabel(String label) {
+		return arrowButtonWithLabel(label, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithLabel(String label, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithTooltip(String tooltip) {
+		return arrowButtonWithTooltip(tooltip, 0);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithTooltip(String tooltip, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithId(String key, String value) {
+		return arrowButtonWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withId(key, value), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithId(String value) {
+		return arrowButtonWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withId(value), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonInGroup(String inGroup) {
+		return arrowButtonInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotArrowButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButton() {
+		return arrowButton(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButton(int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithLabelInGroup(String label, String inGroup) {
+		return arrowButtonWithLabelInGroup(label, inGroup, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithLabelInGroup(String label, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), inGroup(inGroup), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotArrowButton arrowButtonWithTooltipInGroup(String tooltip, String inGroup) {
+		return arrowButtonWithTooltipInGroup(tooltip, inGroup, 0);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotArrowButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotArrowButton arrowButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.ARROW, "SWT.ARROW"));
+		return new SWTBotArrowButton((Button) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithLabel(String label) {
 		return checkBoxWithLabel(label, 0);
@@ -340,8 +543,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -350,6 +554,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBox(String mnemonicText) {
 		return checkBox(mnemonicText, 0);
@@ -359,8 +564,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBox(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -369,6 +575,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithTooltip(String tooltip) {
 		return checkBoxWithTooltip(tooltip, 0);
@@ -378,8 +585,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -389,6 +597,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithId(String key, String value) {
 		return checkBoxWithId(key, value, 0);
@@ -399,8 +608,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(key, value), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -409,6 +619,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithId(String value) {
 		return checkBoxWithId(value, 0);
@@ -418,8 +629,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(value), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -428,6 +640,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxInGroup(String inGroup) {
 		return checkBoxInGroup(inGroup, 0);
@@ -437,8 +650,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -446,6 +660,7 @@
 
 	/**
 	 * @return a {@link SWTBotCheckBox} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBox() {
 		return checkBox(0);
@@ -454,8 +669,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBox(int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -465,6 +681,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithLabelInGroup(String label, String inGroup) {
 		return checkBoxWithLabelInGroup(label, inGroup, 0);
@@ -475,8 +692,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -486,6 +704,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxInGroup(String mnemonicText, String inGroup) {
 		return checkBoxInGroup(mnemonicText, inGroup, 0);
@@ -496,8 +715,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -507,6 +727,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCheckBox checkBoxWithTooltipInGroup(String tooltip, String inGroup) {
 		return checkBoxWithTooltipInGroup(tooltip, inGroup, 0);
@@ -517,8 +738,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCheckBox} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCheckBox checkBoxWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotCheckBox((Button) widget(matcher, index), matcher);
@@ -527,6 +749,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithLabel(String label) {
 		return radioWithLabel(label, 0);
@@ -536,8 +759,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -546,6 +770,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radio(String mnemonicText) {
 		return radio(mnemonicText, 0);
@@ -555,8 +780,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radio(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -565,6 +791,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithTooltip(String tooltip) {
 		return radioWithTooltip(tooltip, 0);
@@ -574,8 +801,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -585,6 +813,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotRadio} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithId(String key, String value) {
 		return radioWithId(key, value, 0);
@@ -595,8 +824,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(key, value), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -605,6 +835,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotRadio} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithId(String value) {
 		return radioWithId(value, 0);
@@ -614,8 +845,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(value), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -624,6 +856,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioInGroup(String inGroup) {
 		return radioInGroup(inGroup, 0);
@@ -633,8 +866,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -642,6 +876,7 @@
 
 	/**
 	 * @return a {@link SWTBotRadio} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radio() {
 		return radio(0);
@@ -650,8 +885,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radio(int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -661,6 +897,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithLabelInGroup(String label, String inGroup) {
 		return radioWithLabelInGroup(label, inGroup, 0);
@@ -671,8 +908,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -682,6 +920,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioInGroup(String mnemonicText, String inGroup) {
 		return radioInGroup(mnemonicText, inGroup, 0);
@@ -692,8 +931,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -703,6 +943,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotRadio radioWithTooltipInGroup(String tooltip, String inGroup) {
 		return radioWithTooltipInGroup(tooltip, inGroup, 0);
@@ -713,8 +954,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotRadio} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotRadio radioWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotRadio((Button) widget(matcher, index), matcher);
@@ -723,6 +965,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithLabel(String label) {
 		return toggleButtonWithLabel(label, 0);
@@ -732,8 +975,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -742,6 +986,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButton(String mnemonicText) {
 		return toggleButton(mnemonicText, 0);
@@ -751,8 +996,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButton(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -761,6 +1007,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithTooltip(String tooltip) {
 		return toggleButtonWithTooltip(tooltip, 0);
@@ -770,8 +1017,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -781,6 +1029,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithId(String key, String value) {
 		return toggleButtonWithId(key, value, 0);
@@ -791,8 +1040,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(key, value), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -801,6 +1051,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithId(String value) {
 		return toggleButtonWithId(value, 0);
@@ -810,8 +1061,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withId(value), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -820,6 +1072,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonInGroup(String inGroup) {
 		return toggleButtonInGroup(inGroup, 0);
@@ -829,8 +1082,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), inGroup(inGroup), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -838,6 +1092,7 @@
 
 	/**
 	 * @return a {@link SWTBotToggleButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButton() {
 		return toggleButton(0);
@@ -846,8 +1101,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButton(int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -857,6 +1113,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithLabelInGroup(String label, String inGroup) {
 		return toggleButtonWithLabelInGroup(label, inGroup, 0);
@@ -867,8 +1124,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withLabel(label), inGroup(inGroup), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -878,6 +1136,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonInGroup(String mnemonicText, String inGroup) {
 		return toggleButtonInGroup(mnemonicText, inGroup, 0);
@@ -888,8 +1147,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -899,6 +1159,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToggleButton toggleButtonWithTooltipInGroup(String tooltip, String inGroup) {
 		return toggleButtonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -909,8 +1170,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToggleButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToggleButton toggleButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Button.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.TOGGLE, "SWT.TOGGLE"));
 		return new SWTBotToggleButton((Button) widget(matcher, index), matcher);
@@ -919,6 +1181,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree treeWithLabel(String label) {
 		return treeWithLabel(label, 0);
@@ -928,8 +1191,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree treeWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class), withLabel(label));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -939,6 +1203,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotTree} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree treeWithId(String key, String value) {
 		return treeWithId(key, value, 0);
@@ -949,8 +1214,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree treeWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class), withId(key, value));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -959,6 +1225,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotTree} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree treeWithId(String value) {
 		return treeWithId(value, 0);
@@ -968,8 +1235,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree treeWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class), withId(value));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -978,6 +1246,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree treeInGroup(String inGroup) {
 		return treeInGroup(inGroup, 0);
@@ -987,8 +1256,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree treeInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class), inGroup(inGroup));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -996,6 +1266,7 @@
 
 	/**
 	 * @return a {@link SWTBotTree} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree tree() {
 		return tree(0);
@@ -1004,8 +1275,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree tree(int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -1015,6 +1287,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTree treeWithLabelInGroup(String label, String inGroup) {
 		return treeWithLabelInGroup(label, inGroup, 0);
@@ -1025,8 +1298,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTree} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTree treeWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Tree.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotTree((Tree) widget(matcher, index), matcher);
@@ -1035,6 +1309,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithLabel(String label) {
 		return textWithLabel(label, 0);
@@ -1044,8 +1319,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withLabel(label));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1054,6 +1330,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText text(String text) {
 		return text(text, 0);
@@ -1063,8 +1340,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText text(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withText(text));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1073,6 +1351,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithTooltip(String tooltip) {
 		return textWithTooltip(tooltip, 0);
@@ -1082,17 +1361,40 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withTooltip(tooltip));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
 	}
 
 	/**
+	 * @param message the message on the widget.
+	 * @return a {@link SWTBotText} with the specified <code>message</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotText textWithMessage(String message) {
+		return textWithMessage(message, 0);
+	}
+
+	/**
+	 * @param message the message on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotText} with the specified <code>message</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotText textWithMessage(String message, int index) {
+		Matcher matcher = allOf(widgetOfType(Text.class), withMessage(message));
+		return new SWTBotText((Text) widget(matcher, index), matcher);
+	}
+
+	/**
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotText} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithId(String key, String value) {
 		return textWithId(key, value, 0);
@@ -1103,8 +1405,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withId(key, value));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1113,6 +1416,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotText} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithId(String value) {
 		return textWithId(value, 0);
@@ -1122,8 +1426,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withId(value));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1132,6 +1437,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textInGroup(String inGroup) {
 		return textInGroup(inGroup, 0);
@@ -1141,8 +1447,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), inGroup(inGroup));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1150,6 +1457,7 @@
 
 	/**
 	 * @return a {@link SWTBotText} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText text() {
 		return text(0);
@@ -1158,8 +1466,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText text(int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1169,6 +1478,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithLabelInGroup(String label, String inGroup) {
 		return textWithLabelInGroup(label, inGroup, 0);
@@ -1179,8 +1489,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1190,6 +1501,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textInGroup(String text, String inGroup) {
 		return textInGroup(text, inGroup, 0);
@@ -1200,8 +1512,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withText(text), inGroup(inGroup));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1211,6 +1524,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotText} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotText textWithTooltipInGroup(String tooltip, String inGroup) {
 		return textWithTooltipInGroup(tooltip, inGroup, 0);
@@ -1221,8 +1535,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotText} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotText textWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Text.class), withTooltip(tooltip), inGroup(inGroup));
 		return new SWTBotText((Text) widget(matcher, index), matcher);
@@ -1231,6 +1546,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxWithLabel(String label) {
 		return comboBoxWithLabel(label, 0);
@@ -1240,8 +1556,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withLabel(label));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1250,6 +1567,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBox(String text) {
 		return comboBox(text, 0);
@@ -1259,8 +1577,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBox(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withText(text));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1270,6 +1589,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotCombo} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxWithId(String key, String value) {
 		return comboBoxWithId(key, value, 0);
@@ -1280,8 +1600,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withId(key, value));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1290,6 +1611,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotCombo} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxWithId(String value) {
 		return comboBoxWithId(value, 0);
@@ -1299,8 +1621,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withId(value));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1309,6 +1632,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxInGroup(String inGroup) {
 		return comboBoxInGroup(inGroup, 0);
@@ -1318,8 +1642,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), inGroup(inGroup));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1327,6 +1652,7 @@
 
 	/**
 	 * @return a {@link SWTBotCombo} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBox() {
 		return comboBox(0);
@@ -1335,8 +1661,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBox(int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1346,6 +1673,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxWithLabelInGroup(String label, String inGroup) {
 		return comboBoxWithLabelInGroup(label, inGroup, 0);
@@ -1356,8 +1684,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1367,6 +1696,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCombo comboBoxInGroup(String text, String inGroup) {
 		return comboBoxInGroup(text, inGroup, 0);
@@ -1377,8 +1707,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCombo} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCombo comboBoxInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Combo.class), withText(text), inGroup(inGroup));
 		return new SWTBotCombo((Combo) widget(matcher, index), matcher);
@@ -1387,6 +1718,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBox(String text) {
 		return ccomboBox(text, 0);
@@ -1396,8 +1728,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBox(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withText(text));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1406,6 +1739,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxWithLabel(String label) {
 		return ccomboBoxWithLabel(label, 0);
@@ -1415,8 +1749,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withLabel(label));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1426,6 +1761,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotCCombo} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxWithId(String key, String value) {
 		return ccomboBoxWithId(key, value, 0);
@@ -1436,8 +1772,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withId(key, value));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1446,6 +1783,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotCCombo} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxWithId(String value) {
 		return ccomboBoxWithId(value, 0);
@@ -1455,8 +1793,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withId(value));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1465,6 +1804,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxInGroup(String inGroup) {
 		return ccomboBoxInGroup(inGroup, 0);
@@ -1474,8 +1814,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), inGroup(inGroup));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1483,6 +1824,7 @@
 
 	/**
 	 * @return a {@link SWTBotCCombo} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBox() {
 		return ccomboBox(0);
@@ -1491,8 +1833,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBox(int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1502,6 +1845,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxInGroup(String text, String inGroup) {
 		return ccomboBoxInGroup(text, inGroup, 0);
@@ -1512,8 +1856,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withText(text), inGroup(inGroup));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1523,6 +1868,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCCombo ccomboBoxWithLabelInGroup(String label, String inGroup) {
 		return ccomboBoxWithLabelInGroup(label, inGroup, 0);
@@ -1533,8 +1879,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCCombo} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCCombo ccomboBoxWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CCombo.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotCCombo((CCombo) widget(matcher, index), matcher);
@@ -1543,6 +1890,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabel(String mnemonicText) {
 		return clabel(mnemonicText, 0);
@@ -1552,8 +1900,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabel(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class), withMnemonic(mnemonicText));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1563,6 +1912,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotCLabel} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabelWithId(String key, String value) {
 		return clabelWithId(key, value, 0);
@@ -1573,8 +1923,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabelWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class), withId(key, value));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1583,6 +1934,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotCLabel} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabelWithId(String value) {
 		return clabelWithId(value, 0);
@@ -1592,8 +1944,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabelWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class), withId(value));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1602,6 +1955,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabelInGroup(String inGroup) {
 		return clabelInGroup(inGroup, 0);
@@ -1611,8 +1965,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabelInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class), inGroup(inGroup));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1620,6 +1975,7 @@
 
 	/**
 	 * @return a {@link SWTBotCLabel} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabel() {
 		return clabel(0);
@@ -1628,8 +1984,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabel(int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1639,6 +1996,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCLabel clabelInGroup(String mnemonicText, String inGroup) {
 		return clabelInGroup(mnemonicText, inGroup, 0);
@@ -1649,8 +2007,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCLabel} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCLabel clabelInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CLabel.class), withMnemonic(mnemonicText), inGroup(inGroup));
 		return new SWTBotCLabel((CLabel) widget(matcher, index), matcher);
@@ -1659,6 +2018,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel label(String mnemonicText) {
 		return label(mnemonicText, 0);
@@ -1668,8 +2028,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel label(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class), withMnemonic(mnemonicText));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1679,6 +2040,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotLabel} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel labelWithId(String key, String value) {
 		return labelWithId(key, value, 0);
@@ -1689,8 +2051,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel labelWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class), withId(key, value));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1699,6 +2062,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotLabel} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel labelWithId(String value) {
 		return labelWithId(value, 0);
@@ -1708,8 +2072,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel labelWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class), withId(value));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1718,6 +2083,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel labelInGroup(String inGroup) {
 		return labelInGroup(inGroup, 0);
@@ -1727,8 +2093,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel labelInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class), inGroup(inGroup));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1736,6 +2103,7 @@
 
 	/**
 	 * @return a {@link SWTBotLabel} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel label() {
 		return label(0);
@@ -1744,8 +2112,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel label(int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1755,6 +2124,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLabel labelInGroup(String mnemonicText, String inGroup) {
 		return labelInGroup(mnemonicText, inGroup, 0);
@@ -1765,8 +2135,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLabel} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLabel labelInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Label.class), withMnemonic(mnemonicText), inGroup(inGroup));
 		return new SWTBotLabel((Label) widget(matcher, index), matcher);
@@ -1775,6 +2146,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotList} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList listWithLabel(String label) {
 		return listWithLabel(label, 0);
@@ -1784,8 +2156,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList listWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(List.class), withLabel(label));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1795,6 +2168,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotList} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList listWithId(String key, String value) {
 		return listWithId(key, value, 0);
@@ -1805,8 +2179,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList listWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(List.class), withId(key, value));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1815,6 +2190,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotList} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList listWithId(String value) {
 		return listWithId(value, 0);
@@ -1824,8 +2200,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList listWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(List.class), withId(value));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1834,6 +2211,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotList} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList listInGroup(String inGroup) {
 		return listInGroup(inGroup, 0);
@@ -1843,8 +2221,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList listInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(List.class), inGroup(inGroup));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1852,6 +2231,7 @@
 
 	/**
 	 * @return a {@link SWTBotList} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList list() {
 		return list(0);
@@ -1860,8 +2240,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList list(int index) {
 		Matcher matcher = allOf(widgetOfType(List.class));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1871,6 +2252,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotList} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotList listWithLabelInGroup(String label, String inGroup) {
 		return listWithLabelInGroup(label, inGroup, 0);
@@ -1881,8 +2263,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotList} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotList listWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(List.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotList((List) widget(matcher, index), matcher);
@@ -1891,6 +2274,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable tableWithLabel(String label) {
 		return tableWithLabel(label, 0);
@@ -1900,8 +2284,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable tableWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class), withLabel(label));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -1911,6 +2296,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotTable} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable tableWithId(String key, String value) {
 		return tableWithId(key, value, 0);
@@ -1921,8 +2307,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable tableWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class), withId(key, value));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -1931,6 +2318,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotTable} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable tableWithId(String value) {
 		return tableWithId(value, 0);
@@ -1940,8 +2328,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable tableWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class), withId(value));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -1950,6 +2339,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable tableInGroup(String inGroup) {
 		return tableInGroup(inGroup, 0);
@@ -1959,8 +2349,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable tableInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class), inGroup(inGroup));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -1968,6 +2359,7 @@
 
 	/**
 	 * @return a {@link SWTBotTable} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable table() {
 		return table(0);
@@ -1976,8 +2368,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable table(int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -1987,6 +2380,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTable tableWithLabelInGroup(String label, String inGroup) {
 		return tableWithLabelInGroup(label, inGroup, 0);
@@ -1997,8 +2391,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTable} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTable tableWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Table.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotTable((Table) widget(matcher, index), matcher);
@@ -2007,6 +2402,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItem(String mnemonicText) {
 		return tabItem(mnemonicText, 0);
@@ -2016,8 +2412,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItem(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class), withMnemonic(mnemonicText));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2027,6 +2424,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotTabItem} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItemWithId(String key, String value) {
 		return tabItemWithId(key, value, 0);
@@ -2037,8 +2435,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItemWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class), withId(key, value));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2047,6 +2446,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotTabItem} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItemWithId(String value) {
 		return tabItemWithId(value, 0);
@@ -2056,8 +2456,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItemWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class), withId(value));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2066,6 +2467,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItemInGroup(String inGroup) {
 		return tabItemInGroup(inGroup, 0);
@@ -2075,8 +2477,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItemInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class), inGroup(inGroup));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2084,6 +2487,7 @@
 
 	/**
 	 * @return a {@link SWTBotTabItem} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItem() {
 		return tabItem(0);
@@ -2092,8 +2496,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItem(int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2103,6 +2508,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotTabItem tabItemInGroup(String mnemonicText, String inGroup) {
 		return tabItemInGroup(mnemonicText, inGroup, 0);
@@ -2113,8 +2519,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotTabItem} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotTabItem tabItemInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(TabItem.class), withMnemonic(mnemonicText), inGroup(inGroup));
 		return new SWTBotTabItem((TabItem) widget(matcher, index), matcher);
@@ -2123,6 +2530,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItem(String mnemonicText) {
 		return cTabItem(mnemonicText, 0);
@@ -2132,8 +2540,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItem(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class), withMnemonic(mnemonicText));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2143,6 +2552,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItemWithId(String key, String value) {
 		return cTabItemWithId(key, value, 0);
@@ -2153,8 +2563,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItemWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class), withId(key, value));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2163,6 +2574,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItemWithId(String value) {
 		return cTabItemWithId(value, 0);
@@ -2172,8 +2584,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItemWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class), withId(value));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2182,6 +2595,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItemInGroup(String inGroup) {
 		return cTabItemInGroup(inGroup, 0);
@@ -2191,8 +2605,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItemInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class), inGroup(inGroup));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2200,6 +2615,7 @@
 
 	/**
 	 * @return a {@link SWTBotCTabItem} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItem() {
 		return cTabItem(0);
@@ -2208,8 +2624,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItem(int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2219,6 +2636,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotCTabItem cTabItemInGroup(String mnemonicText, String inGroup) {
 		return cTabItemInGroup(mnemonicText, inGroup, 0);
@@ -2229,8 +2647,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotCTabItem} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotCTabItem cTabItemInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(CTabItem.class), withMnemonic(mnemonicText), inGroup(inGroup));
 		return new SWTBotCTabItem((CTabItem) widget(matcher, index), matcher);
@@ -2239,6 +2658,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextWithLabel(String label) {
 		return styledTextWithLabel(label, 0);
@@ -2248,8 +2668,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withLabel(label));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2258,6 +2679,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledText(String text) {
 		return styledText(text, 0);
@@ -2267,8 +2689,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledText(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withText(text));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2278,6 +2701,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotStyledText} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextWithId(String key, String value) {
 		return styledTextWithId(key, value, 0);
@@ -2288,8 +2712,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withId(key, value));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2298,6 +2723,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotStyledText} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextWithId(String value) {
 		return styledTextWithId(value, 0);
@@ -2307,8 +2733,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withId(value));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2317,6 +2744,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextInGroup(String inGroup) {
 		return styledTextInGroup(inGroup, 0);
@@ -2326,8 +2754,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), inGroup(inGroup));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2335,6 +2764,7 @@
 
 	/**
 	 * @return a {@link SWTBotStyledText} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledText() {
 		return styledText(0);
@@ -2343,8 +2773,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledText(int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2354,6 +2785,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextWithLabelInGroup(String label, String inGroup) {
 		return styledTextWithLabelInGroup(label, inGroup, 0);
@@ -2364,8 +2796,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2375,6 +2808,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotStyledText styledTextInGroup(String text, String inGroup) {
 		return styledTextInGroup(text, inGroup, 0);
@@ -2385,8 +2819,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotStyledText} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotStyledText styledTextInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(StyledText.class), withText(text), inGroup(inGroup));
 		return new SWTBotStyledText((StyledText) widget(matcher, index), matcher);
@@ -2395,6 +2830,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTimeWithLabel(String label) {
 		return dateTimeWithLabel(label, 0);
@@ -2404,8 +2840,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTimeWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class), withLabel(label));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2415,6 +2852,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotDateTime} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTimeWithId(String key, String value) {
 		return dateTimeWithId(key, value, 0);
@@ -2425,8 +2863,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTimeWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class), withId(key, value));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2435,6 +2874,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotDateTime} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTimeWithId(String value) {
 		return dateTimeWithId(value, 0);
@@ -2444,8 +2884,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTimeWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class), withId(value));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2454,6 +2895,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTimeInGroup(String inGroup) {
 		return dateTimeInGroup(inGroup, 0);
@@ -2463,8 +2905,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTimeInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class), inGroup(inGroup));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2472,6 +2915,7 @@
 
 	/**
 	 * @return a {@link SWTBotDateTime} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTime() {
 		return dateTime(0);
@@ -2480,8 +2924,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTime(int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2491,6 +2936,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotDateTime dateTimeWithLabelInGroup(String label, String inGroup) {
 		return dateTimeWithLabelInGroup(label, inGroup, 0);
@@ -2501,8 +2947,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotDateTime} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotDateTime dateTimeWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(DateTime.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotDateTime((DateTime) widget(matcher, index), matcher);
@@ -2511,6 +2958,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButton(String mnemonicText) {
 		return toolbarButton(mnemonicText, 0);
@@ -2520,8 +2968,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButton(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2530,6 +2979,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonWithTooltip(String tooltip) {
 		return toolbarButtonWithTooltip(tooltip, 0);
@@ -2539,8 +2989,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2550,6 +3001,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonWithId(String key, String value) {
 		return toolbarButtonWithId(key, value, 0);
@@ -2560,8 +3012,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(key, value), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2570,6 +3023,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonWithId(String value) {
 		return toolbarButtonWithId(value, 0);
@@ -2579,8 +3033,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(value), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2589,6 +3044,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonInGroup(String inGroup) {
 		return toolbarButtonInGroup(inGroup, 0);
@@ -2598,8 +3054,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2607,6 +3064,7 @@
 
 	/**
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButton() {
 		return toolbarButton(0);
@@ -2615,8 +3073,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButton(int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2626,6 +3085,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonInGroup(String mnemonicText, String inGroup) {
 		return toolbarButtonInGroup(mnemonicText, inGroup, 0);
@@ -2636,8 +3096,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2647,6 +3108,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarButton toolbarButtonWithTooltipInGroup(String tooltip, String inGroup) {
 		return toolbarButtonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -2657,8 +3119,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarButton toolbarButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.PUSH, "SWT.PUSH"));
 		return new SWTBotToolbarPushButton((ToolItem) widget(matcher, index), matcher);
@@ -2667,6 +3130,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButton(String mnemonicText) {
 		return toolbarToggleButton(mnemonicText, 0);
@@ -2676,8 +3140,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButton(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2686,6 +3151,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithTooltip(String tooltip) {
 		return toolbarToggleButtonWithTooltip(tooltip, 0);
@@ -2695,8 +3161,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2706,6 +3173,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithId(String key, String value) {
 		return toolbarToggleButtonWithId(key, value, 0);
@@ -2716,8 +3184,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(key, value), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2726,6 +3195,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithId(String value) {
 		return toolbarToggleButtonWithId(value, 0);
@@ -2735,8 +3205,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(value), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2745,6 +3216,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonInGroup(String inGroup) {
 		return toolbarToggleButtonInGroup(inGroup, 0);
@@ -2754,8 +3226,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2763,6 +3236,7 @@
 
 	/**
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButton() {
 		return toolbarToggleButton(0);
@@ -2771,8 +3245,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButton(int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2782,6 +3257,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonInGroup(String mnemonicText, String inGroup) {
 		return toolbarToggleButtonInGroup(mnemonicText, inGroup, 0);
@@ -2792,8 +3268,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2803,6 +3280,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithTooltipInGroup(String tooltip, String inGroup) {
 		return toolbarToggleButtonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -2813,8 +3291,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarToggleButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarToggleButton toolbarToggleButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.CHECK, "SWT.CHECK"));
 		return new SWTBotToolbarToggleButton((ToolItem) widget(matcher, index), matcher);
@@ -2823,6 +3302,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButton(String mnemonicText) {
 		return toolbarDropDownButton(mnemonicText, 0);
@@ -2832,8 +3312,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButton(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2842,6 +3323,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithTooltip(String tooltip) {
 		return toolbarDropDownButtonWithTooltip(tooltip, 0);
@@ -2851,8 +3333,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2862,6 +3345,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithId(String key, String value) {
 		return toolbarDropDownButtonWithId(key, value, 0);
@@ -2872,8 +3356,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(key, value), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2882,6 +3367,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithId(String value) {
 		return toolbarDropDownButtonWithId(value, 0);
@@ -2891,8 +3377,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(value), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2901,6 +3388,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonInGroup(String inGroup) {
 		return toolbarDropDownButtonInGroup(inGroup, 0);
@@ -2910,8 +3398,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), inGroup(inGroup), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2919,6 +3408,7 @@
 
 	/**
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButton() {
 		return toolbarDropDownButton(0);
@@ -2927,8 +3417,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButton(int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2938,6 +3429,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonInGroup(String mnemonicText, String inGroup) {
 		return toolbarDropDownButtonInGroup(mnemonicText, inGroup, 0);
@@ -2948,8 +3440,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2959,6 +3452,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithTooltipInGroup(String tooltip, String inGroup) {
 		return toolbarDropDownButtonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -2969,8 +3463,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarDropDownButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarDropDownButton toolbarDropDownButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.DROP_DOWN, "SWT.DROP_DOWN"));
 		return new SWTBotToolbarDropDownButton((ToolItem) widget(matcher, index), matcher);
@@ -2979,6 +3474,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButton(String mnemonicText) {
 		return toolbarRadioButton(mnemonicText, 0);
@@ -2988,8 +3484,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButton(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -2998,6 +3495,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithTooltip(String tooltip) {
 		return toolbarRadioButtonWithTooltip(tooltip, 0);
@@ -3007,8 +3505,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3018,6 +3517,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithId(String key, String value) {
 		return toolbarRadioButtonWithId(key, value, 0);
@@ -3028,8 +3528,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(key, value), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3038,6 +3539,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithId(String value) {
 		return toolbarRadioButtonWithId(value, 0);
@@ -3047,8 +3549,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withId(value), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3057,6 +3560,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonInGroup(String inGroup) {
 		return toolbarRadioButtonInGroup(inGroup, 0);
@@ -3066,8 +3570,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3075,6 +3580,7 @@
 
 	/**
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButton() {
 		return toolbarRadioButton(0);
@@ -3083,8 +3589,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButton(int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3094,6 +3601,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonInGroup(String mnemonicText, String inGroup) {
 		return toolbarRadioButtonInGroup(mnemonicText, inGroup, 0);
@@ -3104,8 +3612,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withMnemonic(mnemonicText), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3115,6 +3624,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithTooltipInGroup(String tooltip, String inGroup) {
 		return toolbarRadioButtonWithTooltipInGroup(tooltip, inGroup, 0);
@@ -3125,8 +3635,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotToolbarRadioButton} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotToolbarRadioButton toolbarRadioButtonWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(ToolItem.class), withTooltip(tooltip), inGroup(inGroup), withStyle(SWT.RADIO, "SWT.RADIO"));
 		return new SWTBotToolbarRadioButton((ToolItem) widget(matcher, index), matcher);
@@ -3135,6 +3646,7 @@
 	/**
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink link(String mnemonicText) {
 		return link(mnemonicText, 0);
@@ -3144,8 +3656,9 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>mnemonicText</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink link(String mnemonicText, int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class), withMnemonic(mnemonicText));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3155,6 +3668,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotLink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink linkWithId(String key, String value) {
 		return linkWithId(key, value, 0);
@@ -3165,8 +3679,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink linkWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class), withId(key, value));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3175,6 +3690,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotLink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink linkWithId(String value) {
 		return linkWithId(value, 0);
@@ -3184,8 +3700,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink linkWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class), withId(value));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3194,6 +3711,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink linkInGroup(String inGroup) {
 		return linkInGroup(inGroup, 0);
@@ -3203,8 +3721,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink linkInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class), inGroup(inGroup));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3212,6 +3731,7 @@
 
 	/**
 	 * @return a {@link SWTBotLink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink link() {
 		return link(0);
@@ -3220,8 +3740,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink link(int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3231,6 +3752,7 @@
 	 * @param mnemonicText the mnemonicText on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotLink linkInGroup(String mnemonicText, String inGroup) {
 		return linkInGroup(mnemonicText, inGroup, 0);
@@ -3241,8 +3763,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotLink} with the specified <code>mnemonicText</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotLink linkInGroup(String mnemonicText, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Link.class), withMnemonic(mnemonicText), inGroup(inGroup));
 		return new SWTBotLink((Link) widget(matcher, index), matcher);
@@ -3251,6 +3774,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithLabel(String label) {
 		return spinnerWithLabel(label, 0);
@@ -3260,8 +3784,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withLabel(label));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3270,6 +3795,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinner(String text) {
 		return spinner(text, 0);
@@ -3279,8 +3805,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinner(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withText(text));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3289,6 +3816,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithTooltip(String tooltip) {
 		return spinnerWithTooltip(tooltip, 0);
@@ -3298,8 +3826,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withTooltip(tooltip));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3309,6 +3838,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotSpinner} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithId(String key, String value) {
 		return spinnerWithId(key, value, 0);
@@ -3319,8 +3849,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withId(key, value));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3329,6 +3860,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotSpinner} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithId(String value) {
 		return spinnerWithId(value, 0);
@@ -3338,8 +3870,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withId(value));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3348,6 +3881,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerInGroup(String inGroup) {
 		return spinnerInGroup(inGroup, 0);
@@ -3357,8 +3891,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), inGroup(inGroup));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3366,6 +3901,7 @@
 
 	/**
 	 * @return a {@link SWTBotSpinner} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinner() {
 		return spinner(0);
@@ -3374,8 +3910,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinner(int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3385,6 +3922,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithLabelInGroup(String label, String inGroup) {
 		return spinnerWithLabelInGroup(label, inGroup, 0);
@@ -3395,8 +3933,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3406,6 +3945,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerInGroup(String text, String inGroup) {
 		return spinnerInGroup(text, inGroup, 0);
@@ -3416,8 +3956,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withText(text), inGroup(inGroup));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3427,6 +3968,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSpinner spinnerWithTooltipInGroup(String tooltip, String inGroup) {
 		return spinnerWithTooltipInGroup(tooltip, inGroup, 0);
@@ -3437,8 +3979,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSpinner} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSpinner spinnerWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Spinner.class), withTooltip(tooltip), inGroup(inGroup));
 		return new SWTBotSpinner((Spinner) widget(matcher, index), matcher);
@@ -3447,6 +3990,7 @@
 	/**
 	 * @param label the label on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithLabel(String label) {
 		return sliderWithLabel(label, 0);
@@ -3456,8 +4000,9 @@
 	 * @param label the label on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithLabel(String label, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withLabel(label));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3466,6 +4011,7 @@
 	/**
 	 * @param text the text on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider slider(String text) {
 		return slider(text, 0);
@@ -3475,8 +4021,9 @@
 	 * @param text the text on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider slider(String text, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withText(text));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3485,6 +4032,7 @@
 	/**
 	 * @param tooltip the tooltip on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithTooltip(String tooltip) {
 		return sliderWithTooltip(tooltip, 0);
@@ -3494,8 +4042,9 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithTooltip(String tooltip, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withTooltip(tooltip));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3505,6 +4054,7 @@
 	 * @param key the key set on the widget.
 	 * @param value the value for the key.
 	 * @return a {@link SWTBotSlider} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithId(String key, String value) {
 		return sliderWithId(key, value, 0);
@@ -3515,8 +4065,9 @@
 	 * @param value the value for the key.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithId(String key, String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withId(key, value));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3525,6 +4076,7 @@
 	/**
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @return a {@link SWTBotSlider} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithId(String value) {
 		return sliderWithId(value, 0);
@@ -3534,8 +4086,9 @@
 	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithId(String value, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withId(value));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3544,6 +4097,7 @@
 	/**
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderInGroup(String inGroup) {
 		return sliderInGroup(inGroup, 0);
@@ -3553,8 +4107,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderInGroup(String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), inGroup(inGroup));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3562,6 +4117,7 @@
 
 	/**
 	 * @return a {@link SWTBotSlider} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider slider() {
 		return slider(0);
@@ -3570,8 +4126,9 @@
 	/**
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider slider(int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3581,6 +4138,7 @@
 	 * @param label the label on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithLabelInGroup(String label, String inGroup) {
 		return sliderWithLabelInGroup(label, inGroup, 0);
@@ -3591,8 +4149,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithLabelInGroup(String label, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withLabel(label), inGroup(inGroup));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3602,6 +4161,7 @@
 	 * @param text the text on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderInGroup(String text, String inGroup) {
 		return sliderInGroup(text, inGroup, 0);
@@ -3612,8 +4172,9 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderInGroup(String text, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withText(text), inGroup(inGroup));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
@@ -3623,6 +4184,7 @@
 	 * @param tooltip the tooltip on the widget.
 	 * @param inGroup the inGroup on the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
 	public SWTBotSlider sliderWithTooltipInGroup(String tooltip, String inGroup) {
 		return sliderWithTooltipInGroup(tooltip, inGroup, 0);
@@ -3633,11 +4195,489 @@
 	 * @param inGroup the inGroup on the widget.
 	 * @param index the index of the widget.
 	 * @return a {@link SWTBotSlider} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
 	 */
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings({"unchecked", "rawtypes"})
 	public SWTBotSlider sliderWithTooltipInGroup(String tooltip, String inGroup, int index) {
 		Matcher matcher = allOf(widgetOfType(Slider.class), withTooltip(tooltip), inGroup(inGroup));
 		return new SWTBotSlider((Slider) widget(matcher, index), matcher);
 	}
 
+	/**
+	 * @param label the label on the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browserWithLabel(String label) {
+		return browserWithLabel(label, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browserWithLabel(String label, int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class), withLabel(label));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotBrowser} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browserWithId(String key, String value) {
+		return browserWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browserWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class), withId(key, value));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotBrowser} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browserWithId(String value) {
+		return browserWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browserWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class), withId(value));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browserInGroup(String inGroup) {
+		return browserInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browserInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class), inGroup(inGroup));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotBrowser} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browser() {
+		return browser(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browser(int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotBrowser browserWithLabelInGroup(String label, String inGroup) {
+		return browserWithLabelInGroup(label, inGroup, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotBrowser} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotBrowser browserWithLabelInGroup(String label, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Browser.class), withLabel(label), inGroup(inGroup));
+		return new SWTBotBrowser((Browser) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithLabel(String label) {
+		return scaleWithLabel(label, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithLabel(String label, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withLabel(label));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param text the text on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scale(String text) {
+		return scale(text, 0);
+	}
+
+	/**
+	 * @param text the text on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>text</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scale(String text, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withText(text));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithTooltip(String tooltip) {
+		return scaleWithTooltip(tooltip, 0);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>tooltip</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithTooltip(String tooltip, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withTooltip(tooltip));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotScale} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithId(String key, String value) {
+		return scaleWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withId(key, value));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotScale} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithId(String value) {
+		return scaleWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withId(value));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleInGroup(String inGroup) {
+		return scaleInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), inGroup(inGroup));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotScale} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scale() {
+		return scale(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scale(int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithLabelInGroup(String label, String inGroup) {
+		return scaleWithLabelInGroup(label, inGroup, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithLabelInGroup(String label, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withLabel(label), inGroup(inGroup));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param text the text on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleInGroup(String text, String inGroup) {
+		return scaleInGroup(text, inGroup, 0);
+	}
+
+	/**
+	 * @param text the text on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>text</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleInGroup(String text, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withText(text), inGroup(inGroup));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotScale scaleWithTooltipInGroup(String tooltip, String inGroup) {
+		return scaleWithTooltipInGroup(tooltip, inGroup, 0);
+	}
+
+	/**
+	 * @param tooltip the tooltip on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotScale} with the specified <code>tooltip</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotScale scaleWithTooltipInGroup(String tooltip, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(Scale.class), withTooltip(tooltip), inGroup(inGroup));
+		return new SWTBotScale((Scale) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBarWithLabel(String label) {
+		return expandBarWithLabel(label, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>label</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBarWithLabel(String label, int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class), withLabel(label));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBarWithId(String key, String value) {
+		return expandBarWithId(key, value, 0);
+	}
+
+	/**
+	 * @param key the key set on the widget.
+	 * @param value the value for the key.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>key/value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBarWithId(String key, String value, int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class), withId(key, value));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBarWithId(String value) {
+		return expandBarWithId(value, 0);
+	}
+
+	/**
+	 * @param value the value for the key {@link org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences#DEFAULT_KEY}.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>value</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBarWithId(String value, int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class), withId(value));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBarInGroup(String inGroup) {
+		return expandBarInGroup(inGroup, 0);
+	}
+
+	/**
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBarInGroup(String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class), inGroup(inGroup));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @return a {@link SWTBotExpandBar} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBar() {
+		return expandBar(0);
+	}
+
+	/**
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>none</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBar(int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	public SWTBotExpandBar expandBarWithLabelInGroup(String label, String inGroup) {
+		return expandBarWithLabelInGroup(label, inGroup, 0);
+	}
+
+	/**
+	 * @param label the label on the widget.
+	 * @param inGroup the inGroup on the widget.
+	 * @param index the index of the widget.
+	 * @return a {@link SWTBotExpandBar} with the specified <code>label</code> with the specified <code>inGroup</code>.
+	 * @throws WidgetNotFoundException if the widget is not found or is disposed.
+	 */
+	@SuppressWarnings({"unchecked", "rawtypes"})
+	public SWTBotExpandBar expandBarWithLabelInGroup(String label, String inGroup, int index) {
+		Matcher matcher = allOf(widgetOfType(ExpandBar.class), withLabel(label), inGroup(inGroup));
+		return new SWTBotExpandBar((ExpandBar) widget(matcher, index), matcher);
+	}
+
+
+	private Matcher<? extends Widget> withLabel(String label) {
+		return WidgetMatcherFactory.withLabel(label, finder);
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotFactory.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotFactory.java
index ac2dc20..f7d3dab 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotFactory.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotFactory.java
@@ -326,7 +326,16 @@
 		Shell[] shells = finder.getShells();
 		ArrayList<SWTBotShell> result = new ArrayList<SWTBotShell>();
 		for (Shell shell : shells) {
-			result.add(new SWTBotShell(shell));
+			try {
+				result.add(new SWTBotShell(shell));
+			}
+			catch (WidgetNotFoundException exc) {
+				// Bug 385220
+				// If we were called while a shell was closing, a shell we
+				// got from finder.getShells() above could have been disposed
+				// by now. Simply ignore it
+			}
+
 		}
 		return result.toArray(new SWTBotShell[] {});
 	}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java
index 96ef9c1..f04b4e0 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotInfo.java
@@ -20,7 +20,7 @@
  */
 public class SWTBotInfo {
 
-	private static final String	VERSION	= "@svn.version@";
+	private static final String	VERSION	= "@git.version@";
 
 	/**
 	 * Prints out some platform specific information useful for diagnosis.
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotWidget.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotWidget.java
index 0bfe391..83e80b5 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotWidget.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/SWTBotWidget.java
@@ -94,4 +94,6 @@
 
 	/** Default reference by */
 	ReferenceBy[] defaultReferenceBy() default { ReferenceBy.ID_KEY_VALUE, ReferenceBy.ID_VALUE, ReferenceBy.IN_GROUP, ReferenceBy.NONE };
+
+	Class<?> returnType() default Object.class;
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/finders/Finder.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/finders/Finder.java
index bc53f1d..058a676 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/finders/Finder.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/finders/Finder.java
@@ -17,6 +17,7 @@
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.utils.TreePath;
 import org.hamcrest.Matcher;
 
 /**
@@ -224,4 +225,17 @@
 		return display;
 	}
 
+
+	/**
+	 * Gets the path to the widget. The path is the list of all parent containers of the widget.
+	 *
+	 * @param w the widget.
+	 * @return the path to the widget w.
+	 * @since 2.0
+	 * @see ControlFinder#getPath(Widget)
+	 */
+	public TreePath getPath(Widget w) {
+		return controlFinder.getPath(w);
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardStrategy.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardStrategy.java
index 9067730..5574d01 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardStrategy.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/AWTKeyboardStrategy.java
@@ -25,7 +25,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-class AWTKeyboardStrategy extends AbstractKeyboardStrategy {
+public class AWTKeyboardStrategy extends AbstractKeyboardStrategy {
 
 	private final Robot							robot;
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/DE_DE.keyboard b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/DE_DE.keyboard
new file mode 100644
index 0000000..5071a7c
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/DE_DE.keyboard
@@ -0,0 +1,31 @@
+€ alt+ctrl+e
+µ alt+ctrl+m
+@ alt+ctrl+q
+= shift+0
+} alt+ctrl+0
+! shift+1
+" shift+2
+* shift++
+² alt+ctrl+2
+§ shift+3
+³ alt+ctrl+3
+$ shift+4
+% shift+5
+& shift+6
+/ shift+7
+{ alt+ctrl+7
+( shift+8
+[ alt+ctrl+8
+) shift+9
+] alt+ctrl+9
+° shift+^
+~ alt+ctrl++
+| alt+ctrl+<
+> shift + <
+' shift + #
+< <
+# #
++ +
+- -
+. .
+, ,
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/FR_FR.keyboard b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/FR_FR.keyboard
new file mode 100644
index 0000000..5bfa726
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/FR_FR.keyboard
@@ -0,0 +1,54 @@
+1 shift + &

+2 shift + é

+3 shift + "

+4 shift + '

+5 shift + (

+6 shift + -

+7 shift + è

+8 shift + _

+9 shift + ç

+0 shift + à

+° shift + )

++ shift + =

+¨ shift + ^

+£ shift + $

+µ shift + *

+% shift + ù

+§ shift + !

+/ shift + :

+. shift + ;

+? shift + ,

+, ,

+; ;

+: :

+! !

+ù ù

+* *

+^ ^

+$ $

+= =

+) )

+à à

+ç ç

+_ _

+è è

+- -

+( (

+' '

+" "

+é é

+& &

+² ²

+€ alt + ctrl + e
+~ alt + ctrl + é

+# alt + ctrl + "

+{ alt + ctrl + '

+[ alt + ctrl + (

+| alt + ctrl + -

+` alt + ctrl + è

+\ alt + ctrl + _

+^ alt + ctrl + ç

+@ alt + ctrl + à

+] alt + ctrl + )

+} alt + ctrl + =

+¤ alt + ctrl + $

diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactory.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactory.java
index 6596fcb..6f30d2a 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactory.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardFactory.java
@@ -26,12 +26,13 @@
  */
 public class KeyboardFactory {
 
-	final Class<?>	strategyClass;
+	public final Class<?>	strategyClass;
 
 	/**
 	 * @param strategyClass the name of the class that is an instance of {@link KeyboardStrategy}.
 	 * @throws Exception if the class cannot be instantiated.
 	 */
+	@Deprecated
 	public KeyboardFactory(String strategyClass) throws Exception {
 		this(Class.forName(strategyClass));
 	}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardLayout.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardLayout.java
index 7d7fba7..18afd41 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardLayout.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/KeyboardLayout.java
@@ -28,7 +28,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-class KeyboardLayout {
+public class KeyboardLayout {
 	private final BidiMap<Character, KeyStroke>	keyStrokes	= new BidiMap<Character, KeyStroke>();
 	private final String						layoutName;
 
@@ -86,7 +86,7 @@
 		if (configURL == null)
 			configURL = classLoader.getResource(toFolder(layoutName) + ".keyboard");
 		if (configURL == null)
-			throw new IllegalArgumentException("keyboard layout " + layoutName + " not available.");
+			throw new IllegalArgumentException(layoutName + ".keyboard not found, see http://wiki.eclipse.org/SWTBot/Keyboard_Layouts for more information.");
 
 		try {
 			return new KeyboardLayout(layoutName, configURL);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/Keystrokes.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/Keystrokes.java
index cf17566..f2eac42 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/Keystrokes.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/Keystrokes.java
@@ -113,7 +113,7 @@
 	 * @param ch the character to convert to {@link KeyStroke}s.
 	 * @return the {@link KeyStroke}s corresponding to the character.
 	 */
-	static KeyStroke[] create(char ch) {
+	public static KeyStroke[] create(char ch) {
 		KeyStroke keyStroke = defaultKeyboardLayout.keyStrokeFor(ch);
 		if (keyStroke.getModifierKeys() == KeyStroke.NO_KEY)
 			return new KeyStroke[] { keyStroke };
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/MockKeyboardStrategy.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/MockKeyboardStrategy.java
index 7dc9320..486beca 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/MockKeyboardStrategy.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/MockKeyboardStrategy.java
@@ -26,7 +26,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-class MockKeyboardStrategy extends AbstractKeyboardStrategy {
+public class MockKeyboardStrategy extends AbstractKeyboardStrategy {
 
 	private MyWidget	widget;
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardStrategy.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardStrategy.java
index a3381d2..d543c5b 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardStrategy.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/keyboard/SWTKeyboardStrategy.java
@@ -17,8 +17,10 @@
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Widget;
 import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
 import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.hamcrest.SelfDescribing;
 
 /**
  * Sends keyboard notifications using {@link Display#post(Event)}.
@@ -27,16 +29,23 @@
  * @version $Id$
  * @see Display#KeyTable
  */
-class SWTKeyboardStrategy extends AbstractKeyboardStrategy {
+public class SWTKeyboardStrategy extends AbstractKeyboardStrategy {
 
 	private final Display				display;
 
+	private Widget	widget;
+
 	private static final Set<Integer>	specialKeys	= new HashSet<Integer>();
 
 	SWTKeyboardStrategy() {
 		this.display = SWTUtils.display();
 	}
 
+	@Override
+	public void init(Widget widget, SelfDescribing description) {
+		this.widget = widget;
+	}
+	
 	public void pressKey(KeyStroke key) {
 		Assert.isTrue(display.post(keyEvent(key, SWT.KeyDown)), "Could not post keyevent.");
 		display.wake();
@@ -52,6 +61,7 @@
 		e.type = type;
 		e.keyCode = keycode(key);
 		e.character = character(key);
+		e.widget = widget;
 		return e;
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/AnyOf.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/AnyOf.java
new file mode 100644
index 0000000..7e92d6a
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/AnyOf.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import java.util.Arrays;
+
+import org.eclipse.swt.widgets.Widget;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+/**
+ * A matcher that evaluates to <code>true</code> if any the matchers evaluate to <code>true</code>.
+ *
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ */
+public class AnyOf<T> extends AbstractMatcher<T> {
+	private final Iterable<Matcher<? extends T>>	matchers;
+
+	AnyOf(Iterable<Matcher<? extends T>> matchers) {
+		this.matchers = matchers;
+	}
+
+	protected boolean doMatch(Object o) {
+		for (Matcher<? extends T> matcher : matchers) {
+			if (matcher.matches(o)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public void describeTo(Description description) {
+		description.appendList("(", " or ", ")", matchers); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	}
+
+	/**
+	 * Evaluates to true only if ANY of the passed in matchers evaluate to true.
+	 *
+	 * @return a matcher.
+	 */
+	@Factory
+	public static <T extends Widget> Matcher<T> anyOf(Matcher<? extends T>... matchers) {
+		return new AnyOf<T>(Arrays.asList(matchers));
+	}
+
+	/**
+	 * Evaluates to true only if ANY of the passed in matchers evaluate to true.
+	 *
+	 * @return a matcher.
+	 */
+	@Factory
+	public static <T extends Widget> Matcher<T> anyOf(Iterable<Matcher<? extends T>> matchers) {
+		return new AnyOf<T>(matchers);
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/InUIThread.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/InUIThread.java
index b30ecb7..028f85d 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/InUIThread.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/InUIThread.java
@@ -24,6 +24,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  * @since 2.0
+ * @deprecated this has been deprecated and will be removed in future releases of swtbot
  */
 public class InUIThread<T extends Widget> extends AbstractMatcher<T> {
 
@@ -54,6 +55,7 @@
 	 * @param matcher the matcher
 	 * @return a matcher.
 	 * @since 2.0
+	 * @deprecated this has been deprecated and will be removed in future releases of swtbot.
 	 */
 	@Factory
 	public static <T extends Widget> Matcher<T> inUIThread(Matcher<?> matcher) {
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactory.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactory.java
index 11c56a6..9ee01da 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactory.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WidgetMatcherFactory.java
@@ -1,4 +1,6 @@
-// Generated source.
+// Generated source. DO NOT MODIFY.
+// To add new new methods, please see README file in the generator plugin.
+
 package org.eclipse.swtbot.swt.finder.matchers;
 
 public abstract class WidgetMatcherFactory {
@@ -18,12 +20,12 @@
    * Matches a widget that has the specified labelText within the given parent.
    * 
    * @param labelText the label.
-   * @param parent the parent widget to which the matcher is scoped.
+   * @param finder finder for locating widgets
    * @return a matcher.
    * @since 2.0
    */
-  public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> withLabel(java.lang.String labelText, org.eclipse.swt.widgets.Composite parent) {
-    return org.eclipse.swtbot.swt.finder.matchers.WithLabel.withLabel(labelText, parent);
+  public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> withLabel(java.lang.String labelText, org.eclipse.swtbot.swt.finder.finders.Finder finder) {
+    return org.eclipse.swtbot.swt.finder.matchers.WithLabel.withLabel(labelText, finder);
   }
 
   /**
@@ -71,6 +73,17 @@
   }
 
   /**
+   * Matches a widget that has the specified exact message.
+   * 
+   * @param message the message.
+   * @return a matcher.
+   * @since 2.0
+   */
+  public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> withMessage(java.lang.String message) {
+    return org.eclipse.swtbot.swt.finder.matchers.WithMessage.withMessage(message);
+  }
+
+  /**
    * Matches a widget that has the specified style bit set.
    * 
    * @param style the style bits.
@@ -181,6 +194,7 @@
    * @param matcher the matcher
    * @return a matcher.
    * @since 2.0
+   * @deprecated this has been deprecated and will be removed in future releases of swtbot.
    */
   public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> inUIThread(org.hamcrest.Matcher<?> matcher) {
     return org.eclipse.swtbot.swt.finder.matchers.InUIThread.inUIThread(matcher);
@@ -204,4 +218,22 @@
     return org.eclipse.swtbot.swt.finder.matchers.AllOf.allOf(matchers);
   }
 
+  /**
+   * Evaluates to true only if ANY of the passed in matchers evaluate to true.
+   * 
+   * @return a matcher.
+   */
+  public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> anyOf(org.hamcrest.Matcher<? extends T>... matchers) {
+    return org.eclipse.swtbot.swt.finder.matchers.AnyOf.anyOf(matchers);
+  }
+
+  /**
+   * Evaluates to true only if ANY of the passed in matchers evaluate to true.
+   * 
+   * @return a matcher.
+   */
+  public static <T extends org.eclipse.swt.widgets.Widget> org.hamcrest.Matcher<T> anyOf(java.lang.Iterable<org.hamcrest.Matcher<? extends T>> matchers) {
+    return org.eclipse.swtbot.swt.finder.matchers.AnyOf.anyOf(matchers);
+  }
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithItem.java
index fdb2c38..6d59b32 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 SWTBot Committers and others.
+ * Copyright (c) 2009,2010 SWTBot Committers 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
@@ -39,8 +39,9 @@
 	}
 
 	public void describeTo(Description description) {
-		description.appendText("with item");
+		description.appendText("with item matching (");
 		this.itemMatcher.describeTo(description);
+		description.appendText(")");
 	}
 
 	protected boolean doMatch(Object obj) {
@@ -67,7 +68,7 @@
 		return this.matches;
 	}
 
-	public Object get(int index) {
+	public T get(int index) {
 		return this.matches.get(index);
 	}
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithLabel.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithLabel.java
index 5927bb7..04994b5 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithLabel.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithLabel.java
@@ -11,17 +11,16 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.matchers;
 
-import static org.hamcrest.Matchers.anything;
-
 import java.util.List;
 import java.util.ListIterator;
 
 import org.eclipse.swt.custom.CLabel;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
+import org.eclipse.swtbot.swt.finder.finders.Finder;
+import org.eclipse.swtbot.swt.finder.finders.MenuFinder;
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
 import org.hamcrest.Description;
 import org.hamcrest.Factory;
 import org.hamcrest.Matcher;
@@ -44,21 +43,23 @@
 	 * The mnemonic text matcher instance to use.
 	 */
 	private final WithMnemonic<Widget>	mnemonicTextMatcher;
-	private final Composite				parent;
+	private final Finder			finder;
 
 	/**
 	 * Matches a widget that has the specified Label.
 	 * 
 	 * @param labelText the label.
-	 * @param parent
+	 * @param finder finder for locating widgets
 	 */
-	WithLabel(String labelText, Composite parent) {
+	WithLabel(String labelText, Finder finder) {
+		Assert.isNotNull(labelText, "The parameter labelText was null.");
+		Assert.isNotNull(finder, "The parameter finder was null.");
 		mnemonicTextMatcher = new WithMnemonic<Widget>(labelText);
-		this.parent = parent;
+		this.finder = finder;
 	}
 
 	protected boolean doMatch(Object obj) {
-		List<? extends Widget> allWidgets = new SWTBot().widgets(Matchers.<Widget>anything(), parent(obj));
+		List<? extends Widget> allWidgets = finder.findControls(Matchers.<Widget> anything());
 
 		int widgetIndex = allWidgets.indexOf(obj);
 
@@ -73,10 +74,6 @@
 		return false;
 	}
 
-	private Composite parent(Object obj) {
-		return parent != null ? parent : ((Control) obj).getShell();
-	}
-
 	private boolean isLabel(Widget widget) {
 		return widget instanceof Label || widget instanceof CLabel;
 	}
@@ -94,20 +91,20 @@
 	 */
 	@Factory
 	public static <T extends Widget> Matcher<T> withLabel(String labelText) {
-		return new WithLabel<T>(labelText, null);
+		return new WithLabel<T>(labelText, new Finder(new ControlFinder(), new MenuFinder()));
 	}
 
 	/**
 	 * Matches a widget that has the specified labelText within the given parent.
 	 * 
 	 * @param labelText the label.
-	 * @param parent the parent widget to which the matcher is scoped.
+	 * @param finder finder for locating widgets
 	 * @return a matcher.
 	 * @since 2.0
 	 */
 	@Factory
-	public static <T extends Widget> Matcher<T> withLabel(String labelText, Composite parent) {
-		return new WithLabel<T>(labelText, parent);
+	public static <T extends Widget> Matcher<T> withLabel(String labelText, Finder finder) {
+		return new WithLabel<T>(labelText, finder);
 	}
 
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithMessage.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithMessage.java
new file mode 100644
index 0000000..9f325ef
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/matchers/WithMessage.java
@@ -0,0 +1,83 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Brock Janiczak - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.matchers;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.matchers.AbstractMatcher;
+import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
+import org.hamcrest.Description;
+import org.hamcrest.Factory;
+import org.hamcrest.Matcher;
+
+/**
+ * Matches {@link org.eclipse.swt.widgets.Widget}s with the specified message.
+ * 
+ * @author Brock Janiczak &lt;brockj [at] gmail [dot] com&gt;
+ * @version $Id$
+ * @since 2.0
+ */
+class WithMessage<T extends Widget> extends AbstractMatcher<T> {
+
+	/** The text */
+	protected String	message;
+
+	/**
+	 * Constructs the message text matcher with the given text.
+	 * 
+	 * @param text the message to match on the {@link org.eclipse.swt.widgets.Widget}
+	 */
+	WithMessage(String text) {
+		this.message = text;
+	}
+
+	protected boolean doMatch(Object obj) {
+		try {
+			return getMessage(obj).equals(message);
+		} catch (Exception e) {
+			// do nothing
+		}
+		return false;
+	}
+
+	/**
+	 * Gets the message of the object using the getText method. If the object doesn't contain a get message method an
+	 * exception is thrown.
+	 * 
+	 * @param obj any object to get the message from.
+	 * @return the return value of obj#getMessage()
+	 * @throws NoSuchMethodException if the method "getMessage" does not exist on the object.
+	 * @throws IllegalAccessException if the java access control does not allow invocation.
+	 * @throws InvocationTargetException if the method "getMessage" throws an exception.
+	 * @see Method#invoke(Object, Object[])
+	 */
+	static String getMessage(Object obj) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
+		return ((String) SWTUtils.invokeMethod(obj, "getMessage")); //$NON-NLS-1$
+	}
+
+	public void describeTo(Description description) {
+		description.appendText("with message '").appendText(message).appendText("'"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * Matches a widget that has the specified exact message.
+	 * 
+	 * @param message the message.
+	 * @return a matcher.
+	 * @since 2.0
+	 */
+	@Factory
+	public static <T extends Widget> Matcher<T> withMessage(String message) {
+		return new WithMessage<T>(message);
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandBarResolver.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandBarResolver.java
new file mode 100644
index 0000000..c125a99
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandBarResolver.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.resolvers;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.swt.widgets.ExpandBar;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class ExpandBarResolver implements IChildrenResolver, IParentResolver {
+
+	public boolean canResolve(Widget w) {
+		return w instanceof ExpandBar;
+	}
+
+	public List getChildren(Widget w) {
+		return hasChildren(w) ? Arrays.asList(((ExpandBar) w).getItems()) : new ArrayList();
+	}
+
+	public Widget getParent(Widget w) {
+		return canResolve(w) ? ((ExpandBar) w).getParent() : null;
+	}
+
+	public Class[] getResolvableClasses() {
+		return new Class[] { ExpandBar.class };
+	}
+
+	public boolean hasChildren(Widget w) {
+		return canResolve(w) && ((ExpandBar) w).getItems().length > 0;
+	}
+
+	public boolean hasParent(Widget w) {
+		return getParent(w) != null;
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandItemResolver.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandItemResolver.java
new file mode 100644
index 0000000..6960242
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/ExpandItemResolver.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.resolvers;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.ExpandItem;
+import org.eclipse.swt.widgets.Widget;
+
+/**
+ * Resolves {@link ExpandItem}s.
+ * 
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class ExpandItemResolver implements IChildrenResolver, IParentResolver {
+
+	public List getChildren(Widget w) {
+		ArrayList children = new ArrayList();
+		Control control = ((ExpandItem) w).getControl();
+		if (control != null)
+			children.add(control);
+		return children;
+	}
+
+	public boolean hasChildren(Widget w) {
+		return canResolve(w) && ((ExpandItem) w).getControl() != null;
+	}
+
+	public boolean canResolve(Widget w) {
+		return w instanceof ExpandItem;
+	}
+
+	public Class[] getResolvableClasses() {
+		return new Class[] { ExpandItem.class };
+	}
+
+	public Widget getParent(Widget w) {
+		return canResolve(w) ? ((ExpandItem) w).getParent() : null;
+	}
+
+	public boolean hasParent(Widget w) {
+		return getParent(w) != null;
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/Resolvable.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/Resolvable.java
index 25b990f..97494ef 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/Resolvable.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/resolvers/Resolvable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2011 Ketan Padegaonkar 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
@@ -28,6 +28,8 @@
 	 */
 	public Resolvable() {
 		this(new Resolver());
+		resolver.addResolver(new ExpandBarResolver());
+		resolver.addResolver(new ExpandItemResolver());
 		resolver.addResolver(new CTabFolderResolver());
 		resolver.addResolver(new TabFolderResolver());
 		resolver.addResolver(new CTabItemResolver());
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Credentials.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Credentials.java
new file mode 100644
index 0000000..eb08edf
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Credentials.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.utils;
+
+/**
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ */
+public class Credentials {
+
+	private final String	username;
+	private final String	password;
+
+	public Credentials(String username, String password) {
+		this.username = username;
+		this.password = password;
+	}
+
+	public String username() {
+		return username;
+	}
+
+	public String password() {
+		return password;
+	}
+
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((password == null) ? 0 : password.hashCode());
+		result = prime * result + ((username == null) ? 0 : username.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		Credentials other = (Credentials) obj;
+		if (password == null) {
+			if (other.password != null)
+				return false;
+		} else if (!password.equals(other.password))
+			return false;
+		if (username == null) {
+			if (other.username != null)
+				return false;
+		} else if (!username.equals(other.username))
+			return false;
+		return true;
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/FileUtils.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/FileUtils.java
index 9882d2e..ccb37ea 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/FileUtils.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/FileUtils.java
@@ -10,18 +10,11 @@
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.utils;
 
-import java.io.BufferedWriter;
-import java.io.Closeable;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
+import java.io.*;
 import java.net.URL;
 import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Provides utilities to read and write to files.
@@ -89,6 +82,34 @@
 		return buffer.toString();
 	}
 
+	public static List<String> readlines(String file) {
+		try {
+			return readlines(new FileInputStream(file));
+		} catch (FileNotFoundException e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static List<String> readlines(InputStream in) {
+		return readlines(new InputStreamReader(in, Charset.forName("UTF-8")));
+	}
+
+	private static List<String> readlines(Reader in) {
+		BufferedReader reader = new BufferedReader(in);
+		ArrayList<String> lines = new ArrayList<String>();
+
+		try {
+			while (reader.ready()) {
+				lines.add(reader.readLine());
+			}
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		} finally {
+			close(in);
+		}
+		return lines;
+	}
+
 	/**
 	 * @param text the contents to write to the file.
 	 * @param file the file to write to.
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMap.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMap.java
index 4e2fdec..11739e1 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMap.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/MultiValueMap.java
@@ -11,6 +11,7 @@
 package org.eclipse.swtbot.swt.finder.utils;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Set;
@@ -41,9 +42,12 @@
 	}
 
 	public Collection<V> getCollection(K k) {
-		return map.get(k);
+		LinkedHashSet<V> result = map.get(k);
+		if (result != null)
+			return result;
+		return Collections.emptySet();
 	}
-
+	
 	public Set<K> keySet() {
 		return map.keySet();
 	}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Position.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Position.java
index 7036809..2c4d2e0 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Position.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/Position.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008-2010 Ketan Padegaonkar 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
@@ -50,7 +50,7 @@
 		if ((obj == null) || (getClass() != obj.getClass()))
 			return false;
 		Position other = (Position) obj;
-		return (column == other.column) || (line == other.line);
+		return (column == other.column) && (line == other.line);
 	}
 
 	@Override
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferenceConstants.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferenceConstants.java
index c7444ab..3ce3318 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferenceConstants.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferenceConstants.java
@@ -22,7 +22,10 @@
 	public static final String	KEY_DEFAULT_KEY					= "org.eclipse.swtbot.search.defaultKey";
 	/** @see SWTBotPreferences#TIMEOUT */
 	public static final String	KEY_TIMEOUT						= "org.eclipse.swtbot.search.timeout";
-	/** @see SWTBotPreferences#RECORDER_FILE_NAME */
+	/**
+	 * @see SWTBotPreferences#RECORDER_FILE_NAME
+	 * @deprecated - this will be removed in future versions of swtbot.
+	 */
 	public static final String	KEY_RECORER_FILE_NAME			= "org.eclipse.swtbot.recorder.file.name";
 
 	/** @see SWTBotPreferences#PLAYBACK_DELAY */
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferences.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferences.java
index bf6aec8..f3bbe00 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferences.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTBotPreferences.java
@@ -46,6 +46,8 @@
 	/**
 	 * The name of the file in which the recorder records. Defaults to "swtbot.record.txt". To set another default, use
 	 * the system property {@value org.eclipse.swtbot.swt.finder.utils.SWTBotPreferenceConstants#KEY_RECORER_FILE_NAME}.
+	 * 
+	 * @deprecated - this will be removed in future versions
 	 */
 	public static String		RECORDER_FILE_NAME			= System.getProperty(KEY_RECORER_FILE_NAME, "swtbot.record.txt");
 
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTUtils.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTUtils.java
index d65cf21..8093575 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTUtils.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/SWTUtils.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2011 Ketan Padegaonkar 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
@@ -12,6 +12,7 @@
 package org.eclipse.swtbot.swt.finder.utils;
 
 import java.io.File;
+import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.text.MessageFormat;
@@ -299,6 +300,22 @@
 	}
 
 	/**
+	 * Get the value of an attribute on the object even if the attribute is not accessible. 
+	 * @param object the object
+	 * @param attributeName the attribute name
+	 * @return the value the attribute value
+	 * @throws SecurityException if the attribute accessibility may not be changed.
+	 * @throws NoSuchFieldException if the attribute attributeName does not exist.
+	 * @throws IllegalAccessException if the java access control does not allow access.
+	 */
+	public static Object getAttribute(final Object object, final String attributeName) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+		Field field = object.getClass().getDeclaredField(attributeName);
+		if (!field.isAccessible())
+			field.setAccessible(true);
+		return field.get(object);
+	}
+	
+	/**
 	 * This captures a screen shot and saves it to the given file.
 	 * 
 	 * @param fileName the filename to save screenshot to.
@@ -380,6 +397,10 @@
 	private static boolean captureScreenshotInternal(final String fileName, Rectangle bounds) {
 		GC gc = new GC(display);
 		Image image = null;
+		File file = new File(fileName);
+		File parentDir = file.getParentFile();
+		if (parentDir != null)
+			parentDir.mkdirs();
 		try {
 			log.debug(MessageFormat.format("Capturing screenshot ''{0}''", fileName)); //$NON-NLS-1$
 
@@ -391,7 +412,7 @@
 			return true;
 		} catch (Exception e) {
 			log.warn("Could not capture screenshot: " + fileName + "'", e); //$NON-NLS-1$ //$NON-NLS-2$
-			File brokenImage = new File(fileName).getAbsoluteFile();
+			File brokenImage = file.getAbsoluteFile();
 			if (brokenImage.exists()) {
 				try {
 					log.trace(MessageFormat.format("Broken screenshot set to be deleted on exit: {0}", fileName)); //$NON-NLS-1$
@@ -474,4 +495,27 @@
 	public static boolean isUIThread() {
 		return isUIThread(display);
 	}
+
+
+	/**
+	 * @return <code>true</code> if the current OS is macosx.
+	 */
+	public static boolean isMac(){
+		return isCocoa() || isCarbon();
+	}
+
+	/**
+	 * @return <code>true</code> if the current platform is {@code cocoa}
+	 */
+	public static boolean isCocoa(){
+		return SWT.getPlatform().equals("cocoa");
+	}
+
+	/**
+	 * @return <code>true</code> if the current platform is {@code carbon}
+	 */
+	public static boolean isCarbon(){
+		return SWT.getPlatform().equals("carbon");
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/TreePath.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/TreePath.java
index 1eab2fe..7532dbf 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/TreePath.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/TreePath.java
@@ -30,7 +30,7 @@
 	 * 
 	 * @param segments path of elements to a leaf node in a tree, starting with the root element
 	 */
-	public TreePath(Object[] segments) {
+	public TreePath(Object... segments) {
 		Assert.isNotNull(segments);
 		for (int i = 0; i < segments.length; i++) {
 			Assert.isNotNull(segments[i]);
@@ -59,7 +59,7 @@
 
 	/**
 	 * Returns the last element in this path, or <code>null</code> if this path has no segments.
-	 *
+	 * 
 	 * @return the last element in this path
 	 */
 	public Object getLastSegment() {
@@ -110,4 +110,21 @@
 		return new TreePath(parentSegments);
 	}
 
+	/**
+	 * Removes the last path component from the tree and returns it.
+	 * 
+	 * @return the last path component after removing it from the tree.
+	 */
+	public Object pop() {
+		int segmentCount = getSegmentCount();
+		if (segmentCount == 0) {
+			return null;
+		}
+		Object lastSegment = getLastSegment();
+
+		Object[] parentSegments = new Object[segmentCount - 1];
+		System.arraycopy(segments, 0, parentSegments, 0, segmentCount - 1);
+		segments = parentSegments;
+		return lastSegment;
+	}
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/internal/Assert.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/internal/Assert.java
index c904806..ab8f0a4 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/internal/Assert.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/utils/internal/Assert.java
@@ -94,4 +94,18 @@
 		if (!expression)
 			throw new AssertionFailedException("assertion failed: " + message); //$NON-NLS-1$
 	}
+
+	/**
+	 * Asserts that the given list is not empty or null. If this is not the case, some kind of unchecked exception is
+	 * thrown. The given message is included in that exception, to aid debugging.
+	 * 
+	 * @param expression the outcode of the check
+	 * @param message the message to include in the exception
+	 */
+	public static void isNotEmpty(Object... toCheck) {
+		Assert.isNotNull(toCheck);
+		if (toCheck.length == 0) {
+			throw new AssertionFailedException("List cannot be empty or null.");
+		}
+	}
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/Conditions.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/Conditions.java
index 0475fff..ec2a960 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/Conditions.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/Conditions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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
@@ -8,6 +8,7 @@
  * Contributors:
  *     Ketan Padegaonkar - initial API and implementation
  *     Ketan Patel - https://bugs.eclipse.org/bugs/show_bug.cgi?id=259837
+ *     Jesper S Møller - https://bugs.eclipse.org/bugs/show_bug.cgi?id=322668
  *******************************************************************************/
 
 package org.eclipse.swtbot.swt.finder.waits;
@@ -15,8 +16,10 @@
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
 import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
 import org.hamcrest.Matcher;
 
 /**
@@ -43,6 +46,21 @@
 	}
 
 	/**
+	 * Gets the condition for checking trees have the proper number of rows. Useful in cases where the tree is populated
+	 * continuously from a non UI thread.
+	 * 
+	 * @param tree the tree
+	 * @param rowCount the number of rows that the tree must have, in order for {@link ICondition#test()} to evaluate to
+	 *            <code>true</code>.
+	 * @return <code>true</code> if the tree has the number of rows specified. Otherwise <code>false</code>.
+	 * @throws IllegalArgumentException Thrown if the row count is less then 1.
+	 * @since 2.0
+	 */
+	public static ICondition treeHasRows(SWTBotTree tree, int rowCount) {
+		return new TreeHasRows(tree, rowCount);
+	}
+
+	/**
 	 * Gets the condition for checking if shells have closed. Useful in cases where a shell takes long to close.
 	 *
 	 * @param shell the shell to monitor.
@@ -112,4 +130,12 @@
 		return new WaitForMenu(shell, matcher);
 	}
 
+	/**
+	 * @param widget the widget 
+	 * @return a condition that waits until the widget is enabled.
+	 * @since 2.0
+	 */
+	public static ICondition widgetIsEnabled(AbstractSWTBot<? extends Widget> widget){
+		return new WidgetIsEnabledCondition(widget);
+	}
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRows.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRows.java
new file mode 100644
index 0000000..8abc300
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/TreeHasRows.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Jesper S Møller - initial API and implementation 
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.waits;
+
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
+
+/**
+ * A condition that returns <code>false</code> until the table has the specified number of rows.
+ * 
+ * @see Conditions
+ * @author Jesper Steen Moeller &lt;jesper [at] selskabet [dot] org&gt;
+ */
+class TreeHasRows extends DefaultCondition {
+
+	/**
+	 * The row count.
+	 */
+	private final int			rowCount;
+	/**
+	 * The table (SWTBotTable) instance to check.
+	 */
+	private final SWTBotTree	tree;
+
+	/**
+	 * Constructs an instance of the condition for the given tree. The row count is used to know how many rows it needs
+	 * to satisfy the condition.
+	 * 
+	 * @param tree the tree
+	 * @param rowCount the number of rows needed.
+	 * @throws NullPointerException Thrown if the table is <code>null</code>.
+	 * @throws IllegalArgumentException Thrown if the row count is less then 1.
+	 */
+	TreeHasRows(SWTBotTree tree, int rowCount) {
+		Assert.isNotNull(tree, "The tree can not be null"); //$NON-NLS-1$
+		Assert.isLegal(rowCount >= 0, "The node count must be greater than zero (0)"); //$NON-NLS-1$
+		this.tree = tree;
+		this.rowCount = rowCount;
+	}
+
+	/**
+	 * Performs the check to see if the condition is satisfied.
+	 * 
+	 * @see org.eclipse.swtbot.swt.finder.waits.ICondition#test()
+	 * @return <code>true</code> if the condition node count equals the number of nodes in the tree. Otherwise
+	 *         <code>false</code> is returned.
+	 */
+	public boolean test() {
+		return tree.rowCount() == rowCount;
+	}
+
+	/**
+	 * Gets the failure message if the test is not satisfied.
+	 * 
+	 * @see org.eclipse.swtbot.swt.finder.waits.ICondition#getFailureMessage()
+	 * @return The failure message.
+	 */
+	public String getFailureMessage() {
+		return "Timed out waiting for " + tree + " to contain " + rowCount + " rows."; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/WidgetIsEnabledCondition.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/WidgetIsEnabledCondition.java
new file mode 100644
index 0000000..ea79358
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/waits/WidgetIsEnabledCondition.java
@@ -0,0 +1,32 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.waits;
+
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBot;
+
+class WidgetIsEnabledCondition extends DefaultCondition {
+
+	private final AbstractSWTBot<? extends Widget>	widget;
+
+	WidgetIsEnabledCondition(AbstractSWTBot<? extends Widget> widget) {
+		this.widget = widget;
+	}
+
+	public boolean test() throws Exception {
+		return widget.isEnabled();
+	}
+
+	public String getFailureMessage() {
+		return "The widget " + widget + " was not enabled.";
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBot.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBot.java
index e74223a..92c3bfe 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBot.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/AbstractSWTBot.java
@@ -12,6 +12,7 @@
 
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
 import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
+import static org.eclipse.swtbot.swt.finder.waits.Conditions.widgetIsEnabled;
 import static org.hamcrest.Matchers.allOf;
 
 import java.util.List;
@@ -33,6 +34,7 @@
 import org.eclipse.swtbot.swt.finder.keyboard.Keyboard;
 import org.eclipse.swtbot.swt.finder.keyboard.KeyboardFactory;
 import org.eclipse.swtbot.swt.finder.keyboard.Keystrokes;
+import org.eclipse.swtbot.swt.finder.matchers.WithId;
 import org.eclipse.swtbot.swt.finder.results.ArrayResult;
 import org.eclipse.swtbot.swt.finder.results.BoolResult;
 import org.eclipse.swtbot.swt.finder.results.IntResult;
@@ -218,6 +220,17 @@
 	}
 
 	/**
+	 * Create a selection event with a particular state mask
+	 * 
+	 * @param stateMask the state of the keyboard modifier keys.
+	 */
+	protected Event createSelectionEvent(int stateMask) {
+		Event event = createEvent();
+		event.stateMask = stateMask;
+		return event;
+	}
+
+	/**
 	 * Create a key event
 	 * 
 	 * @param keyCode the key code of the key pressed
@@ -244,9 +257,9 @@
 		notify(SWT.MouseMove);
 		notify(SWT.Activate);
 		notify(SWT.FocusIn);
-		notify(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
-		notify(SWT.MouseUp);
-		notify(SWT.Selection);
+		notify(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.NONE, 1));
+		notify(SWT.MouseUp, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
+		notify(SWT.Selection, createSelectionEvent(SWT.BUTTON1));
 		notify(SWT.MouseHover);
 		notify(SWT.MouseMove);
 		notify(SWT.MouseExit);
@@ -270,7 +283,7 @@
 		notify(SWT.FocusIn);
 		notify(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON3, 1));
 		notify(SWT.MouseUp);
-		notify(SWT.Selection);
+		notify(SWT.Selection, createSelectionEvent(SWT.BUTTON3));		
 		notify(SWT.MouseHover);
 		notify(SWT.MouseMove);
 		notify(SWT.MouseExit);
@@ -292,9 +305,9 @@
 		notify(SWT.MouseMove);
 		notify(SWT.Activate);
 		notify(SWT.FocusIn);
-		notify(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
-		notify(SWT.MouseUp);
-		notify(SWT.Selection);
+		notify(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.NONE, 1));
+		notify(SWT.MouseUp, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
+		notify(SWT.Selection, createSelectionEvent(SWT.BUTTON1));
 		notify(SWT.MouseDoubleClick, createMouseEvent(x, y, 1, SWT.BUTTON1, 2));
 		notify(SWT.MouseHover);
 		notify(SWT.MouseMove);
@@ -366,6 +379,21 @@
 	}
 
 	/**
+	 * Gets the value of {@link Widget#getData(String))} for the key {@link SWTBotPreferences#DEFAULT_KEY} of this
+	 * object's widget.
+	 * 
+	 * @return the id that SWTBot may use to search this widget.
+	 * @see WithId
+	 */
+	public String getId() {
+		return syncExec(new StringResult() {
+			public String run() {
+				return (String) widget.getData(SWTBotPreferences.DEFAULT_KEY);
+			}
+		});
+	}
+
+	/**
 	 * Gets the tooltip of this object's widget.
 	 * 
 	 * @return the tooltip on the widget.
@@ -596,7 +624,15 @@
 	 */
 	protected void assertEnabled() {
 		Assert.isTrue(isEnabled(), MessageFormat.format("Widget {0} is not enabled.", this)); //$NON-NLS-1$ //$NON-NLS-2$
-
+	}
+	
+	/**
+	 * Wait until the widget is enabled.
+	 * 
+	 * @since 2.0
+	 */
+	protected void waitForEnabled() {
+		new SWTBot().waitUntil(widgetIsEnabled(this));
 	}
 
 	/**
@@ -621,7 +657,7 @@
 	 * @since 1.2
 	 */
 	public void setFocus() {
-		assertEnabled();
+		waitForEnabled();
 		log.debug(MessageFormat.format("Attempting to set focus on {0}", this));
 		syncExec(new VoidResult() {
 			public void run() {
@@ -647,7 +683,7 @@
 	 * @see Control#traverse(int)
 	 */
 	public boolean traverse(final Traverse traverse) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 
 		if (!(widget instanceof Control))
@@ -812,7 +848,7 @@
 	 * @see Keystrokes#toKeys(int, char)
 	 */
 	public AbstractSWTBot<T> pressShortcut(int modificationKeys, char c) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		keyboard().pressShortcut(modificationKeys, c);
 		return this;
@@ -828,7 +864,7 @@
 	 * @see Keystrokes#toKeys(int, char)
 	 */
 	public AbstractSWTBot<T> pressShortcut(int modificationKeys, int keyCode, char c) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		keyboard().pressShortcut(modificationKeys, keyCode, c);
 		return this;
@@ -843,7 +879,7 @@
 	 * @see Keystrokes
 	 */
 	public AbstractSWTBot<T> pressShortcut(KeyStroke... keys) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		keyboard().pressShortcut(keys);
 		return this;
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/BrowserAuthenticationListener.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/BrowserAuthenticationListener.java
new file mode 100644
index 0000000..0a49561
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/BrowserAuthenticationListener.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Obeo 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:
+ *     Mariot Chauvin, Obeo - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import org.eclipse.swt.browser.AuthenticationEvent;
+import org.eclipse.swt.browser.AuthenticationListener;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.utils.Credentials;
+
+/**
+ * A browser authentication listener.
+ * This implementation requires SWT 3.5 or later version.
+ * @author mchauvin
+ */
+final class BrowserAuthenticationListener implements AuthenticationListener {
+	
+	private Credentials	credentials;
+
+	public void init(final Browser widget) {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				widget.addAuthenticationListener(BrowserAuthenticationListener.this);
+			}
+		});
+	}
+	
+	public void setCredentials(Credentials credentials) {
+		this.credentials = credentials;
+	}
+
+	public Credentials getCredentials() {
+		return this.credentials;
+	}
+
+	public void authenticate(AuthenticationEvent event) {
+		if (credentials == null) {
+			event.doit = false;
+			return;
+		}
+		event.doit = true;
+		event.user = credentials.username();
+		event.password = credentials.password();
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButton.java
new file mode 100644
index 0000000..196eaac
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotArrowButton.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2008 Ketan Padegaonkar 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:
+ *     Ketan Padegaonkar - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swtbot.swt.finder.ReferenceBy;
+import org.eclipse.swtbot.swt.finder.SWTBotWidget;
+import org.eclipse.swtbot.swt.finder.Style;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
+import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.hamcrest.SelfDescribing;
+
+/**
+ * This represents a {@link Button} widget of type {@link SWT#ARROW}.
+ *
+ * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
+ * @version $Id$
+ * @see SWTBotCheckBox
+ * @see SWTBotRadio
+ * @see SWTBotToggleButton
+ */
+@SWTBotWidget(clasz = Button.class, style = @Style(name = "SWT.ARROW", value = SWT.ARROW), preferredName = "arrowButton", referenceBy = { ReferenceBy.LABEL, ReferenceBy.TOOLTIP })  //$NON-NLS-1$
+public class SWTBotArrowButton extends AbstractSWTBotControl<Button> {
+
+	/**
+	 * Constructs an instance of this object with the given button
+	 *
+	 * @param button the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 * @since 2.0
+	 */
+	public SWTBotArrowButton(Button button) {
+		this(button, null);
+	}
+
+	/**
+	 * Constructs an instance of this object with the given button
+	 *
+	 * @param button the widget.
+	 * @param description the description of the widget, this will be reported by {@link #toString()}
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 * @since 2.0
+	 */
+	public SWTBotArrowButton(Button button, SelfDescribing description) {
+		super(button, description);
+		Assert.isTrue(SWTUtils.hasStyle(button, SWT.ARROW), "Expecting an arrow button."); //$NON-NLS-1$
+	}
+
+	/**
+	 * Click on the button.
+	 */
+	public SWTBotArrowButton click() {
+		log.debug(MessageFormat.format("Clicking on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		waitForEnabled();
+		notify(SWT.MouseEnter);
+		notify(SWT.MouseMove);
+		notify(SWT.Activate);
+		notify(SWT.FocusIn);
+		notify(SWT.MouseDown);
+		notify(SWT.MouseUp);
+		notify(SWT.Selection);
+		notify(SWT.MouseHover);
+		notify(SWT.MouseMove);
+		notify(SWT.MouseExit);
+		notify(SWT.Deactivate);
+		notify(SWT.FocusOut);
+		log.debug(MessageFormat.format("Clicked on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
+		return this;
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowser.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowser.java
new file mode 100644
index 0000000..18308ea
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotBrowser.java
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Red Hat, Inc. 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:
+ *     Libor Zoubek, Red Hat - initial API and implementation
+ *     Ketan Padegaonkar - cleanup to conform to SWTBot standards
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.ProgressEvent;
+import org.eclipse.swt.browser.ProgressListener;
+import org.eclipse.swtbot.swt.finder.ReferenceBy;
+import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.SWTBotWidget;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.Result;
+import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.utils.Credentials;
+import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
+import org.hamcrest.SelfDescribing;
+
+/**
+ * This represents a {@link Browser} widget.
+ * 
+ * @author Libor Zoubek &lt;lzoubek [at] redhat [dot] com&gt;
+ */
+@SWTBotWidget(clasz = Browser.class, preferredName = "browser", referenceBy = { ReferenceBy.LABEL })
+public class SWTBotBrowser extends AbstractSWTBotControl<Browser> {
+
+	private final InternalProgressListener				progressListener;
+	private final static BrowserAuthenticationListener	authListener	= new BrowserAuthenticationListener();
+
+	/**
+	 * Constructs an instance of this object with the given browser
+	 * 
+	 * @param browser the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 * @since 2.0
+	 */
+	public SWTBotBrowser(Browser browser) {
+		this(browser, null);
+	}
+
+	/**
+	 * Constructs an instance of this object with the given browser
+	 * 
+	 * @param browser the widget.
+	 * @param description the description of the widget, this will be reported by {@link #toString()}
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 * @since 2.0
+	 */
+	public SWTBotBrowser(Browser browser, SelfDescribing description) {
+		super(browser, description);
+		progressListener = new InternalProgressListener(this);
+		authListener.init(widget);
+	}
+
+	/**
+	 * Loads given URI into browser, the page is loaded asynchronously (see {@link #isPageLoaded()})
+	 * 
+	 * @param url
+	 */
+	public void setUrl(final String url) {
+		UIThreadRunnable.syncExec(new VoidResult() {
+			public void run() {
+				progressListener.setDone(false);
+				widget.addProgressListener(progressListener);
+				boolean result = widget.setUrl(url);
+				if (!result) {
+					progressListener.setDone(true);
+					widget.removeProgressListener(progressListener);
+				}
+			}
+		});
+	}
+
+	/**
+	 * @return the current URL or an empty String if there is no current URL
+	 */
+	public String getUrl() {
+		waitForPageLoaded();
+		return UIThreadRunnable.syncExec(new Result<String>() {
+			public String run() {
+				return widget.getUrl();
+			}
+		});
+	}
+
+	@Override
+	public String getText() {
+		waitForPageLoaded();
+		return super.getText();
+	}
+
+	/**
+	 * Executes script in browser asynchronously
+	 * 
+	 * @param script
+	 */
+	public void execute(final String script) {
+		waitForPageLoaded();
+		UIThreadRunnable.asyncExec(new VoidResult() {
+			public void run() {
+				widget.execute(script);
+			}
+		});
+	}
+
+	/**
+	 * @return the receiver's back command enabled state
+	 */
+	public boolean isBackEnabled() {
+		return UIThreadRunnable.syncExec(new Result<Boolean>() {
+			public Boolean run() {
+				return widget.isBackEnabled();
+			}
+		});
+	}
+
+	/**
+	 * @return the receiver's forward command enabled state
+	 */
+	public boolean isForwardEnabled() {
+		return UIThreadRunnable.syncExec(new Result<Boolean>() {
+			public Boolean run() {
+				return widget.isForwardEnabled();
+			}
+		});
+	}
+
+	/**
+	 * Navigate to the previous session history item.
+	 */
+	public void back() {
+		UIThreadRunnable.asyncExec(new VoidResult() {
+			public void run() {
+				progressListener.setDone(false);
+				widget.addProgressListener(progressListener);
+				boolean result = widget.back();
+				if (!result) {
+					progressListener.setDone(true);
+					widget.removeProgressListener(progressListener);
+				}
+			}
+		});
+
+	}
+
+	/**
+	 * Navigate to the next session history item.
+	 */
+	public void forward() {
+		UIThreadRunnable.asyncExec(new VoidResult() {
+			public void run() {
+				progressListener.setDone(false);
+				widget.addProgressListener(progressListener);
+				boolean result = widget.forward();
+				if (!result) {
+					progressListener.setDone(true);
+					widget.removeProgressListener(progressListener);
+				}
+			}
+		});
+
+	}
+
+	/**
+	 * Refreshes browser
+	 */
+	public void refresh() {
+		UIThreadRunnable.asyncExec(new VoidResult() {
+			public void run() {
+				widget.refresh();
+			}
+		});
+	}
+
+	/**
+	 * @return <code>true</code> by default or when page was completely loaded by browser after asynchronous page load
+	 *         invoked by {@link #goURL(String)} was finished, this method returns false only during page loading
+	 */
+	public boolean isPageLoaded() {
+		return progressListener.isDone();
+	}
+
+	/**
+	 * Waits until browser loads page.
+	 * 
+	 * @throws TimeoutException if page is not loaded after default timeout
+	 */
+	public void waitForPageLoaded() {
+		new SWTBot().waitUntil(new WaitForBrowserLoadsPage(this));
+	}
+
+	/**
+	 * Sets credentials, which will be used when page requires authentication, if both username and password set to null
+	 * authentication (if requested) will be canceled
+	 * <p>
+	 * <b>Note:</b> Credentials are shared by all {@link SWTBotBrowser} instances.
+	 * </p>
+	 * instances
+	 * 
+	 * @param username the username
+	 * @param password the password
+	 */
+	public void setCredentials(String username, String password) {
+		setCredentials(new Credentials(username, password));
+	}
+
+	/**
+	 * Sets credentials, which will be used when page requires authentication, if both username and password set to null
+	 * authentication (if requested) will be canceled
+	 * <p>
+	 * <b>Note:</b> Credentials are shared by all {@link SWTBotBrowser} instances.
+	 * </p>
+	 * instances
+	 * 
+	 * @param credentials the credentials with the username and password
+	 */
+	public void setCredentials(Credentials credentials) {
+		authListener.setCredentials(credentials);
+	}
+
+	/**
+	 * Gets credentials.
+	 * 
+	 * @return the credentials containing the username and password.
+	 */
+	public Credentials getCredentials() {
+		return authListener.getCredentials();
+	}
+
+	/**
+	 * This represents internal progress listener notified when browser finishes loading of URL
+	 * 
+	 * @author Libor Zoubek &lt;lzoubek [at] redhat [dot] com&gt;
+	 */
+	class InternalProgressListener implements ProgressListener {
+		private final SWTBotBrowser	browser;
+		private boolean				done	= true;
+
+		public InternalProgressListener(SWTBotBrowser browser) {
+			this.browser = browser;
+		}
+
+		public synchronized boolean isDone() {
+			return done;
+		}
+
+		public synchronized void setDone(boolean done) {
+			this.done = done;
+		}
+
+		public void changed(ProgressEvent event) {
+		}
+
+		public void completed(ProgressEvent event) {
+			setDone(true);
+			browser.widget.removeProgressListener(this);
+		}
+
+	}
+
+	private static final class WaitForBrowserLoadsPage extends DefaultCondition {
+
+		private final SWTBotBrowser	browser;
+
+		public WaitForBrowserLoadsPage(SWTBotBrowser browser) {
+			Assert.isNotNull(browser, "The browser can not be null"); //$NON-NLS-1$		
+			this.browser = browser;
+		}
+
+		public String getFailureMessage() {
+			return "Browser dit not finish loading page before timeout."; //$NON-NLS-1$	
+		}
+
+		public boolean test() throws Exception {
+			return browser.isPageLoaded();
+		}
+
+	}
+
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButton.java
index 85d9051..b55b156 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotButton.java
@@ -62,7 +62,7 @@
 	 */
 	public SWTBotButton click() {
 		log.debug(MessageFormat.format("Clicking on {0}", SWTUtils.getText(widget))); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		notify(SWT.MouseEnter);
 		notify(SWT.MouseMove);
 		notify(SWT.Activate);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCCombo.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCCombo.java
index 4765b0b..aff7662 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCCombo.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCCombo.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Cedric Chabanois and others.
+ * Copyright (c) 2008, 2010 Cedric Chabanois 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
@@ -9,6 +9,7 @@
  *     Cedric Chabanois - initial API and implementation
  *     Cédric Chabanois - http://swtbot.org/bugzilla/show_bug.cgi?id=17
  *     Stefan Seelmann - http://swtbot.org/bugzilla/show_bug.cgi?id=26
+ *     Ketan Padegaonkar - ongoing bugfixes
  *******************************************************************************/
 package org.eclipse.swtbot.swt.finder.widgets;
 
@@ -64,7 +65,7 @@
 	 */
 	public void setText(final String text) {
 		log.debug(MessageFormat.format("Setting text on widget {0} to {1}", this, text)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		if (hasStyle(widget, SWT.READ_ONLY))
 			throw new RuntimeException("This combo box is read-only."); //$NON-NLS-1$
 		asyncExec(new VoidResult() {
@@ -97,7 +98,6 @@
 	public void setSelection(final String text) {
 		log.debug(MessageFormat.format("Setting selection on {0} to {1}", widget, text)); //$NON-NLS-1$
 		_setSelection(text);
-		notify(SWT.Selection);
 		log.debug(MessageFormat.format("Set selection on {0} to {1}", widget, text)); //$NON-NLS-1$
 	}
 
@@ -107,7 +107,7 @@
 	 * @param text The text to use.
 	 */
 	private void _setSelection(final String text) {
-		assertEnabled();
+		waitForEnabled();
 		final int indexOf = syncExec(new IntResult() {
 			public Integer run() {
 				String[] items = widget.getItems();
@@ -164,7 +164,7 @@
 	 * @param index the zero based index.
 	 */
 	public void setSelection(final int index) {
-		assertEnabled();
+		waitForEnabled();
 		int itemCount = itemCount();
 		if (index > itemCount)
 			throw new RuntimeException("The index (" + index + ") is more than the number of items (" + itemCount + ") in the combo."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItem.java
index 4221ee3..a306786 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCTabItem.java
@@ -89,7 +89,7 @@
 	 */
 	public SWTBotCTabItem activate() throws TimeoutException {
 		log.trace(MessageFormat.format("Activating {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		// this runs in sync because tabFolder.setSelection() does not send a notification, and so should not block.
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -142,7 +142,7 @@
 	 * @return this CTabItem.
 	 */
 	public SWTBotCTabItem close() {
-		assertEnabled();
+		waitForEnabled();
 		Rectangle rectangleCloseBox = syncExec(new Result<Rectangle>() {
 			public Rectangle run() {
 				try {
@@ -175,7 +175,7 @@
 		notifyParent(SWT.MouseMove);
 		notifyParent(SWT.Activate);
 		notifyParent(SWT.FocusIn);
-		notifyParent(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
+		notifyParent(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.NONE, 1));
 		// this event being button 1 is what allows CTabItem to close
 		notifyParent(SWT.MouseUp, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
 		notifyParent(SWT.Selection);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBox.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBox.java
index addc2e2..8169c85 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBox.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCheckBox.java
@@ -74,7 +74,7 @@
 	 */
 	public void deselect() {
 		log.debug(MessageFormat.format("Deselecting {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		if (!isChecked()) {
 			log.debug(MessageFormat.format("Widget {0} already deselected, not deselecting again.", this)); //$NON-NLS-1$
 			return;
@@ -93,7 +93,7 @@
 	 */
 	public void select() {
 		log.debug(MessageFormat.format("Selecting {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		if (isChecked()) {
 			log.debug(MessageFormat.format("Widget {0} already selected, not selecting again.", this)); //$NON-NLS-1$
 			return;
@@ -111,7 +111,7 @@
 	 * Toggle the checkbox.
 	 */
 	protected void toggle() {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				log.debug(MessageFormat.format("Toggling state on {0}. Setting state to {1}", widget, (!widget.getSelection() ? "selected" //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCombo.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCombo.java
index 8ec4f84..62e2013 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCombo.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotCombo.java
@@ -24,6 +24,7 @@
 import org.eclipse.swtbot.swt.finder.results.StringResult;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
 import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
+import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
 import org.hamcrest.SelfDescribing;
 
 /**
@@ -57,13 +58,37 @@
 	}
 
 	/**
+	 * Types the string in the combo box.
+	 *
+	 * @param text the text to be typed.
+	 * @return the same instance.
+	 */
+	public SWTBotCombo typeText(final String text) {
+		return typeText(text, SWTBotPreferences.TYPE_INTERVAL);
+	}
+
+	/**
+	 * Types the string in the combo box.
+	 *
+	 * @param text the text to be typed.
+	 * @param interval the interval between consecutive key strokes.
+	 * @return the same instance.
+	 */
+	public SWTBotCombo typeText(final String text, int interval) {
+		log.debug(MessageFormat.format("Inserting text:{0} into text {1}", text, this)); //$NON-NLS-1$
+		setFocus();
+		keyboard().typeText(text, interval);
+		return this;
+	}
+
+	/**
 	 * Set the selection to the specified text.
 	 * 
 	 * @param text the text to set into the combo.
 	 */
 	public void setSelection(final String text) {
 		log.debug(MessageFormat.format("Setting selection on {0} to {1}", this, text)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		_setSelection(text);
 		notify(SWT.Selection);
 		log.debug(MessageFormat.format("Set selection on {0} to {1}", this, text)); //$NON-NLS-1$
@@ -122,7 +147,7 @@
 	 * @param index the zero based index.
 	 */
 	public void setSelection(final int index) {
-		assertEnabled();
+		waitForEnabled();
 		int itemCount = itemCount();
 		if (index > itemCount)
 			throw new RuntimeException("The index (" + index + ") is more than the number of items (" + itemCount + ") in the combo."); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -170,7 +195,7 @@
 	 */
 	public void setText(final String text) {
 		log.debug(MessageFormat.format("Setting text on {0} to {1}", this, text)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 
 		if (hasStyle(widget, SWT.READ_ONLY))
 			throw new RuntimeException("This combo box is read-only."); //$NON-NLS-1$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTime.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTime.java
index 6b63d87..c39d6c8 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTime.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotDateTime.java
@@ -84,14 +84,11 @@
 	 */
 	public void setDate(final Date toSet) {
 		log.debug(MessageFormat.format("Setting date on control: {0} to {1}", this, toSet)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		syncExec(new VoidResult() {
 			@SuppressWarnings("deprecation")
 			public void run() {
-				widget.setYear(toSet.getYear() + 1900);
-				widget.setDay(toSet.getDate());
-				widget.setMonth(toSet.getMonth());
-
+				widget.setDate(toSet.getYear() + 1900, toSet.getMonth(), toSet.getDate());
 				widget.setHours(toSet.getHours());
 				widget.setMinutes(toSet.getMinutes());
 				widget.setSeconds(toSet.getSeconds());
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBar.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBar.java
new file mode 100644
index 0000000..9a62bec
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandBar.java
@@ -0,0 +1,188 @@
+/*******************************************************************************
+ * Copyright (c) 2011 SWTBot Committers 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:
+ *     Toby Weston - initial API and implementation (Bug 259799)
+ *******************************************************************************/
+package org.eclipse.swtbot.swt.finder.widgets;
+
+import static java.util.Collections.emptyList;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.allOf;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
+import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withText;
+import static org.eclipse.swtbot.swt.finder.waits.Conditions.waitForWidget;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.swt.widgets.ExpandBar;
+import org.eclipse.swt.widgets.ExpandItem;
+import org.eclipse.swt.widgets.Widget;
+import org.eclipse.swtbot.swt.finder.ReferenceBy;
+import org.eclipse.swtbot.swt.finder.SWTBot;
+import org.eclipse.swtbot.swt.finder.SWTBotWidget;
+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.results.IntResult;
+import org.eclipse.swtbot.swt.finder.results.ListResult;
+import org.eclipse.swtbot.swt.finder.waits.WaitForObjectCondition;
+import org.hamcrest.Matcher;
+import org.hamcrest.SelfDescribing;
+
+/**
+ * Represents an {@link ExpandBar}.
+ * 
+ * @author Toby Weston
+ */
+@SWTBotWidget(clasz = ExpandBar.class, preferredName = "expandBar", referenceBy = { ReferenceBy.LABEL })
+public class SWTBotExpandBar extends AbstractSWTBot<ExpandBar> {
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotExpandBar(ExpandBar w) {
+		super(w);
+	}
+
+	/**
+	 * Constructs a new instance with the given widget.
+	 * 
+	 * @param w the widget.
+	 * @param description the description of the widget, this will be reported by {@link #toString()}
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 */
+	public SWTBotExpandBar(ExpandBar w, SelfDescribing description) {
+		super(w, description);
+	}
+
+	/**
+	 * @return the number of {@link ExpandItem}s in the widget.
+	 */
+	public int itemCount() {
+		return syncExec(new IntResult() {
+			public Integer run() {
+				return widget.getItemCount();
+			}
+		});
+	}
+
+	/**
+	 * @return the number of items that are expanded.
+	 * @see #itemCount()
+	 * @see #collapsedItemCount()
+	 */
+	public int expandedItemCount() {
+		return syncExec(new IntResult() {
+			public Integer run() {
+				int count = 0;
+				for (ExpandItem item : widget.getItems()) {
+					if (item.getExpanded())
+						count++;
+				}
+				return count;
+			}
+		});
+	}
+
+	/**
+	 * @return the number of items that are collapsed.
+	 * @see #itemCount()
+	 * @see #expandedItemCount()
+	 */
+	public int collapsedItemCount() {
+		return itemCount() - expandedItemCount();
+	}
+
+	/**
+	 * Expands the {@link ExpandItem} and returns it.
+	 * 
+	 * @param itemText the text on the item.
+	 * @return the {@link SWTBotExpandItem} with the specified text.
+	 */
+	@SuppressWarnings("unchecked")
+	public SWTBotExpandItem expandItem(final String itemText) {
+		return expandItem(withText(itemText));
+	}
+
+	/**
+	 * Expands the {@link ExpandItem} and returns it.
+	 * 
+	 * @param matcher the matcher.
+	 * @return the {@link SWTBotExpandItem} that matches the matcher
+	 */
+	public SWTBotExpandItem expandItem(Matcher<Widget> matcher) {
+		waitForEnabled();
+		return getExpandItem(matcher).expand();
+	}
+
+	/**
+	 * Collapses the {@link ExpandItem} and returns it.
+	 * 
+	 * @param itemText the text on the item.
+	 * @return the {@link SWTBotExpandItem} with the specified text.
+	 */
+	@SuppressWarnings("unchecked")
+	public SWTBotExpandItem collapseItem(final String itemText) {
+		return collapseItem(withText(itemText));
+	}
+
+	/**
+	 * Collapses the {@link ExpandItem} and returns it.
+	 * 
+	 * @param matcher the matcher.
+	 * @return the {@link SWTBotExpandItem} that matches the matcher.
+	 */
+	public SWTBotExpandItem collapseItem(Matcher<Widget> matcher) {
+		waitForEnabled();
+		return getExpandItem(matcher).collapse();
+	}
+
+	/**
+	 * Return the {@link ExpandItem} that matches the specified matcher.
+	 * 
+	 * @param matcher the matcher.
+	 * @return the {@link SWTBotExpandItem} with the specified text.
+	 */
+	public SWTBotExpandItem getExpandItem(Matcher<Widget> matcher) {
+		try {
+			matcher = allOf(widgetOfType(ExpandItem.class), matcher);
+			WaitForObjectCondition<? extends Widget> waitForWidget = waitForWidget(matcher, widget);
+			new SWTBot().waitUntilWidgetAppears(waitForWidget);
+			return new SWTBotExpandItem((ExpandItem) waitForWidget.get(0), matcher);
+		} catch (TimeoutException e) {
+			throw new WidgetNotFoundException("Timed out waiting for expandBar item " + matcher, e);
+		}
+	}
+
+	/**
+	 * @return a list of {@link SWTBotExpandItem} or the empty list if there was a problem with any of the items.
+	 */
+	public List<SWTBotExpandItem> getAllItems() {
+		return syncExec(new ListResult<SWTBotExpandItem>() {
+			public List<SWTBotExpandItem> run() {
+				List<SWTBotExpandItem> result = new ArrayList<SWTBotExpandItem>();
+				for (ExpandItem item : widget.getItems()) {
+					try {
+						result.add(new SWTBotExpandItem(item));
+					} catch (WidgetNotFoundException e) {
+						return emptyList();
+					}
+				}
+				return result;
+			}
+		});
+	}
+
+	/**
+	 * @return <code>true</code> if the expandBar has any items, <code>false</code> otherwise.
+	 */
+	public boolean hasItems() {
+		return itemCount() > 0;
+	}
+}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandItem.java
new file mode 100644
index 0000000..ca7cadb
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotExpandItem.java
@@ -0,0 +1,145 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SWTBot Committers 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:

+ *     Toby Weston - initial API and implementation (Bug 259799)

+ *******************************************************************************/

+package org.eclipse.swtbot.swt.finder.widgets;

+

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.widgets.Event;

+import org.eclipse.swt.widgets.ExpandBar;

+import org.eclipse.swt.widgets.ExpandItem;

+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;

+import org.eclipse.swtbot.swt.finder.results.BoolResult;

+import org.eclipse.swtbot.swt.finder.results.VoidResult;

+import org.eclipse.swtbot.swt.finder.results.WidgetResult;

+import org.hamcrest.SelfDescribing;

+

+/**

+ * Represents an {@link ExpandItem}.

+ * 

+ * @author Toby Weston (Bug 259799)

+ * @version $Id$

+ */

+public class SWTBotExpandItem extends AbstractSWTBot<ExpandItem> {

+	private ExpandBar	expandBar;

+

+	/**

+	 * Constructs a new instance with the given widget.

+	 * 

+	 * @param w the widget.

+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.

+	 */

+	public SWTBotExpandItem(ExpandItem w) throws WidgetNotFoundException {

+		this(w, null);

+	}

+

+	/**

+	 * Constructs a new instance with the given widget.

+	 * 

+	 * @param w the widget.

+	 * @param description the description of the widget, this will be reported by {@link #toString()}

+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.

+	 */

+	public SWTBotExpandItem(final ExpandItem w, SelfDescribing description) throws WidgetNotFoundException {

+		super(w, description);

+		this.expandBar = syncExec(new WidgetResult<ExpandBar>() {

+			public ExpandBar run() {

+				return w.getParent();

+			}

+		});

+	}

+

+	/**

+	 * Expand this item and return itself.

+	 * 

+	 * @return itself.

+	 */

+	public SWTBotExpandItem expand() {

+		asyncExec(new VoidResult() {

+			public void run() {

+				if (isExpanded())

+					return;

+				widget.setExpanded(true);

+				expandNotify();

+			}

+		});

+		return this;

+	}

+

+	/**

+	 * Collapse this item and return itself.

+	 * 

+	 * @return itself.

+	 */

+	public SWTBotExpandItem collapse() {

+		asyncExec(new VoidResult() {

+			public void run() {

+				if (isCollapsed())

+					return;

+				widget.setExpanded(false);

+				collapseNotify();

+			}

+		});

+		return this;

+	}

+

+	/**

+	 * @return <code>true</code> if the item is expanded, <code>false</code> otherwise.

+	 * @see #isCollapsed()

+	 */

+	public boolean isExpanded() {

+		return syncExec(new BoolResult() {

+			public Boolean run() {

+				return widget.getExpanded();

+			}

+		});

+	}

+

+	/**

+	 * @return <code>true</code> if the item is collapsed, <code>false</code> otherwise.

+	 * @see SWTBotExpandItem#isExpanded()

+	 */

+	public boolean isCollapsed() {

+		return !isExpanded();

+	}

+

+	private void expandNotify() {

+		notifyExpandBar(SWT.MouseMove);

+		notifyExpandBar(SWT.Activate);

+		notifyExpandBar(SWT.FocusIn);

+		notifyExpandBar(SWT.MouseDown);

+		notifyExpandBar(SWT.Expand);

+		notifyExpandBar(SWT.MeasureItem);

+		notifyExpandBar(SWT.Deactivate);

+		notifyExpandBar(SWT.FocusOut);

+	}

+

+	private void collapseNotify() {

+		notifyExpandBar(SWT.MouseMove);

+		notifyExpandBar(SWT.Activate);

+		notifyExpandBar(SWT.FocusIn);

+		notifyExpandBar(SWT.MouseDown);

+		notifyExpandBar(SWT.Collapse);

+		notifyExpandBar(SWT.MeasureItem);

+		notifyExpandBar(SWT.Deactivate);

+		notifyExpandBar(SWT.FocusOut);

+	}

+

+	private void notifyExpandBar(int eventType) {

+		notify(eventType, createEvent(), expandBar);

+	}

+

+	protected Event createEvent() {

+		Event e = super.createEvent();

+		e.widget = expandBar;

+		e.item = widget;

+		return e;

+	}

+

+}

diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLink.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLink.java
index 198a729..d55dae3 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLink.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotLink.java
@@ -68,9 +68,10 @@
 		Assert.isLegal(isText, "Link does not contain text (" + hyperlinkText + "). It contains (" + text + ")");
 
 		hyperlinkText = extractHyperlinkTextOrHREF(hyperlinkText, text);
+		notify(SWT.MouseDown, createMouseEvent(0, 0, 1, SWT.NONE, 1));
 		notify(SWT.Selection, createHyperlinkEvent(hyperlinkText));
-
-		return click(true);
+		notify(SWT.MouseUp, createMouseEvent(0, 0, 1, SWT.BUTTON1, 1));
+		return this;
 	}
 
 	private String extractHyperlinkTextOrHREF(String hyperlinkText, String text) {
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotList.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotList.java
index ded7cb3..d8f9235 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotList.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotList.java
@@ -60,7 +60,7 @@
 	 */
 	public void select(final String item) {
 		log.debug(MessageFormat.format("Set selection {0} to text {1}", this, item)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		final int indexOf = indexOf(item);
 		Assert.isTrue(indexOf != -1, "Item `" + item + "' not found in list."); //$NON-NLS-1$ //$NON-NLS-2$
 		asyncExec(new VoidResult() {
@@ -78,7 +78,7 @@
 	 */
 	public void select(final int index) {
 		log.debug(MessageFormat.format("Set selection {0} to index {1}", this, index)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		int itemCount = itemCount();
 		Assert.isTrue(index <= itemCount, java.text.MessageFormat.format(
 				"The index ({0}) is more than the number of items ({1}) in the list.", index, itemCount)); //$NON-NLS-1$
@@ -134,9 +134,9 @@
 	 * 
 	 * @param indices the indices to select in the list.
 	 */
-	public void select(final int[] indices) {
+	public void select(final int... indices) {
 		log.debug(MessageFormat.format("Set selection {0} to indices {1}]", this, StringUtils.join(indices, ", "))); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.setSelection(indices);
@@ -151,9 +151,9 @@
 	 * 
 	 * @param items the items to select in the list.
 	 */
-	public void select(final String[] items) {
+	public void select(final String... items) {
 		log.debug(MessageFormat.format("Set selection {0} to items [{1}]", this, StringUtils.join(items, ", "))); //$NON-NLS-1$ //$NON-NLS-2$
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.deselectAll();
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenu.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenu.java
index a2011c0..71d3ad8 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenu.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotMenu.java
@@ -55,7 +55,7 @@
 	 */
 	public SWTBotMenu click() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		toggleSelection();
 		notify(SWT.Selection);
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadio.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadio.java
index 53a3596..c3ee7d4 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadio.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotRadio.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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
@@ -19,6 +19,7 @@
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.results.BoolResult;
 import org.eclipse.swtbot.swt.finder.results.VoidResult;
+import org.eclipse.swtbot.swt.finder.results.WidgetResult;
 import org.eclipse.swtbot.swt.finder.utils.MessageFormat;
 import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
 import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
@@ -66,42 +67,55 @@
 			log.debug(MessageFormat.format("Widget {0} is already selected, not clicking again.", this)); //$NON-NLS-1$
 			return this;
 		}
-		assertEnabled();
+		waitForEnabled();
+
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
+
+		final SWTBotRadio otherSelectedButton = otherSelectedButton();
+
+		if (otherSelectedButton != null) {
+			otherSelectedButton.notify(SWT.Deactivate);
+			asyncExec(new VoidResult() {
+				public void run() {
+					otherSelectedButton.widget.setSelection(false);
+				}
+			});
+		}
+
+		notify(SWT.Activate);
+		notify(SWT.MouseDown, createMouseEvent(0, 0, 1, 0, 1));
+		notify(SWT.MouseUp, createMouseEvent(0, 0, 1, SWT.BUTTON1, 1));
 		asyncExec(new VoidResult() {
 			public void run() {
-				deselectOtherRadioButtons();
-				log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
 				widget.setSelection(true);
 			}
+		});
+		notify(SWT.Selection);
+		if (otherSelectedButton != null) {
+			otherSelectedButton.notify(SWT.Selection);
+		}
+		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
+		return this;
+	}
 
-			/**
-			 * @see "http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet224.java?view=co"
-			 */
-			private void deselectOtherRadioButtons() {
+	private SWTBotRadio otherSelectedButton() {
+		Button button = syncExec(new WidgetResult<Button>() {
+			public Button run() {
 				if (hasStyle(widget.getParent(), SWT.NO_RADIO_GROUP))
-					return;
+					return null;
 				Widget[] siblings = SWTUtils.siblings(widget);
 				for (Widget widget : siblings) {
 					if ((widget instanceof Button) && hasStyle(widget, SWT.RADIO))
-						((Button) widget).setSelection(false);
+						if (((Button) widget).getSelection())
+							return (Button) widget;
 				}
+				return null;
 			}
 		});
-		notify(SWT.MouseEnter);
-		notify(SWT.MouseMove);
-		notify(SWT.Activate);
-		notify(SWT.FocusIn);
-		notify(SWT.MouseDown);
-		notify(SWT.MouseUp);
-		notify(SWT.Selection);
-		notify(SWT.MouseHover);
-		notify(SWT.MouseMove);
-		notify(SWT.MouseExit);
-		notify(SWT.Deactivate);
-		notify(SWT.FocusOut);
-		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
-		return this;
+
+		if (button != null)
+			return new SWTBotRadio(button);
+		return null;
 	}
 
 	/**
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScale.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScale.java
new file mode 100644
index 0000000..b6f3a27
--- /dev/null
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotScale.java
@@ -0,0 +1,133 @@
+/*******************************************************************************

+ * Copyright (c) 2011 SWTBot Committers 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:

+ *     John Cortell - initial API and implementation

+ *******************************************************************************/

+package org.eclipse.swtbot.swt.finder.widgets;

+

+import org.eclipse.swt.SWT;

+import org.eclipse.swt.widgets.Scale;

+import org.eclipse.swtbot.swt.finder.ReferenceBy;

+import org.eclipse.swtbot.swt.finder.SWTBotWidget;

+import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;

+import org.eclipse.swtbot.swt.finder.results.IntResult;

+import org.eclipse.swtbot.swt.finder.results.VoidResult;

+import org.eclipse.swtbot.swt.finder.utils.MessageFormat;

+import org.hamcrest.SelfDescribing;

+

+/**

+ * Represents a scale

+ * 

+ * @author John Cortell

+ */

+@SWTBotWidget(clasz = Scale.class, preferredName = "scale", referenceBy = { ReferenceBy.LABEL, ReferenceBy.TEXT, ReferenceBy.TOOLTIP })

+public class SWTBotScale extends AbstractSWTBot<Scale> {

+

+	/**

+	 * Constructs a new instance with the given widget.

+	 * 

+	 * @param widget the widget.

+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.

+	 */

+	public SWTBotScale(Scale widget) throws WidgetNotFoundException {

+		super(widget);

+	}

+

+	/**

+	 * Constructs an instance with the given widget

+	 * 

+	 * @param widget the widget.

+	 * @param description the description of the widget, this will be reported by {@link #toString()}

+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.

+	 */

+	public SWTBotScale(Scale widget, SelfDescribing description) throws WidgetNotFoundException {

+		super(widget, description);

+	}

+

+	/**

+	 * Return the current value of the scale.

+	 * 

+	 * @return the current selection in the scale.

+	 */

+	public int getValue() {

+		return syncExec(new IntResult() {

+			public Integer run() {

+				return widget.getSelection();

+			}

+		});

+	}

+

+	/**

+	 * Set the selection to the specified value.

+	 * 

+	 * @param value the value to set into the scale.

+	 */

+	public void setValue(final int value) {

+		log.debug(MessageFormat.format("Setting selection on {0} to {1}", this, value)); //$NON-NLS-1$

+		waitForEnabled();

+		asyncExec(new VoidResult() {

+			public void run() {

+				widget.setSelection(value);

+			}

+		});

+		notify(SWT.Selection);

+		log.debug(MessageFormat.format("Set selection on {0} to {1}", this, value)); //$NON-NLS-1$

+	}

+

+	/**

+	 * Return the maximum value the scale will accept.

+	 * 

+	 * @return the maximum of the scale.

+	 */

+	public int getMaximum() {

+		return syncExec(new IntResult() {

+			public Integer run() {

+				return widget.getMaximum();

+			}

+		});

+	}

+

+	/**

+	 * Return the minimum value the scale will accept.

+	 * 

+	 * @return the minimum of the scale.

+	 */

+	public int getMinimum() {

+		return syncExec(new IntResult() {

+			public Integer run() {

+				return widget.getMinimum();

+			}

+		});

+	}

+

+	/**

+	 * Return the increment of the scale.

+	 * 

+	 * @return the increment of the scale.

+	 */

+	public int getIncrement() {

+		return syncExec(new IntResult() {

+			public Integer run() {

+				return widget.getIncrement();

+			}

+		});

+	}

+

+	/**

+	 * Return the page increment of the scale.

+	 * 

+	 * @return the increment of the scale.

+	 */

+	public int getPageIncrement() {

+		return syncExec(new IntResult() {

+			public Integer run() {

+				return widget.getPageIncrement();

+			}

+		});

+	}

+}

diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShell.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShell.java
index 598690c..27e471f 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShell.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotShell.java
@@ -138,4 +138,13 @@
 		});
 	}
 
+	/**
+	 * Returns a SWTBot instance that matches the contents of this shell.
+	 * 
+	 * @return SWTBot
+	 */
+	public SWTBot bot() {
+		return new SWTBot(widget);
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSlider.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSlider.java
index 8b1ff0d..e156d87 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSlider.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSlider.java
@@ -70,7 +70,7 @@
 	 */
 	public void setSelection(final int value) {
 		log.debug(MessageFormat.format("Setting selection on {0} to {1}", this, value)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.setSelection(value);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinner.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinner.java
index 3c46025..cb2b3a7 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinner.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotSpinner.java
@@ -71,7 +71,7 @@
 	 */
 	public void setSelection(final int value) {
 		log.debug(MessageFormat.format("Setting selection on {0} to {1}", this, value)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.setSelection(value);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledText.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledText.java
index 9dcc91d..01119d8 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledText.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotStyledText.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008,2010 Ketan Padegaonkar 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
@@ -70,7 +70,7 @@
 	 * @param text the text to set.
 	 */
 	public void setText(final String text) {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.setText(text);
@@ -119,7 +119,7 @@
 	 */
 	public void navigateTo(final int line, final int column) {
 		log.debug(MessageFormat.format("Enquing navigation to location {0}, {1} in {2}", line, column, this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -190,7 +190,7 @@
 	 * @param text the text to be inserted at the location of the caret.
 	 */
 	public void insertText(final String text) {
-		assertEnabled();
+		waitForEnabled();
 		syncExec(new VoidResult() {
 			public void run() {
 				widget.insert(text);
@@ -262,7 +262,7 @@
 	 * @param length the length of the selection.
 	 */
 	public void selectRange(final int line, final int column, final int length) {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				int offset = offset(line, column);
@@ -442,4 +442,18 @@
 			}
 		});
 	}
+
+	/**
+	 * Gets the tab width of the {@link StyledText} measured in characters.
+	 * 
+	 * @return the tab width of the {@link StyledText} measured in characters.
+	 */
+	public int getTabs() {
+		return syncExec(new IntResult() {
+			public Integer run() {
+				return widget.getTabs();
+			}
+		});
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItem.java
index ffb8f64..d3cc00e 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTabItem.java
@@ -70,7 +70,7 @@
 	 */
 	public SWTBotTabItem activate() throws TimeoutException {
 		log.trace(MessageFormat.format("Activating {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		// this runs in sync because tabFolder.setSelection() does not send a notification, and so should not block.
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -111,7 +111,7 @@
 	public boolean isEnabled() {
 		return syncExec(new BoolResult() {
 			public Boolean run() {
-				return widget.getParent().isEnabled();
+				return parent.isEnabled();
 			}
 		});
 	}
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTable.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTable.java
index c3171d0..b3d8128 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTable.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTable.java
@@ -229,7 +229,7 @@
 	 * @since 1.0
 	 */
 	public void select(final String... items) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		int[] itemIndicies = new int[items.length];
 		for(int i = 0; i < items.length; i++) {
@@ -307,7 +307,7 @@
 	 * Unselect all selections.
 	 */
 	public void unselect() {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -324,7 +324,7 @@
 	 * @param indices the row indices to select in the table.
 	 */
 	public void select(final int... indices) {
-		assertEnabled();
+		waitForEnabled();
 		if (indices.length > 1)
 			assertMultiSelect();
 		setFocus();
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumn.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumn.java
index 12ab770..c809a2f 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumn.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableColumn.java
@@ -14,6 +14,8 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
+import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
+import org.eclipse.swtbot.swt.finder.results.WidgetResult;
 import org.hamcrest.SelfDescribing;
 
 /**
@@ -28,6 +30,21 @@
 	 * Constructs a new instance of this object.
 	 * 
 	 * @param w the widget.
+	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
+	 * @since 2.0
+	 */
+	public SWTBotTableColumn(final TableColumn w) throws WidgetNotFoundException {
+		this(w, UIThreadRunnable.syncExec(new WidgetResult<Table>() {
+			public Table run() {
+				return w.getParent();
+			}
+		}));
+	}
+	
+	/**
+	 * Constructs a new instance of this object.
+	 * 
+	 * @param w the widget.
 	 * @param parent the parent table.
 	 * @throws WidgetNotFoundException if the widget is <code>null</code> or widget has been disposed.
 	 * @since 2.0
@@ -54,7 +71,7 @@
 	 * Clicks the item.
 	 */
 	public SWTBotTableColumn click() {
-		assertEnabled();
+		waitForEnabled();
 		notify(SWT.Selection);
 		notify(SWT.MouseUp, createMouseEvent(0, 0, 1, SWT.BUTTON1, 1), parent);
 		return this;
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
index a239e05..9dc243b 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTableItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 http://www.inria.fr/ and others.
+ * Copyright (c) 2008,2010 http://www.inria.fr/ 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
@@ -87,9 +87,9 @@
 		notifyTable(SWT.MouseMove);
 		notifyTable(SWT.Activate);
 		notifyTable(SWT.FocusIn);
-		notifyTable(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
-		notifyTable(SWT.MouseUp);
+		notifyTable(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.NONE, 1));
 		notifyTable(SWT.Selection, createEvent());
+		notifyTable(SWT.MouseUp, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
 		notifyTable(SWT.MouseHover);
 		notifyTable(SWT.MouseMove);
 		notifyTable(SWT.MouseExit);
@@ -139,7 +139,7 @@
 	}
 	
 	public SWTBotMenu contextMenu(String text) throws WidgetNotFoundException {
-		new SWTBotTable(table).assertEnabled();
+		new SWTBotTable(table).waitForEnabled();
 		select();
 		notifyTable(SWT.MenuDetect);
 		return super.contextMenu(table, text);
@@ -260,6 +260,14 @@
 		event.widget = table;
 		return event;
 	}
+	
+	public boolean isEnabled() {
+		return syncExec(new BoolResult() {
+			public Boolean run() {
+				return table.isEnabled();
+			}
+		});
+	}
 
 //	protected Rectangle absoluteLocation() {
 //		return syncExec(new Result<Rectangle>() {
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotText.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotText.java
index 77004ee..e6641e9 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotText.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotText.java
@@ -27,7 +27,7 @@
  * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
  * @version $Id$
  */
-@SWTBotWidget(clasz = Text.class, preferredName = "text", referenceBy = { ReferenceBy.LABEL, ReferenceBy.TEXT, ReferenceBy.TOOLTIP })
+@SWTBotWidget(clasz = Text.class, preferredName = "text", referenceBy = { ReferenceBy.LABEL, ReferenceBy.TEXT, ReferenceBy.TOOLTIP, ReferenceBy.MESSAGE })
 public class SWTBotText extends AbstractSWTBot<Text> {
 
 	/**
@@ -58,7 +58,7 @@
 	 * @return the same instance.
 	 */
 	public SWTBotText setText(final String text) {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				widget.setText(text);
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButton.java
index 40715d8..724b2f1 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToggleButton.java
@@ -74,7 +74,7 @@
 	 */
 	public void unpress() {
 		log.debug(MessageFormat.format("Deselecting {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		if (!isPressed()) {
 			log.debug(MessageFormat.format("Widget {0} already deselected, not deselecting again.", this)); //$NON-NLS-1$
 			return;
@@ -93,7 +93,7 @@
 	 */
 	public void press() {
 		log.debug(MessageFormat.format("Selecting {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		if (isPressed()) {
 			log.debug(MessageFormat.format("Widget {0} already selected, not selecting again.", this)); //$NON-NLS-1$
 			return;
@@ -111,7 +111,7 @@
 	 * Toggle the toggle button.
 	 */
 	protected void toggle() {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				log.debug(MessageFormat.format("Toggling state on {0}. Setting state to {1}", widget, (!widget.getSelection() ? "selected" //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButton.java
index a0752e6..2eb55a8 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarDropDownButton.java
@@ -40,7 +40,7 @@
  * @since 1.2
  */
 @SWTBotWidget(clasz = ToolItem.class, preferredName = "toolbarDropDownButton", style = @Style(name = "SWT.DROP_DOWN", value = SWT.DROP_DOWN), referenceBy = {
-		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP })
+		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP}, returnType = SWTBotToolbarDropDownButton.class )
 public class SWTBotToolbarDropDownButton extends SWTBotToolbarButton {
 
 	/**
@@ -109,7 +109,7 @@
 		try {
 			menuFinder.register();
 			log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-			assertEnabled();
+			waitForEnabled();
 			notify(SWT.MouseEnter);
 			notify(SWT.MouseMove);
 			notify(SWT.Activate);
@@ -137,7 +137,7 @@
 	 */
 	public SWTBotToolbarDropDownButton click() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		sendNotifications();
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
 		return this;
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButton.java
index d232e15..ea7594c 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarPushButton.java
@@ -24,7 +24,8 @@
 /**
  * @author Mariot Chauvin &lt;mariot [dot] chauvin [at] obeo [dot] fr&gt;
  */
-@SWTBotWidget(clasz = ToolItem.class, style = @Style(name="SWT.PUSH", value=SWT.PUSH), preferredName = "toolbarButton", referenceBy = { ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP })
+@SWTBotWidget(clasz = ToolItem.class, style = @Style(name = "SWT.PUSH", value = SWT.PUSH), preferredName = "toolbarButton", referenceBy = {
+		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP }, returnType = SWTBotToolbarButton.class)
 public class SWTBotToolbarPushButton extends SWTBotToolbarButton {
 
 	/**
@@ -56,7 +57,7 @@
 	 */
 	public SWTBotToolbarPushButton click() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		sendNotifications();
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
 		return this;
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButton.java
index a0236f1..ad3b98b 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarRadioButton.java
@@ -30,7 +30,7 @@
  * @version $Id$
  */
 @SWTBotWidget(clasz = ToolItem.class, preferredName = "toolbarRadioButton", style = @Style(name = "SWT.RADIO", value = SWT.RADIO), referenceBy = {
-		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP })
+		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP }, returnType = SWTBotToolbarRadioButton.class)
 public class SWTBotToolbarRadioButton extends SWTBotToolbarButton {
 
 	/**
@@ -62,7 +62,7 @@
 	 */
 	public SWTBotToolbarRadioButton toggle() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		internalToggle();
 		sendNotifications();
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarSeparatorButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarSeparatorButton.java
index 1c99579..11fdfd4 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarSeparatorButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarSeparatorButton.java
@@ -29,7 +29,7 @@
  * @since 2.0
  */
 @SWTBotWidget(clasz = ToolItem.class, preferredName = "toolbarSeparatorButton", style = @Style(name = "SWT.SEPARATOR", value = SWT.SEPARATOR), referenceBy = {
-		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP })
+		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP }, returnType = SWTBotToolbarButton.class)
 public class SWTBotToolbarSeparatorButton extends SWTBotToolbarButton {
 
 	/**
@@ -62,7 +62,7 @@
 	 */
 	public SWTBotToolbarSeparatorButton click() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		sendNotifications();
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
 		return this;
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButton.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButton.java
index 86c1200..e299dfe 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButton.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotToolbarToggleButton.java
@@ -30,7 +30,7 @@
  * @version $Id$
  */
 @SWTBotWidget(clasz = ToolItem.class, preferredName = "toolbarToggleButton", style = @Style(name = "SWT.CHECK", value = SWT.CHECK), referenceBy = {
-		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP })
+		ReferenceBy.MNEMONIC, ReferenceBy.TOOLTIP }, returnType = SWTBotToolbarToggleButton.class)
 public class SWTBotToolbarToggleButton extends SWTBotToolbarButton {
 
 	/**
@@ -62,7 +62,7 @@
 	 */
 	public SWTBotToolbarToggleButton toggle() {
 		log.debug(MessageFormat.format("Clicking on {0}", this)); //$NON-NLS-1$
-		assertEnabled();
+		waitForEnabled();
 		internalToggle();
 		sendNotifications();
 		log.debug(MessageFormat.format("Clicked on {0}", this)); //$NON-NLS-1$
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTree.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTree.java
index 0abeac1..db4afee 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTree.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTree.java
@@ -194,19 +194,41 @@
 	 * @return this same instance.
 	 */
 	public SWTBotTree select(final String... items) {
+		waitForEnabled();
+		setFocus();
+		asyncExec(new VoidResult() {
+			public void run() {
+				List<TreeItem> selection = new ArrayList<TreeItem>();
+				for (String item : items) {
+					SWTBotTreeItem si = getTreeItem(item);
+					selection.add(si.widget);
+				}
+				if (!hasStyle(widget, SWT.MULTI) && items.length > 1)
+					log.warn("Tree does not support SWT.MULTI, cannot make multiple selections"); //$NON-NLS-1$
+				widget.setSelection(selection.toArray(new TreeItem[] {}));
+			}
+		});
+		notifySelect();
+		return this;
+	}
+	
+	/**
+	 * Selects the items in the array. Useful for cases where you're selecting items whose names are not unique, or
+	 * items you've exposed one at a time while traversing the tree.
+	 * 
+	 * @param items the items to select.
+	 * @return this same instance.
+	 */
+	public SWTBotTree select(final SWTBotTreeItem... items) {
 		assertEnabled();
 		setFocus();
 		asyncExec(new VoidResult() {
 			public void run() {
-				TreeItem[] treeItems = widget.getItems();
 				List<TreeItem> selection = new ArrayList<TreeItem>();
-				for (TreeItem treeItem : treeItems) {
-					for (String item : items) {
-						if (treeItem.getText().equals(item))
-							selection.add(treeItem);
-					}
+				for (SWTBotTreeItem treeItem : items) {
+					selection.add(treeItem.widget);
 				}
-				if (hasStyle(widget, SWT.MULTI) && items.length > 1)
+				if (!hasStyle(widget, SWT.MULTI) && items.length > 1)
 					log.warn("Tree does not support SWT.MULTI, cannot make multiple selections"); //$NON-NLS-1$
 				widget.setSelection(selection.toArray(new TreeItem[] {}));
 			}
@@ -221,7 +243,7 @@
 	 * @return this same instance.
 	 */
 	public SWTBotTree unselect() {
-		assertEnabled();
+		waitForEnabled();
 		asyncExec(new VoidResult() {
 			public void run() {
 				log.debug(MessageFormat.format("Unselecting all in {0}", widget)); //$NON-NLS-1$
@@ -239,12 +261,12 @@
 	 * @return this same instance.
 	 */
 	public SWTBotTree select(final int... indices) {
-		assertEnabled();
+		waitForEnabled();
 		setFocus();
 		asyncExec(new VoidResult() {
 			public void run() {
 				log.debug(MessageFormat.format("Selecting rows [{0}] in tree{1}", StringUtils.join(indices, ", "), this)); //$NON-NLS-1$ //$NON-NLS-2$
-				if (hasStyle(widget, SWT.MULTI) && indices.length > 1)
+				if (!hasStyle(widget, SWT.MULTI) && indices.length > 1)
 					log.warn("Tree does not support SWT.MULTI, cannot make multiple selections"); //$NON-NLS-1$
 				TreeItem items[] = new TreeItem[indices.length];
 				for (int i = 0; i < indices.length; i++)
@@ -275,15 +297,26 @@
 	}
 
 	/**
-	 * Expands the node matching the node information.
-	 *
-	 * @param nodeText the text on the node.
-	 * @return the Tree item that was expanded.
-	 * @throws WidgetNotFoundException if the node is not found.
+	 * Attempts to expand all nodes along the path specified by the node array parameter.
+	 * 
+	 * @param nodes node path to expand
+	 * @return the last Tree item that was expanded.
+	 * @throws WidgetNotFoundException if any of the nodes on the path do not exist
 	 */
-	public SWTBotTreeItem expandNode(final String nodeText) throws WidgetNotFoundException {
-		assertEnabled();
-		return getTreeItem(nodeText).expand();
+	public SWTBotTreeItem expandNode(String... nodes) throws WidgetNotFoundException {
+		Assert.isNotEmpty((Object[])nodes);
+
+		log.debug(MessageFormat.format("Expanding nodes {0} in tree {1}", StringUtils.join(nodes, ">"), this));
+
+		waitForEnabled();
+		SWTBotTreeItem item = getTreeItem(nodes[0]).expand();
+		
+		List<String> asList = new ArrayList<String>(Arrays.asList(nodes));
+		asList.remove(0);
+		if (!asList.isEmpty())
+			item = item.expandNode(asList.toArray(new String[0]));
+
+		return item;
 	}
 
 	/**
@@ -294,7 +327,7 @@
 	 * @throws WidgetNotFoundException if the node is not found.
 	 */
 	public SWTBotTreeItem collapseNode(final String nodeText) throws WidgetNotFoundException {
-		assertEnabled();
+		waitForEnabled();
 		return getTreeItem(nodeText).collapse();
 	}
 
@@ -337,7 +370,7 @@
 	 * @throws WidgetNotFoundException if the node is not found.
 	 */
 	public SWTBotTreeItem expandNode(final String nodeText, final boolean recursive) throws WidgetNotFoundException {
-		assertEnabled();
+		waitForEnabled();
 		return syncExec(new Result<SWTBotTreeItem>() {
 			public SWTBotTreeItem run() {
 				SWTBotTreeItem item;
@@ -365,53 +398,6 @@
 		});
 	}
 
-
-	// /**
-	// * Expand the node using the keyboard
-	// *
-	// * @param node the node to be expanded.
-	// * @param recursive if the expansion should be recursive.
-	// * @return the tree item that was expanded.
-	// * @throws WidgetNotFoundException if the node is not found.
-	// */
-	// public SWTBotTreeItem expandNode(final SWTBotTreeItem node, final boolean recursive) throws
-	// WidgetNotFoundException {
-	// assertEnabled();
-	// return syncExec(new Result<SWTBotTreeItem>() {
-	// public SWTBotTreeItem run() {
-	// try {
-	// expandNode(node);
-	// } catch (WidgetNotFoundException e) {
-	// throw new RuntimeException(e);
-	// }
-	// return node;
-	// }
-	//
-	// private void expandNode(SWTBotTreeItem node) throws WidgetNotFoundException {
-	// if(node.getItems().length != 0) {
-	// node.expandWithKeys();
-	//
-	// node.keyPress(SWT.ARROW_DOWN, true);
-	//
-	// if (recursive) {
-	// expandTreeItem(node);
-	// }
-	// }
-	// else {
-	// keyPress(SWT.ARROW_DOWN, true);
-	// return;
-	// }
-	// }
-	//
-	// private void expandTreeItem(SWTBotTreeItem node) throws WidgetNotFoundException {
-	// SWTBotTreeItem[] items = node.getItems();
-	// for (SWTBotTreeItem item : items) {
-	// expandNode(item);
-	// }
-	// }
-	// });
-	// }
-
 	/**
 	 * Gets the tree item matching the given name.
 	 *
@@ -492,31 +478,4 @@
 		});
 	}
 
-	// /**
-	// * Expands all of the nodes in the tree
-	// */
-	// public void expandNodes() {
-	// SWTBotTreeItem[] children = getAllItems();
-	// for (SWTBotTreeItem node : children) {
-	// expandNode(node, true);
-	// }
-	// }
-	//
-	// /**
-	// * Collapses all of the nodes in the tree
-	// */
-	// public void collapseNodes() {
-	// SWTBotTreeItem[] children = getAllItems();
-	// for (SWTBotTreeItem node : children) {
-	// System.out.println("Pressing left key");
-	// node.keyPress(SWT.ARROW_LEFT, true);
-	// try {
-	// Thread.sleep(500);
-	// } catch (InterruptedException e) {
-	// // TODO Auto-generated catch block
-	// e.printStackTrace();
-	// }
-	// node.keyPress(SWT.ARROW_DOWN, true);
-	// }
-	// }
 }
diff --git a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
index ae7b411..eed22a8 100644
--- a/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
+++ b/org.eclipse.swtbot.swt.finder/src/org/eclipse/swtbot/swt/finder/widgets/SWTBotTreeItem.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar and others.
+ * Copyright (c) 2008, 2010 Ketan Padegaonkar 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
@@ -17,10 +17,12 @@
 import java.util.List;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Tree;
 import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.swtbot.swt.finder.SWTBot;
 import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
 import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
 import org.eclipse.swtbot.swt.finder.results.ArrayResult;
@@ -36,6 +38,7 @@
 import org.eclipse.swtbot.swt.finder.utils.TableRow;
 import org.eclipse.swtbot.swt.finder.utils.TextDescription;
 import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
+import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
 import org.hamcrest.SelfDescribing;
 
 /**
@@ -45,9 +48,9 @@
  * @version $Id$
  */
 public class SWTBotTreeItem extends AbstractSWTBot<TreeItem> {
-//	private static final int	expandKey	= SWT.getPlatform().equals("gtk") ? SWT.KEYPAD_ADD : SWT.ARROW_RIGHT;
-//	private static final int	collapseKey	= SWT.getPlatform().equals("gtk") ? SWT.KEYPAD_SUBTRACT : SWT.ARROW_LEFT;
-	private Tree				tree;
+	// private static final int expandKey = SWT.getPlatform().equals("gtk") ? SWT.KEYPAD_ADD : SWT.ARROW_RIGHT;
+	// private static final int collapseKey = SWT.getPlatform().equals("gtk") ? SWT.KEYPAD_SUBTRACT : SWT.ARROW_LEFT;
+	private Tree	tree;
 
 	/**
 	 * @param treeItem the widget.
@@ -83,7 +86,8 @@
 			return getText();
 		}
 		int columnCount = new SWTBotTree(tree).columnCount();
-		Assert.isLegal(column < columnCount, java.text.MessageFormat.format("The column index ({0}) is more than the number of column({1}) in the tree.", column, columnCount)); //$NON-NLS-1$
+		Assert.isLegal(column < columnCount, java.text.MessageFormat.format(
+				"The column index ({0}) is more than the number of column({1}) in the tree.", column, columnCount)); //$NON-NLS-1$
 		return syncExec(new StringResult() {
 			public String run() {
 				return widget.getText(column);
@@ -133,7 +137,8 @@
 	 */
 	public SWTBotTreeItem getNode(final int row) {
 		int rowCount = rowCount();
-		Assert.isLegal(row < rowCount, java.text.MessageFormat.format("The row number ({0}) is more than the number of rows({1}) in the tree.", row, rowCount)); //$NON-NLS-1$
+		Assert.isLegal(row < rowCount,
+				java.text.MessageFormat.format("The row number ({0}) is more than the number of rows({1}) in the tree.", row, rowCount)); //$NON-NLS-1$
 		return syncExec(new Result<SWTBotTreeItem>() {
 			public SWTBotTreeItem run() {
 				return new SWTBotTreeItem(widget.getItem(row));
@@ -161,6 +166,12 @@
 	 */
 	public SWTBotTreeItem expand() {
 		assertEnabled();
+
+		if (isExpanded()) {
+			log.warn(MessageFormat.format("Tree item {0} is already expanded. Won''t expand it again.", this));
+			return this;
+		}
+
 		preExpandNotify();
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -173,11 +184,17 @@
 
 	/**
 	 * Collapses the tree item to simulate click the plus sign.
-	 *
+	 * 
 	 * @return the tree item, after collapsing it.
 	 */
 	public SWTBotTreeItem collapse() {
 		assertEnabled();
+
+		if (!isExpanded()) {
+			log.warn(MessageFormat.format("Tree item {0} is already collapsed. Won''t collapse it again.", this));
+			return this;
+		}
+
 		preCollapseNotify();
 		asyncExec(new VoidResult() {
 			public void run() {
@@ -250,19 +267,26 @@
 	}
 
 	/**
-	 * Expands the node matching the given node text.
+	 * Expands the node matching the given node texts.
 	 * 
-	 * @param nodeText the text on the node.
-	 * @return the node that was expanded or <code>null</code> if not match exists.
+	 * @param nodes the text on the node.
+	 * @return the last tree node that was expanded or <code>null</code> if none exists.
+	 * @throws WidgetNotFoundException if any of the nodes on the path do not exist
 	 */
-	public SWTBotTreeItem expandNode(final String nodeText) {
+	public SWTBotTreeItem expandNode(final String... nodes) {
+		Assert.isNotEmpty((Object[]) nodes);
 		assertEnabled();
-		return getNode(nodeText).expand();
+
+		SWTBotTreeItem item = this;
+		for (String node : nodes)
+			item = item.getNode(node).expand();
+
+		return item;
 	}
 
 	/**
 	 * Collapses the node matching the given node text.
-	 *
+	 * 
 	 * @param nodeText the text on the node.
 	 * @return the node that was collapsed or <code>null</code> if not match exists.
 	 */
@@ -271,28 +295,6 @@
 		return getNode(nodeText).collapse();
 	}
 
-	// /**
-	// * Expand the tree item using the right arrow key.
-	// *
-	// * @return the tree item, after expanding it.
-	// */
-	// SWTBotTreeItem expandWithKeys() {
-	// SWTBotTree parent = getParent();
-	// parent.keyPress(expandKey, true);
-	// return this;
-	// }
-
-	// /**
-	// * Collapse the tree item using the left arrow key.
-	// *
-	// * @return the tree item, after collapsing it.
-	// */
-	// SWTBotTreeItem collapseWithKeys() {
-	// SWTBotTree parent = getParent();
-	// parent.keyPress(collapseKey, true);
-	// return this;
-	// }
-
 	/**
 	 * Gets the node matching the given node text and index.
 	 * 
@@ -303,7 +305,8 @@
 	 */
 	public SWTBotTreeItem getNode(final String nodeText, final int index) {
 		List<SWTBotTreeItem> nodes = getNodes(nodeText);
-		Assert.isTrue(index < nodes.size(), MessageFormat.format("The index ({0}) was more than the number of nodes ({1}) in the tree.", index, nodes.size()));
+		Assert.isTrue(index < nodes.size(),
+				MessageFormat.format("The index ({0}) was more than the number of nodes ({1}) in the tree.", index, nodes.size()));
 		return nodes.get(index);
 	}
 
@@ -374,9 +377,9 @@
 		notifyTree(SWT.MouseMove);
 		notifyTree(SWT.Activate);
 		notifyTree(SWT.FocusIn);
-		notifyTree(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
-		notifyTree(SWT.MouseUp);
-		notifyTree(SWT.Selection, createEvent());
+		notifyTree(SWT.MouseDown, createMouseEvent(x, y, 1, SWT.NONE, 1));
+		notifyTree(SWT.MouseUp, createMouseEvent(x, y, 1, SWT.BUTTON1, 1));
+		notifyTree(SWT.Selection, createSelectionEvent(SWT.BUTTON1));
 		notifyTree(SWT.MouseHover);
 		notifyTree(SWT.MouseMove);
 		notifyTree(SWT.MouseExit);
@@ -393,12 +396,21 @@
 	 */
 	public SWTBotTreeItem click() {
 		assertEnabled();
-		Rectangle cellBounds = syncExec(new Result<Rectangle>() {
-			public Rectangle run() {
-				return widget.getBounds();
-			}
-		});
-		clickXY(cellBounds.x + (cellBounds.width / 2), cellBounds.y + (cellBounds.height / 2));
+		Point center = getCenter(getCellBounds());
+		clickXY(center.x, center.y);
+		return this;
+	}
+
+	/**
+	 * Clicks on this node at the given column index.
+	 * 
+	 * @return the current node.
+	 * @since 2.0
+	 */
+	public SWTBotTreeItem click(final int column) {
+		assertEnabled();
+		Point center = getCenter(getCellBounds(column));
+		clickXY(center.x, center.y);
 		return this;
 	}
 
@@ -410,22 +422,63 @@
 	 */
 	public SWTBotTreeItem doubleClick() {
 		assertEnabled();
+		
+		final Point center = getCenter(getCellBounds());
+		
 		asyncExec(new VoidResult() {
 			public void run() {
 				tree.setSelection(widget);
 			}
 		});
-		notifyTree(SWT.Selection);
-		notifyTree(SWT.MouseDown);
-		notifyTree(SWT.MouseUp);
-		notifyTree(SWT.MouseDown);
-		notifyTree(SWT.MouseDoubleClick);
+		notifyTree(SWT.Selection, createSelectionEvent(SWT.BUTTON1));
+		notifyTree(SWT.MouseDown, createMouseEvent(center.x, center.y, 1, SWT.BUTTON1, 1));
+		notifyTree(SWT.MouseUp, createMouseEvent(center.x, center.y, 1, SWT.BUTTON1, 1));
+		notifyTree(SWT.MouseDown, createMouseEvent(center.x, center.y, 1, SWT.BUTTON1, 1));
+		notifyTree(SWT.MouseDoubleClick, createMouseEvent(center.x, center.y, 1, SWT.BUTTON1, 1));
+
 		notifyTree(SWT.DefaultSelection);
 		notifyTree(SWT.MouseUp);
 		return this;
 	}
 
 	/**
+	 * Get the cell bounds. widget should be enabled before calling this method.
+	 * 
+	 * @param column the tree column index
+	 * @return the cell bounds
+	 */
+	private Rectangle getCellBounds(final int column) {
+		return syncExec(new Result<Rectangle>() {
+			public Rectangle run() {
+				return widget.getBounds(column);
+			}
+		});
+	}
+
+	/**
+	 * Get the cell bounds. widget should be enabled before calling this method.
+	 * @return the cell bounds
+	 */
+	private Rectangle getCellBounds() {
+		return 	 syncExec(new Result<Rectangle>() {
+			public Rectangle run() {
+				return widget.getBounds();
+			}
+		});
+	}
+
+
+	/**
+	 * Get the center of the given rectangle.
+	 * 
+	 * @param bounds the rectangle
+	 * @return the center.
+	 */
+	private Point getCenter(Rectangle bounds) {
+		return new Point(bounds.x + (bounds.width / 2), bounds.y + (bounds.height / 2));
+	}
+
+	/**
 	 * Selects the items matching the array provided.
 	 * 
 	 * @param items the items to select.
@@ -439,12 +492,11 @@
 
 		syncExec(new VoidResult() {
 			public void run() {
-				TreeItem[] treeItems = widget.getItems();
 				ArrayList<TreeItem> selection = new ArrayList<TreeItem>();
 
-				for (TreeItem treeItem : treeItems) {
-					if (nodes.contains(treeItem.getText()))
-						selection.add(treeItem);
+				for (String item : items) {
+					SWTBotTreeItem si = getTreeItem(item);
+					selection.add(si.widget);
 				}
 				tree.setFocus();
 				tree.setSelection(selection.toArray(new TreeItem[] {}));
@@ -493,8 +545,10 @@
 
 	@Override
 	public SWTBotMenu contextMenu(String text) {
-		new SWTBotTree(tree).assertEnabled();
+		new SWTBotTree(tree).waitForEnabled();
 		select();
+		notifyTree(SWT.MouseDown, createMouseEvent(0, 0, 3, 0, 1));
+		notifyTree(SWT.MouseUp, createMouseEvent(0, 0, 3, 0, 1));
 		notifyTree(SWT.MenuDetect);
 		return super.contextMenu(tree, text);
 	}
@@ -599,72 +653,21 @@
 			}
 		});
 	}
-	
-	 /**
-     * Gets if the item is expanded.
-     * 
-     * @return <code>true</code> if the item is expanded,
-     *         <code>false</code> otherwise.
-     * @since 2.0
-     */
-    public boolean isExpanded() {
-        assertEnabled();
-        return UIThreadRunnable.syncExec(new BoolResult() {
-            public Boolean run() {
-                return widget.getExpanded();
-            }
-        });
-    }
 
-	// protected Rectangle absoluteLocation() {
-	// return syncExec(new Result<Rectangle>() {
-	// public Rectangle run() {
-	// return display.map(widget.getParent(), null, getBounds());
-	// }
-	// });
-	// }
-	//
-	// /**
-	// * Click on the center of the widget.
-	// *
-	// * @param post Whether or not {@link Display#post} should be used
-	// */
-	// private SWTBotTreeItem click(final boolean post) {
-	// if (post) {
-	// Rectangle location = absoluteLocation();
-	// click(location.x, location.y, true);
-	// } else
-	// click();
-	// return this;
-	// }
-	//
-	// /**
-	// * Right click on the center of the widget.
-	// *
-	// * @param post Whether or not {@link Display#post} should be used
-	// */
-	// private SWTBotTreeItem rightClick(final boolean post) {
-	// if (post) {
-	// Rectangle location = absoluteLocation();
-	// rightClick(location.x, location.y, true);
-	// } else
-	// rightClick();
-	// return this;
-	// }
-	//
-	// /**
-	// * Moves the cursor to the center of the widget
-	// */
-	// private void moveMouseToWidget() {
-	// syncExec(new VoidResult() {
-	// public void run() {
-	// Rectangle bounds = getBounds();
-	// Point point = new Point(bounds.x + (bounds.width / 2), bounds.y + (bounds.height / 2));
-	// Point pt = display.map(widget.getParent(), null, point.x, point.y);
-	// moveMouse(pt.x, pt.y);
-	// }
-	// });
-	// }
+	/**
+	 * Gets if the item is expanded.
+	 * 
+	 * @return <code>true</code> if the item is expanded, <code>false</code> otherwise.
+	 * @since 2.0
+	 */
+	public boolean isExpanded() {
+		assertEnabled();
+		return UIThreadRunnable.syncExec(new BoolResult() {
+			public Boolean run() {
+				return widget.getExpanded();
+			}
+		});
+	}
 
 	/**
 	 * Gets all the items in this tree node.
@@ -675,12 +678,66 @@
 		return syncExec(new ArrayResult<SWTBotTreeItem>() {
 			public SWTBotTreeItem[] run() {
 				TreeItem[] items = widget.getItems();
-				SWTBotTreeItem[] children = new SWTBotTreeItem[items.length];
+				List<SWTBotTreeItem> children = new ArrayList<SWTBotTreeItem>(); 
 				for (int i = 0; i < items.length; i++) {
-					children[i] = new SWTBotTreeItem(items[i]);
+					if (!items[i].isDisposed()) {
+						children.add(new SWTBotTreeItem(items[i]));
+					}
 				}
-				return children;
+				return children.toArray(new SWTBotTreeItem[children.size()]);
 			}
 		});
 	}
+
+	/**
+	 * Gets the tree item matching the given name.
+	 * 
+	 * @param nodeText the text on the node.
+	 * @return the tree item with the specified text.
+	 * @throws WidgetNotFoundException if the node was not found.
+	 */
+	private SWTBotTreeItem getTreeItem(final String nodeText) throws WidgetNotFoundException {
+		try {
+			new SWTBot().waitUntil(new DefaultCondition() {
+				public String getFailureMessage() {
+					return "Could not find node with text " + nodeText; //$NON-NLS-1$
+				}
+
+				public boolean test() throws Exception {
+					return getItem(nodeText) != null;
+				}
+			});
+		} catch (TimeoutException e) {
+			throw new WidgetNotFoundException("Timed out waiting for tree item " + nodeText, e); //$NON-NLS-1$
+		}
+		return new SWTBotTreeItem(getItem(nodeText));
+	}
+
+	/**
+	 * Gets the item matching the given name.
+	 * 
+	 * @param nodeText the text on the node.
+	 * @return the tree item with the specified text.
+	 */
+	private TreeItem getItem(final String nodeText) {
+		return syncExec(new WidgetResult<TreeItem>() {
+			public TreeItem run() {
+				TreeItem[] items = widget.getItems();
+				for (TreeItem item : items) {
+					if (item.getText().equals(nodeText))
+						return item;
+				}
+				return null;
+			}
+		});
+	}
+
+	public boolean isEnabled() {
+		return syncExec(new BoolResult() {
+			public Boolean run() {
+				return tree.isEnabled();
+			}
+		});
+	}
+
 }
diff --git a/org.eclipse.swtbot.swt.recorder.test/.project b/org.eclipse.swtbot.swt.recorder.test/.project
deleted file mode 100644
index 5c238a1..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.swt.recorder.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.swt.recorder.test/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c49ea25..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,21 +0,0 @@
-#Wed Dec 17 00:35:11 IST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=default
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=default
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=default
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.swtbot.swt.recorder.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.recorder.test/META-INF/MANIFEST.MF
deleted file mode 100644
index ebd87bd..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot SWT Recorder Test Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.swt.recorder.test
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.ui,
- org.eclipse.swtbot.swt.finder,
- org.junit4,
- org.eclipse.swtbot.swt.recorder,
- org.eclipse.swtbot.swt.finder.test,
- org.apache.log4j;version="1.2.12",
- org.hamcrest
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/SWTBotRecorderMain.java b/org.eclipse.swtbot.swt.recorder.test/src/SWTBotRecorderMain.java
deleted file mode 100644
index 5a4a134..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/SWTBotRecorderMain.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-
-import junit.framework.TestResult;
-import junit.framework.TestSuite;
-
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.recorder.SWTBotRecorder;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotRecorderMain {
-
-	public static void main(String[] args) {
-		try {
-			TestSuite testSuite = new TestSuite(RunnerTest.class);
-			testSuite.run(new TestResult());
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	public static class RunnerTest extends AbstractSWTTestCase {
-
-		private SWTBotRecorder	recorder;
-
-		public void setUp() throws Exception {
-			super.setUp();
-			System.setProperty("org.eclipse.swtbot.recorder.actions.print", "true");
-			recorder = new SWTBotRecorder(display, new SWTBot());
-			recorder.start();
-
-			// display.syncExec(new Runnable() {
-			// public void run() {
-			// while (!controlShell.isDisposed())
-			// if (!display.readAndDispatch())
-			// display.sleep();
-			// display.dispose();
-			// }
-			// });
-		}
-
-		// @Test public void registeringListenerAddsToListenerTable() throws Exception {
-		// AbstractSWTBotRecorderListener listener = new ShellEventListener(null, new SWTBot());
-		// assertEquals(0, recorder.registeredListeners.size());
-		// recorder.registerListener(SWT.Activate, listener);
-		// assertEquals(1, recorder.registeredListeners.size());
-		// assertTrue(recorder.registeredListeners.contains(new ListenerSet(SWT.Activate, listener)));
-		// }
-		//
-		// @Test public void unRegisteringListenerRemovesFromListenerTable() throws Exception {
-		// SWTBotRecorderListener listener = new ShellEventListener(null, new SWTBot());
-		// recorder.registerListener(SWT.Activate, listener);
-		// assertEquals(1, recorder.registeredListeners.size());
-		// recorder.unregisterAllListeners();
-		// assertTrue(recorder.registeredListeners.isEmpty());
-		// }
-
-		@Test
-		public void doNothing() throws Exception {
-
-		}
-
-		public void _testRecords() throws Exception {
-			display.syncExec(new Runnable() {
-				public void run() {
-					while (!controlShell.isDisposed())
-						if (!display.readAndDispatch())
-							display.sleep();
-					display.dispose();
-				}
-			});
-			recorder.stop();
-		}
-
-		public void tearDown() throws Exception {
-			// recorder.unregisterAllListeners();
-			super.tearDown();
-		}
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/AbstractSWTBotRecorderTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/AbstractSWTBotRecorderTest.java
deleted file mode 100644
index 854e5af..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/AbstractSWTBotRecorderTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.AbstractSWTTestCase;
-import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAction;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-import org.junit.After;
-import org.junit.Before;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public abstract class AbstractSWTBotRecorderTest extends AbstractSWTTestCase {
-	protected SWTBotRecorder	recorder;
-
-	@Before
-	public void setUp() throws Exception {
-		super.setUp();
-		bot = new SWTBot();
-		if (bot.activeShell().widget == controlShell)
-			bot.tabItem(tabItem()).activate();
-		recorder = new SWTBotRecorder(display, bot);
-		recorder.start();
-	}
-
-	protected String tabItem() {
-		return "Button";
-	}
-
-	@After
-	public void tearDown() throws Exception {
-		recorder.stop();
-		super.tearDown();
-	}
-
-	protected void assertEvent(final String string) throws Exception {
-		bot.waitUntil(new DefaultCondition() {
-			public String getFailureMessage() {
-				return "Could not get event: " + string + ". Got " + recorder.getEvents() + " instead.";
-			}
-
-			public boolean test() throws Exception {
-				final ActionList events = recorder.getEvents();
-				List actions = events.getActions();
-				for (Iterator iterator = actions.iterator(); iterator.hasNext();) {
-					SWTBotAction action = (SWTBotAction) iterator.next();
-					if (action.toJava().equals(string))
-						return true;
-				}
-				return false;
-			}
-		});
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/CheckBoxSelectionListenerTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/CheckBoxSelectionListenerTest.java
deleted file mode 100644
index 2737e65..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/CheckBoxSelectionListenerTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.text;
-
-import org.eclipse.swtbot.swt.recorder.AbstractSWTBotRecorderTest;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class CheckBoxSelectionListenerTest extends AbstractSWTBotRecorderTest {
-
-	@Test
-	public void buttonClickIsRecorded() throws Exception {
-		bot.checkBox("SWT.FLAT").select();
-		assertEvent("bot.checkBox(\"SWT.FLAT\").select();");
-	}
-
-	@Test
-	public void buttonClickIsRecorded2() throws Exception {
-		bot.checkBox("SWT.FLAT").deselect();
-		assertEvent("bot.checkBox(\"SWT.FLAT\").deselect();");
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/PushButtonSelectionListenerTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/PushButtonSelectionListenerTest.java
deleted file mode 100644
index f67afe4..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/PushButtonSelectionListenerTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.text;
-
-import org.eclipse.swtbot.swt.recorder.AbstractSWTBotRecorderTest;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class PushButtonSelectionListenerTest extends AbstractSWTBotRecorderTest {
-
-	@Test
-	public void buttonClickIsRecorded() throws Exception {
-		bot.button("One").click();
-		assertEvent("bot.button(\"One\").click();");
-	}
-
-	@Test
-	public void buttonClickIsRecorded2() throws Exception {
-		bot.button("Two", 1).click();
-		assertEvent("bot.button(\"Two\", 1).click();");
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/RadioButtonSelectionListenerTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/RadioButtonSelectionListenerTest.java
deleted file mode 100644
index 019a8ea..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/RadioButtonSelectionListenerTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.text;
-
-import org.eclipse.swtbot.swt.recorder.AbstractSWTBotRecorderTest;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class RadioButtonSelectionListenerTest extends AbstractSWTBotRecorderTest {
-
-	@Test
-	public void buttonClickIsRecorded() throws Exception {
-		bot.radio("SWT.CHECK").click();
-		assertEvent("bot.radio(\"SWT.CHECK\").click();");
-	}
-
-	@Test
-	public void buttonClickIsRecorded2() throws Exception {
-		bot.radio("SWT.PUSH").click();
-		assertEvent("bot.radio(\"SWT.PUSH\").click();");
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/ShellEventListenerTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/ShellEventListenerTest.java
deleted file mode 100644
index 85edd9a..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/ShellEventListenerTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.text;
-
-import org.eclipse.swtbot.swt.recorder.AbstractSWTBotRecorderTest;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class ShellEventListenerTest extends AbstractSWTBotRecorderTest {
-
-	@Test
-	public void shellActivationRecorded() throws Exception {
-		bot.shell("SWT Custom Controls").activate();
-		assertEvent("bot.shell(\"SWT Custom Controls\").activate();");
-	}
-
-	@Test
-	public void shellActivationRecorded2() throws Exception {
-		bot.shell("SWT Controls").activate();
-		assertEvent("bot.shell(\"SWT Controls\").activate();");
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/TabSelectionListenerTest.java b/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/TabSelectionListenerTest.java
deleted file mode 100644
index e4f42fd..0000000
--- a/org.eclipse.swtbot.swt.recorder.test/src/org/eclipse/swtbot/swt/recorder/text/TabSelectionListenerTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.text;
-
-import org.eclipse.swtbot.swt.recorder.AbstractSWTBotRecorderTest;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class TabSelectionListenerTest extends AbstractSWTBotRecorderTest {
-
-	@Test
-	public void tabItemClickIsRecorded() throws Exception {
-		bot.tabItem("CoolBar").activate();
-		assertEvent("bot.tabItem(\"CoolBar\").activate();");
-	}
-
-	@Test
-	public void tabItemClickIsRecorded2() throws Exception {
-		bot.tabItem("Button").activate();
-		assertEvent("bot.tabItem(\"Button\").activate();");
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/.classpath b/org.eclipse.swtbot.swt.recorder.ui.test/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/.project b/org.eclipse.swtbot.swt.recorder.ui.test/.project
deleted file mode 100644
index 164a3b7..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder.ui.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.swt.recorder.ui.test/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 852a215..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,21 +0,0 @@
-#Tue Dec 16 23:22:32 IST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.recorder.ui.test/META-INF/MANIFEST.MF
deleted file mode 100644
index c7cf598..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,11 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Recorder UI Test Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.swt.recorder.ui.test;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Require-Bundle: org.eclipse.ui,
- org.junit4,
- org.eclipse.swtbot.swt.recorder.ui
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/BootstrapperTest.java b/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/BootstrapperTest.java
deleted file mode 100644
index 1450046..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/BootstrapperTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-public class BootstrapperTest {
-	
-	private long	original;
-
-	@Before
-	public void setup(){
-		original = SWTBotRecorderWindow.DISPLAY_WAIT_TIMEOUT;
-		SWTBotRecorderWindow.DISPLAY_WAIT_TIMEOUT = 0;
-	}
-	
-	@After public void teardown(){
-		SWTBotRecorderWindow.DISPLAY_WAIT_TIMEOUT = original;
-	}
-	
-	
-	@Test
-	public void invokesMain() throws Exception {
-		try {
-			new Bootstrapper("org.eclipse.swtbot.swt.recorder.ui.BootstrapperTest$MyMain", "my", "args").start();
-		} catch (IllegalStateException e) {
-			assertEquals("Could not find a display", e.getMessage());
-			assertEquals(2, MyMain.args.length);
-			assertEquals("my", MyMain.args[0]);
-			assertEquals("args", MyMain.args[1]);
-		}
-	}
-	
-	public static class MyMain {
-		private static String[]	args;
-
-		public static void main(String[] args) {
-			MyMain.args = args;
-		}
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/MainTest.java b/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/MainTest.java
deleted file mode 100644
index 6bce4d3..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui.test/src/org/eclipse/swtbot/swt/recorder/ui/MainTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class MainTest {
-
-	@Test
-	public void noArgumentsThrowsException() throws Exception {
-		try {
-			Main.main(new String[] {});
-			fail("expecting IllegalArgumentException");
-		} catch (IllegalArgumentException e) {
-			assertEquals("Usage: java org.eclipse.swtbot.swt.recorder.ui.Main com.your.MainClass [arguments to your main...]", e
-					.getMessage());
-		}
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/.classpath b/org.eclipse.swtbot.swt.recorder.ui/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.swt.recorder.ui/.project b/org.eclipse.swtbot.swt.recorder.ui/.project
deleted file mode 100644
index eaa9535..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.swt.recorder.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.swt.recorder.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 4bebe10..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,21 +0,0 @@
-#Tue Dec 16 23:22:33 IST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.swtbot.swt.recorder.ui/.settings/org.moreunit.prefs b/org.eclipse.swtbot.swt.recorder.ui/.settings/org.moreunit.prefs
deleted file mode 100644
index a64319b..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/.settings/org.moreunit.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Wed Dec 31 22:51:04 IST 2008
-eclipse.preferences.version=1
-org.moreunit.flexiblenaming=true
-org.moreunit.prefixes=
-org.moreunit.unitsourcefolder=org.eclipse.swtbot.swt.recorder.ui\:src\:org.eclipse.swtbot.swt.recorder.ui.test\:src
-org.moreunit.useprojectsettings=true
diff --git a/org.eclipse.swtbot.swt.recorder.ui/LICENSE.EPL b/org.eclipse.swtbot.swt.recorder.ui/LICENSE.EPL
deleted file mode 100644
index 3d967ae..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/LICENSE.EPL
+++ /dev/null
@@ -1,70 +0,0 @@
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-i) changes to the Program, and
-ii) additions to the Program;
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-b) its license agreement:
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-b) a copy of this Agreement must be included with each copy of the Program.
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.recorder.ui/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.recorder.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 59c4e9d..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot Recorder UI Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.swt.recorder.ui;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-Activator: org.eclipse.swtbot.swt.recorder.ui.Activator
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.swtbot.swt.recorder.ui
-Import-Package: org.eclipse.jface.resource,
- org.eclipse.swt,
- org.eclipse.swt.events,
- org.eclipse.swt.graphics,
- org.eclipse.swt.layout,
- org.eclipse.swt.widgets,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.results,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.waits,
- org.eclipse.swtbot.swt.recorder,
- org.eclipse.swtbot.swt.recorder.generators,
- org.eclipse.swtbot.swt.recorder.listeners
-Require-Bundle: org.eclipse.swt.examples
diff --git a/org.eclipse.swtbot.swt.recorder.ui/about.html b/org.eclipse.swtbot.swt.recorder.ui/about.html
deleted file mode 100644
index 88cfbc9..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>December 2nd, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.swt.recorder.ui/build.properties b/org.eclipse.swtbot.swt.recorder.ui/build.properties
deleted file mode 100644
index 3672fd0..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html,\
-               LICENSE.EPL,\
-               src/
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               about.html,\
-               build.properties,\
-               src/
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/icons/clear.gif b/org.eclipse.swtbot.swt.recorder.ui/src/icons/clear.gif
deleted file mode 100644
index af30a42..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/icons/clear.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/icons/pause.gif b/org.eclipse.swtbot.swt.recorder.ui/src/icons/pause.gif
deleted file mode 100644
index 161e3f5..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/icons/pause.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/icons/save.gif b/org.eclipse.swtbot.swt.recorder.ui/src/icons/save.gif
deleted file mode 100644
index 499dd0c..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/icons/save.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/icons/start.gif b/org.eclipse.swtbot.swt.recorder.ui/src/icons/start.gif
deleted file mode 100644
index 16f4e25..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/icons/start.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/icons/stop.gif b/org.eclipse.swtbot.swt.recorder.ui/src/icons/stop.gif
deleted file mode 100644
index dc47edf..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/icons/stop.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Bootstrapper.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Bootstrapper.java
deleted file mode 100644
index 83368ec..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Bootstrapper.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.swt.SWT;
-
-public class Bootstrapper {
-
-	private final String	mainClassName;
-	private String[]		args;
-
-	public Bootstrapper(String mainClassName, String... args) {
-		this.mainClassName = mainClassName;
-		this.args = args;
-	}
-
-	void start() throws Exception {
-
-		if (isCarbon())
-			System.setProperty("org.eclipse.swt.internal.carbon.smallFonts", "");
-
-		Thread recorderThread = recorderThread();
-
-		recorderThread.start();
-		executeMainClass();
-		recorderThread.join();
-	}
-
-	private void executeMainClass() throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
-		Class<?> mainClass = Class.forName(this.mainClassName);
-		mainClass.getMethod("main", new Class[] { String[].class }).invoke(null, new Object[] { args });
-	}
-
-	private Thread recorderThread() {
-		Thread recorderThread = new Thread("SWTBotRecorder") {
-			public void run() {
-				new SWTBotRecorderWindow().createWindow();
-			}
-		};
-		return recorderThread;
-	}
-
-	private static boolean isCarbon() {
-		return ("carbon".equals(SWT.getPlatform()));
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/ClearButtonSelectionListener.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/ClearButtonSelectionListener.java
deleted file mode 100644
index 0544173..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/ClearButtonSelectionListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class ClearButtonSelectionListener implements SelectionListener {
-
-	private final SWTBotRecorderWindow	recorderUI;
-	private final Button			clearButton;
-
-	/**
-	 * @param clearButton the clear button
-	 * @param recorderUI the ui to be invoked when the button is clicked.
-	 */
-	public ClearButtonSelectionListener(SWTBotRecorderWindow recorderUI, Button clearButton) {
-		this.recorderUI = recorderUI;
-		this.clearButton = clearButton;
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		recorderUI.clear();
-		clearButton.setSelection(false);
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		widgetDefaultSelected(e);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Main.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Main.java
deleted file mode 100644
index 807e1d8..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/Main.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class Main {
-
-	public static void main(String[] args) throws Exception {
-		if (args.length == 0) {
-			System.err.println("Usage: java " + Main.class.getName() + " com.your.MainClass [arguments to your main...]"); //$NON-NLS-1$ //$NON-NLS-2$
-			throw new IllegalArgumentException("Usage: java " + Main.class.getName() + " com.your.MainClass [arguments to your main...]"); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		try {
-			new Bootstrapper(mainClassName(args), getProgramArguments(args)).start();
-		} catch (Exception e) {
-			e.printStackTrace();
-			throw e;
-		}
-	}
-
-	private static String mainClassName(String[] args) {
-		return args[0];
-	}
-
-	protected static String[] getProgramArguments(String[] args) {
-		String[] trimmedArgs = new String[args.length - 1];
-		System.arraycopy(args, 1, trimmedArgs, 0, args.length - 1);
-		return trimmedArgs;
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SWTBotRecorderWindow.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SWTBotRecorderWindow.java
deleted file mode 100644
index f1edfca..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SWTBotRecorderWindow.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import java.io.FileOutputStream;
-import java.io.InputStream;
-import java.io.PrintWriter;
-
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.BoolResult;
-import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.finder.utils.StringUtils;
-import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
-import org.eclipse.swtbot.swt.recorder.SWTBotRecorder;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAction;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotRecorderWindow {
-
-	public static long			DISPLAY_WAIT_TIMEOUT	= 30 * 1000;
-	public static final String	CLEAR					= "clear";
-	public static final String	STOP					= "stop";
-	public static final String	SAVE					= "save";
-	public static final String	START					= "start";
-	public static final String	PAUSE					= "pause";
-
-	public static ImageRegistry	imageRegistry;
-	private Display				display;
-	private Shell				shell;
-	private Button				startPauseButton;
-	private Button				saveButton;
-	private SWTBot				bot;
-	private SWTBotRecorder		recorder;
-	private Button				clearButton;
-	private Button				stopRecorderButton;
-
-	public SWTBotRecorderWindow() {
-	}
-
-	public void createWindow() {
-		waitForDisplayToAppear(DISPLAY_WAIT_TIMEOUT);
-		record(SWTUtils.display());
-	}
-
-	private void createShell() {
-		shell = new Shell(display, SWT.TITLE | SWT.ON_TOP);
-		shell.setLayout(new GridLayout(4, false));
-		shell.setText("SWTBot Recorder");
-
-		createStartPauseButton();
-		createStopRecorderButton();
-		createSaveButton();
-		createClearButton();
-
-		hookButtonActions();
-		setButtonStates();
-
-		shell.pack();
-		shell.open();
-	}
-
-	private void createStopRecorderButton() {
-		stopRecorderButton = new Button(shell, SWT.TOGGLE);
-		stopRecorderButton.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
-		stopRecorderButton.setImage(imageRegistry.get(STOP));
-	}
-
-	public void setButtonStates() {
-		saveButton.setEnabled(recorder.isRunning());
-		clearButton.setEnabled(recorder.isRunning());
-		stopRecorderButton.setEnabled(recorder.isRunning());
-	}
-
-	private void createClearButton() {
-		clearButton = new Button(shell, SWT.TOGGLE);
-		clearButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
-		clearButton.setImage(imageRegistry.get(CLEAR));
-	}
-
-	private void createSaveButton() {
-		saveButton = new Button(shell, SWT.TOGGLE);
-		saveButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
-		saveButton.setImage(imageRegistry.get(SAVE));
-	}
-
-	private void createStartPauseButton() {
-		startPauseButton = new Button(shell, SWT.TOGGLE);
-		startPauseButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
-		startPauseButton.setImage(imageRegistry.get(START));
-	}
-
-	private void hookButtonActions() {
-		hookStartPauseButtonActions();
-		hookSaveButtonActions();
-		hookClearButtonActions();
-		hookStopRecorderButtonActions();
-	}
-
-	private void hookStopRecorderButtonActions() {
-		stopRecorderButton.addSelectionListener(new StopRecorderListener(this, startPauseButton, stopRecorderButton));
-	}
-
-	private void hookClearButtonActions() {
-		clearButton.addSelectionListener(new ClearButtonSelectionListener(this, clearButton));
-	}
-
-	private void hookSaveButtonActions() {
-		saveButton.addSelectionListener(new SaveButtonSelectionListener(this, saveButton));
-	}
-
-	private void hookStartPauseButtonActions() {
-		startPauseButton.addSelectionListener(new StartPauseButtonToggleListener(this, startPauseButton));
-	}
-
-	private void loadImages() {
-		imageRegistry = new ImageRegistry();
-		loadImage(START, PAUSE, SAVE, STOP, CLEAR);
-	}
-
-	private void loadImage(String... imageNames) {
-		for (String imageName : imageNames) {
-			InputStream record = getClass().getClassLoader().getResourceAsStream("icons/" + imageName + ".gif");
-			imageRegistry.put(imageName, new Image(display, record));
-		}
-	}
-
-	private void record(final Display display) {
-		new SWTBot().waitUntil(new DefaultCondition() {
-			public String getFailureMessage() {
-				return null;
-			}
-
-			public boolean test() throws Exception {
-				return UIThreadRunnable.syncExec(new BoolResult() {
-					public Boolean run() {
-						return display.getSyncThread() != null;
-					}
-				});
-			}
-
-		});
-		display.syncExec(recorderRunnable());
-	}
-
-	private Runnable recorderRunnable() {
-		return new Runnable() {
-			public void run() {
-				init();
-				hookRecorderListeners();
-				createShell();
-			}
-		};
-	}
-
-	private void init() {
-		display = Display.getCurrent();
-		loadImages();
-	}
-
-	private void hookRecorderListeners() {
-		bot = new SWTBot();
-		recorder = new SWTBotRecorder(display, bot);
-	}
-
-	private void waitForDisplayToAppear(long timeout) {
-		SWTUtils.waitForDisplayToAppear(timeout);
-	}
-
-	/**
-	 * Stop recorder, if it's running.
-	 */
-	public void stop() {
-		if (isRunning())
-			recorder.stop();
-	}
-
-	public void clear() {
-		recorder.clear();
-	}
-
-	/**
-	 * Clear recorder and start it.
-	 */
-	public void start() {
-		clear();
-		unPause();
-	}
-
-	/**
-	 * Start recorder, if it's not already running.
-	 */
-	public void unPause() {
-		if (!isRunning())
-			recorder.start();
-	}
-
-	/**
-	 * Save recorded script.
-	 */
-	public void save() {
-		String fileName = getSaveFileName();
-		PrintWriter printWriter = null;
-		try {
-			printWriter = new PrintWriter(new FileOutputStream(fileName));
-			for (SWTBotAction action : recorder.getEvents().getActions()) {
-				printWriter.println(action);
-			}
-			printWriter.close();
-		} catch (Exception e) {
-			e.printStackTrace();
-		} finally {
-			if (printWriter != null)
-				printWriter.close();
-		}
-	}
-
-	public boolean isRunning() {
-		return recorder.isRunning();
-	}
-
-	private String getSaveFileName() {
-		String recorderFileName = SWTBotPreferences.RECORDER_FILE_NAME;
-		if (StringUtils.isEmptyOrNull(recorderFileName))
-			return new FileDialog(saveButton.getShell(), SWT.SAVE).open();
-		return recorderFileName;
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SaveButtonSelectionListener.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SaveButtonSelectionListener.java
deleted file mode 100644
index 9e834c5..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/SaveButtonSelectionListener.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SaveButtonSelectionListener implements SelectionListener {
-
-	private final Button			saveButton;
-	private final SWTBotRecorderWindow	recorderUI;
-
-	/**
-	 * @param saveButton the button to listen
-	 * @param recorderUI the ui to be invoked when the button is clicked.
-	 * @see SWTBotRecorderUI#save()
-	 */
-	public SaveButtonSelectionListener(SWTBotRecorderWindow recorderUI, Button saveButton) {
-		this.recorderUI = recorderUI;
-		this.saveButton = saveButton;
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		saveButton.setSelection(false);
-		recorderUI.save();
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		widgetDefaultSelected(e);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StartPauseButtonToggleListener.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StartPauseButtonToggleListener.java
deleted file mode 100644
index ce4d9c6..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StartPauseButtonToggleListener.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-public class StartPauseButtonToggleListener implements SelectionListener {
-
-	private final Button			recordButton;
-	private final SWTBotRecorderWindow	recorderUI;
-
-	public StartPauseButtonToggleListener(SWTBotRecorderWindow recorderUI, Button recordButton) {
-		this.recorderUI = recorderUI;
-		this.recordButton = recordButton;
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		if (recorderUI.isRunning()) {
-			recordButton.setImage(SWTBotRecorderWindow.imageRegistry.get(SWTBotRecorderWindow.START));
-			recorderUI.stop();
-		} else {
-			recordButton.setImage(SWTBotRecorderWindow.imageRegistry.get(SWTBotRecorderWindow.PAUSE));
-			recorderUI.unPause();
-		}
-		recorderUI.setButtonStates();
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		widgetDefaultSelected(e);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StopRecorderListener.java b/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StopRecorderListener.java
deleted file mode 100644
index f6193a1..0000000
--- a/org.eclipse.swtbot.swt.recorder.ui/src/org/eclipse/swtbot/swt/recorder/ui/StopRecorderListener.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.ui;
-
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.widgets.Button;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-final class StopRecorderListener implements SelectionListener {
-
-	private final SWTBotRecorderWindow	recorderUI;
-	private final Button			startPauseButton;
-	private final Button			stopRecorderButton;
-
-	public StopRecorderListener(SWTBotRecorderWindow recorderUI, Button startPauseButton, Button stopRecorderButton) {
-		this.recorderUI = recorderUI;
-		this.startPauseButton = startPauseButton;
-		this.stopRecorderButton = stopRecorderButton;
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-		startPauseButton.setImage(SWTBotRecorderWindow.imageRegistry.get(SWTBotRecorderWindow.START));
-		startPauseButton.setSelection(false);
-		recorderUI.stop();
-		recorderUI.setButtonStates();
-		stopRecorderButton.setSelection(false);
-	}
-
-	public void widgetSelected(SelectionEvent e) {
-		widgetDefaultSelected(e);
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/.settings/org.moreunit.prefs b/org.eclipse.swtbot.swt.recorder/.settings/org.moreunit.prefs
deleted file mode 100644
index d33ad75..0000000
--- a/org.eclipse.swtbot.swt.recorder/.settings/org.moreunit.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Wed Dec 31 22:50:53 IST 2008
-eclipse.preferences.version=1
-org.moreunit.flexiblenaming=true
-org.moreunit.prefixes=
-org.moreunit.unitsourcefolder=org.eclipse.swtbot.swt.recorder\:src\:org.eclipse.swtbot.swt.recorder.test\:src
-org.moreunit.useprojectsettings=true
diff --git a/org.eclipse.swtbot.swt.recorder/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.recorder/META-INF/MANIFEST.MF
deleted file mode 100644
index cbace3d..0000000
--- a/org.eclipse.swtbot.swt.recorder/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot SWT Recorder Plug-in (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.swt.recorder
-Bundle-Version: 2.0.0.qualifier
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.swtbot.swt.recorder,
- org.eclipse.swtbot.swt.recorder.generators,
- org.eclipse.swtbot.swt.recorder.listeners,
- org.eclipse.swtbot.swt.recorder.methodargs,
- org.eclipse.swtbot.swt.recorder.widgets,
- org.eclipse.swtbot.swt.recorder.widgets.text
-Import-Package: org.apache.log4j;version="1.2.12",
- org.eclipse.swt,
- org.eclipse.swt.widgets,
- org.eclipse.swtbot.swt.finder,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.matchers,
- org.eclipse.swtbot.swt.finder.results,
- org.eclipse.swtbot.swt.finder.utils,
- org.eclipse.swtbot.swt.finder.utils.internal,
- org.eclipse.swtbot.swt.finder.widgets,
- org.hamcrest;version="1.1.0"
diff --git a/org.eclipse.swtbot.swt.recorder/build.properties b/org.eclipse.swtbot.swt.recorder/build.properties
deleted file mode 100644
index a060787..0000000
--- a/org.eclipse.swtbot.swt.recorder/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/SWTBotRecorder.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/SWTBotRecorder.java
deleted file mode 100644
index 24a1c8a..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/SWTBotRecorder.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
-import org.eclipse.swtbot.swt.finder.results.VoidResult;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-import org.eclipse.swtbot.swt.recorder.widgets.text.CheckBoxSelectionListener;
-import org.eclipse.swtbot.swt.recorder.widgets.text.PushButtonSelectionListener;
-import org.eclipse.swtbot.swt.recorder.widgets.text.RadioButtonSelectionListener;
-import org.eclipse.swtbot.swt.recorder.widgets.text.ShellEventListener;
-import org.eclipse.swtbot.swt.recorder.widgets.text.TabSelectionListener;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotRecorder {
-
-	/**
-	 * Maps event types to listeners that listen to the specified event.
-	 * 
-	 * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
-	 * @version $Id$
-	 */
-	private static class ListenerSet {
-
-		private final int		eventType;
-		private final Listener	listener;
-
-		/**
-		 * @param eventType the event type to listen to.
-		 * @param listener the listener that should listen to the event.
-		 */
-		public ListenerSet(int eventType, Listener listener) {
-			this.eventType = eventType;
-			this.listener = listener;
-		}
-
-		public int hashCode() {
-			final int prime = 31;
-			int result = 1;
-			result = prime * result + eventType;
-			result = prime * result + ((listener == null) ? 0 : listener.hashCode());
-			return result;
-		}
-
-		public boolean equals(Object obj) {
-			if (this == obj)
-				return true;
-			if (obj == null)
-				return false;
-			if (getClass() != obj.getClass())
-				return false;
-			ListenerSet other = (ListenerSet) obj;
-			if (eventType != other.eventType)
-				return false;
-			if (listener == null) {
-				if (other.listener != null)
-					return false;
-			} else if (!listener.equals(other.listener))
-				return false;
-			return true;
-		}
-
-	}
-
-	private final Display		display;
-	final Set<ListenerSet>		registeredListeners;
-
-	private final ActionList	eventList;
-
-	private final Listener		shellEventListener;
-	// private final Listener treeEventListener;
-	// private final Listener keyEventListener;
-	private final Listener		pushButtonListener;
-	private final Listener		radioButtonListener;
-	private final Listener		checkboxListener;
-	// private final Listener listSelectionListener;
-	// private final Listener comboSelectionListener;
-	private final Listener		tabSelectionListener;
-	// private final Listener menuSelectionListener;
-	private boolean				running	= false;
-
-	/**
-	 * Constructs a recorder.
-	 * 
-	 * @param display the display on which events are recorded.
-	 * @param bot a helper bot.
-	 */
-	public SWTBotRecorder(Display display, SWTBot bot) {
-		this.display = display;
-		registeredListeners = new HashSet<ListenerSet>();
-		eventList = new ActionList();
-		shellEventListener = new ShellEventListener(eventList, bot);
-		// treeEventListener = new TreeEventListener(eventList, bot);
-		// keyEventListener = new KeyEventListener(eventList, bot);
-		pushButtonListener = new PushButtonSelectionListener(eventList, bot);
-		radioButtonListener = new RadioButtonSelectionListener(eventList, bot);
-		checkboxListener = new CheckBoxSelectionListener(eventList, bot);
-		// listSelectionListener = new ListSelectionListener(eventList, bot);
-		// comboSelectionListener = new ComboSelectionListener(eventList, bot);
-		tabSelectionListener = new TabSelectionListener(eventList, bot);
-		// menuSelectionListener = new MenuSelectionListener(eventList, bot);
-	}
-
-	/**
-	 * Starts recording after clearing previously recorded events.
-	 */
-	public void start() {
-		if (running)
-			throw new IllegalStateException("Already recording"); //$NON-NLS-1$
-		running = true;
-		clear();
-		hookListeners();
-	}
-
-	/**
-	 * @return the list of recorded events.
-	 */
-	public ActionList stop() {
-		if (!running)
-			throw new IllegalStateException("Not recording"); //$NON-NLS-1$
-		running = false;
-		unregisterAllListeners();
-		return getEvents();
-	}
-
-	/**
-	 * @return <code>true</code> if the recorder is running, <code>false</code> otherwise.
-	 */
-	public boolean isRunning() {
-		return running;
-	}
-
-	/**
-	 * Clear the events recorded so far.
-	 */
-	public void clear() {
-		eventList.clear();
-	}
-
-	/**
-	 * This uses {@link #registerListener(int, Listener)}, so as to keep track of all registered listeners to
-	 * un-register them conveniently when clients call {@link #stop()}
-	 */
-	protected void hookListeners() {
-		registerShellListeners();
-		//
-		// registerTreeListeners();
-		//
-		// registerKeyListeners();
-
-		registerPushButtonListeners();
-		registerRadioButtonListeners();
-		registerCheckboxListeners();
-
-		//
-		// registerListSelectionListeners();
-		//
-		// registerComboSelectionListeners();
-		//
-		registerTabSelectionListeners();
-		//
-		// registerMenuListeners();
-	}
-
-	// private void registerMenuListeners() {
-	// registerListener(SWT.Selection, menuSelectionListener);
-	// }
-	//
-	private void registerTabSelectionListeners() {
-		registerListener(SWT.Selection, tabSelectionListener);
-	}
-
-	//
-	// private void registerComboSelectionListeners() {
-	// registerListener(SWT.Verify, comboSelectionListener);
-	// }
-	//
-	// private void registerListSelectionListeners() {
-	// registerListener(SWT.DefaultSelection, listSelectionListener);
-	// registerListener(SWT.Selection, listSelectionListener);
-	// }
-
-	private void registerPushButtonListeners() {
-		registerListener(SWT.DefaultSelection, pushButtonListener);
-		registerListener(SWT.Selection, pushButtonListener);
-	}
-
-	private void registerRadioButtonListeners() {
-		registerListener(SWT.DefaultSelection, radioButtonListener);
-		registerListener(SWT.Selection, radioButtonListener);
-	}
-
-	private void registerCheckboxListeners() {
-		registerListener(SWT.DefaultSelection, checkboxListener);
-		registerListener(SWT.Selection, checkboxListener);
-	}
-
-	//
-	// private void registerKeyListeners() {
-	// registerListener(SWT.KeyDown, keyEventListener);
-	// }
-	//
-	// private void registerTreeListeners() {
-	// registerListener(SWT.Collapse, treeEventListener);
-	// registerListener(SWT.Expand, treeEventListener);
-	// }
-	//
-	private void registerShellListeners() {
-		registerListener(SWT.Activate, shellEventListener);
-		registerListener(SWT.Close, shellEventListener);
-	}
-
-	/**
-	 * Add the specified listener as the display filter for the specified event type.
-	 * <p>
-	 * This is a convinience method to add filters, so that clients do not have to remove them explicitly.
-	 * </p>
-	 * 
-	 * @see #unregisterAllListeners()
-	 * @param eventType the event type
-	 * @param listener the listener
-	 */
-	protected void registerListener(final int eventType, final Listener listener) {
-		UIThreadRunnable.syncExec(display, new VoidResult() {
-			public void run() {
-				display.addFilter(eventType, listener);
-			}
-		});
-		registeredListeners.add(new ListenerSet(eventType, listener));
-	}
-
-	/**
-	 * @return the list of events captured so far.
-	 */
-	public ActionList getEvents() {
-		return eventList;
-	}
-
-	/**
-	 * Unregisters all listeners
-	 * 
-	 * @see #unregister(int, Listener)
-	 */
-	protected void unregisterAllListeners() {
-		for (ListenerSet set : new ArrayList<ListenerSet>(registeredListeners)) {
-			unregister(set.eventType, set.listener);
-		}
-	}
-
-	/**
-	 * Removes the specified listener as the display filter for the specified event type.
-	 * 
-	 * @param eventType the event from which the listener should be unregistered.
-	 * @param listener the listener to unregister.
-	 */
-	protected void unregister(final int eventType, final Listener listener) {
-		UIThreadRunnable.syncExec(display, new VoidResult() {
-			public void run() {
-				display.removeFilter(eventType, listener);
-				registeredListeners.remove(new ListenerSet(eventType, listener));
-			}
-		});
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAccessor.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAccessor.java
deleted file mode 100644
index edbfee1..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAccessor.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.generators;
-
-import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotAccessor {
-
-	private final String	bot;
-	private final String	methodCall;
-	private final String	accessor;
-	private final int		index;
-
-	/**
-	 * Create an accessor with the specified parameters.
-	 * 
-	 * @param bot the name of the bot.
-	 * @param methodCall the name of the method call that will find the widget.
-	 * @param accessor the accessor used to find the widget.
-	 */
-	public SWTBotAccessor(String bot, String methodCall, String accessor) {
-		this(bot, methodCall, accessor, 0);
-	}
-
-	/**
-	 * Create an accessor with the specified parameters.
-	 * 
-	 * @param bot the name of the bot.
-	 * @param methodCall the name of the method call that will find the widget.
-	 * @param accessor the accessor used to find the widget.
-	 * @param index the index of the widget.
-	 */
-	public SWTBotAccessor(String bot, String methodCall, String accessor, int index) {
-		Assert.isNotNull(bot);
-		Assert.isNotNull(methodCall);
-		Assert.isNotNull(accessor);
-		Assert.isTrue(index >= 0);
-		this.index = index;
-		this.bot = bot;
-		this.methodCall = methodCall;
-		this.accessor = accessor;
-	}
-
-	public String toString() {
-		return toJava();
-	}
-
-	/**
-	 * Returns a string of the format {@code bot.button("Foo")} or {@code bot.button("Foo", 10)}
-	 * 
-	 * @return the Java representation of this accessor.
-	 */
-	public String toJava() {
-		String index = ""; //$NON-NLS-1$
-		if (this.index != 0)
-			index = ", " + this.index; //$NON-NLS-1$
-
-		String accessor = ""; //$NON-NLS-1$
-		if (!"".equals(this.accessor)) //$NON-NLS-1$
-			accessor = "\"" + this.accessor + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-
-		return bot + "." + methodCall + "(" + accessor + index + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		SWTBotAccessor other = (SWTBotAccessor) obj;
-		return accessor.equals(other.accessor) && bot.equals(other.bot) && (index == other.index) && methodCall.equals(other.methodCall);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAction.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAction.java
deleted file mode 100644
index 6757ca2..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotAction.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.generators;
-
-
-import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-
-/**
- * Represents an SWTBot action.
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotAction {
-
-	private final SWTBotAccessor	accessor;
-	private final SWTBotEvent		event;
-
-	/**
-	 * @param accessor the accessor
-	 * @param event the event
-	 */
-	public SWTBotAction(SWTBotAccessor accessor, SWTBotEvent event) {
-		Assert.isNotNull(accessor);
-		Assert.isNotNull(event);
-		this.accessor = accessor;
-		this.event = event;
-	}
-
-	/**
-	 * @return the java representation of this action
-	 */
-	public String toJava() {
-		return accessor.toJava() + "." + event.methodCall() + "(" + event.args() + ")" + ";"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-	}
-
-	public String toString() {
-		return toJava();
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		SWTBotAction other = (SWTBotAction) obj;
-		return accessor.equals(other.accessor) && event.equals(other.event);
-	}
-
-	/**
-	 * @param actions the list into which this action should add itself.
-	 */
-	public void add(ActionList actions) {
-		SWTBotAction lastAction = actions.lastAction();
-		if (canCollate(lastAction))
-			actions.remove(lastAction);
-		actions.add(this);
-	}
-
-	private boolean canCollate(SWTBotAction lastAction) {
-		if (lastAction != null)
-			return lastAction.accessor.equals(accessor) && lastAction.event.canCollate(event);
-		return false;
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotEvent.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotEvent.java
deleted file mode 100644
index 6df3edd..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/generators/SWTBotEvent.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.generators;
-
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
-import org.eclipse.swtbot.swt.recorder.methodargs.NullArgument;
-import org.eclipse.swtbot.swt.recorder.methodargs.SWTBotEventArguments;
-import org.eclipse.swtbot.swt.recorder.methodargs.StringArgument;
-import org.eclipse.swtbot.swt.recorder.methodargs.StringArrayArgument;
-
-/**
- * Represents an {@link Event} object as a method invocation on an SWTBot widget. For e.g. a click event on a button
- * 
- * <pre>
- * SWTBotButton button = ...;
- * button.click();
- * </pre>
- * 
- * is represented by <code>new SWTBotEvent("click")</code>
- * 
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTBotEvent {
-
-	private final String				methodCall;
-	private final SWTBotEventArguments	arguments;
-
-	/**
-	 * @param methodCall the method to be invoked in order to generate an event, the method must not take any arguments.
-	 */
-	public SWTBotEvent(String methodCall) {
-		this(methodCall, new NullArgument());
-	}
-
-	/**
-	 * @param methodCall the method to be invoked in order to generate an event.
-	 * @param arguments the arguments that the method takes.
-	 */
-	public SWTBotEvent(String methodCall, SWTBotEventArguments arguments) {
-		if ((methodCall == null) || "".equals(methodCall.trim())) //$NON-NLS-1$
-			throw new IllegalArgumentException("Argument cannot be empty or null"); //$NON-NLS-1$
-		Assert.isNotNull(arguments);
-		this.methodCall = methodCall;
-		this.arguments = arguments;
-	}
-
-	/**
-	 * @param methodCall the method to be invoked in order to generate an event.
-	 * @param arg the string argument that the method takes.
-	 */
-	public SWTBotEvent(String methodCall, String arg) {
-		this(methodCall, new StringArgument(arg));
-	}
-
-	/**
-	 * @param methodCall the method to be invoked in order to generate an event.
-	 * @param arguments the string array that the method takes.
-	 */
-	public SWTBotEvent(String methodCall, String[] arguments) {
-		this(methodCall, new StringArrayArgument(arguments));
-	}
-
-	public String toString() {
-		return methodCall();
-	}
-
-	/**
-	 * @return the {@link #methodCall()}
-	 */
-	public String methodCall() {
-		return methodCall;
-	}
-
-	/**
-	 * @return the arguments as a string.
-	 */
-	public String args() {
-		return arguments.asString();
-	}
-
-	public boolean equals(Object obj) {
-		if (this == obj)
-			return true;
-		if (obj == null)
-			return false;
-		if (getClass() != obj.getClass())
-			return false;
-		SWTBotEvent other = (SWTBotEvent) obj;
-		return arguments.equals(other.arguments) && methodCall.equals(other.methodCall);
-	}
-
-	/**
-	 * This is useful when the user interacts with the same control multiple times, but only the last event is relevant;
-	 * or in case when multiple keystrokes in a textbox should generate one event with all the keystrokes.
-	 * 
-	 * @param event the event to collate.
-	 * @return <code>true</code> if the specified event is similar to this instance.
-	 */
-	public boolean canCollate(SWTBotEvent event) {
-		return methodCall.equals(event.methodCall);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/listeners/ActionList.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/listeners/ActionList.java
deleted file mode 100644
index 769c640..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/listeners/ActionList.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.listeners;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAction;
-
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class ActionList {
-
-	/** the list of actions. */
-	protected List<SWTBotAction>	actions	= new ArrayList<SWTBotAction>();
-
-	/**
-	 * @param event the event to be added to the list.
-	 */
-	public void add(SWTBotAction event) {
-		actions.add(event);
-		if (shouldPrint())
-			System.out.println(event);
-	}
-
-	private boolean shouldPrint() {
-		return Boolean.getBoolean("org.eclipse.swtbot.recorder.actions.print"); //$NON-NLS-1$
-	}
-
-	/**
-	 * Clears all events.
-	 */
-	public void clear() {
-		actions.clear();
-	}
-
-	/**
-	 * @param event removes the specified event from the list.
-	 */
-	public void remove(SWTBotAction event) {
-		actions.remove(event);
-	}
-
-	/**
-	 * @return the number of events in the list.
-	 */
-	public int size() {
-		return actions.size();
-	}
-
-	public String toString() {
-		return actions.toString();
-	}
-
-	/**
-	 * @return <code>true</code> if the number of events is zero.
-	 */
-	public boolean isEmpty() {
-		return actions.isEmpty();
-	}
-
-	/**
-	 * @return the last action in the list or <code>null</code> if the list is empty.
-	 */
-	public SWTBotAction lastAction() {
-		if (actions.isEmpty())
-			return null;
-		return actions.get(actions.size() - 1);
-	}
-
-	/**
-	 * @param index the index of the action to return.
-	 * @return the index(th) action in the list.
-	 */
-	public SWTBotAction get(int index) {
-		return actions.get(index);
-	}
-
-	/**
-	 * Returns a copy of the actions.
-	 * 
-	 * @return a copy of all the action, modifications to this copy will not affect this instance.
-	 */
-	public List<SWTBotAction> getActions() {
-		return new ArrayList<SWTBotAction>(actions);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/AbstractSWTBotEventArguments.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/AbstractSWTBotEventArguments.java
deleted file mode 100644
index 9f47fd0..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/AbstractSWTBotEventArguments.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.methodargs;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public abstract class AbstractSWTBotEventArguments implements SWTBotEventArguments {
-
-	public boolean equals(SWTBotEventArguments other) {
-		return asString().equals(other.asString());
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/SWTBotEventArguments.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/SWTBotEventArguments.java
deleted file mode 100644
index 2fd6015..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/SWTBotEventArguments.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.methodargs;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public interface SWTBotEventArguments {
-	/**
-	 * @return the string representation of the argument
-	 */
-	public String asString();
-
-	/**
-	 * @param other another object.
-	 * @return <code>true</code> if this instance is equal to the other instance.
-	 */
-	public boolean equals(SWTBotEventArguments other);
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArgument.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArgument.java
deleted file mode 100644
index c45c3c9..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArgument.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.methodargs;
-
-import org.eclipse.swtbot.swt.finder.utils.internal.Assert;
-
-/**
- * Represents an argument of type {@link String}.
- * 
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class StringArgument extends AbstractSWTBotEventArguments {
-
-	private final String	arg;
-
-	/**
-	 * @param arg the argument
-	 */
-	public StringArgument(String arg) {
-		Assert.isNotNull(arg);
-		this.arg = arg;
-	}
-
-	public String asString() {
-		return "\"" + arg + "\""; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArrayArgument.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArrayArgument.java
deleted file mode 100644
index 28900ff..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/methodargs/StringArrayArgument.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.methodargs;
-
-/**
- * Represents an array of string arguments.
- * 
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class StringArrayArgument extends AbstractSWTBotEventArguments {
-
-	/** the arguments to the array */
-	protected final String[]	args;
-
-	/**
-	 * @param args the string arguments.
-	 */
-	public StringArrayArgument(String[] args) {
-		this.args = args;
-	}
-
-	public String asString() {
-		String result = "new String [] { "; //$NON-NLS-1$
-		for (int i = 0; i < args.length; i++) {
-			String arg = args[i];
-			result += "\"" + arg + "\", "; //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		result = result.substring(0, result.lastIndexOf(", ")); //$NON-NLS-1$
-		result = result + " }"; //$NON-NLS-1$
-		return result;
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/AccessorCreatorStrategy.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/AccessorCreatorStrategy.java
deleted file mode 100644
index fb58811..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/AccessorCreatorStrategy.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets;
-
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.widgetOfType;
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withMnemonic;
-import static org.eclipse.swtbot.swt.finder.matchers.WidgetMatcherFactory.withStyle;
-import static org.hamcrest.Matchers.allOf;
-
-import java.util.List;
-
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.SWTBotWidget;
-import org.eclipse.swtbot.swt.finder.Style;
-import org.eclipse.swtbot.swt.finder.utils.ClassUtils;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.finder.utils.StringUtils;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAccessor;
-import org.eclipse.swtbot.swt.recorder.widgets.text.AbstractTextBasedRecorderListener;
-import org.hamcrest.Matcher;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class AccessorCreatorStrategy {
-
-	private final Event								event;
-	private final SWTBotWidget						annotation;
-	private final SWTBot							bot;
-	private final AbstractTextBasedRecorderListener	eventListener;
-
-	/**
-	 * @param event the generated event
-	 * @param eventListener the listener which recorded the event
-	 * @param annotation the annotation on the SWTBot widget that
-	 * @param bot the bot used to find widgets
-	 */
-	public AccessorCreatorStrategy(Event event, AbstractTextBasedRecorderListener eventListener, SWTBotWidget annotation, SWTBot bot) {
-		this.event = event;
-		this.eventListener = eventListener;
-		this.annotation = annotation;
-		this.bot = bot;
-	}
-
-	public SWTBotAccessor create() {
-		Widget widget = getWidget();
-		String text = getText(widget);
-		if (!StringUtils.isEmptyOrNull(text)) {
-			Matcher<Widget> matcher = createMatcher(text);
-			List<? extends Widget> similarWidgets = similarWidgets(matcher, widget);
-			int index = similarWidgets.indexOf(widget);
-			return new SWTBotAccessor("bot", annotation.preferredName(), text, index); //$NON-NLS-1$
-		}
-		return null;
-	}
-
-	private Widget getWidget() {
-		return eventListener.getWidget(event);
-	}
-
-	private final String getText(Widget widget) {
-		return SWTUtils.getText(widget).replaceAll("&", ""); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private Matcher<Widget> createMatcher(String text) {
-		return allOf(typeMatcher(), mnemonicTextMatcher(text), styleMatcher());
-	}
-
-	private final Matcher<? extends Widget> typeMatcher() {
-		return widgetOfType(this.annotation.clasz());
-	}
-
-	private final Matcher<? extends Widget> mnemonicTextMatcher(String text) {
-		return withMnemonic(text);
-	}
-
-	private <T extends Widget> List<? extends T> similarWidgets(Matcher<T> matcher, Widget widget) {
-		return bot.widgets(matcher);
-	}
-
-	private final Matcher<? extends Widget> styleMatcher() {
-		Style style = annotation.style();
-		return withStyle(style.value(), style.name());
-	}
-
-	private Shell getShell(Widget widget) {
-		if (widget instanceof Control)
-			return ((Control) widget).getShell();
-		throw new IllegalArgumentException("Cannot find the shell for widgets of type: " + ClassUtils.simpleClassName(widget)); //$NON-NLS-1$
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/AbstractTextBasedRecorderListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/AbstractTextBasedRecorderListener.java
deleted file mode 100644
index aca31bf..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/AbstractTextBasedRecorderListener.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-import org.apache.log4j.Logger;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.SWTBotWidget;
-import org.eclipse.swtbot.swt.finder.utils.ClassUtils;
-import org.eclipse.swtbot.swt.finder.utils.SWTBotEvents;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAccessor;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotAction;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-import org.eclipse.swtbot.swt.recorder.widgets.AccessorCreatorStrategy;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public abstract class AbstractTextBasedRecorderListener implements Listener {
-
-	private final ActionList	eventList;
-	protected final SWTBot		bot;
-	private final Class<?>		widgetType;
-	private SWTBotWidget		annotation;
-	private final Logger		log;
-
-	public AbstractTextBasedRecorderListener(Class<?> widgetType, ActionList eventList, SWTBot bot) {
-		this.widgetType = widgetType;
-		this.eventList = eventList;
-		this.bot = bot;
-		this.annotation = widgetType.getAnnotation(SWTBotWidget.class);
-		this.log = Logger.getLogger(getClass());
-	}
-
-	public void handleEvent(Event event) {
-		try {
-			if (!canHandleEvent(event))
-				return;
-			doHandle(event);
-		} catch (Exception e) {
-			log.fatal("Could not record event " + SWTBotEvents.toString(event), e); //$NON-NLS-1$
-		}
-	}
-
-	protected abstract SWTBotEvent createEvent(Event event);
-
-	private final SWTBotAccessor createAccessor(Event event) {
-		return new AccessorCreatorStrategy(event, this, annotation, bot).create();
-	}
-
-	public Widget getWidget(Event event) {
-		return event.widget;
-	}
-
-	private void doHandle(Event event) {
-		SWTBotAction action = new SWTBotAction(createAccessor(event), createEvent(event));
-		eventList.add(action);
-	}
-
-	private boolean canHandleEvent(Event event) {
-		return hasSWTBotAnnotation() && canHandleWidget(event);
-	}
-
-	private final boolean canHandleWidget(Event event) {
-		Widget widget = getWidget(event);
-		return matchesWidgetType(widget) && matchesWidgetStyle(widget) && !SWTUtils.isEmptyOrNullText(widget) && doCanHandleEvent(event);
-	}
-
-	protected abstract boolean doCanHandleEvent(Event event);
-
-	protected Shell getShell(Widget widget) {
-		if (widget instanceof Control)
-			return ((Control) widget).getShell();
-		throw new IllegalArgumentException("Cannot find the shell for widgets of type: " + ClassUtils.simpleClassName(widget)); //$NON-NLS-1$
-	}
-
-	protected boolean matchesWidgetStyle(Widget widget) {
-		return SWTUtils.hasStyle(widget, this.annotation.style().value());
-	}
-
-	private boolean matchesWidgetType(Widget widget) {
-		if (widget == null)
-			return false;
-		return this.annotation.clasz().equals(widget.getClass());
-	}
-
-	private boolean hasSWTBotAnnotation() {
-		return this.annotation != null;
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/CheckBoxSelectionListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/CheckBoxSelectionListener.java
deleted file mode 100644
index 26cbe31..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/CheckBoxSelectionListener.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotCheckBox;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class CheckBoxSelectionListener extends AbstractTextBasedRecorderListener {
-
-	/**
-	 * Creates a Checkbox selection listener.
-	 * @param eventList the event list to append to.
-	 * @param bot a helper swtbot instance.
-	 */
-	public CheckBoxSelectionListener(ActionList eventList, SWTBot bot) {
-		super(SWTBotCheckBox.class, eventList, bot);
-	}
-
-	protected SWTBotEvent createEvent(Event event) {
-		Button checkBox = (Button) event.widget;
-		return new SWTBotEvent(checkBox.getSelection() ? "select" : "deselect"); //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	protected boolean doCanHandleEvent(Event event) {
-		return event.type == SWT.Selection || event.type == SWT.DefaultSelection;
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/PushButtonSelectionListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/PushButtonSelectionListener.java
deleted file mode 100644
index 4982669..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/PushButtonSelectionListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotButton;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class PushButtonSelectionListener extends AbstractTextBasedRecorderListener {
-
-	public PushButtonSelectionListener(ActionList eventList, SWTBot bot) {
-		super(SWTBotButton.class, eventList, bot);
-	}
-
-	protected SWTBotEvent createEvent(Event event) {
-		return new SWTBotEvent("click"); //$NON-NLS-1$
-	}
-
-	protected boolean doCanHandleEvent(Event event) {
-		return event.type == SWT.Selection || event.type == SWT.DefaultSelection;
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/RadioButtonSelectionListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/RadioButtonSelectionListener.java
deleted file mode 100644
index 1ccc014..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/RadioButtonSelectionListener.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotRadio;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class RadioButtonSelectionListener extends AbstractTextBasedRecorderListener {
-
-	public RadioButtonSelectionListener(ActionList eventList, SWTBot bot) {
-		super(SWTBotRadio.class, eventList, bot);
-	}
-
-	protected SWTBotEvent createEvent(Event event) {
-		return new SWTBotEvent("click"); //$NON-NLS-1$
-	}
-
-	protected boolean doCanHandleEvent(Event event) {
-		return event.type == SWT.Selection || event.type == SWT.DefaultSelection;
-	}
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/ShellEventListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/ShellEventListener.java
deleted file mode 100644
index ca8c041..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/ShellEventListener.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotShell;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-import org.hamcrest.Matcher;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class ShellEventListener extends AbstractTextBasedRecorderListener {
-
-	public ShellEventListener(ActionList eventList, SWTBot bot) {
-		super(SWTBotShell.class, eventList, bot);
-	}
-
-	protected SWTBotEvent createEvent(Event event) {
-		return new SWTBotEvent("activate"); //$NON-NLS-1$
-	}
-
-	protected boolean doCanHandleEvent(Event event) {
-		return event.type == SWT.Activate;
-	}
-
-	protected List<? extends Widget> similarWidgets(Matcher<?> matcher, Widget widget) {
-		return bot.shells(SWTUtils.getText(widget));
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/TabSelectionListener.java b/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/TabSelectionListener.java
deleted file mode 100644
index 045dd46..0000000
--- a/org.eclipse.swtbot.swt.recorder/src/org/eclipse/swtbot/swt/recorder/widgets/text/TabSelectionListener.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.recorder.widgets.text;
-
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.SWTBot;
-import org.eclipse.swtbot.swt.finder.widgets.SWTBotTabItem;
-import org.eclipse.swtbot.swt.recorder.generators.SWTBotEvent;
-import org.eclipse.swtbot.swt.recorder.listeners.ActionList;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class TabSelectionListener extends AbstractTextBasedRecorderListener {
-
-	public TabSelectionListener(ActionList eventList, SWTBot bot) {
-		super(SWTBotTabItem.class, eventList, bot);
-	}
-
-	protected SWTBotEvent createEvent(Event event) {
-		return new SWTBotEvent("activate"); //$NON-NLS-1$
-	}
-
-	protected boolean doCanHandleEvent(Event event) {
-		return true;
-	}
-
-	public Widget getWidget(Event event) {
-		return event.item;
-	}
-
-	protected Shell getShell(Widget widget) {
-		if (widget instanceof TabItem) {
-			return ((TabItem) widget).getParent().getShell();
-		}
-		return super.getShell(widget);
-	}
-
-}
diff --git a/org.eclipse.swtbot.swt.spy/.classpath b/org.eclipse.swtbot.swt.spy/.classpath
deleted file mode 100644
index f3b093b..0000000
--- a/org.eclipse.swtbot.swt.spy/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="test"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.swtbot.swt.spy/.project b/org.eclipse.swtbot.swt.spy/.project
deleted file mode 100644
index 3796cde..0000000
--- a/org.eclipse.swtbot.swt.spy/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.swtbot.swt.spy</name>
-		<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.swtbot.swt.spy/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.swtbot.swt.spy/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index eeb622e..0000000
--- a/org.eclipse.swtbot.swt.spy/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,79 +0,0 @@
-#Tue Dec 16 23:22:30 IST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.doc.comment.support=disabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=all_standard_tags
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=warning
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.swtbot.swt.spy/META-INF/MANIFEST.MF b/org.eclipse.swtbot.swt.spy/META-INF/MANIFEST.MF
deleted file mode 100644
index c1d678b..0000000
--- a/org.eclipse.swtbot.swt.spy/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,23 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: SWTBot SWT Spy Plug-in (Based on Eclipse's SWT Spy) (incubation)
-Bundle-SymbolicName: org.eclipse.swtbot.swt.spy;singleton:=true
-Bundle-Version: 2.0.0.qualifier
-Bundle-ActivationPolicy: lazy
-Bundle-ClassPath: .
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.swtbot.swt.spy
-Import-Package: org.eclipse.core.commands.common,
- org.eclipse.jface.action,
- org.eclipse.swt,
- org.eclipse.swt.custom,
- org.eclipse.swt.events,
- org.eclipse.swt.examples.controlexample,
- org.eclipse.swt.graphics,
- org.eclipse.swt.layout,
- org.eclipse.swt.widgets,
- org.eclipse.swtbot.swt.finder.finders,
- org.eclipse.swtbot.swt.finder.resolvers,
- org.eclipse.swtbot.swt.finder.utils,
- org.junit;version="4.3.0"
diff --git a/org.eclipse.swtbot.swt.spy/build.properties b/org.eclipse.swtbot.swt.spy/build.properties
deleted file mode 100644
index e00c7dc..0000000
--- a/org.eclipse.swtbot.swt.spy/build.properties
+++ /dev/null
@@ -1,28 +0,0 @@
-###############################################################################
-# Copyright (c) 2008 Ketan Padegaonkar 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:
-#     Ketan Padegaonkar - initial API and implementation
-###############################################################################
-source.. = src/,\
-           test/
-bin.includes = META-INF/,\
-               .,\
-               LICENSE.EPL,\
-               about.html
-src.includes = .classpath,\
-               .project,\
-               LICENSE.EPL,\
-               META-INF/,\
-               build.properties,\
-               src/,\
-               test/,\
-               about.html,\
-               src/
-jars.compile.order = .
-source.. = src/,\
-           test/
diff --git a/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/SWTSpy.java b/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/SWTSpy.java
deleted file mode 100644
index b37f109..0000000
--- a/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/SWTSpy.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.spy;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.layout.GridData;
-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.eclipse.swtbot.swt.finder.resolvers.IChildrenResolver;
-import org.eclipse.swtbot.swt.finder.resolvers.IParentResolver;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SWTSpy {
-
-	private Shell	spyShell;
-
-	Action			actionMonitor;
-
-	Object			lastWidget;
-
-	StyledText		output;
-
-	Runnable		trackWidgets;
-
-	/**
-	 * @param display
-	 * @param childrenResolver
-	 * @param parentResolver
-	 */
-	public SWTSpy(Display display, IChildrenResolver childrenResolver, IParentResolver parentResolver) {
-		initialize(display);
-		trackWidgets = new WidgetTracker(this, childrenResolver, parentResolver);
-	}
-
-	private void createActionMonitor() {
-		actionMonitor = new Action("Monitor", IAction.AS_CHECK_BOX) {
-			public void run() {
-				if (actionMonitor.isChecked()) {
-					Display display = output.getDisplay();
-					display.timerExec(100, trackWidgets);
-				}
-			}
-		};
-
-		actionMonitor.setToolTipText("Enable/Disable monitoring of widgets");
-		actionMonitor.setChecked(false);
-	}
-
-	private void createOutputText() {
-		output = new StyledText(spyShell, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.READ_ONLY);
-		output.setLayoutData(new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true));
-		output.setFont(new Font(Display.getCurrent(), "Courier New", 10, SWT.NONE));
-	}
-
-	private void createShell(Display display) {
-		spyShell = new Shell(display, SWT.SHELL_TRIM);
-		spyShell.setText("SWT Spy");
-		spyShell.setSize(400, 300);
-		spyShell.setLayout(new FillLayout());
-		spyShell.addShellListener(new ShellAdapter() {
-			public void shellClosed(ShellEvent e) {
-				e.doit = false;
-			}
-		});
-		spyShell.setLayoutData(new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, true));
-	}
-
-	private void hookAccelerator() {
-		spyShell.getDisplay().addFilter(SWT.KeyDown, new Listener() {
-			public void handleEvent(Event e) {
-				if (e.stateMask == SWT.CTRL && e.keyCode == SWT.SHIFT) {
-					if (actionMonitor.isChecked())
-						actionMonitor.setChecked(false);
-					else {
-						actionMonitor.setChecked(true);
-						actionMonitor.run();
-					}
-					e.doit = false;
-				}
-				;
-			}
-		});
-	}
-
-	private void initialize(Display display) {
-		createShell(display);
-		createOutputText();
-		createActionMonitor();
-		hookAccelerator();
-		spyShell.open();
-	}
-}
diff --git a/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/WidgetTracker.java b/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/WidgetTracker.java
deleted file mode 100644
index 991d4a5..0000000
--- a/org.eclipse.swtbot.swt.spy/src/org/eclipse/swtbot/swt/spy/WidgetTracker.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.spy;
-
-import java.util.List;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CTabFolder;
-import org.eclipse.swt.custom.CTabItem;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.CoolItem;
-import org.eclipse.swt.widgets.Decorations;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-import org.eclipse.swt.widgets.ProgressBar;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Tracker;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.swtbot.swt.finder.finders.ControlFinder;
-import org.eclipse.swtbot.swt.finder.finders.PathGenerator;
-import org.eclipse.swtbot.swt.finder.resolvers.IChildrenResolver;
-import org.eclipse.swtbot.swt.finder.resolvers.IParentResolver;
-import org.eclipse.swtbot.swt.finder.utils.SWTUtils;
-import org.eclipse.swtbot.swt.finder.utils.TreePath;
-class WidgetTracker implements Runnable {
-	protected IChildrenResolver	childrenResolver;
-
-	protected ControlFinder		controlFinder;
-
-	protected Display			display;
-
-	protected IParentResolver	parentResolver;
-
-	protected SWTSpy			view;
-
-	WidgetTracker(SWTSpy view, IChildrenResolver childrenResolver, IParentResolver parentResolver) {
-		this.view = view;
-		this.childrenResolver = childrenResolver;
-		this.parentResolver = parentResolver;
-	}
-
-	// public void clickOnToolbar(Control control) {
-	// if (control instanceof ToolBar) {
-	// ToolBar toolbar = (ToolBar) control;
-	// Display display = toolbar.getDisplay();
-	//
-	// Point cursorLocation = Display.getCurrent().getCursorLocation();
-	//
-	// Event event = new Event();
-	// event.display = display;
-	//
-	// event.button = 1;
-	// event.type = SWT.MouseDown;
-	//
-	// event.doit = true;
-	// event.x = cursorLocation.x;
-	// event.y = cursorLocation.y;
-	//
-	// // display.post(event);
-	//
-	// event.type = SWT.MouseUp;
-	// // display.post(event);
-	// }
-
-	// }
-
-	public String getClassName(Object o) {
-		if (o == null)
-			return null;
-		int i = o.getClass().getName().lastIndexOf('.');
-		return o.getClass().getName().substring(i + 1);
-	}
-
-	public void getCompositeInformation(Control control, StringBuffer buf) {
-		List<Widget> children = childrenResolver.getChildren(control);
-		buf.append("\nChildren: " + children.size() + "\n");
-		for (Widget widget : children)
-			buf.append("\t" + widget + "\n");
-		buf.append("\n");
-	}
-
-	public void getLayoutInformation(Control control, StringBuffer buf) {
-		buf.append("Layout Information: \n");
-		buf.append(control + "\n");
-		buf.append("\tStyle: " + getStyle(control) + "\n");
-		buf.append("\tLayout Data: " + control.getLayoutData() + "\n");
-		buf.append("\tBounds: " + control.getBounds() + "\n");
-		buf.append("\n");
-	}
-
-	public void getLocationInformation(Control control, StringBuffer buf) {
-		TreePath path = controlFinder.getPath(control);
-		String stringFromPath = new PathGenerator().getPathAsString(path);
-		buf.append("Location: \n").append(stringFromPath).append("\n\n");
-	}
-
-	public void getParentInformation(Control control, StringBuffer buf) {
-		Composite parent = control.getParent();
-		if (parent != null) {
-			buf.append("Parent Tree:\n");
-
-			TreePath parents = controlFinder.getPath(control).getParentPath();
-
-			int segmentCount = parents.getSegmentCount();
-			for (int i = segmentCount - 1; i >= 0; i--) {
-				String prefix = "";
-				Widget segment = (Widget) parents.getSegment(i);
-				for (int j = 0; j < segmentCount - i - 1; j++)
-					prefix += "\t";
-
-				buf.append(prefix + getClassName(segment) + "[" + SWTUtils.widgetIndex(segment) + "]" + "@" + "\n");
-				if (segment instanceof Composite) {
-					buf.append(prefix + "\t Layout: " + getClassName(((Composite) segment).getLayout()) + "\n");
-					buf.append(prefix + "\t LayoutData: " + getClassName(((Control) segment).getLayoutData()) + "\n");
-				}
-			}
-			buf.append("\n");
-		}
-	}
-
-	public void getSiblingInformation(Control control, StringBuffer buf) {
-		Widget[] siblings = SWTUtils.siblings(control);
-		buf.append("Siblings: " + siblings.length + "\n");
-
-		for (int i = 0; i < siblings.length; i++) {
-			Widget sibling = siblings[i];
-			if (sibling== control)
-				buf.append("\t[*]");
-			else
-				buf.append("\t   ");
-			if (sibling instanceof Control)
-				buf.append(sibling + ": Layout Data: " + ((Control) sibling).getLayoutData()
-						+ "\n");
-			else
-				buf.append(sibling + "\n");
-		}
-		buf.append("\n");
-	}
-
-	public void run() {
-		if ((view.output == null) || view.output.isDisposed() || !view.actionMonitor.isChecked())
-			return;
-
-		display = view.output.getDisplay();
-		controlFinder = new ControlFinder();
-
-		Control control = display.getCursorControl();
-
-		if (control == null) {
-			view.output.setText("");
-			view.lastWidget = 0;
-		} else if (control != view.lastWidget) {
-			view.lastWidget = control;
-
-			StringBuffer buf = new StringBuffer();
-			getInformation(control, buf);
-			// clickOnToolbar(control);
-			view.output.setText(buf.toString());
-		}
-		display.timerExec(100, view.trackWidgets);
-	}
-
-	private void getInformation(Control control, StringBuffer buf) {
-
-		getLocationInformation(control, buf);
-
-		getLayoutInformation(control, buf);
-
-		getCompositeInformation(control, buf);
-
-		getSiblingInformation(control, buf);
-
-		getParentInformation(control, buf);
-
-	}
-
-	String getStyle(Widget w) {
-
-		int style = w.getStyle();
-		String result = "";
-		if (style == SWT.DEFAULT)
-			return "DEFAULT - bad!";
-		if ((style & 1 << 1) != 0)
-			if ((w instanceof CTabFolder) || (w instanceof StyledText) || (w instanceof org.eclipse.swt.widgets.List) || (w instanceof Text)
-					|| (w instanceof Table) || (w instanceof Tree))
-				result += "MULTI | ";
-			else if (w instanceof Menu)
-				result += "BAR | ";
-			else if ((w instanceof Label) || (w instanceof MenuItem) || (w instanceof ToolItem))
-				result += "SEPARATOR | ";
-			else if (w instanceof Button)
-				result += "TOGGLE | ";
-			else if (w instanceof ProgressBar)
-				result += "INDETERMINATE | ";
-			else
-				result += "BAR or SEPARATOR or TOGGLE or MULTI or INDETERMINATE or DBCS | ";
-		if ((style & 1 << 2) != 0)
-			if ((w instanceof Menu) || (w instanceof ToolItem) || (w instanceof CoolItem) || (w instanceof Combo))
-				result += "DROP_DOWN | ";
-			else if (w instanceof Button)
-				result += "ARROW | ";
-			else if ((w instanceof CTabFolder) || (w instanceof StyledText) || (w instanceof org.eclipse.swt.widgets.List)
-					|| (w instanceof Text) || (w instanceof Table) || (w instanceof Tree))
-				result += "SINGLE | ";
-			else if ((w instanceof Label) || (w instanceof Group))
-				result += "SHADOW_IN | ";
-			else if (w instanceof Decorations)
-				result += "TOOL | ";
-			else
-				result += "ALPHA or TOOL or SINGLE or ARROW or DROP_DOWN or SHADOW_IN | ";
-		if ((style & 1 << 3) != 0)
-			if (w instanceof Menu)
-				result += "POP_UP | ";
-			else if ((w instanceof Button) || (w instanceof MenuItem) || (w instanceof ToolItem))
-				result += "PUSH | ";
-			else if ((w instanceof Combo) || (w instanceof Text) || (w instanceof StyledText))
-				result += "READ_ONLY | ";
-			else if ((w instanceof Label) || (w instanceof Group) || (w instanceof ToolBar))
-				result += "SHADOW_OUT | ";
-			else if (w instanceof Decorations)
-				result += "NO_TRIM | ";
-			else
-				result += "POP_UP or PUSH or READ_ONLY or SHADOW_OUT or NO_TRIM or NATIVE | ";
-		if ((style & 1 << 4) != 0)
-			if ((w instanceof Button) || (w instanceof MenuItem) || (w instanceof ToolItem))
-				result += "RADIO | ";
-			else if (w instanceof Group)
-				result += "SHADOW_ETCHED_IN | ";
-			else if ((w instanceof Decorations) || (w instanceof Tracker))
-				result += "RESIZE | ";
-			else
-				result += "RESIZE or SHADOW_ETCHED_IN or RADIO or PHONETIC | ";
-		if ((style & 1 << 5) != 0)
-			if ((w instanceof Button) || (w instanceof MenuItem) || (w instanceof ToolItem) || (w instanceof Table)
-					|| (w instanceof Tree))
-				result += "CHECK | ";
-			else if ((w instanceof Label) || (w instanceof Group))
-				result += "SHADOW_NONE | ";
-			else if (w instanceof Decorations)
-				result += "TITLE | ";
-			else
-				result += "ROMAN or CHECK  or SHADOW_NONE or TITLE | ";
-		if ((style & 1 << 6) != 0)
-			if (w instanceof MenuItem)
-				result += "CASCADE | ";
-			else if ((w instanceof StyledText) || (w instanceof Label) || (w instanceof Text) || (w instanceof ToolBar))
-				result += "WRAP | ";
-			else if (w instanceof Combo)
-				result += "SIMPLE | ";
-			else if (w instanceof Group)
-				result += "SHADOW_ETCHED_OUT | ";
-			else if ((w instanceof Decorations) || (w instanceof CTabFolder) || (w instanceof CTabItem))
-				result += "CLOSE | ";
-			else
-				result += "CLOSE or MENU or CASCADE or WRAP or SIMPLE or SHADOW_ETCHED_OUT | ";
-		if ((style & 1 << 7) != 0)
-			if (w instanceof Decorations)
-				result += "MIN | ";
-			else if ((w instanceof Button) || (w instanceof Tracker))
-				result += "UP | ";
-			else if (w instanceof CTabFolder)
-				result += "TOP | ";
-			else
-				result += "MIN or UP or TOP | ";
-		if ((style & 1 << 8) != 0)
-			result += "HORIZONTAL | ";
-		if ((style & 1 << 9) != 0)
-			result += "VERTICAL | ";
-		if ((style & 1 << 10) != 0)
-			if (w instanceof Decorations)
-				result += "MAX | ";
-			else if ((w instanceof Button) || (w instanceof Tracker))
-				result += "DOWN | ";
-			else if (w instanceof CTabFolder)
-				result += "BOTTOM | ";
-			else
-				result += "MAX or DOWN or BOTTOM | ";
-		if ((style & 1 << 11) != 0)
-			result += "BORDER | ";
-		if ((style & 1 << 12) != 0)
-			result += "CLIP_CHILDREN | ";
-		if ((style & 1 << 13) != 0)
-			result += "CLIP_SIBLINGS | ";
-		if ((style & 1 << 14) != 0)
-			result += "ON_TOP or LEAD or LEFT | ";
-		if ((style & 1 << 15) != 0)
-			if (w instanceof Shell)
-				result += "PRIMARY_MODAL | ";
-			else if (w instanceof Table)
-				result += "HIDE_SELECTION | ";
-			else
-				result += "PRIMARY_MODAL or HIDE_SELECTION | ";
-		if ((style & 1 << 16) != 0)
-			if ((w instanceof StyledText) || (w instanceof Table))
-				result += "FULL_SELECTION | ";
-			else if (w instanceof Shell)
-				result += "APPLICATION_MODAL | ";
-			else if (w instanceof ProgressBar)
-				result += "SMOOTH | ";
-			else
-				result += "FULL_SELECTION or SMOOTH or APPLICATION_MODAL | ";
-		if ((style & 1 << 17) != 0)
-			if (w instanceof Shell)
-				result += "SYSTEM_MODAL | ";
-			else if ((w instanceof Button) || (w instanceof Label) || (w instanceof TableColumn)
-					|| (w instanceof Tracker) || (w instanceof ToolBar))
-				result += "TRAIL | ";
-			else
-				result += "SYSTEM_MODAL or TRAIL or RIGHT | ";
-		if ((style & 1 << 18) != 0)
-			result += "NO_BACKGROUND | ";
-		if ((style & 1 << 19) != 0)
-			result += "NO_FOCUS | ";
-		if ((style & 1 << 20) != 0)
-			result += "NO_REDRAW_RESIZE | ";
-		if ((style & 1 << 21) != 0)
-			result += "NO_MERGE_PAINTS | ";
-		if ((style & 1 << 22) != 0)
-			if (w instanceof Text)
-				result += "PASSWORD | ";
-			else if (w instanceof Composite)
-				result += "NO_RADIO_GROUP | ";
-			else
-				result += "NO_RADIO_GROUP or PASSWORD | ";
-		if ((style & 1 << 23) != 0)
-			result += "FLAT | ";
-		if ((style & 1 << 24) != 0)
-			if ((w instanceof Button) || (w instanceof Label) || (w instanceof TableColumn))
-				result += "CENTER | ";
-			else
-				result += "EMBEDDED or CENTER | ";
-		if ((style & 1 << 25) != 0)
-			result += "LEFT_TO_RIGHT | ";
-		if ((style & 1 << 26) != 0)
-			result += "RIGHT_TO_LEFT | ";
-		if ((style & 1 << 27) != 0)
-			result += "MIRRORED | ";
-		if ((style & 1 << 28) != 0)
-			result += "VIRTUAL | ";
-		int lastOr = result.lastIndexOf("|");
-		if (lastOr == result.length() - 2)
-			result = result.substring(0, result.length() - 2);
-		return result;
-	}
-}
diff --git a/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/AllEventListenersTest.java b/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/AllEventListenersTest.java
deleted file mode 100644
index fa59362..0000000
--- a/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/AllEventListenersTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.spy;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.examples.controlexample.ControlExample;
-import org.eclipse.swt.layout.FillLayout;
-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.eclipse.swtbot.swt.finder.finders.ControlFinder;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class AllEventListenersTest {
-
-	private Display			display;
-
-	private Shell			shell1;
-
-	private ControlExample	controlExample1;
-
-	private Shell			shell2;
-
-	private ControlExample	controlExample2;
-
-	public void setUp() throws Exception {
-		display = new Display();
-		createShell1();
-		createShell2();
-		new ControlFinder();
-	}
-
-	private void createShell1() {
-		shell1 = new Shell(display, SWT.SHELL_TRIM);
-		shell1.setLayout(new FillLayout());
-		controlExample1 = new ControlExample(shell1);
-		shell1.setText(ControlExample.getResourceString("window.title"));
-		ControlExample.setShellSize(controlExample1, shell1);
-		shell1.open();
-	}
-
-	private void createShell2() {
-		shell2 = new Shell(display, SWT.SHELL_TRIM);
-		shell2.setLayout(new FillLayout());
-		controlExample2 = new ControlExample(shell2);
-		shell2.setText(ControlExample.getResourceString("window.title"));
-		ControlExample.setShellSize(controlExample2, shell2);
-		shell2.open();
-	}
-
-	public void tearDown() throws Exception {
-		while (!(shell1.isDisposed() || shell2.isDisposed()))
-			if (!display.readAndDispatch())
-				display.sleep();
-		controlExample1.dispose();
-		controlExample2.dispose();
-	}
-
-	@Test public void ListensToAllEvents() throws Exception {
-		Listener listener = new Listener() {
-			public void handleEvent(Event event) {
-				System.out.println(event);
-			}
-		};
-		display.addFilter(SWT.MouseMove, listener);
-	}
-}
diff --git a/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/SwtSpyTest.java b/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/SwtSpyTest.java
deleted file mode 100644
index c8e0b22..0000000
--- a/org.eclipse.swtbot.swt.spy/test/org/eclipse/swtbot/swt/spy/SwtSpyTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 Ketan Padegaonkar 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:
- *     Ketan Padegaonkar - initial API and implementation
- *******************************************************************************/
-package org.eclipse.swtbot.swt.spy;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.examples.controlexample.ControlExample;
-import org.eclipse.swt.layout.FillLayout;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swtbot.swt.finder.resolvers.DefaultChildrenResolver;
-import org.eclipse.swtbot.swt.finder.resolvers.DefaultParentResolver;
-import org.junit.Test;
-
-/**
- * @author Ketan Padegaonkar &lt;KetanPadegaonkar [at] gmail [dot] com&gt;
- * @version $Id$
- */
-public class SwtSpyTest {
-
-	private Display			display;
-
-	private Shell			controlExampleShell;
-
-	@Test public void Something() throws Exception {
-
-	}
-
-	private void createShellToSpy() {
-		controlExampleShell = new Shell(display, SWT.SHELL_TRIM);
-		controlExampleShell.setSize(800, 600);
-		controlExampleShell.setLayout(new FillLayout());
-		createPartControl(controlExampleShell);
-		controlExampleShell.setText(ControlExample.getResourceString("window.title"));
-		controlExampleShell.open();
-	}
-
-	protected void createPartControl(Shell parent) {
-		new ControlExample(controlExampleShell);
-		controlExampleShell.open();
-	}
-
-	private void createSwtSpy() {
-		new SWTSpy(display, new DefaultChildrenResolver(), new DefaultParentResolver());
-	}
-
-	public void setUp() throws Exception {
-		display = new Display();
-		createShellToSpy();
-		createSwtSpy();
-	}
-
-	public void tearDown() throws Exception {
-		while (!controlExampleShell.isDisposed())
-			if (!display.readAndDispatch())
-				display.sleep();
-		display.dispose();
-	}
-}
diff --git a/org.eclipse.swtbot.test/build.properties b/org.eclipse.swtbot.test/build.properties
index 83b8d3e..aff4051 100644
--- a/org.eclipse.swtbot.test/build.properties
+++ b/org.eclipse.swtbot.test/build.properties
@@ -10,10 +10,12 @@
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot.test/feature.properties b/org.eclipse.swtbot.test/feature.properties
new file mode 100644
index 0000000..b3dd40d
--- /dev/null
+++ b/org.eclipse.swtbot.test/feature.properties
@@ -0,0 +1,140 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c) 2007-2010 Ketan Padegaonkar and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	Ketan Padegaonkar - initial API and implementation
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot.test/feature.xml b/org.eclipse.swtbot.test/feature.xml
index 788e4d1..f734aa7 100644
--- a/org.eclipse.swtbot.test/feature.xml
+++ b/org.eclipse.swtbot.test/feature.xml
@@ -2,90 +2,19 @@
 <feature
       id="org.eclipse.swtbot.test"
       label="SWTBot Tests Feature (incubation)"
-      version="2.0.0.qualifier"
+      version="2.0.5.qualifier"
       provider-name="Eclipse.org">
 
    <description url="http://eclipse.org/">
       Tests for SWTBot (incubation)
    </description>
 
-   <copyright url="http://eclipse.org/">
-      Copyright (c) 2007, 2008 Ketan Padegaonkar 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:
-Ketan Padegaonkar - initial API and implementation
+   <copyright>
+      %copyright
    </copyright>
 
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-
-Eclipse Foundation Software User Agreement
-March 17, 2005
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-   
-Applicable Licenses
-   
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-   
-* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-  and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
- 
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:
-
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-  
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html) 
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is permitted.
-   
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
+   <license url="%licenseURL">
+      %license
    </license>
 
    <url>
@@ -101,11 +30,15 @@
          version="0.0.0"/>
 
    <includes
-         id="org.eclipse.swtbot.eclipse.test"
+         id="org.eclipse.swtbot.eclipse.test.junit"
          version="0.0.0"/>
 
    <includes
-         id="org.eclipse.swtbot.recording"
+         id="org.eclipse.swtbot.ide"
+         version="0.0.0"/>
+
+   <includes
+         id="org.eclipse.swtbot.forms"
          version="0.0.0"/>
 
    <requires>
@@ -116,14 +49,12 @@
       <import plugin="org.hamcrest"/>
       <import plugin="org.eclipse.swtbot.junit4_x"/>
       <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.swtbot.swt.recorder"/>
       <import plugin="org.eclipse.jface.text"/>
       <import plugin="org.eclipse.core.resources"/>
       <import plugin="org.eclipse.ui.editors"/>
       <import plugin="org.eclipse.ui.ide"/>
       <import plugin="org.eclipse.core.runtime"/>
       <import plugin="org.eclipse.swtbot.eclipse.finder"/>
-      <import plugin="org.eclipse.swtbot.swt.recorder.ui"/>
       <import plugin="org.eclipse.swtbot.eclipse.ui"/>
       <import plugin="org.eclipse.core.runtime.compatibility"/>
       <import plugin="org.apache.ant"/>
@@ -137,12 +68,6 @@
          version="0.0.0"/>
 
    <plugin
-         id="org.eclipse.swtbot.swt.recorder.test"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
          id="org.eclipse.swtbot.eclipse.finder.test"
          download-size="0"
          install-size="0"
@@ -156,12 +81,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.swtbot.swt.recorder.ui.test"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
          id="org.eclipse.swt.examples"
          download-size="0"
          install-size="0"
@@ -178,18 +97,11 @@
          id="org.eclipse.swtbot.eclipse.ui.test"
          download-size="0"
          install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.swtbot.ant.optional.junit4"
-         download-size="0"
-         install-size="0"
          version="0.0.0"
-         fragment="true"
-         unpack="false"/>
+         fragment="true"/>
 
    <plugin
-         id="org.eclipse.swtbot.ant.optional.junit3"
+         id="org.eclipse.swtbot.ant.junit"
          download-size="0"
          install-size="0"
          version="0.0.0"
@@ -217,4 +129,25 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.ui.forms.examples"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.eclipse.swtbot.forms.finder.test"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"/>
+
+   <plugin
+         id="org.eclipse.swtbot.swt.finder.test.keyboards"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         fragment="true"
+         unpack="false"/>
+
 </feature>
diff --git a/org.eclipse.swtbot.test/license.html b/org.eclipse.swtbot.test/license.html
index c6af966..c184ca3 100644
--- a/org.eclipse.swtbot.test/license.html
+++ b/org.eclipse.swtbot.test/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
    For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
 
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,23 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
 </ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/org.eclipse.swtbot.test/pom.xml b/org.eclipse.swtbot.test/pom.xml
new file mode 100644
index 0000000..87567e6
--- /dev/null
+++ b/org.eclipse.swtbot.test/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.test.features</groupId>
+  <artifactId>org.eclipse.swtbot.test</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.updatesite/LICENSE.EPL b/org.eclipse.swtbot.updatesite/LICENSE.EPL
deleted file mode 100644
index 3d967ae..0000000
--- a/org.eclipse.swtbot.updatesite/LICENSE.EPL
+++ /dev/null
@@ -1,70 +0,0 @@
-Eclipse Public License - v 1.0
-
-THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-1. DEFINITIONS
-
-"Contribution" means:
-
-a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and
-b) in the case of each subsequent Contributor:
-i) changes to the Program, and
-ii) additions to the Program;
-where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.
-"Contributor" means any person or entity that distributes the Program.
-
-"Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.
-
-"Program" means the Contributions distributed in accordance with this Agreement.
-
-"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.
-
-2. GRANT OF RIGHTS
-
-a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.
-b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.
-c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.
-d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.
-3. REQUIREMENTS
-
-A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:
-
-a) it complies with the terms and conditions of this Agreement; and
-b) its license agreement:
-i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;
-ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;
-iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and
-iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.
-When the Program is made available in source code form:
-
-a) it must be made available under this Agreement; and
-b) a copy of this Agreement must be included with each copy of the Program.
-Contributors may not remove or alter any copyright notices contained within the Program.
-
-Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.
-
-4. COMMERCIAL DISTRIBUTION
-
-Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.
-
-For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.
-
-5. NO WARRANTY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.
-
-6. DISCLAIMER OF LIABILITY
-
-EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-7. GENERAL
-
-If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
-
-If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.
-
-All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.
-
-Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.
-
-This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.
\ No newline at end of file
diff --git a/org.eclipse.swtbot.updatesite/about.html b/org.eclipse.swtbot.updatesite/about.html
deleted file mode 100644
index 88cfbc9..0000000
--- a/org.eclipse.swtbot.updatesite/about.html
+++ /dev/null
@@ -1,28 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
-<title>About</title>
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>December 2nd, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.updatesite/build.xml b/org.eclipse.swtbot.updatesite/build.xml
deleted file mode 100644
index 34a647e..0000000
--- a/org.eclipse.swtbot.updatesite/build.xml
+++ /dev/null
@@ -1,273 +0,0 @@
-<project name="org.eclipse.swtbot.updatesite" default="all" basedir=".">
-
-	<taskdef name="purge" classname="com.dallaway.ant.Purge" classpath="../org.eclipse.swtbot.releng/externals/libs/purge.jar" />
-
-	<taskdef resource="net/sf/antcontrib/antlib.xml" />
-	<property name="num.previous.revisions" value="1" />
-	<property name="target" value="${basedir}/target" />
-	<taskdef resource="net/sf/antcontrib/antlib.xml" classpath="../org.eclipse.swtbot.releng/externals/libs/ant-contrib-1.0b3.jar" />
-
-	<condition property="should.generate.archives">
-		<equals arg1="${has.archives}" arg2="true" />
-	</condition>
-
-	<echo>${should.generate.archives}: ${has.archives}</echo>
-
-	<target name="purge_old_files">
-		<echo>Purging feaures</echo>
-		<purge keep="${num.previous.revisions}">
-			<fileset dir="${target}/features">
-				<include name="org.eclipse.swtbot_*.jar" />
-			</fileset>
-			<fileset dir="${target}/features">
-				<include name="org.eclipse.swtbot.eclipse_*.jar" />
-			</fileset>
-			<fileset dir="${target}/features">
-				<include name="org.eclipse.swtbot.eclipse.gef*.jar" />
-			</fileset>
-		</purge>
-
-		<echo>Purging plugins</echo>
-		<purge keep="${num.previous.revisions}">
-
-			<!-- demo -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.swt.demo_*.jar" />
-			</fileset>
-
-			<!-- gef finder -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.eclipse.gef.finder_*.jar" />
-			</fileset>
-
-			<!-- eclipse finder -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.eclipse.finder_*.jar" />
-			</fileset>
-
-			<!-- finder -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.swt.finder_*.jar" />
-			</fileset>
-
-			<!-- eclipse ui and core-->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.eclipse.ui_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.eclipse.core_*.jar" />
-			</fileset>
-
-			<!-- spy -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.swt.spy_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.eclipse.spy_*.jar" />
-			</fileset>
-
-			<!-- recorder -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.swt.recorder_*.jar" />
-			</fileset>
-
-			<!-- recorder ui -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.swt.recorder.ui_*.jar" />
-			</fileset>
-
-			<!-- junit comptibility -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swtbot.junit4_x*.jar" />
-			</fileset>
-
-			<!-- apache jars -->
-			<fileset dir="${target}/plugins">
-				<include name="org.apache.log4j_*.jar" />
-			</fileset>
-
-			<!-- hamcrest jars -->
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.core_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.core.source*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.integration_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.integration.source_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.library_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.library.source_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.text_*.jar" />
-			</fileset>
-			<fileset dir="${target}/plugins">
-				<include name="org.hamcrest.text.source_*.jar" />
-			</fileset>
-
-			<!-- swt examples -->
-			<fileset dir="${target}/plugins">
-				<include name="org.eclipse.swt.examples_*.jar" />
-			</fileset>
-		</purge>
-	</target>
-
-	<target name="-create.features.template">
-		<basename file="${file}" property="file.name" />
-		<propertyregex property="all.buildId" input="${file.name}" regexp="${featureId}_(.*).jar" select="\1" />
-		<echo message="Adding ${featureId} version: ${all.buildId}" />
-		<concat destfile="build/${destFile}" append="true">
-			<path path="${srcFile}" />
-			<filterchain>
-				<expandproperties />
-			</filterchain>
-		</concat>
-	</target>
-
-	<target name="create_features_list" depends="purge_old_files">
-		<for param="file">
-			<path>
-				<fileset dir="${target}/features" includes="${plugin.prefix}_*.jar" />
-			</path>
-			<sequential>
-				<ant target="-create.features.template" inheritall="false">
-					<property name="file" value="@{file}" />
-					<property name="featureId" value="${plugin.prefix}" />
-					<property name="destFile" value="${plugin.prefix}.featurelist.xml" />
-					<property name="srcFile" value="site.template.${plugin.prefix}.featurelist.xml" />
-				</ant>
-			</sequential>
-		</for>
-	</target>
-
-	<target name="-create.plugins.template">
-		<basename file="${plugin.file.name}" property="file" />
-		<dirname file="${plugin.file.name}" property="file.dirname" />
-		<basename file="${file.dirname}" property="file.basedir" />
-		<echo>Adding feature/plugin: ${file} in ${file.basedir}</echo>
-		<concat destfile="build/${destFile}" append="true">
-			<path path="${srcFile}" />
-			<filterchain>
-				<expandproperties />
-			</filterchain>
-		</concat>
-	</target>
-
-
-	<target name="create_plugins_archive_list" if="should.generate.archives">
-		<for param="plugin">
-			<path>
-				<fileset dir="${target}/features" includes="*.jar" />
-				<fileset dir="${target}/plugins" includes="*.jar" />
-			</path>
-			<sequential>
-				<ant target="-create.plugins.template" inheritall="false">
-					<property name="plugin.file.name" value="@{plugin}" />
-					<property name="featureId" value="${plugin.prefix}" />
-					<property name="destFile" value="${plugin.prefix}.pluginarchivelist.xml" />
-					<property name="srcFile" value="site.template.${plugin.prefix}.pluginarchivelist.xml" />
-				</ant>
-			</sequential>
-		</for>
-	</target>
-
-	<target name="create_site_xml" depends="create_features_list">
-		<concat destfile="${target}/site.xml.tokenize" fixlastline="true" eol="unix">
-			<header file="site.template.header.xml" />
-			<fileset file="build/${plugin.prefix}.featurelist.xml" />
-			<fileset file="build/${plugin.prefix}.pluginarchivelist.xml" />
-			<fileset file="site.template.categories.xml" />
-			<footer file="site.template.footer.xml" />
-		</concat>
-
-		<move file="${target}/site.xml.tokenize" tofile="${target}/site.xml">
-			<filterchain>
-				<expandproperties />
-			</filterchain>
-		</move>
-
-	</target>
-
-	<target name="clean">
-		<delete dir="build" />
-		<delete dir="eclipse" />
-		<mkdir dir="build" />
-		<delete dir="${target}" includes="artifacts*.*, content*.*" />
-	</target>
-
-	<target name="-create.jars">
-		<for param="file">
-			<path>
-				<dirset dir="${target}/eclipse/features" includes="*" excludes="*.jar" />
-				<dirset dir="${target}/eclipse/plugins" includes="*" excludes="*.jar" />
-			</path>
-			<sequential>
-				<echo>Packaging feature @{file} as a jar</echo>
-				<zip destfile="@{file}.jar" basedir="@{file}" />
-				<delete dir="@{file}" />
-			</sequential>
-		</for>
-	</target>
-
-	<target name="init">
-		<mkdir dir="${target}" />
-
-		<unzip dest="${target}">
-			<fileset dir="../${plugin.prefix}.releng/artifacts" includes="org.eclipse.swtbot.eclipse-*" />
-			<fileset dir="../${plugin.prefix}.releng/artifacts" includes="org.eclipse.swtbot.eclipse.gef-*" />
-		</unzip>
-
-		<antcall target="-create.jars" inheritall="false" />
-
-		<move todir="${target}">
-			<fileset dir="${target}/eclipse" />
-		</move>
-	</target>
-
-	<target name="copy-to-update-site">
-		<property name="update-site-location" value="update-site" />
-		<copy todir="${update-site-location}">
-			<fileset dir=".">
-				<include name="features/**.*" />
-				<include name="plugins/**.*" />
-				<include name="index.html" />
-				<include name="site.xml" />
-				<include name="web/**.*" />
-			</fileset>
-			<fileset dir="target">
-			</fileset>
-		</copy>
-	</target>
-
-	<target name="create-p2-site">
-
-		<java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true">
-			<classpath>
-				<fileset dir="${eclipse.location}/plugins">
-					<include name="org.eclipse.equinox.launcher_*.jar" />
-				</fileset>
-			</classpath>
-
-			<arg line="-application org.eclipse.equinox.p2.metadata.generator.EclipseGenerator" />
-			<arg line="-updateSite ${target}" />
-			<arg line="-site file:${target}/site.xml" />
-			<arg line="-metadataRepository file:${target}" />
-			<arg line="-metadataRepositoryName 'SWTBot Update Site'" />
-			<arg line="-artifactRepository file:${target}" />
-			<arg line="-artifactRepositoryName 'SWTBot Artifacts'" />
-			<arg line="-compress -reusePack200Files -vmargs -Xmx128M" />
-		</java>
-	</target>
-
-	<target name="all" depends="clean, init, purge_old_files, create_features_list, create_plugins_archive_list, create_site_xml, create-p2-site, copy-to-update-site" />
-</project>
diff --git a/org.eclipse.swtbot.updatesite/category.xml b/org.eclipse.swtbot.updatesite/category.xml
new file mode 100644
index 0000000..29aa6d4
--- /dev/null
+++ b/org.eclipse.swtbot.updatesite/category.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<site>
+   <feature url="features/org.eclipse.swtbot_2.0.5.qualifier.jar" id="org.eclipse.swtbot" version="2.0.5.qualifier">
+      <category name="SWTBot - API"/>
+   </feature>
+   <feature url="features/org.eclipse.swtbot.eclipse_2.0.5.qualifier.jar" id="org.eclipse.swtbot.eclipse" version="2.0.5.qualifier">
+      <category name="SWTBot - API"/>
+   </feature>
+   <feature url="features/org.eclipse.swtbot.eclipse.gef_2.0.5.qualifier.jar" id="org.eclipse.swtbot.eclipse.gef" version="2.0.5.qualifier">
+      <category name="SWTBot - API"/>
+   </feature>
+   <feature url="features/org.eclipse.swtbot.forms_2.0.5.qualifier.jar" id="org.eclipse.swtbot.forms" version="2.0.5.qualifier">
+      <category name="SWTBot - API"/>
+   </feature>
+   <feature url="features/org.eclipse.swtbot.ide_2.0.5.qualifier.jar" id="org.eclipse.swtbot.ide" version="2.0.5.qualifier">
+      <category name="SWTBot - IDE Integration"/>
+   </feature>
+   <feature url="features/org.eclipse.swtbot.eclipse.test.junit_2.0.5.qualifier.jar" id="org.eclipse.swtbot.eclipse.test.junit" version="2.0.5.qualifier">
+      <category name="SWTBot - Headless Support"/>
+   </feature>
+   <category-def name="SWTBot - API" label="SWTBot - API"/>
+   <category-def name="SWTBot - IDE Integration" label="SWTBot - IDE Integration"/>
+   <category-def name="SWTBot - Headless Support" label="SWTBot - Headless Support"/>
+</site>
diff --git a/org.eclipse.swtbot.updatesite/index.html b/org.eclipse.swtbot.updatesite/index.html
deleted file mode 100644
index f4731ae..0000000
--- a/org.eclipse.swtbot.updatesite/index.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<html>
-<head>
-<title>org.eclipse.swtbot.updatesite</title>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<style>@import url("web/site.css");</style>
-<script type="text/javascript">
-	var returnval = 0;
-	var stylesheet, xmlFile, cache, doc;
-	function init(){
-		// NSCP 7.1+ / Mozilla 1.4.1+ / Safari
-		// Use the standard DOM Level 2 technique, if it is supported
-		if (document.implementation && document.implementation.createDocument) {
-			xmlFile = document.implementation.createDocument("", "", null);
-			stylesheet = document.implementation.createDocument("", "", null);
-			if (xmlFile.load){
-				xmlFile.load("site.xml");
-				stylesheet.load("web/site.xsl");
-			} else {
-				alert("Document could not be loaded by browser.");
-			}
-			xmlFile.addEventListener("load", transform, false);
-			stylesheet.addEventListener("load", transform, false);
-		}
-		//IE 6.0+ solution
-		else if (window.ActiveXObject) {
-			xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
-			xmlFile.async = false;
-			xmlFile.load("site.xml");
-			stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
-			stylesheet.async = false;
-			stylesheet.load("web/site.xsl");
-			cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
-			cache.stylesheet = stylesheet;
-			transformData();
-		}
-	}
-	// separate transformation function for IE 6.0+
-	function transformData(){
-		var processor = cache.createProcessor();
-		processor.input = xmlFile;
-		processor.transform();
-		data.innerHTML = processor.output;
-	}
-	// separate transformation function for NSCP 7.1+ and Mozilla 1.4.1+ 
-	function transform(){
-		returnval+=1;
-		if (returnval==2){
-			var processor = new XSLTProcessor();
-			processor.importStylesheet(stylesheet); 
-			doc = processor.transformToDocument(xmlFile);
-			document.getElementById("data").innerHTML = doc.documentElement.innerHTML;
-		}
-	}
-</script>
-</head>
-<body onload="init();">
-<!--[insert static HTML here]-->
-<div id="data"><!-- this is where the transformed data goes --></div>
-</body>
-</html>
diff --git a/org.eclipse.swtbot.updatesite/pom.xml b/org.eclipse.swtbot.updatesite/pom.xml
new file mode 100644
index 0000000..85e236e
--- /dev/null
+++ b/org.eclipse.swtbot.updatesite/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot</groupId>
+  <artifactId>org.eclipse.swtbot.updatesite</artifactId>
+  <packaging>eclipse-repository</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.updatesite/site.template.categories.xml b/org.eclipse.swtbot.updatesite/site.template.categories.xml
deleted file mode 100644
index e486103..0000000
--- a/org.eclipse.swtbot.updatesite/site.template.categories.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-	<!-- begin the categories -->
-	<category-def name="SWTBot SWT Features (incubation)" label="SWTBot SWT Features (incubation)">
-		<description>
-			This feature contains the basic SWTBot with drivers for SWT. This is useful for testing plain SWT applications.
-		</description>
-	</category-def>
-	
-	<category-def name="SWTBot Eclipse Features (incubation)" label="SWTBot Eclipse Features (incubation)">
-		<description>
-			This feature contains the SWTBot drivers for Eclipse, and some tooling for launching SWTBot tests for eclipse plugins. This is useful for testing Eclipse plugins and applications.
-		</description>
-	</category-def>
-	
-
-	<category-def name="SWTBot GEF Features (incubation)" label="SWTBot GEF Features (incubation)">
-		<description>
-			This feature contains the SWTBot drivers for GEF. This is useful for testing GEF based applications.
-		</description>
-	</category-def>
-
-	<!-- end the categories -->
-
diff --git a/org.eclipse.swtbot.updatesite/site.template.footer.xml b/org.eclipse.swtbot.updatesite/site.template.footer.xml
deleted file mode 100644
index 66f3505..0000000
--- a/org.eclipse.swtbot.updatesite/site.template.footer.xml
+++ /dev/null
@@ -1 +0,0 @@
-</site>
diff --git a/org.eclipse.swtbot.updatesite/site.template.header.xml b/org.eclipse.swtbot.updatesite/site.template.header.xml
deleted file mode 100644
index 2067c38..0000000
--- a/org.eclipse.swtbot.updatesite/site.template.header.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-	<description>
-		The SWTBot Update site.
-	</description>
diff --git a/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.featurelist.xml b/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.featurelist.xml
deleted file mode 100644
index 76c82b4..0000000
--- a/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.featurelist.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-	<!-- begin SWTBot feature list -->
-	<feature url="${update.site.base.url}/features/org.eclipse.swtbot_${all.buildId}.jar" id="org.eclipse.swtbot" version="${all.buildId}">
-		<category name="SWTBot SWT Features (incubation)"/>
-	</feature>
-
-	<feature url="${update.site.base.url}/features/org.eclipse.swtbot.eclipse_${all.buildId}.jar" id="org.eclipse.swtbot.eclipse" version="${all.buildId}">
-		<category name="SWTBot Eclipse Features (incubation)"/>
-	</feature>
-
-	<feature url="${update.site.base.url}/features/org.eclipse.swtbot.gef_${all.buildId}.jar" id="org.eclipse.swtbot.eclipse.gef" version="${all.buildId}">
-		<category name="SWTBot GEF Features (incubation)"/>
-	</feature>
-	<!-- end SWTBot feature list -->
diff --git a/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.pluginarchivelist.xml b/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.pluginarchivelist.xml
deleted file mode 100644
index 529142b..0000000
--- a/org.eclipse.swtbot.updatesite/site.template.org.eclipse.swtbot.pluginarchivelist.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-
-	<archive path="${file.basedir}/${file}" 
-		url="${update.site.base.url}/${file.basedir}/${file}"/>
diff --git a/org.eclipse.swtbot.updatesite/web/site.css b/org.eclipse.swtbot.updatesite/web/site.css
deleted file mode 100644
index 62c6f9f..0000000
--- a/org.eclipse.swtbot.updatesite/web/site.css
+++ /dev/null
@@ -1,12 +0,0 @@
-<STYLE type="text/css">
-td.spacer {padding-bottom: 10px; padding-top: 10px;}
-.title { font-family: sans-serif; color: #99AACC;}
-.bodyText { font-family: sans-serif; font-size: 9pt; color:#000000;  }
-.sub-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white;}
-.log-text {font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black;}
-.big-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white;}
-.light-row {background:#FFFFFF}
-.dark-row {background:#EEEEFF}
-.header {background:#99AADD}
-#indent {word-wrap : break-word;width :300px;text-indent:10px;}
-</STYLE>
diff --git a/org.eclipse.swtbot.updatesite/web/site.xsl b/org.eclipse.swtbot.updatesite/web/site.xsl
deleted file mode 100644
index 8082412..0000000
--- a/org.eclipse.swtbot.updatesite/web/site.xsl
+++ /dev/null
@@ -1,214 +0,0 @@
-<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt">
-<xsl:output method="html" encoding="UTF-8"/>
-<xsl:key name="cat" match="category" use="@name"/>
-<xsl:template match="/">
-<xsl:for-each select="site">
-	<html>
-	<head>
-	<title>org.eclipse.swtbot.updatesite</title>
-	<style>@import url("web/site.css");</style>
-	</head>
-	<body>
-	<h1 class="title">org.eclipse.swtbot.updatesite</h1>
-	<p class="bodyText"><xsl:value-of select="description"/></p>
-	<table width="100%" border="0" cellspacing="1" cellpadding="2">
-	<xsl:for-each select="category-def">
-		<xsl:sort select="@label" order="ascending" case-order="upper-first"/>
-		<xsl:sort select="@name" order="ascending" case-order="upper-first"/>
-	<xsl:if test="count(key('cat',@name)) != 0">
-			<tr class="header">
-				<td class="sub-header" width="30%">
-					<xsl:value-of select="@name"/>
-				</td>
-				<td class="sub-header" width="70%">
-					<xsl:value-of select="@label"/>
-				</td>
-			</tr>
-			<xsl:for-each select="key('cat',@name)">
-			<xsl:sort select="ancestor::feature//@version" order="ascending"/>
-			<xsl:sort select="ancestor::feature//@id" order="ascending" case-order="upper-first"/>
-			<tr>
-				<xsl:choose>
-				<xsl:when test="(position() mod 2 = 1)">
-					<xsl:attribute name="class">dark-row</xsl:attribute>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:attribute name="class">light-row</xsl:attribute>
-				</xsl:otherwise>
-				</xsl:choose>
-				<td class="log-text" id="indent">
-						<xsl:choose>
-						<xsl:when test="ancestor::feature//@label">
-							<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@label"/></a>
-							<br/>
-							<div id="indent">
-							(<xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/>)
-							</div>
-						</xsl:when>
-						<xsl:otherwise>
-						<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/></a>
-						</xsl:otherwise>
-						</xsl:choose>
-						<br />
-				</td>
-				<td>
-					<table>
-						<xsl:if test="ancestor::feature//@os">
-							<tr><td class="log-text" id="indent">Operating Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@os"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@ws">
-							<tr><td class="log-text" id="indent">Windows Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@ws"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@nl">
-							<tr><td class="log-text" id="indent">Languages:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@nl"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@arch">
-							<tr><td class="log-text" id="indent">Architecture:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@arch"/></td>
-							</tr>
-						</xsl:if>
-					</table>
-				</td>
-			</tr>
-			</xsl:for-each>
-			<tr><td class="spacer"><br/></td><td class="spacer"><br/></td></tr>
-		</xsl:if>
-	</xsl:for-each>
-	<xsl:if test="count(feature)  &gt; count(feature/category)">
-	<tr class="header">
-		<td class="sub-header" colspan="2">
-		Uncategorized
-		</td>
-	</tr>
-	</xsl:if>
-	<xsl:choose>
-	<xsl:when test="function-available('msxsl:node-set')">
-	   <xsl:variable name="rtf-nodes">
-		<xsl:for-each select="feature[not(category)]">
-			<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-			<xsl:sort select="@version" order="ascending" />
-			<xsl:value-of select="."/>
-			<xsl:copy-of select="." />
-		</xsl:for-each>
-	   </xsl:variable>
-	   <xsl:variable name="myNodeSet" select="msxsl:node-set($rtf-nodes)/*"/>
-	<xsl:for-each select="$myNodeSet">
-	<tr>
-		<xsl:choose>
-		<xsl:when test="position() mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:when>
-	<xsl:otherwise>
-	<xsl:for-each select="feature[not(category)]">
-	<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-	<xsl:sort select="@version" order="ascending" />
-	<tr>
-		<xsl:choose>
-		<xsl:when test="count(preceding-sibling::feature[not(category)]) mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:otherwise>
-	</xsl:choose>
-	</table>
-	</body>
-	</html>
-</xsl:for-each>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/org.eclipse.swtbot/build.properties b/org.eclipse.swtbot/build.properties
index 83b8d3e..aff4051 100644
--- a/org.eclipse.swtbot/build.properties
+++ b/org.eclipse.swtbot/build.properties
@@ -10,10 +10,12 @@
 ###############################################################################
 bin.includes = feature.xml,\
                license.html,\
-               epl-v10.html
+               epl-v10.html,\
+               feature.properties
 jars.compile.order = .
 source.. =
 src.includes = feature.xml,\
                build.properties,\
                epl-v10.html,\
-               license.html
+               license.html,\
+               feature.properties
diff --git a/org.eclipse.swtbot/feature.properties b/org.eclipse.swtbot/feature.properties
new file mode 100644
index 0000000..b3dd40d
--- /dev/null
+++ b/org.eclipse.swtbot/feature.properties
@@ -0,0 +1,140 @@
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+copyright=\
+Copyright (c) 2007-2010 Ketan Padegaonkar and others.\n\
+All rights reserved. This program and the accompanying materials\n\
+are made available under the terms of the Eclipse Public License v1.0\n\
+which accompanies this distribution, and is available at\n\
+http://www.eclipse.org/legal/epl-v10.html\n\
+\n\
+Contributors:\n\
+	Ketan Padegaonkar - initial API and implementation
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/org.eclipse.swtbot/feature.xml b/org.eclipse.swtbot/feature.xml
index 57978c8..70965a0 100644
--- a/org.eclipse.swtbot/feature.xml
+++ b/org.eclipse.swtbot/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.swtbot"
       label="SWTBot for SWT Testing (incubation)"
-      version="2.0.0.qualifier"
+      version="2.0.5.qualifier"
       provider-name="Eclipse.org"
       plugin="org.eclipse.swtbot.eclipse.ui">
 
@@ -10,83 +10,12 @@
       SWTBot for testing SWT based applications (incubation)
    </description>
 
-   <copyright url="http://eclipse.org/">
-      Copyright (c) 2007, 2008 Ketan Padegaonkar 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:
-    Ketan Padegaonkar - initial API and implementation
+   <copyright>
+      %copyright
    </copyright>
 
-   <license url="license.html">
-      Eclipse.org Software User Agreement
-
-Eclipse Foundation Software User Agreement
-March 17, 2005
-
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-(COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-   
-Applicable Licenses
-   
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-(&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-   
-* Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-* Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(tm) ARchive) in a directory named &quot;plugins&quot;.
-* A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-  and/or Fragments associated with that Feature.
-* Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
- 
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:
-
-* The top-level (root) directory
-* Plug-in and Fragment directories
-* Inside Plug-ins and Fragments packaged as JARs
-* Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-* Feature directories
-  
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-* Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-* Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-* Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-* IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html) 
-* Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-* Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is permitted.
-   
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
+   <license url="%licenseURL">
+      %license
    </license>
 
    <url>
diff --git a/org.eclipse.swtbot/license.html b/org.eclipse.swtbot/license.html
index c6af966..c184ca3 100644
--- a/org.eclipse.swtbot/license.html
+++ b/org.eclipse.swtbot/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
    For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
 
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,23 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
 </ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/org.eclipse.swtbot/pom.xml b/org.eclipse.swtbot/pom.xml
new file mode 100644
index 0000000..bb8e106
--- /dev/null
+++ b/org.eclipse.swtbot/pom.xml
@@ -0,0 +1,25 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.features</groupId>
+  <artifactId>org.eclipse.swtbot</artifactId>
+  <packaging>eclipse-feature</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.eclipse.junit4.headless/.classpath b/org.eclipse.ui.forms.examples/.classpath
old mode 100644
new mode 100755
similarity index 95%
rename from org.eclipse.swtbot.eclipse.junit4.headless/.classpath
rename to org.eclipse.ui.forms.examples/.classpath
index 64c5e31..2fbb7a2
--- a/org.eclipse.swtbot.eclipse.junit4.headless/.classpath
+++ b/org.eclipse.ui.forms.examples/.classpath
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="bin"/>
diff --git a/org.eclipse.ui.forms.examples/.cvsignore b/org.eclipse.ui.forms.examples/.cvsignore
new file mode 100755
index 0000000..ba077a4
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/org.eclipse.swtbot.swt.recorder/.project b/org.eclipse.ui.forms.examples/.project
old mode 100644
new mode 100755
similarity index 89%
copy from org.eclipse.swtbot.swt.recorder/.project
copy to org.eclipse.ui.forms.examples/.project
index d2190e0..0039091
--- a/org.eclipse.swtbot.swt.recorder/.project
+++ b/org.eclipse.ui.forms.examples/.project
@@ -1,9 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.swtbot.swt.recorder</name>
+	<name>org.eclipse.ui.forms.examples</name>
 	<comment></comment>
-	<projects>
-	</projects>
 	<buildSpec>
 		<buildCommand>
 			<name>org.eclipse.jdt.core.javabuilder</name>
diff --git a/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs
new file mode 100755
index 0000000..9d6b2a2
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,53 @@
+#Mon Nov 30 14:26:46 PST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
diff --git a/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs
new file mode 100755
index 0000000..817d509
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Mon May 16 16:39:49 EDT 2005
+eclipse.preferences.version=1
+internal.default.compliance=default
diff --git a/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs b/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs
new file mode 100755
index 0000000..b4438da
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,12 @@
+#Mon May 16 16:39:49 EDT 2005
+compilers.p.deprecated=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/org.eclipse.ui.forms.examples/META-INF/MANIFEST.MF b/org.eclipse.ui.forms.examples/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b01bf31
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.ui.forms.examples; singleton:=true
+Bundle-Version: 3.1.100.qualifier
+Bundle-ClassPath: examples.jar
+Bundle-Activator: org.eclipse.ui.forms.examples.internal.ExamplesPlugin
+Bundle-Vendor: Eclipse.org
+Bundle-Localization: plugin
+Export-Package: org.eclipse.ui.forms.examples.internal,
+ org.eclipse.ui.forms.examples.internal.dialogs,
+ org.eclipse.ui.forms.examples.internal.rcp,
+ org.eclipse.ui.forms.examples.views
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.resources,
+ org.eclipse.ui.forms,
+ org.eclipse.core.runtime,
+ org.eclipse.ui.ide
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/org.eclipse.ui.forms.examples/about.html b/org.eclipse.ui.forms.examples/about.html
new file mode 100755
index 0000000..6f6b96c
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/about.html
@@ -0,0 +1,22 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html>
+<head>
+<title>About</title>
+<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>February 24, 2005</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/org.eclipse.swtbot.ant.optional.junit4/build.properties b/org.eclipse.ui.forms.examples/build.properties
similarity index 61%
copy from org.eclipse.swtbot.ant.optional.junit4/build.properties
copy to org.eclipse.ui.forms.examples/build.properties
index ddcdb5e..8a816c6 100755
--- a/org.eclipse.swtbot.ant.optional.junit4/build.properties
+++ b/org.eclipse.ui.forms.examples/build.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
+# Copyright (c) 2003, 2009 IBM Corporation 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
@@ -8,5 +8,12 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-bin.includes = about.html,\
-               META-INF/
+source.examples.jar = src/
+bin.includes = plugin.xml,\
+               *.jar,\
+               examples.jar,\
+               icons/,\
+               about.html,\
+               META-INF/,\
+               plugin.properties
+output.examples.jar = bin/
diff --git a/org.eclipse.ui.forms.examples/icons/clear.gif b/org.eclipse.ui.forms.examples/icons/clear.gif
new file mode 100755
index 0000000..6bc10f9
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/clear.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/close_view.gif b/org.eclipse.ui.forms.examples/icons/close_view.gif
new file mode 100755
index 0000000..1aca259
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/close_view.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/container_obj.gif b/org.eclipse.ui.forms.examples/icons/container_obj.gif
new file mode 100755
index 0000000..f32c28d
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/container_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/e_search_menu.gif b/org.eclipse.ui.forms.examples/icons/e_search_menu.gif
new file mode 100755
index 0000000..f0f5d83
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/e_search_menu.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/file_obj.gif b/org.eclipse.ui.forms.examples/icons/file_obj.gif
new file mode 100755
index 0000000..6b86d07
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/file_obj.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/form_banner.gif b/org.eclipse.ui.forms.examples/icons/form_banner.gif
new file mode 100755
index 0000000..aebc0b2
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/form_banner.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/help.gif b/org.eclipse.ui.forms.examples/icons/help.gif
new file mode 100755
index 0000000..9d70301
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/help.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/help_topic.gif b/org.eclipse.ui.forms.examples/icons/help_topic.gif
new file mode 100755
index 0000000..9bdd516
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/help_topic.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/large_image.gif b/org.eclipse.ui.forms.examples/icons/large_image.gif
new file mode 100755
index 0000000..c5c94ee
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/large_image.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/linkto_help.gif b/org.eclipse.ui.forms.examples/icons/linkto_help.gif
new file mode 100755
index 0000000..86550fe
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/linkto_help.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif b/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif
new file mode 100755
index 0000000..dc7d3a7
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/newprj_wiz.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/nw.gif b/org.eclipse.ui.forms.examples/icons/nw.gif
new file mode 100755
index 0000000..d0952a8
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/nw.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/progress.gif b/org.eclipse.ui.forms.examples/icons/progress.gif
new file mode 100755
index 0000000..f6a200f
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/progress.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/sample.gif b/org.eclipse.ui.forms.examples/icons/sample.gif
new file mode 100755
index 0000000..34fb3c9
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/sample.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/th_horizontal.gif b/org.eclipse.ui.forms.examples/icons/th_horizontal.gif
new file mode 100755
index 0000000..f4c14a4
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/th_horizontal.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/th_vertical.gif b/org.eclipse.ui.forms.examples/icons/th_vertical.gif
new file mode 100755
index 0000000..f685839
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/th_vertical.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/toc_closed.gif b/org.eclipse.ui.forms.examples/icons/toc_closed.gif
new file mode 100755
index 0000000..504acb2
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/toc_closed.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/toc_open.gif b/org.eclipse.ui.forms.examples/icons/toc_open.gif
new file mode 100755
index 0000000..9e665d5
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/toc_open.gif
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/icons/topic_small.gif b/org.eclipse.ui.forms.examples/icons/topic_small.gif
new file mode 100755
index 0000000..17d8b2e
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/icons/topic_small.gif
Binary files differ
diff --git a/org.eclipse.swtbot.ant.optional.junit4/build.properties b/org.eclipse.ui.forms.examples/plugin.properties
similarity index 72%
copy from org.eclipse.swtbot.ant.optional.junit4/build.properties
copy to org.eclipse.ui.forms.examples/plugin.properties
index ddcdb5e..94ed361 100755
--- a/org.eclipse.swtbot.ant.optional.junit4/build.properties
+++ b/org.eclipse.ui.forms.examples/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
+# Copyright (c) 2003, 2007 IBM Corporation 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
@@ -8,5 +8,6 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-bin.includes = about.html,\
-               META-INF/
+pluginName = Examples of Eclipse Forms
+baseEditor = Simple Form (RCP) Editor
+singleHeaderEditor = Single Header Editor
diff --git a/org.eclipse.ui.forms.examples/plugin.xml b/org.eclipse.ui.forms.examples/plugin.xml
new file mode 100755
index 0000000..df18dd9
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/plugin.xml
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/pom.xml b/org.eclipse.ui.forms.examples/pom.xml
new file mode 100644
index 0000000..40c88b3
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/pom.xml
@@ -0,0 +1,26 @@
+<!-- Copyright (c) 2011 PetalsLink.
+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
+
+Authors:
+* Mickael Istria (PetalsLink)
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.eclipse.swtbot.plugins</groupId>
+  <artifactId>org.eclipse.ui.forms.examples</artifactId>
+  <version>3.1.100-SNAPSHOT</version>
+  <packaging>eclipse-plugin</packaging>
+  <parent>
+  	<groupId>org.eclipse.swtbot</groupId>
+  	<artifactId>parent</artifactId>
+  	<version>2.0.5-SNAPSHOT</version>
+  	<relativePath>../pom.xml</relativePath>
+  </parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java
new file mode 100755
index 0000000..269726d
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPlugin.java
@@ -0,0 +1,150 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal;
+import java.net.URL;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+/**
+ * The main plugin class to be used in the desktop.
+ */
+public class ExamplesPlugin extends AbstractUIPlugin {
+	//The shared instance.
+	private static ExamplesPlugin plugin;
+	//Resource bundle.
+	private ResourceBundle resourceBundle;
+	private FormColors formColors;
+	public static final String IMG_FORM_BG = "formBg";
+	public static final String IMG_LARGE = "large";
+	public static final String IMG_HORIZONTAL = "horizontal";
+	public static final String IMG_VERTICAL = "vertical";
+	public static final String IMG_SAMPLE = "sample";
+	public static final String IMG_WIZBAN = "wizban";
+	public static final String IMG_LINKTO_HELP = "linkto_help";
+	public static final String IMG_HELP_TOPIC = "help_topic";
+	public static final String IMG_CLOSE = "close";
+	public static final String IMG_HELP_CONTAINER = "container_obj";
+	public static final String IMG_HELP_TOC_OPEN = "toc_open";
+	public static final String IMG_HELP_TOC_CLOSED = "toc_closed";
+	public static final String IMG_HELP_SEARCH = "e_search_menu";
+	public static final String IMG_CLEAR = "clear";
+	public static final String IMG_NW = "nw";
+
+	/**
+	 * The constructor.
+	 */
+	public ExamplesPlugin() {
+		plugin = this;
+		try {
+			resourceBundle = ResourceBundle
+					.getBundle("org.eclipse.ui.forms.examples.internal.ExamplesPluginResources");
+		} catch (MissingResourceException x) {
+			resourceBundle = null;
+		}
+	}
+
+	protected void initializeImageRegistry(ImageRegistry registry) {
+		registerImage(registry, IMG_FORM_BG, "form_banner.gif");
+		registerImage(registry, IMG_LARGE, "large_image.gif");
+		registerImage(registry, IMG_HORIZONTAL, "th_horizontal.gif");
+		registerImage(registry, IMG_VERTICAL, "th_vertical.gif");
+		registerImage(registry, IMG_SAMPLE, "sample.gif");
+		registerImage(registry, IMG_WIZBAN, "newprj_wiz.gif");
+		registerImage(registry, IMG_LINKTO_HELP, "linkto_help.gif");
+		registerImage(registry, IMG_HELP_TOPIC, "topic.gif");
+		registerImage(registry, IMG_HELP_CONTAINER, "container_obj.gif");
+		registerImage(registry, IMG_HELP_TOC_CLOSED, "toc_closed.gif");
+		registerImage(registry, IMG_HELP_TOC_OPEN, "toc_open.gif");
+		registerImage(registry, IMG_CLOSE, "close_view.gif");
+		registerImage(registry, IMG_HELP_SEARCH, "e_search_menu.gif");
+		registerImage(registry, IMG_CLEAR, "clear.gif");
+		registerImage(registry, IMG_NW, "nw.gif");
+	}
+
+	private void registerImage(ImageRegistry registry, String key,
+			String fileName) {
+		try {
+			IPath path = new Path("icons/" + fileName);
+			URL url = FileLocator.find(getBundle(), path, null);
+			if (url!=null) {
+				ImageDescriptor desc = ImageDescriptor.createFromURL(url);
+				registry.put(key, desc);
+			}
+		} catch (Exception e) {
+		}
+	}
+
+	public FormColors getFormColors(Display display) {
+		if (formColors == null) {
+			formColors = new FormColors(display);
+			formColors.markShared();
+		}
+		return formColors;
+	}
+	/**
+	 * Returns the shared instance.
+	 */
+	public static ExamplesPlugin getDefault() {
+		return plugin;
+	}
+	/**
+	 * Returns the workspace instance.
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+	/**
+	 * Returns the string from the plugin's resource bundle, or 'key' if not
+	 * found.
+	 */
+	public static String getResourceString(String key) {
+		ResourceBundle bundle = ExamplesPlugin.getDefault().getResourceBundle();
+		try {
+			return (bundle != null ? bundle.getString(key) : key);
+		} catch (MissingResourceException e) {
+			return key;
+		}
+	}
+	/**
+	 * Returns the plugin's resource bundle,
+	 */
+	public ResourceBundle getResourceBundle() {
+		return resourceBundle;
+	}
+	public void stop(BundleContext context) throws Exception {
+		try {
+			if (formColors != null) {
+				formColors.dispose();
+				formColors = null;
+			}
+		} finally {
+			super.stop(context);
+		}
+	}
+	public Image getImage(String key) {
+		return getImageRegistry().get(key);
+	}
+	public ImageDescriptor getImageDescriptor(String key) {
+		return getImageRegistry().getDescriptor(key);
+	}
+}
diff --git a/org.eclipse.swtbot.ant.optional.junit4/build.properties b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties
similarity index 80%
rename from org.eclipse.swtbot.ant.optional.junit4/build.properties
rename to org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties
index ddcdb5e..339810c 100755
--- a/org.eclipse.swtbot.ant.optional.junit4/build.properties
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/ExamplesPluginResources.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
+# Copyright (c) 2003, 2004 IBM Corporation 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
@@ -8,5 +8,3 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-bin.includes = about.html,\
-               META-INF/
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java
new file mode 100755
index 0000000..5d7dbc5
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/FormEditorInput.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.*;
+
+public class FormEditorInput implements IEditorInput {
+	private String name;
+	public FormEditorInput(String name) {
+		this.name = name;
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorInput#exists()
+	 */
+	public boolean exists() {
+		return true;
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorInput#getImageDescriptor()
+	 */
+	public ImageDescriptor getImageDescriptor() {
+		return PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
+				ISharedImages.IMG_OBJ_ELEMENT);
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorInput#getName()
+	 */
+	public String getName() {
+		return name;
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorInput#getPersistable()
+	 */
+	public IPersistableElement getPersistable() {
+		return null;
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IEditorInput#getToolTipText()
+	 */
+	public String getToolTipText() {
+		return getName();
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
+	 */
+	public Object getAdapter(Class adapter) {
+		return null;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java
new file mode 100755
index 0000000..02cd146
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/OpenFormEditorAction.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+
+public abstract class OpenFormEditorAction extends AbstractHandler {
+
+	protected Object openEditor(String inputName, String editorId, IWorkbenchWindow window) {
+		return openEditor(new FormEditorInput(inputName), editorId, window);
+	}
+	
+	protected Object openEditor(IEditorInput input, String editorId, IWorkbenchWindow window) {
+		IWorkbenchPage page = window.getActivePage();
+		try {
+			page.openEditor(input, editorId);
+		} catch (PartInitException e) {
+			System.out.println(e);
+		}
+		return null;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java
new file mode 100755
index 0000000..5b3df3d
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/OpenFormDialog.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.dialogs;
+
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class OpenFormDialog extends AbstractHandler {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+		SampleFormDialog dialog = new SampleFormDialog(window.getShell());
+		dialog.create();
+		dialog.getShell().setText("Sample Form Dialog");
+		dialog.getShell().setSize(500,500);
+		dialog.getShell().setLocation(100, 300);
+		dialog.open();
+		return null;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java
new file mode 100755
index 0000000..5ff3c25
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/dialogs/SampleFormDialog.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ui.forms.examples.internal.dialogs;
+
+import org.eclipse.jface.window.IShellProvider;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormDialog;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.examples.internal.rcp.FreeFormPage;
+
+public class SampleFormDialog extends FormDialog {
+
+	public SampleFormDialog(Shell shell) {
+		super(shell);
+	}
+
+	public SampleFormDialog(IShellProvider parentShell) {
+		super(parentShell);
+	}
+
+	protected void createFormContent(IManagedForm mform) {
+		mform.getForm().setText("An example of a simple form dialog");
+		FreeFormPage.createSharedFormContent(mform);
+		mform.getForm().setBackgroundImage(null);
+		mform.getToolkit().decorateFormHeading(mform.getForm().getForm());
+		mform.getForm().setImage(
+				PlatformUI.getWorkbench().getSharedImages().getImage(
+						ISharedImages.IMG_OBJ_ELEMENT));
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java
new file mode 100755
index 0000000..5b6a15d
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ErrorMessagesPage.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.HyperlinkSettings;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessage;
+import org.eclipse.ui.forms.IMessageManager;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+/**
+ * This page shows how to use the message manager to handle errors in a form
+ * page.
+ * 
+ * @since 3.3
+ */
+public class ErrorMessagesPage extends FormPage {
+
+	/*
+	private RichMessageToolTipManager richToolTipMessageManager;
+	class RichToolTip extends ToolTip {
+		private IManagedForm mform;
+		private FormText text;
+		private String content;
+
+		public RichToolTip(IManagedForm mform, Control control) {
+			super(control);
+			this.mform = mform;
+			setShift(new Point(10, 10));
+		}
+
+		protected Composite createToolTipContentArea(Event event,
+				Composite parent) {
+			this.text = mform.getToolkit().createFormText(parent, true);
+			configureFormText(mform.getForm().getForm(), text);
+			update();
+			return text;
+		}
+
+		public void update(String content) {
+			if (content == null) {
+				// hide
+				deactivate();
+			} else {
+				activate();
+				this.content = content;
+				update();
+			}
+		}
+
+		private void update() {
+			if (text != null && text.isDisposed())
+				text = null;
+			if (text != null) {
+				if (content != null)
+					text.setText(content, true, false);
+				else
+					text.setText("", false, false);
+			}
+		}
+	}
+
+	class RichMessageToolTipManager implements IMessageToolTipManager {
+		private ArrayList toolTips = new ArrayList();
+		private IManagedForm mform;
+
+		public RichMessageToolTipManager(IManagedForm mform) {
+			this.mform = mform;
+		}
+
+		public void createToolTip(Control control, boolean imageLabel) {
+			ToolTip toolTip = new RichToolTip(mform, control);
+			toolTips.add(toolTip);
+		}
+
+		public void setActive(boolean active) {
+			for (int i = 0; i < toolTips.size(); i++) {
+				RichToolTip toolTip = (RichToolTip) toolTips.get(i);
+				if (active)
+					toolTip.activate();
+				else
+					toolTip.deactivate();
+			}
+		}
+
+		public void update() {
+			IMessage[] messages = mform.getForm().getForm()
+					.getChildrenMessages();
+			String content = mform.getForm().getMessage() == null ? null
+					: createFormTextContent(messages);
+			for (int i = 0; i < toolTips.size(); i++) {
+				RichToolTip toolTip = (RichToolTip) toolTips.get(i);
+				toolTip.update(content);
+			}
+		}
+	}
+	
+	*/
+
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public ErrorMessagesPage(FormEditor editor) {
+		super(editor, "messageManager", "Message Manager");
+	}
+
+	protected void createFormContent(final IManagedForm managedForm) {
+		final ScrolledForm form = managedForm.getForm();
+		final FormToolkit toolkit = managedForm.getToolkit();
+		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
+				HyperlinkSettings.UNDERLINE_HOVER);
+		form.setText("Example with message handling");
+		toolkit.decorateFormHeading(form.getForm());
+		form.getForm().addMessageHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				String title = e.getLabel();
+				// String details = title;
+				Object href = e.getHref();
+				if (href instanceof IMessage[]) {
+					// details =
+					// managedForm.getMessageManager().createSummary((IMessage[])href);
+				}
+				// int type = form.getForm().getMessageType();
+				/*
+				 * switch (type) { case IMessageProvider.NONE: case
+				 * IMessageProvider.INFORMATION:
+				 * MessageDialog.openInformation(form.getShell(), title,
+				 * details); break; case IMessageProvider.WARNING:
+				 * MessageDialog.openWarning(form.getShell(), title, details);
+				 * break; case IMessageProvider.ERROR:
+				 * MessageDialog.openError(form.getShell(), title, details);
+				 * break; }
+				 */
+				Point hl = ((Control) e.widget).toDisplay(0, 0);
+				hl.x += 10;
+				hl.y += 10;
+				Shell shell = new Shell(form.getShell(), SWT.ON_TOP | SWT.TOOL);
+				shell.setImage(getImage(form.getMessageType()));
+				shell.setText(title);
+				shell.setLayout(new FillLayout());
+				// ScrolledFormText stext = new ScrolledFormText(shell, false);
+				// stext.setBackground(toolkit.getColors().getBackground());
+				FormText text = toolkit.createFormText(shell, true);
+				configureFormText(form.getForm(), text);
+				// stext.setFormText(text);
+				if (href instanceof IMessage[])
+					text.setText(createFormTextContent((IMessage[]) href),
+							true, false);
+				shell.setLocation(hl);
+				// Point size = shell.computeSize(400, SWT.DEFAULT);
+				/*
+				richToolTipMessageManager.setActive(false);
+				shell.addDisposeListener(new DisposeListener() {
+					public void widgetDisposed(DisposeEvent e) {
+						richToolTipMessageManager.setActive(true);
+					}
+				});
+				*/
+				shell.pack();
+				shell.open();
+			}
+		});
+
+		//richToolTipMessageManager = new RichMessageToolTipManager(managedForm);
+		//form.getForm().setMessageToolTipManager(richToolTipMessageManager);
+
+		final IMessageManager mmng = managedForm.getMessageManager();
+
+		TableWrapLayout layout = new TableWrapLayout();
+		form.getBody().setLayout(layout);
+		Section section = toolkit.createSection(form.getBody(),
+				Section.TITLE_BAR);
+		section.setText("Local field messages");
+		Composite sbody = toolkit.createComposite(section);
+		section.setClient(sbody);
+		GridLayout glayout = new GridLayout();
+		glayout.horizontalSpacing = 10;
+		glayout.numColumns = 2;
+		sbody.setLayout(glayout);
+		toolkit.paintBordersFor(sbody);
+		createDecoratedTextField("Field1", toolkit, sbody, mmng);
+		createDecoratedTextField("Field2", toolkit, sbody, mmng);
+		createDecoratedTextField("Field3", toolkit, sbody, mmng);
+		final Button button1 = toolkit.createButton(form.getBody(),
+				"Add general error", SWT.CHECK);
+		button1.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (button1.getSelection()) {
+					mmng.addMessage("saveError", "Save Error", null,
+							IMessageProvider.ERROR);
+				} else {
+					mmng.removeMessage("saveError");
+				}
+			}
+		});
+		final Button button2 = toolkit.createButton(form.getBody(),
+				"Add static message", SWT.CHECK);
+		button2.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (button2.getSelection()) {
+					mmng.addMessage("info", "Secondary info", null,
+							IMessageProvider.NONE);
+				} else {
+					mmng.removeMessage("info");
+				}
+			}
+		});
+		final Button button3 = toolkit.createButton(form.getBody(),
+				"Auto update", SWT.CHECK);
+		button3.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				mmng.setAutoUpdate(button3.getSelection());
+			}
+		});
+		button3.setSelection(true);
+	}
+
+	private Image getImage(int type) {
+		switch (type) {
+		case IMessageProvider.ERROR:
+			return PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJS_ERROR_TSK);
+		case IMessageProvider.WARNING:
+			return PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJS_WARN_TSK);
+		case IMessageProvider.INFORMATION:
+			return PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_OBJS_INFO_TSK);
+		}
+		return null;
+	}
+
+	private void configureFormText(final Form form, FormText text) {
+		text.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				String is = (String)e.getHref();
+				try {
+					int index = Integer.parseInt(is);
+					IMessage [] messages = form.getChildrenMessages();
+					IMessage message =messages[index];
+					Control c = message.getControl();
+					((FormText)e.widget).getShell().dispose();
+					if (c!=null)
+						c.setFocus();
+				}
+				catch (NumberFormatException ex) {
+				}
+			}
+		});
+		text.setImage("error", getImage(IMessageProvider.ERROR));
+		text.setImage("warning", getImage(IMessageProvider.WARNING));
+		text.setImage("info", getImage(IMessageProvider.INFORMATION));
+	}
+
+	String createFormTextContent(IMessage[] messages) {
+		StringWriter sw = new StringWriter();
+		PrintWriter pw = new PrintWriter(sw);
+		pw.println("<form>");
+		for (int i = 0; i < messages.length; i++) {
+			IMessage message = messages[i];
+			pw
+					.print("<li vspace=\"false\" style=\"image\" indent=\"16\" value=\"");
+			switch (message.getMessageType()) {
+			case IMessageProvider.ERROR:
+				pw.print("error");
+				break;
+			case IMessageProvider.WARNING:
+				pw.print("warning");
+				break;
+			case IMessageProvider.INFORMATION:
+				pw.print("info");
+				break;
+			}
+			pw.print("\"> <a href=\"");
+			pw.print(i+"");
+			pw.print("\">");
+			if (message.getPrefix() != null)
+				pw.print(message.getPrefix());
+			pw.print(message.getMessage());
+			pw.println("</a></li>");
+		}
+		pw.println("</form>");
+		pw.flush();
+		return sw.toString();
+	}
+
+	private void createDecoratedTextField(String label, FormToolkit toolkit,
+			Composite parent, final IMessageManager mmng) {
+		toolkit.createLabel(parent, label);
+		final Text text = toolkit.createText(parent, "");
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.widthHint = 150;
+		text.setLayoutData(gd);
+		text.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				String s = text.getText();
+				// flag length
+				if (s.length() > 0 && s.length() <= 5) {
+					mmng.addMessage("textLength",
+							"Text is longer than 0 characters", null,
+							IMessageProvider.INFORMATION, text);
+				} else if (s.length() > 5 && s.length() <= 10) {
+					mmng.addMessage("textLength",
+							"Text is longer than 5 characters", null,
+							IMessageProvider.WARNING, text);
+				} else if (s.length() > 10) {
+					mmng.addMessage("textLength",
+							"Text is longer than 10 characters", null,
+							IMessageProvider.ERROR, text);
+				} else {
+					mmng.removeMessage("textLength", text);
+				}
+				// flag type
+				boolean badType = false;
+				for (int i = 0; i < s.length(); i++) {
+					if (!Character.isLetter(s.charAt(i))) {
+						badType = true;
+						break;
+					}
+				}
+				if (badType) {
+					mmng.addMessage("textType",
+							"Text must only contain letters", null,
+							IMessageProvider.ERROR, text);
+				} else {
+					mmng.removeMessage("textType", text);
+				}
+			}
+		});
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java
new file mode 100755
index 0000000..1fb63d9
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/FreeFormPage.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import java.io.*;
+import java.io.InputStream;
+
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.editor.*;
+import org.eclipse.ui.forms.events.*;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.*;
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class FreeFormPage extends FormPage {
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public FreeFormPage(FormEditor editor) {
+		super(editor, "first", "First Page");
+	}
+	public static final void createSharedFormContent(IManagedForm managedForm) {
+		ScrolledForm form = managedForm.getForm();
+		FormToolkit toolkit = managedForm.getToolkit();
+		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(HyperlinkSettings.UNDERLINE_HOVER);
+		form.setText("Free-form text with links");
+		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(ExamplesPlugin.IMG_FORM_BG));
+		TableWrapLayout layout = new TableWrapLayout();
+		layout.leftMargin = 10;
+		layout.rightMargin = 10;
+		form.getBody().setLayout(layout);
+		TableWrapData td;
+		Hyperlink link = toolkit.createHyperlink(form.getBody(),
+				"Sample hyperlink with longer text.", SWT.WRAP);
+		link.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				try {
+					Thread.sleep(1000);
+				} catch (InterruptedException ex) {
+				}
+			}
+		});
+		td = new TableWrapData();
+		td.align = TableWrapData.LEFT;
+		link.setLayoutData(td);
+		createExpandable(form, toolkit);
+		createFormTextSection(form, toolkit);
+	}
+	
+	protected void createFormContent(IManagedForm managedForm) {
+		createSharedFormContent(managedForm);
+	}
+	private static void createExpandable(final ScrolledForm form, final FormToolkit toolkit) {
+		final ExpandableComposite exp = toolkit.createExpandableComposite(form
+				.getBody(), ExpandableComposite.TREE_NODE
+		//	ExpandableComposite.NONE
+				);
+		exp.setActiveToggleColor(toolkit.getHyperlinkGroup()
+				.getActiveForeground());
+		exp.setToggleColor(toolkit.getColors().getColor(IFormColors.SEPARATOR));
+		Composite client = toolkit.createComposite(exp);
+		exp.setClient(client);
+		TableWrapLayout elayout = new TableWrapLayout();
+		client.setLayout(elayout);
+		elayout.leftMargin = elayout.rightMargin = 0;
+		final Button button = toolkit.createButton(client, "Button", SWT.PUSH);
+		button.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				//openFormWizard(button.getShell(), toolkit.getColors());
+			}
+		});
+		exp.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(true);
+			}
+		});
+		exp.setText("Expandable Section with a longer title");
+		TableWrapData td = new TableWrapData();
+		//td.colspan = 2;
+		td.align = TableWrapData.LEFT;
+		//td.align = TableWrapData.FILL;
+		exp.setLayoutData(td);
+	}
+	
+	private static void createFormTextSection(final ScrolledForm form, FormToolkit toolkit) {
+		Section section =
+			toolkit.createSection(
+				form.getBody(),
+				Section.TWISTIE | Section.DESCRIPTION);
+		section.setActiveToggleColor(
+			toolkit.getHyperlinkGroup().getActiveForeground());
+		section.setToggleColor(
+			toolkit.getColors().getColor(IFormColors.SEPARATOR));
+		toolkit.createCompositeSeparator(section);
+		FormText rtext = toolkit.createFormText(section, false);
+		section.setClient(rtext);
+		loadFormText(rtext, toolkit);
+
+		section.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(false);
+			}
+		});
+
+		section.setText("Section title");
+		section.setDescription(
+		"This is a section description that should be rendered below the separator.");
+		TableWrapData td = new TableWrapData();
+		td.align = TableWrapData.FILL;
+		td.grabHorizontal = true;
+		section.setLayoutData(td);
+	}
+
+	private static void loadFormText(final FormText rtext, FormToolkit toolkit) {
+		rtext.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				MessageDialog.openInformation(rtext.getShell(), "Eclipse Forms", 
+				"Link activated: href=" + e.getHref());
+			}
+		});
+		rtext.setHyperlinkSettings(toolkit.getHyperlinkGroup());
+		rtext.setImage("image1", ExamplesPlugin.getDefault().getImage(ExamplesPlugin.IMG_LARGE));
+		createCompositeControl(rtext, toolkit);
+		createControl(rtext, toolkit);
+		Menu menu = new Menu(rtext);
+		final MenuItem item = new MenuItem(menu, SWT.PUSH);
+		item.setText("&Copy");
+		item.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				rtext.copy();
+			}
+		});
+		//rtext.setMenu(menu);
+		item.setEnabled(false);
+		rtext.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				item.setEnabled(rtext.canCopy());
+			}
+		});
+		InputStream is = FreeFormPage.class.getResourceAsStream("index.xml");
+		if (is!=null) {
+			rtext.setContents(is, true);
+			try {
+				is.close();
+			}
+			catch (IOException e) {
+			}
+		}
+	}
+	private static void createControl(FormText ftext, FormToolkit toolkit) {
+		TreeNode node = new TreeNode(ftext, SWT.NULL);
+		toolkit.adapt(node, true, true);
+		ftext.setControl("node", node);
+	}
+	private static void createCompositeControl(FormText ftext, FormToolkit toolkit) {
+		Composite comp = toolkit.createComposite(ftext);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 3;
+		comp.setLayout(layout);
+		toolkit.createLabel(comp, "Sample text:");
+		Text text = toolkit.createText(comp, "");
+		text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		toolkit.createButton(comp, "Browse...", SWT.PUSH);
+		ftext.setControl("control1", comp);
+		toolkit.paintBordersFor(comp);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java
new file mode 100755
index 0000000..20814f1
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/HeadlessPage.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+
+public class HeadlessPage extends FormPage {
+	private int count;
+
+	public HeadlessPage(FormEditor editor, int count) {
+		super(editor, "page"+count, "Page "+count);
+		this.count = count;
+	}
+	
+	protected void createFormContent(IManagedForm managedForm) {
+		FormToolkit toolkit = managedForm.getToolkit();
+		Composite body = managedForm.getForm().getBody();
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 4;
+		body.setLayout(layout);
+		Label label = toolkit.createLabel(body, "The content of the headless page #"+count);
+		GridData gd = new GridData();
+		gd.horizontalSpan = 4;
+		label.setLayoutData(gd);
+		for (int i=0; i<80; i++) {
+			toolkit.createLabel(body, "Field "+i);
+			Text text = toolkit.createText(body, null);
+			gd = new GridData(GridData.FILL_HORIZONTAL);
+			text.setLayoutData(gd);
+		}
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java
new file mode 100755
index 0000000..8b432f4
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/IModelListener.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+/**
+ * @author dejan
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public interface IModelListener {
+	String ADDED="__added";
+	String REMOVED="__removed";
+	String CHANGED = "__changed";
+	void modelChanged(Object[] objects, String type, String property);
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java
new file mode 100755
index 0000000..d62aa84
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NamedObject.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+/**
+ *
+ */
+public	class NamedObject {
+	private String name;
+	protected SimpleModel model;
+	
+	public NamedObject(String name) {
+		this.name = name;
+	}
+	public void setModel(SimpleModel model) {
+		this.model = model;
+	}
+	public String getName() {
+		return name;
+	}
+	public String toString() {
+		return getName();
+	}
+	public void setName(String name) {
+		this.name = name;
+		model.fireModelChanged(new Object [] {this}, IModelListener.CHANGED, "");
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java
new file mode 100755
index 0000000..c2edd4d
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/NewStylePage.java
@@ -0,0 +1,581 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2008 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.dnd.DND;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.DragSourceListener;
+import org.eclipse.swt.dnd.DropTargetAdapter;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.FormColors;
+import org.eclipse.ui.forms.HyperlinkSettings;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.IMessageManager;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.events.IHyperlinkListener;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class NewStylePage extends FormPage {
+	private static final String SHORT_TITLE = "Short Title";
+	private static final String LONG_TITLE = "This title is somewhat longer";
+	private static final String SHORT_MESSAGE = "A short {0} message";
+	private static final String LONG_MESSAGE = "This {0} message is longer and will also compete with other header regions";
+	private static final String[] MESSAGE_NAMES = { "text", "info", "warning",
+			"error" };
+	
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public NewStylePage(FormEditor editor) {
+		super(editor, "newStyle", "New Style");
+	}
+
+	protected void createFormContent(IManagedForm managedForm) {
+		final ScrolledForm form = managedForm.getForm();
+		final FormToolkit toolkit = managedForm.getToolkit();
+		toolkit.getHyperlinkGroup().setHyperlinkUnderlineMode(
+				HyperlinkSettings.UNDERLINE_HOVER);
+
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 10;
+		layout.marginWidth = 6;
+		layout.horizontalSpacing = 20;
+		form.getBody().setLayout(layout);
+
+		Section section = toolkit.createSection(form.getBody(),
+				ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE
+						| ExpandableComposite.EXPANDED);
+		Composite client = toolkit.createComposite(section);
+		section.setClient(client);
+		section.setText("Header features");
+		section
+				.setDescription("Use the switches below to control basic heading parameters.");
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		section.setLayoutData(gd);
+		layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		client.setLayout(layout);
+		final Button tbutton = toolkit.createButton(client, "Add title",
+				SWT.CHECK);
+		final Button sbutton = toolkit.createButton(client, "Short title",
+				SWT.RADIO);
+		sbutton.setSelection(true);
+		sbutton.setEnabled(false);
+		gd = new GridData();
+		gd.horizontalIndent = 10;
+		sbutton.setLayoutData(gd);
+		final Button lbutton = toolkit.createButton(client, "Long title",
+				SWT.RADIO);
+		gd = new GridData();
+		gd.horizontalIndent = 10;
+		lbutton.setLayoutData(gd);
+		lbutton.setEnabled(false);
+		tbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateTitle(form, tbutton.getSelection(), sbutton
+						.getSelection());
+				sbutton.setEnabled(tbutton.getSelection());
+				lbutton.setEnabled(tbutton.getSelection());
+			}
+		});
+		sbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateTitle(form, tbutton.getSelection(), sbutton
+						.getSelection());
+			}
+		});
+		lbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateTitle(form, tbutton.getSelection(), sbutton
+						.getSelection());
+			}
+		});
+		final Button ibutton = toolkit.createButton(client, "Add image",
+				SWT.CHECK);
+		ibutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateImage(form, ibutton.getSelection());
+			}
+		});
+
+		final Button tbbutton = toolkit.createButton(client, "Add tool bar",
+				SWT.CHECK);
+		
+		final Button albutton = toolkit.createButton(client, "Set tool bar allignment to SWT.BOTTOM",
+				SWT.CHECK);
+		albutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.getForm().setToolBarVerticalAlignment(albutton.getSelection()?SWT.BOTTOM:SWT.TOP);
+				form.reflow(true);
+			}
+		});
+		gd = new GridData();
+		gd.horizontalIndent = 10;
+		albutton.setLayoutData(gd);
+		albutton.setEnabled(false);
+		tbbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				addToolBar(toolkit, form, tbbutton.getSelection());
+				albutton.setEnabled(tbbutton.getSelection());
+			}
+		});
+
+		final Button gbutton = toolkit.createButton(client,
+				"Paint background gradient", SWT.CHECK);
+		gbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				addHeadingGradient(toolkit, form, gbutton.getSelection());
+			}
+		});
+
+		final Button clbutton = toolkit.createButton(client, "Add head client",
+				SWT.CHECK);
+		clbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				addHeadClient(toolkit, form, clbutton.getSelection());
+			}
+		});
+
+		final Button mbutton = toolkit.createButton(client,
+				"Add drop-down menu", SWT.CHECK);
+		mbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				addMenu(toolkit, form, mbutton.getSelection());
+			}
+		});
+
+		final Button dbutton = toolkit.createButton(client, "Add drag support",
+				SWT.CHECK);
+		dbutton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (dbutton.getSelection()) {
+					addDragSupport(form);
+					dbutton.setEnabled(false);
+				}
+			}
+		});
+
+		section = toolkit.createSection(form.getBody(),
+				ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE
+						| ExpandableComposite.EXPANDED);
+		Composite client2 = toolkit.createComposite(section);
+		section.setClient(client2);
+		section.setText("Messages and active state");
+		section
+				.setDescription("Use the buttons below to control messages and active state.");
+		gd = new GridData(GridData.FILL_BOTH);
+		section.setLayoutData(gd);
+
+		layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		layout.numColumns = 4;
+		client2.setLayout(layout);
+
+		final Button shortMessage = toolkit.createButton(client2,
+				"Short message", SWT.RADIO);
+		shortMessage.setSelection(true);
+		gd = new GridData();
+		gd.horizontalSpan = 4;
+		shortMessage.setLayoutData(gd);
+		final Button longMessage = toolkit.createButton(client2, "Long message",
+				SWT.RADIO);
+		gd = new GridData();
+		gd.horizontalSpan = 4;
+		longMessage.setLayoutData(gd);
+
+		final IHyperlinkListener listener = new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				String title = e.getLabel();
+				String details = (String)e.getHref();
+				if (details==null) {
+					details = title;
+					title = null;
+				}
+				switch (form.getForm().getMessageType()) {
+				case IMessageProvider.NONE:
+				case IMessageProvider.INFORMATION:
+					if (title==null)
+						title = "Forms Information";
+					MessageDialog.openInformation(form.getShell(), title, details);
+					break;
+				case IMessageProvider.WARNING:
+					if (title==null)
+						title = "Forms Warning";
+					MessageDialog.openWarning(form.getShell(), title, details);
+					break;
+				case IMessageProvider.ERROR:
+					if (title==null)
+						title = "Forms Error";
+					MessageDialog.openError(form.getShell(), title, details);
+					break;
+				}
+			}
+		};
+
+		final Button hyperMessage = toolkit.createButton(client2,
+				"Message as hyperlink", SWT.CHECK);
+		gd = new GridData();
+		gd.horizontalSpan = 4;
+		hyperMessage.setLayoutData(gd);
+		hyperMessage.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (hyperMessage.getSelection())
+					form.getForm().addMessageHyperlinkListener(listener);
+				else
+					form.getForm().removeMessageHyperlinkListener(listener);
+			}
+		});
+		
+		Control[] children = client.getChildren();
+		ArrayList buttons = new ArrayList();
+		for (int i = 0; i < children.length; i++) {
+			if (children[i] instanceof Button) {
+				Button button = (Button) children[i];
+				if ((button.getStyle() & SWT.CHECK) != 0 && !button.equals(dbutton)) {
+					buttons.add(button);
+				}
+			}
+		}
+		final Button[] checkboxes = (Button[]) buttons.toArray(new Button[buttons.size()]);
+		
+		final Button manageMessage = toolkit.createButton(client2,
+				"Use message manager", SWT.CHECK);
+		gd = new GridData();
+		gd.horizontalSpan = 4;
+		manageMessage.setLayoutData(gd);
+		
+		SelectionAdapter mmListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (manageMessage.getSelection() && e.widget instanceof Button)
+					addRemoveMessage((Button) e.widget, form.getMessageManager());
+			}
+		};
+		for (int i = 0; i < checkboxes.length; i++)
+			checkboxes[i].addSelectionListener(mmListener);
+
+		final Button autoUpdate = toolkit.createButton(client2,
+				"Auto update message manager", SWT.CHECK);
+		gd = new GridData();
+		gd.horizontalSpan = 4;
+		autoUpdate.setLayoutData(gd);
+		autoUpdate.setSelection(true);
+		autoUpdate.setEnabled(false);
+		autoUpdate.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.getMessageManager().setAutoUpdate(autoUpdate.getSelection());
+			}
+		});
+		
+		shortMessage.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(getErrorMessage(form.getMessageType(),
+						longMessage.getSelection()), form.getMessageType());
+			}
+		});
+		longMessage.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(getErrorMessage(form.getMessageType(),
+						longMessage.getSelection()), form.getMessageType());
+			}
+		});
+
+		final Button error = toolkit.createButton(client2, "Error", SWT.PUSH);
+		error.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(getErrorMessage(IMessageProvider.ERROR,
+						longMessage.getSelection()), IMessageProvider.ERROR);
+
+			}
+		});
+		final Button warning = toolkit.createButton(client2, "Warning", SWT.PUSH);
+		warning.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(getErrorMessage(IMessageProvider.WARNING,
+						longMessage.getSelection()), IMessageProvider.WARNING);
+			}
+		});
+		final Button info = toolkit.createButton(client2, "Info", SWT.PUSH);
+		info.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(getErrorMessage(IMessageProvider.INFORMATION,
+						longMessage.getSelection()),
+						IMessageProvider.INFORMATION);
+			}
+		});
+		final Button cancel = toolkit.createButton(client2, "Cancel", SWT.PUSH);
+		cancel.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				form.setMessage(null, 0);
+			}
+		});
+		manageMessage.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				boolean selection = manageMessage.getSelection();
+				if (!selection)
+					autoUpdate.setSelection(true);
+				autoUpdate.setEnabled(selection);
+				IMessageManager mm = form.getMessageManager();
+				mm.setAutoUpdate(false);
+				if (selection) {
+					for (int i = 0; i < checkboxes.length; i++) {
+						addRemoveMessage(checkboxes[i], mm);
+					}
+				}
+				else {
+					mm.removeAllMessages();
+				}
+				mm.setAutoUpdate(true);
+				error.setEnabled(!selection);
+				warning.setEnabled(!selection);
+				info.setEnabled(!selection);
+				cancel.setEnabled(!selection);
+				if (selection) {
+					hyperMessage.setSelection(false);
+					form.getForm().removeMessageHyperlinkListener(listener);
+				}
+				hyperMessage.setEnabled(!selection);
+			}
+		});
+
+		final Button busy = toolkit.createButton(client2, "Start Progress",
+				SWT.PUSH);
+		busy.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				// IWorkbenchSiteProgressService service =
+				// (IWorkbenchSiteProgressService)getSite().getAdapter(IWorkbenchSiteProgressService.class);
+
+				if (form.getForm().isBusy()) {
+					form.getForm().setBusy(false);
+					busy.setText("Start Progress");
+				} else {
+					form.getForm().setBusy(true);
+					busy.setText("Stop Progress");
+				}
+			}
+		});
+		gd = new GridData();
+		gd.horizontalSpan = 2;
+		busy.setLayoutData(gd);
+	}
+
+	private void addHeadingGradient(FormToolkit toolkit, ScrolledForm form,
+			boolean add) {
+		FormColors colors = toolkit.getColors();
+		Color top = colors.getColor(IFormColors.H_GRADIENT_END);
+		Color bot = colors.getColor(IFormColors.H_GRADIENT_START);
+		if (add)
+			form.getForm().setTextBackground(new Color[] { top, bot },
+					new int[] { 100 }, true);
+		else {
+			form.getForm().setTextBackground(null, null, false);
+			form.getForm().setBackground(colors.getBackground());
+		}
+		form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE1,
+				add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE1) : null);
+		form.getForm().setHeadColor(IFormColors.H_BOTTOM_KEYLINE2,
+				add ? colors.getColor(IFormColors.H_BOTTOM_KEYLINE2) : null);
+		form.getForm().setHeadColor(IFormColors.H_HOVER_LIGHT,
+				add ? colors.getColor(IFormColors.H_HOVER_LIGHT) : null);
+		form.getForm().setHeadColor(IFormColors.H_HOVER_FULL,
+				add ? colors.getColor(IFormColors.H_HOVER_FULL) : null);
+		form.getForm().setHeadColor(IFormColors.TB_TOGGLE,
+				add ? colors.getColor(IFormColors.TB_TOGGLE) : null);
+		form.getForm().setHeadColor(IFormColors.TB_TOGGLE_HOVER,
+				add ? colors.getColor(IFormColors.TB_TOGGLE_HOVER) : null);
+		form.getForm().setSeparatorVisible(add);
+		form.reflow(true);
+		form.redraw();
+	}
+
+	private String getErrorMessage(int type, boolean longMessage) {
+		String name = MESSAGE_NAMES[type];
+		if (longMessage)
+			return MessageFormat.format(LONG_MESSAGE, new Object[] { name });
+		else
+			return MessageFormat.format(SHORT_MESSAGE, new Object[] { name });
+	}
+
+	private void updateTitle(ScrolledForm form, boolean addTitle,
+			boolean shortTitle) {
+		if (addTitle) {
+			String text = shortTitle ? SHORT_TITLE : LONG_TITLE;
+			form.setText(text);
+		} else {
+			form.setText(null);
+		}
+	}
+
+	private void updateImage(ScrolledForm form, boolean addImage) {
+		if (addImage)
+			form.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
+					ISharedImages.IMG_DEF_VIEW));
+		else
+			form.setImage(null);
+	}
+	
+	private void addRemoveMessage(Button button, IMessageManager mm) {
+		if (button.getSelection())
+			mm.addMessage(button, button.getText() + " is checked.", null, IMessageProvider.INFORMATION, button);
+		else
+			mm.removeMessage(button, button);
+	}
+
+	private void addToolBar(FormToolkit toolkit, ScrolledForm form, boolean add) {
+		if (add) {
+			Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
+				public void run() {
+				}
+			};
+			haction.setChecked(true);
+			haction.setToolTipText("Horizontal orientation");
+			haction.setImageDescriptor(ExamplesPlugin.getDefault()
+					.getImageRegistry().getDescriptor(
+							ExamplesPlugin.IMG_HORIZONTAL));
+			Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
+				public void run() {
+				}
+			};
+			vaction.setChecked(false);
+			vaction.setToolTipText("Vertical orientation");
+			vaction.setImageDescriptor(ExamplesPlugin.getDefault()
+					.getImageRegistry().getDescriptor(
+							ExamplesPlugin.IMG_VERTICAL));
+			ControlContribution save = new ControlContribution("save") {
+				protected Control createControl(Composite parent) {
+					Button saveButton = new Button(parent, SWT.PUSH);
+					saveButton.setText("Save");
+					return saveButton;
+				}
+			};
+			form.getToolBarManager().add(haction);
+			form.getToolBarManager().add(vaction);
+			form.getToolBarManager().add(save);
+			form.getToolBarManager().update(true);
+		} else {
+			form.getToolBarManager().removeAll();
+		}
+		form.reflow(true);
+	}
+
+	private void addMenu(FormToolkit toolkit, ScrolledForm form, boolean add) {
+		if (add) {
+			Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
+				public void run() {
+				}
+			};
+			haction.setChecked(true);
+			haction.setText("Horizontal");
+			haction.setToolTipText("Horizontal orientation");
+			haction.setImageDescriptor(ExamplesPlugin.getDefault()
+					.getImageRegistry().getDescriptor(
+							ExamplesPlugin.IMG_HORIZONTAL));
+			Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
+				public void run() {
+				}
+			};
+			vaction.setChecked(false);
+			vaction.setText("Vertical");
+			vaction.setToolTipText("Vertical orientation");
+			vaction.setImageDescriptor(ExamplesPlugin.getDefault()
+					.getImageRegistry().getDescriptor(
+							ExamplesPlugin.IMG_VERTICAL));
+			form.getForm().getMenuManager().add(haction);
+			form.getForm().getMenuManager().add(vaction);
+		} else {
+			form.getForm().getMenuManager().removeAll();
+		}
+		form.reflow(true);
+	}
+
+	private void addHeadClient(FormToolkit toolkit, ScrolledForm form,
+			boolean add) {
+		if (add) {
+			Composite headClient = new Composite(form.getForm().getHead(),
+					SWT.NULL);
+			GridLayout glayout = new GridLayout();
+			glayout.marginWidth = glayout.marginHeight = 0;
+			glayout.numColumns = 3;
+			headClient.setLayout(glayout);
+			Text t = new Text(headClient, toolkit.getBorderStyle());
+			t.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			new Combo(headClient, SWT.NULL);
+			new Combo(headClient, SWT.NULL);
+			toolkit.paintBordersFor(headClient);
+			form.setHeadClient(headClient);
+		} else {
+			Control client = form.getForm().getHeadClient();
+			if (client != null) {
+				client.dispose();
+				form.setHeadClient(null);
+			}
+		}
+	}
+
+	private void addDragSupport(final ScrolledForm form) {
+		int operations = DND.DROP_MOVE | DND.DROP_COPY | DND.DROP_LINK;
+		Transfer[] transferTypes = { TextTransfer.getInstance() };
+		form.getForm().addTitleDragSupport(operations, transferTypes,
+				new DragSourceListener() {
+					public void dragFinished(DragSourceEvent event) {
+					}
+
+					public void dragSetData(DragSourceEvent event) {
+						event.data = form.getForm().getText();
+					}
+
+					public void dragStart(DragSourceEvent event) {
+						event.doit = true;
+					}
+				});
+		form.getForm().addTitleDropSupport(operations, transferTypes,
+				new DropTargetAdapter() {
+				});
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java
new file mode 100755
index 0000000..91af481
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSimpleFormEditorAction.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.forms.examples.internal.OpenFormEditorAction;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class OpenSimpleFormEditorAction extends OpenFormEditorAction {
+	
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+		return openEditor(new SimpleFormEditorInput("Simple Editor"), "org.eclipse.ui.forms.examples.base-editor", window);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java
new file mode 100755
index 0000000..27d3c8b
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/OpenSingleHeaderEditorAction.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.forms.examples.internal.OpenFormEditorAction;
+import org.eclipse.ui.handlers.HandlerUtil;
+
+public class OpenSingleHeaderEditorAction extends OpenFormEditorAction {
+	
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
+		return openEditor(new SimpleFormEditorInput("Single Header Editor"),
+				"org.eclipse.ui.forms.examples.single-header-editor", window);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java
new file mode 100755
index 0000000..7aa310b
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/PageWithSubPages.java
@@ -0,0 +1,102 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.*;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.editor.*;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.*;
+/**
+ *
+ */
+public class PageWithSubPages extends FormPage {
+	private CTabFolder tabFolder;
+	private Text text;
+	
+	class TextSection {
+		String text;
+		public TextSection(String text) {this.text = text;}
+	}
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public PageWithSubPages(FormEditor editor) {
+		super(editor, "composite", "Composite Page");
+	}
+	protected void createFormContent(IManagedForm managedForm) {
+		ScrolledForm form = managedForm.getForm();
+		FormToolkit toolkit = managedForm.getToolkit();
+		form.setText("Form with subpages");
+		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
+				ExamplesPlugin.IMG_FORM_BG));
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 10;
+		form.getBody().setLayout(layout);
+		tabFolder = new CTabFolder(form.getBody(), SWT.FLAT|SWT.TOP);
+		toolkit.adapt(tabFolder, true, true);
+		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.heightHint = 0;
+		tabFolder.setLayoutData(gd);
+		Color selectedColor = toolkit.getColors().getColor(IFormColors.SEPARATOR);
+		tabFolder.setSelectionBackground(new Color[] {selectedColor, toolkit.getColors().getBackground()}, new int[] {50});
+		//tabFolder.setCursor(FormsResources.getHandCursor());
+
+		toolkit.paintBordersFor(tabFolder);
+		createTabs(toolkit);
+		createText(toolkit, form.getBody());
+		tabFolder.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateSelection();
+			}
+		});
+		tabFolder.setSelection(0);
+		updateSelection();		
+	}
+	private void createTabs(FormToolkit toolkit) {
+		createTab(toolkit, "Copyright", "Copyright 2004 IBM and others.");
+		createTab(toolkit, "License Agreement", "LICENSE AGREEMENT\n\nUse this feature any way you want.");
+		createTab(toolkit, "Description", "A simple description of the feature");
+	}
+	private void createText(FormToolkit toolkit, Composite parent) {
+		Composite tabContent = toolkit.createComposite(parent);
+		tabContent.setLayoutData(new GridData(GridData.FILL_BOTH));
+		GridLayout layout = new GridLayout();
+		tabContent.setLayout(layout);
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		GridData gd;
+		text = toolkit.createText(tabContent, "", SWT.MULTI|SWT.WRAP);
+		gd = new GridData(GridData.FILL_BOTH);
+		gd.verticalSpan = 2;
+		text.setLayoutData(gd);
+		Button apply = toolkit.createButton(tabContent, "Apply", SWT.PUSH);
+		apply.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_BEGINNING));
+		Button reset = toolkit.createButton(tabContent, "Reset", SWT.PUSH);
+		reset.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL|GridData.VERTICAL_ALIGN_BEGINNING));
+	}
+	private void updateSelection() {
+		CTabItem item = tabFolder.getSelection();
+		TextSection section = (TextSection)item.getData();
+		text.setText(section.text);
+	}
+	private void createTab(FormToolkit toolkit, String title, String content) {
+		CTabItem item = new CTabItem(tabFolder, SWT.NULL);
+		TextSection section = new TextSection(content);
+		item.setText(title);
+		item.setData(section);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java
new file mode 100755
index 0000000..f25a613
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesBlock.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.*;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.*;
+/**
+ *
+ */
+public class ScrolledPropertiesBlock extends MasterDetailsBlock {
+	private FormPage page;
+	public ScrolledPropertiesBlock(FormPage page) {
+		this.page = page;
+	}
+	/**
+	 * @param id
+	 * @param title
+	 */
+	class MasterContentProvider implements IStructuredContentProvider {
+		public Object[] getElements(Object inputElement) {
+			if (inputElement instanceof SimpleFormEditorInput) {
+				SimpleFormEditorInput input = (SimpleFormEditorInput) page
+						.getEditor().getEditorInput();
+				return input.getModel().getContents();
+			}
+			return new Object[0];
+		}
+		public void dispose() {
+		}
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+	}
+	class MasterLabelProvider extends LabelProvider
+			implements
+				ITableLabelProvider {
+		public String getColumnText(Object obj, int index) {
+			return obj.toString();
+		}
+		public Image getColumnImage(Object obj, int index) {
+			if (obj instanceof TypeOne) {
+				return PlatformUI.getWorkbench().getSharedImages().getImage(
+						ISharedImages.IMG_OBJ_ELEMENT);
+			}
+			if (obj instanceof TypeTwo) {
+				return PlatformUI.getWorkbench().getSharedImages().getImage(
+						ISharedImages.IMG_OBJ_FILE);
+			}
+			return null;
+		}
+	}
+	protected void createMasterPart(final IManagedForm managedForm,
+			Composite parent) {
+		//final ScrolledForm form = managedForm.getForm();
+		FormToolkit toolkit = managedForm.getToolkit();
+		Section section = toolkit.createSection(parent, Section.DESCRIPTION);
+		section.setText("Model Objects");
+		section
+				.setDescription("The list contains objects from the model whose details are editable on the right");
+		section.marginWidth = 10;
+		section.marginHeight = 5;
+		toolkit.createCompositeSeparator(section);
+		Composite client = toolkit.createComposite(section, SWT.WRAP);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 2;
+		layout.marginHeight = 2;
+		client.setLayout(layout);
+		Table t = toolkit.createTable(client, SWT.NULL);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 20;
+		gd.widthHint = 100;
+		t.setLayoutData(gd);
+		toolkit.paintBordersFor(client);
+		Button b = toolkit.createButton(client, "Add...", SWT.PUSH);
+		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+		b.setLayoutData(gd);
+		section.setClient(client);
+		final SectionPart spart = new SectionPart(section);
+		managedForm.addPart(spart);
+		TableViewer viewer = new TableViewer(t);
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				managedForm.fireSelectionChanged(spart, event.getSelection());
+			}
+		});
+		viewer.setContentProvider(new MasterContentProvider());
+		viewer.setLabelProvider(new MasterLabelProvider());
+		viewer.setInput(page.getEditor().getEditorInput());
+	}
+	protected void createToolBarActions(IManagedForm managedForm) {
+		final ScrolledForm form = managedForm.getForm();
+		Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
+			public void run() {
+				sashForm.setOrientation(SWT.HORIZONTAL);
+				form.reflow(true);
+			}
+		};
+		haction.setChecked(true);
+		haction.setToolTipText("Horizontal orientation");
+		haction.setImageDescriptor(ExamplesPlugin.getDefault()
+				.getImageRegistry()
+				.getDescriptor(ExamplesPlugin.IMG_HORIZONTAL));
+		Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
+			public void run() {
+				sashForm.setOrientation(SWT.VERTICAL);
+				form.reflow(true);
+			}
+		};
+		vaction.setChecked(false);
+		vaction.setToolTipText("Vertical orientation");
+		vaction.setImageDescriptor(ExamplesPlugin.getDefault()
+				.getImageRegistry().getDescriptor(ExamplesPlugin.IMG_VERTICAL));
+		form.getToolBarManager().add(haction);
+		form.getToolBarManager().add(vaction);
+	}
+	protected void registerPages(DetailsPart detailsPart) {
+		detailsPart.registerPage(TypeOne.class, new TypeOneDetailsPage());
+		detailsPart.registerPage(TypeTwo.class, new TypeTwoDetailsPage());
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java
new file mode 100755
index 0000000..e8f0239
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ScrolledPropertiesPage.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.*;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.*;
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class ScrolledPropertiesPage extends FormPage {
+	private ScrolledPropertiesBlock block;
+	public ScrolledPropertiesPage(FormEditor editor) {
+		super(editor, "fourth", "Master Details");
+		block = new ScrolledPropertiesBlock(this);
+	}
+	protected void createFormContent(final IManagedForm managedForm) {
+		final ScrolledForm form = managedForm.getForm();
+		//FormToolkit toolkit = managedForm.getToolkit();
+		form.setText("Form with scrolled sections");
+		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
+				ExamplesPlugin.IMG_FORM_BG));
+		block.createContent(managedForm);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java
new file mode 100755
index 0000000..199bcfb
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SecondPage.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.editor.*;
+import org.eclipse.ui.forms.events.*;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.*;
+
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class SecondPage extends FormPage {
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public SecondPage(FormEditor editor) {
+		super(editor, "second", "Section Page");
+	}
+
+	protected void createFormContent(IManagedForm managedForm) {
+		ScrolledForm form = managedForm.getForm();
+		FormToolkit toolkit = managedForm.getToolkit();
+		form.setText("Title for the second page");
+		form.setBackgroundImage(ExamplesPlugin.getDefault().getImage(
+				ExamplesPlugin.IMG_FORM_BG));
+		GridLayout layout = new GridLayout();
+		layout.makeColumnsEqualWidth = true;
+		layout.numColumns = 2;
+		form.getBody().setLayout(layout);
+		//This call is needed because the section will compute
+		// the bold version based on the parent.
+		Dialog.applyDialogFont(form.getBody());
+		Section s1 = createTableSection(form, toolkit, "First Table Section", true);
+		Section s2 = createTableSection(form, toolkit, "Second Table Section", false);
+		// This call is needed for all the children
+		Dialog.applyDialogFont(form.getBody());
+		s2.descriptionVerticalSpacing = s1.getTextClientHeightDifference();
+		form.reflow(true);
+	}
+
+	private Section createTableSection(final ScrolledForm form,
+			FormToolkit toolkit, String title, boolean addTextClient) {
+		Section section = toolkit.createSection(form.getBody(), Section.TWISTIE
+				| Section.TITLE_BAR);
+		section.setActiveToggleColor(toolkit.getHyperlinkGroup()
+				.getActiveForeground());
+		section.setToggleColor(toolkit.getColors().getColor(
+				IFormColors.SEPARATOR));
+		if (addTextClient) {
+			ToolBar tbar = new ToolBar(section, SWT.FLAT | SWT.HORIZONTAL);
+			ToolItem titem = new ToolItem(tbar, SWT.NULL);
+			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
+					.getImage(ISharedImages.IMG_TOOL_CUT));
+			titem = new ToolItem(tbar, SWT.PUSH);
+			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
+					.getImage(ISharedImages.IMG_TOOL_COPY));
+			titem = new ToolItem(tbar, SWT.SEPARATOR);
+			titem = new ToolItem(tbar, SWT.PUSH);
+			titem.setImage(PlatformUI.getWorkbench().getSharedImages()
+					.getImage(ISharedImages.IMG_TOOL_DELETE));
+			section.setTextClient(tbar);
+		}
+		FormText description = toolkit.createFormText(section, false);
+		description
+				.setText(
+						"<form><p>This description uses FormText widget and as a result can have <b>bold</b> text.</p></form>",
+						true, false);
+		section.setDescriptionControl(description);
+
+		Composite client = toolkit.createComposite(section, SWT.WRAP);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+
+		client.setLayout(layout);
+		Table t = toolkit.createTable(client, SWT.NULL);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 200;
+		gd.widthHint = 100;
+		t.setLayoutData(gd);
+		toolkit.paintBordersFor(client);
+		Button b = toolkit.createButton(client, "Add...", SWT.PUSH);
+		gd = new GridData(GridData.VERTICAL_ALIGN_BEGINNING);
+		b.setLayoutData(gd);
+		section.setText(title);
+		section
+				.setDescription("<form><p>This section has a <b>tree</b> and a button. It also has <a>a link</a> in the description.</p></form>");
+		section.setClient(client);
+		section.setExpanded(true);
+		section.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(false);
+			}
+		});
+		gd = new GridData(GridData.FILL_BOTH);
+		section.setLayoutData(gd);
+		return section;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java
new file mode 100755
index 0000000..94c95e7
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditor.java
@@ -0,0 +1,84 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.forms.editor.FormEditor;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+/**
+ * A simple multi-page form editor that uses Eclipse Forms support.
+ * Example plug-in is configured to create one instance of
+ * form colors that is shared between multiple editor instances.
+ */
+public class SimpleFormEditor extends FormEditor {
+	/**
+	 *  
+	 */
+	public SimpleFormEditor() {
+	}
+	/*
+	 *  (non-Javadoc)
+	 * @see org.eclipse.ui.forms.editor.FormEditor#createToolkit(org.eclipse.swt.widgets.Display)
+	 */
+	protected FormToolkit createToolkit(Display display) {
+		// Create a toolkit that shares colors between editors.
+		return new FormToolkit(ExamplesPlugin.getDefault().getFormColors(
+				display));
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+	 */
+	protected void addPages() {
+		try {
+		addPage(new NewStylePage(this));
+		addPage(new ErrorMessagesPage(this));
+		addPage(new FreeFormPage(this));
+		addPage(new SecondPage(this));
+		int index = addPage(new Composite(getContainer(), SWT.NULL));
+		setPageText(index, "Composite");
+		addPage(new ThirdPage(this));
+		addPage(new ScrolledPropertiesPage(this));
+		addPage(new PageWithSubPages(this));
+		}
+		catch (PartInitException e) {
+			//
+		}
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void doSave(IProgressMonitor monitor) {
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
+	 */
+	public void doSaveAs() {
+	}
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
+	 */
+	public boolean isSaveAsAllowed() {
+		return false;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java
new file mode 100755
index 0000000..b2fd6af
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleFormEditorInput.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import org.eclipse.ui.forms.examples.internal.FormEditorInput;
+
+public class SimpleFormEditorInput extends FormEditorInput {
+	private SimpleModel model;
+	
+	public SimpleFormEditorInput(String name) {
+		super(name);
+		model = new SimpleModel();
+	}
+	
+	public SimpleModel getModel() {
+		return model;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java
new file mode 100755
index 0000000..ba1ceab
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SimpleModel.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import java.util.ArrayList;
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class SimpleModel {
+	private ArrayList modelListeners;
+	private ArrayList objects;
+	public SimpleModel() {
+		modelListeners = new ArrayList();
+		initialize();
+	}
+	public void addModelListener(IModelListener listener) {
+		if (!modelListeners.contains(listener))
+			modelListeners.add(listener);
+	}
+	public void removeModelListener(IModelListener listener) {
+		modelListeners.remove(listener);
+	}
+	public void fireModelChanged(Object[] objects, String type, String property) {
+		for (int i = 0; i < modelListeners.size(); i++) {
+			((IModelListener) modelListeners.get(i)).modelChanged(objects,
+					type, property);
+		}
+	}
+	public Object[] getContents() {
+		return objects.toArray();
+	}
+	private void initialize() {
+		objects = new ArrayList();
+		NamedObject[] objects = {
+				new TypeOne("TypeOne instance 1", 2, true, "Some text"),
+				new TypeOne("TypeOne instance 2", 1, false, "Different text"),
+				new TypeOne("TypeOne instance 3", 3, true, "Text"),
+				new TypeOne("TypeOne instance 4", 0, false, "Longer text"),
+				new TypeOne("TypeOne instance 5", 1, true, "Sample"),
+				new TypeTwo("TypeTwo instance 1", false, true),
+				new TypeTwo("TypeTwo instance 2", true, false)};
+		add(objects, false);
+	}
+	public void add(NamedObject[] objs, boolean notify) {
+		for (int i = 0; i < objs.length; i++) {
+			objects.add(objs[i]);
+			objs[i].setModel(this);
+		}
+		if (notify)
+			fireModelChanged(objs, IModelListener.ADDED, "");
+	}
+	public void remove(NamedObject[] objs, boolean notify) {
+		for (int i = 0; i < objs.length; i++) {
+			objects.remove(objs[i]);
+			objs[i].setModel(null);
+		}
+		if (notify)
+			fireModelChanged(objs, IModelListener.REMOVED, "");
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java
new file mode 100755
index 0000000..7245743
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/SingleHeaderEditor.java
@@ -0,0 +1,137 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ControlContribution;
+import org.eclipse.swt.SWT;
+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.ui.ISharedImages;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.SharedHeaderFormEditor;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.Form;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+/**
+ * A form editor that has several pages but only one stable header.
+ */
+public class SingleHeaderEditor extends SharedHeaderFormEditor {
+	/**
+	 * 
+	 */
+	public SingleHeaderEditor() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.forms.editor.FormEditor#createToolkit(org.eclipse.swt.widgets.Display)
+	 */
+	protected FormToolkit createToolkit(Display display) {
+		// Create a toolkit that shares colors between editors.
+		return new FormToolkit(ExamplesPlugin.getDefault().getFormColors(
+				display));
+	}
+
+	protected void createHeaderContents(IManagedForm headerForm) {
+		final ScrolledForm sform = headerForm.getForm();
+		//sform.setText("Shared header for all the pages");
+		getToolkit().decorateFormHeading(sform.getForm());
+		addToolBar(sform.getForm());
+		sform.setImage(PlatformUI.getWorkbench().getSharedImages().getImage(
+				ISharedImages.IMG_OBJ_FILE));
+		headerForm.getForm().getDisplay().timerExec(5000, new Runnable() {
+			public void run() {
+				sform.setText("<Another text>");
+			}
+		});
+		//sform.setMessage("Static text", 0);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.forms.editor.FormEditor#addPages()
+	 */
+	protected void addPages() {
+		try {
+			addPage(new HeadlessPage(this, 1));
+			addPage(new HeadlessPage(this, 2));
+			addPage(new HeadlessPage(this, 3));
+		} catch (PartInitException e) {
+			//
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSave(org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public void doSave(IProgressMonitor monitor) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#doSaveAs()
+	 */
+	public void doSaveAs() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
+	 */
+	public boolean isSaveAsAllowed() {
+		return false;
+	}
+
+	private void addToolBar(Form form) {
+		Action haction = new Action("hor", Action.AS_RADIO_BUTTON) {
+			public void run() {
+			}
+		};
+		haction.setChecked(true);
+		haction.setToolTipText("Horizontal orientation");
+		haction.setImageDescriptor(ExamplesPlugin.getDefault()
+				.getImageRegistry()
+				.getDescriptor(ExamplesPlugin.IMG_HORIZONTAL));
+		Action vaction = new Action("ver", Action.AS_RADIO_BUTTON) {
+			public void run() {
+			}
+		};
+		vaction.setChecked(false);
+		vaction.setToolTipText("Vertical orientation");
+		vaction.setImageDescriptor(ExamplesPlugin.getDefault()
+				.getImageRegistry().getDescriptor(ExamplesPlugin.IMG_VERTICAL));
+		ControlContribution save = new ControlContribution("save") {
+			protected Control createControl(Composite parent) {
+				Button saveButton = new Button(parent, SWT.PUSH);
+				saveButton.setText("Save");
+				return saveButton;
+			}
+		};
+		form.getToolBarManager().add(haction);
+		form.getToolBarManager().add(vaction);
+		form.getToolBarManager().add(save);
+		form.getToolBarManager().update(true);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java
new file mode 100755
index 0000000..c48b28c
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/ThirdPage.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.*;
+import org.eclipse.ui.forms.events.*;
+import org.eclipse.ui.forms.widgets.*;
+/**
+ * @author dejan
+ * 
+ * To change the template for this generated type comment go to Window -
+ * Preferences - Java - Code Generation - Code and Comments
+ */
+public class ThirdPage extends FormPage {
+	/**
+	 * @param id
+	 * @param title
+	 */
+	public ThirdPage(FormEditor editor) {
+		super(editor, "third", "Flow Page");
+	}
+	protected void createFormContent(IManagedForm managedForm) {
+		ScrolledForm form = managedForm.getForm();
+		//FormToolkit toolkit = managedForm.getToolkit();
+		form.setText("Form with wrapped controls");
+		ColumnLayout layout = new ColumnLayout();
+		layout.topMargin = 0;
+		layout.bottomMargin = 5;
+		layout.leftMargin = 10;
+		layout.rightMargin = 10;
+		layout.horizontalSpacing = 10;
+		layout.verticalSpacing = 10;
+		layout.maxNumColumns = 4;
+		layout.minNumColumns = 1;
+		form.getBody().setLayout(layout);
+		//form.getBody().setBackground(
+		//		form.getBody().getDisplay().getSystemColor(SWT.COLOR_GREEN));
+		createSectionWithLinks(managedForm, "Link Section",
+				"An example of a section with links", 2);
+		createSectionWithLinks(managedForm, "Link Section",
+				"An example of a section with links", 2);
+		createMixedSection(managedForm, "Mixed Section",
+				"An example of a section with both links and form controls");
+		createSectionWithLinks(managedForm, "Link Section",
+				"An example of a section with links", 4);
+		createSectionWithControls(managedForm, "Control Section",
+				"An example of a section with form controls");
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 3);
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 5);
+		createMixedSection(managedForm, "Mixed Section",
+				"An example of a section with both links and form controls");
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 2);
+		createSectionWithControls(managedForm, "Control Section",
+				"An example of a section with links");
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 4);
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 2);
+		createMixedSection(managedForm, "Mixed Section",
+				"An example of a section with both links and form controls");
+		createSectionWithLinks(managedForm, "Sample Section",
+				"An example of a section with links", 2);
+		createSectionWithControls(managedForm, "Control Section",
+				"An example of a section with form controls");
+	}
+	private void createSectionWithLinks(IManagedForm mform, String title,
+			String desc, int nlinks) {
+		Composite client = createSection(mform, title, desc, 1);
+		FormToolkit toolkit = mform.getToolkit();
+		for (int i = 1; i <= nlinks; i++)
+			toolkit.createHyperlink(client, "Hyperlink text " + i, SWT.WRAP);
+	}
+	private void createSectionWithControls(IManagedForm mform, String title,
+			String desc) {
+		Composite client = createSection(mform, title, desc, 1);
+		FormToolkit toolkit = mform.getToolkit();
+		toolkit.createButton(client, "A radio button 1", SWT.RADIO);
+		toolkit.createButton(client, "A radio button 2", SWT.RADIO);
+		toolkit.createButton(client, "A radio button with a longer text",
+				SWT.RADIO);
+		toolkit.createButton(client, "A checkbox button", SWT.CHECK);
+	}
+	private void createMixedSection(IManagedForm mform, String title, String desc) {
+		Composite client = createSection(mform, title, desc, 2);
+		FormToolkit toolkit = mform.getToolkit();
+		Hyperlink link = toolkit.createHyperlink(client,
+				"A longer hyperlink text example", SWT.WRAP);
+		GridData gd = new GridData();
+		gd.horizontalSpan = 2;
+		link.setLayoutData(gd);
+		link = toolkit.createHyperlink(client, "Another hyperlink text",
+				SWT.WRAP);
+		gd = new GridData();
+		gd.horizontalSpan = 2;
+		link.setLayoutData(gd);
+		toolkit.createLabel(client, "A text label:");
+		Text text = toolkit.createText(client, "", SWT.SINGLE);
+		text.setText("Sample text");
+		text.setEnabled(false);
+		gd = new GridData();
+		gd.widthHint = 150;
+		text.setLayoutData(gd);
+		toolkit.paintBordersFor(client);
+	}
+	private Composite createSection(IManagedForm mform, String title,
+			String desc, int numColumns) {
+		final ScrolledForm form = mform.getForm();
+		FormToolkit toolkit = mform.getToolkit();
+		Section section = toolkit.createSection(form.getBody(), Section.TWISTIE
+				| Section.SHORT_TITLE_BAR | Section.DESCRIPTION | Section.EXPANDED);
+		section.setText(title);
+		section.setDescription(desc);
+		Composite client = toolkit.createComposite(section);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = layout.marginHeight = 0;
+		layout.numColumns = numColumns;
+		client.setLayout(layout);
+		section.setClient(client);
+		section.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(false);
+			}
+		});
+		return client;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java
new file mode 100755
index 0000000..45dc98c
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOne.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+/**
+ * @author dejan
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class TypeOne extends NamedObject {
+	public static final String P_CHOICE="choice";
+	public static final String P_FLAG="flag";
+	public static final String P_TEXT="text";
+	public static final String [] CHOICES = {
+			"Choice 1", "Choice 2", "Choice 3", "Choice 4" };
+	private int choice=0;
+	private String text;
+	private boolean flag;
+
+	/**
+	 * @param name
+	 */
+	public TypeOne(String name, int choice, boolean flag, String text) {
+		super(name);
+		this.flag = flag;
+		this.text = text;
+		this.choice = choice;
+	}
+	public int getChoice() {
+		return choice;
+	}
+	public void setChoice(int choice) {
+		this.choice = choice;
+		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_CHOICE);
+	}
+	public boolean getFlag() {
+		return flag;
+	}
+	public void setFlag(boolean flag) {
+		this.flag = flag;
+		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG);
+	}
+	public String getText() {
+		return text;
+	}
+	public void setText(String text) {
+		this.text = text;
+		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_TEXT);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java
new file mode 100755
index 0000000..94f1681
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeOneDetailsPage.java
@@ -0,0 +1,186 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.*;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.widgets.*;
+
+/**
+ * @author dejan
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class TypeOneDetailsPage implements IDetailsPage {
+	private IManagedForm mform;
+	private TypeOne input;
+	private Button [] choices;
+	private Button flag;
+	private Text text;
+	private static final String RTEXT_DATA =
+			"<form><p>An example of a free-form text that should be "+
+			"wrapped below the section with widgets.</p>"+
+			"<p>It can contain simple tags like <a>links</a> and <b>bold text</b>.</p></form>";
+	
+	public TypeOneDetailsPage() {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#initialize(org.eclipse.ui.forms.IManagedForm)
+	 */
+	public void initialize(IManagedForm mform) {
+		this.mform = mform;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createContents(Composite parent) {
+		TableWrapLayout layout = new TableWrapLayout();
+		layout.topMargin = 5;
+		layout.leftMargin = 5;
+		layout.rightMargin = 2;
+		layout.bottomMargin = 2;
+		parent.setLayout(layout);
+
+		FormToolkit toolkit = mform.getToolkit();
+		Section s1 = toolkit.createSection(parent, Section.DESCRIPTION);
+		s1.marginWidth = 10;
+		s1.setText("Type One Details");
+		s1.setDescription("Set the properties of the selected TypeOne object.");
+		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
+		td.grabHorizontal = true;
+		s1.setLayoutData(td);
+		toolkit.createCompositeSeparator(s1);
+		Composite client = toolkit.createComposite(s1);
+		GridLayout glayout = new GridLayout();
+		glayout.marginWidth = glayout.marginHeight = toolkit.getBorderStyle()==SWT.BORDER?0:2;
+		glayout.numColumns = 2;
+		client.setLayout(glayout);
+		//client.setBackground(client.getDisplay().getSystemColor(SWT.COLOR_CYAN));
+		
+		SelectionListener choiceListener = new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				Integer value = (Integer)e.widget.getData();
+				if (input!=null) {
+					input.setChoice(value.intValue());
+				}
+			}
+		};
+		GridData gd;
+		choices = new Button[TypeOne.CHOICES.length];
+		for (int i=0; i<TypeOne.CHOICES.length; i++) {
+			choices[i] = toolkit.createButton(client, TypeOne.CHOICES[i], SWT.RADIO);
+			choices[i].setData(new Integer(i));
+			choices[i].addSelectionListener(choiceListener);
+			gd = new GridData();
+			gd.horizontalSpan = 2;
+			choices[i].setLayoutData(gd);
+		}
+		createSpacer(toolkit, client, 2);
+		flag = toolkit.createButton(client, "Value of the flag property", SWT.CHECK);
+		flag.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (input!=null)
+					input.setFlag(flag.getSelection());
+			}
+		});
+		gd = new GridData();
+		gd.horizontalSpan = 2;
+		flag.setLayoutData(gd);
+		createSpacer(toolkit, client, 2);
+		
+		toolkit.createLabel(client, "Text property:");
+		text = toolkit.createText(client, "", SWT.SINGLE);
+		text.addModifyListener(new ModifyListener() {
+			public void modifyText(ModifyEvent e) {
+				if (input!=null)
+					input.setText(text.getText());
+			}
+		});
+		gd = new GridData(GridData.FILL_HORIZONTAL|GridData.VERTICAL_ALIGN_BEGINNING);
+		gd.widthHint = 10;
+		text.setLayoutData(gd);
+		
+		createSpacer(toolkit, client, 2);
+		
+		FormText rtext = toolkit.createFormText(parent, false);
+		rtext.setText(RTEXT_DATA, true, false);
+		td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
+		td.grabHorizontal = true;
+		rtext.setLayoutData(td);
+		
+		toolkit.paintBordersFor(client);
+		s1.setClient(client);
+	}
+	private void createSpacer(FormToolkit toolkit, Composite parent, int span) {
+		Label spacer = toolkit.createLabel(parent, "");
+		GridData gd = new GridData();
+		gd.horizontalSpan = span;
+		spacer.setLayoutData(gd);
+	}
+	private void update() {
+		for (int i=0; i<TypeOne.CHOICES.length; i++) {
+			choices[i].setSelection(input!=null && input.getChoice()==i);
+		}
+		flag.setSelection(input!=null && input.getFlag());
+		text.setText(input!=null && input.getText()!=null?input.getText():"");
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#inputChanged(org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void selectionChanged(IFormPart part, ISelection selection) {
+		IStructuredSelection ssel = (IStructuredSelection)selection;
+		if (ssel.size()==1) {
+			input = (TypeOne)ssel.getFirstElement();
+		}
+		else
+			input = null;
+		update();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#commit()
+	 */
+	public void commit(boolean onSave) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#setFocus()
+	 */
+	public void setFocus() {
+		choices[0].setFocus();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#dispose()
+	 */
+	public void dispose() {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#isDirty()
+	 */
+	public boolean isDirty() {
+		return false;
+	}
+	public boolean isStale() {
+		return false;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#refresh()
+	 */
+	public void refresh() {
+		update();
+	}
+	public boolean setFormInput(Object input) {
+		return false;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java
new file mode 100755
index 0000000..c1093c0
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwo.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2004 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+/**
+ * @author dejan
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class TypeTwo extends NamedObject {
+	public static final String P_FLAG1="flag1";
+	public static final String P_FLAG2="flag2";
+	private boolean flag1;
+	private boolean flag2;
+
+	/**
+	 * @param name
+	 */
+	public TypeTwo(String name, boolean flag1, boolean flag2) {
+		super(name);
+		this.flag1 = flag1;
+		this.flag2 = flag2;
+	}
+	public boolean getFlag1() {
+		return flag1;
+	}
+	public boolean getFlag2() {
+		return flag2;
+	}
+	public void setFlag1(boolean flag1) {
+		this.flag1 = flag1;
+		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG1);
+	}
+	public void setFlag2(boolean flag2) {
+		this.flag2 = flag2;
+		model.fireModelChanged(new Object[] {this}, IModelListener.CHANGED, P_FLAG2);
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java
new file mode 100755
index 0000000..2988e28
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/TypeTwoDetailsPage.java
@@ -0,0 +1,135 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.internal.rcp;
+
+import org.eclipse.jface.viewers.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.*;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.forms.*;
+import org.eclipse.ui.forms.widgets.*;
+
+/**
+ * @author dejan
+ *
+ * To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Generation - Code and Comments
+ */
+public class TypeTwoDetailsPage implements IDetailsPage {
+	private IManagedForm mform;
+	private TypeTwo input;
+	private Button flag1;
+	private Button flag2;
+	
+	public TypeTwoDetailsPage() {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#initialize(org.eclipse.ui.forms.IManagedForm)
+	 */
+	public void initialize(IManagedForm mform) {
+		this.mform = mform;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#createContents(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createContents(Composite parent) {
+		TableWrapLayout layout = new TableWrapLayout();
+		layout.topMargin = 5;
+		layout.leftMargin = 5;
+		layout.rightMargin = 2;
+		//layout.bottomMargin = 2;
+		parent.setLayout(layout);
+
+		FormToolkit toolkit = mform.getToolkit();
+		Section s1 = toolkit.createSection(parent, Section.DESCRIPTION);
+		s1.marginWidth = 10;
+		s1.setText("Type Two Details");
+		s1.setDescription("Set the properties of the selected TypeTwo object.");
+		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
+		td.grabHorizontal = true;
+		s1.setLayoutData(td);
+		toolkit.createCompositeSeparator(s1);
+		Composite client = toolkit.createComposite(s1);
+		//client.setBackground(client.getDisplay().getSystemColor(SWT.COLOR_MAGENTA));
+		GridLayout glayout = new GridLayout();
+		glayout.marginWidth = glayout.marginHeight = 0;
+		client.setLayout(glayout);
+		
+		flag1 = toolkit.createButton(client, "Value of the flag1 property", SWT.CHECK);
+		flag1.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (input!=null)
+					input.setFlag1(flag1.getSelection());
+			}
+		});
+		
+		flag2 = toolkit.createButton(client, "Value of the flag2 property", SWT.CHECK);
+		flag2.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				if (input!=null)
+					input.setFlag2(flag2.getSelection());
+			}
+		});
+		s1.setClient(client);
+	}
+	private void update() {
+		flag1.setSelection(input!=null && input.getFlag1());
+		flag2.setSelection(input!=null && input.getFlag2());
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#inputChanged(org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void selectionChanged(IFormPart part, ISelection selection) {
+		IStructuredSelection ssel = (IStructuredSelection)selection;
+		if (ssel.size()==1) {
+			input = (TypeTwo)ssel.getFirstElement();
+		}
+		else
+			input = null;
+		update();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#commit()
+	 */
+	public void commit(boolean onSave) {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#setFocus()
+	 */
+	public void setFocus() {
+		flag1.setFocus();
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#dispose()
+	 */
+	public void dispose() {
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#isDirty()
+	 */
+	public boolean isDirty() {
+		return false;
+	}
+	
+	public boolean isStale() {
+		return false;
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.forms.IDetailsPage#refresh()
+	 */
+	public void refresh() {
+		update();
+	}
+	public boolean setFormInput(Object input) {
+		return false;
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml
new file mode 100755
index 0000000..3be639b
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/internal/rcp/index.xml
Binary files differ
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java
new file mode 100755
index 0000000..df7bf12
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/FormView.java
@@ -0,0 +1,206 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.ui.forms.examples.views;
+import org.eclipse.jface.resource.JFaceResources;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.forms.IFormColors;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.examples.internal.ExamplesPlugin;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormText;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.Hyperlink;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+import org.eclipse.ui.part.ViewPart;
+
+public class FormView extends ViewPart {
+	private FormToolkit toolkit;
+	private ScrolledForm form;
+	/**
+	 * The constructor.
+	 */
+	public FormView() {
+	}
+	/**
+	 * This is a callback that will allow us to create the viewer and
+	 * initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		toolkit = new FormToolkit(parent.getDisplay());
+		form = toolkit.createScrolledForm(parent);
+		form.setText("Hello, Eclipse Forms");
+		TableWrapLayout layout = new TableWrapLayout();
+		form.getBody().setLayout(layout);
+		
+		Hyperlink link = toolkit.createHyperlink(form.getBody(), "Click here.",
+				SWT.WRAP);
+		link.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				System.out.println("Link activated!");
+			}
+		});
+		link.setText("This is an example of a form that is much longer and will need to wrap.");
+		layout.numColumns = 2;
+		TableWrapData td = new TableWrapData();
+		td.colspan = 2;
+		link.setLayoutData(td);
+		toolkit.createLabel(form.getBody(), "Text field label:");
+		Text text = toolkit.createText(form.getBody(), "");
+		td = new TableWrapData(TableWrapData.FILL_GRAB);
+		text.setLayoutData(td);
+		Button button = toolkit.createButton(form.getBody(),
+				"An example of a checkbox in a form", SWT.CHECK);
+		td = new TableWrapData();
+		td.colspan = 2;
+		button.setLayoutData(td);
+		
+		ImageHyperlink ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
+		ih.setText("Image link with no image");
+		ih = toolkit.createImageHyperlink(form.getBody(), SWT.NULL);
+		ih.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
+		ih.setText("Link with image and text");
+		
+		ExpandableComposite ec = toolkit.createExpandableComposite(form.getBody(), ExpandableComposite.TREE_NODE|ExpandableComposite.CLIENT_INDENT);
+		ImageHyperlink eci = toolkit.createImageHyperlink(ec, SWT.NULL);
+		eci.setImage(ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
+		ec.setTextClient(eci);
+		ec.setText("Expandable Composite title");
+		String ctext = "We will now create a somewhat long text so that "+
+		"we can use it as content for the expandable composite. "+
+		"Expandable composite is used to hide or show the text using the "+
+		"toggle control";
+		Label client = toolkit.createLabel(ec, ctext, SWT.WRAP);
+		ec.setClient(client);
+		td = new TableWrapData();
+		td.colspan = 2;
+		ec.setLayoutData(td);
+		ec.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(true);
+			}
+		});
+		Section section = toolkit.createSection(form.getBody(), Section.DESCRIPTION|Section.TWISTIE|Section.EXPANDED);
+		td = new TableWrapData(TableWrapData.FILL);
+		td.colspan = 2;
+		section.setLayoutData(td);
+		section.addExpansionListener(new ExpansionAdapter() {
+			public void expansionStateChanged(ExpansionEvent e) {
+				form.reflow(true);
+			}
+		});
+		section.setText("Section title");
+		toolkit.createCompositeSeparator(section);
+		section.setDescription("This is the description that goes below the title");
+		Composite sectionClient = toolkit.createComposite(section);
+		sectionClient.setLayout(new GridLayout());
+		button = toolkit.createButton(sectionClient, "Radio 1", SWT.RADIO);
+		button = toolkit.createButton(sectionClient, "Radio 2", SWT.RADIO);
+		section.setClient(sectionClient);
+
+		StringBuffer buf = new StringBuffer();
+		buf.append("<form>");
+		buf.append("<p>");
+		buf.append("Here is some plain text for the text to render; ");
+		buf.append("this text is at <a href=\"http://www.eclipse.org\" nowrap=\"true\">http://www.eclipse.org</a> web site.");
+		buf.append("</p>");
+		buf.append("<p>");
+		buf.append("<span color=\"header\" font=\"header\">This text is in header font and color.</span>");
+		buf.append("</p>");
+		buf.append("<p>This line will contain some <b>bold</b> and some <span font=\"code\">source</span> text. ");
+		buf.append("We can also add <img href=\"image\"/> an image. ");
+		buf.append("</p>");
+		buf.append("<li>A default (bulleted) list item.</li>");
+		buf.append("<li>Another bullet list item.</li>");
+		buf.append("<li style=\"text\" value=\"1.\">A list item with text.</li>");
+		buf.append("<li style=\"text\" value=\"2.\">Another list item with text</li>");
+		buf.append("<li style=\"image\" value=\"image\">List item with an image bullet</li>");
+		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"3.\">A list item with text.</li>");
+		buf.append("<li style=\"text\" bindent=\"20\" indent=\"40\" value=\"4.\">A list item with text.</li>");
+		buf.append("<p>     leading blanks;      more white \n\n new lines   <br/><br/><br/> \n more <b>   bb   </b>  white  . </p>");
+		buf.append("</form>");
+		FormText rtext = toolkit.createFormText(form.getBody(), false);
+		//rtext.setWhitespaceNormalized(false);
+		td = new TableWrapData(TableWrapData.FILL);
+		td.colspan = 2;
+		rtext.setLayoutData(td);
+		rtext.setImage("image", ExamplesPlugin.getDefault().getImageRegistry().get(ExamplesPlugin.IMG_SAMPLE));
+		rtext.setColor("header", toolkit.getColors().getColor(IFormColors.TITLE));
+		rtext.setFont("header", JFaceResources.getHeaderFont());
+		rtext.setFont("code", JFaceResources.getTextFont());
+		rtext.setText(buf.toString(), true, false);
+		rtext.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				System.out.println("Link active: "+e.getHref());
+			}
+		});
+/*		layout.numColumns = 3;
+		Label label;
+		TableWrapData td;
+		
+		label = toolkit.createLabel(form.getBody(), "Some text to put in the first column", SWT.WRAP);
+		label = toolkit.createLabel(form.getBody() ,"Some text to put in the second column and make it a bit longer so that we can see what happens with column distribution. This text must be the longest so that it can get more space allocated to the columns it belongs to.", SWT.WRAP);
+		td = new TableWrapData();
+		td.colspan = 2;
+		label.setLayoutData(td);
+		label = toolkit.createLabel(form.getBody(), "This text will span two rows and should not grow the column.", SWT.WRAP);
+		td = new TableWrapData();
+		td.rowspan = 2;
+		label.setLayoutData(td);
+		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
+		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
+		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
+		label = toolkit.createLabel(form.getBody(), "This text goes into column 2 and consumes only one cell", SWT.WRAP);
+		label.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
+		label = toolkit.createLabel(form.getBody(), "This text goes into column 3 and consumes only one cell too", SWT.WRAP);
+		label.setLayoutData(new TableWrapData(TableWrapData.FILL));
+		form.getBody().setBackground(form.getBody().getDisplay().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND));*/
+		
+		toolkit.paintBordersFor(form.getBody());
+	}
+	/**
+	 * Passing the focus request to the form.
+	 */
+	public void setFocus() {
+		Control focusControl = form.getDisplay().getFocusControl();
+		if (focusControl!=null) {
+			Composite parent = focusControl.getParent();
+			while (parent!=null) {
+				if (parent==form) {
+					// already have focus
+					return;
+				}
+				parent = parent.getParent();
+			}
+		}
+		form.setFocus();
+	}
+	/**
+	 * Disposes the toolkit
+	 */
+	public void dispose() {
+		toolkit.dispose();
+		super.dispose();
+	}
+}
diff --git a/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java
new file mode 100755
index 0000000..2484a37
--- /dev/null
+++ b/org.eclipse.ui.forms.examples/src/org/eclipse/ui/forms/examples/views/ShowHelpAction.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.ui.forms.examples.views;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.ui.*;
+
+/**
+ * @author dejan
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class ShowHelpAction implements IWorkbenchWindowActionDelegate {
+	private IWorkbenchWindow window;
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose()
+	 */
+	public void dispose() {
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
+	 */
+	public void init(IWorkbenchWindow window) {
+		this.window = window;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		try {
+			window.getActivePage().showView("org.eclipse.ui.forms.examples.helpView");
+		}
+		catch (PartInitException e) {
+			System.out.println(e);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..9816c8e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,248 @@
+<!-- Copyright (c) 2011 PetalsLink. 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 Authors: * Mickael Istria (PetalsLink) -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+
+	<groupId>org.eclipse.swtbot</groupId>
+	<artifactId>parent</artifactId>
+	<name>Eclipse SWTBot</name>
+	<version>2.0.5-SNAPSHOT</version>
+	<packaging>pom</packaging>
+
+	<prerequisites>
+		<maven>3.0</maven>
+	</prerequisites>
+	<properties>
+		<tycho-version>0.15.0</tycho-version>
+		<!-- Properties to enable jacoco code coverage analysis -->
+		<sonar.core.codeCoveragePlugin>jacoco</sonar.core.codeCoveragePlugin>
+		<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
+		<sonar.jacoco.itReportPath>../target/jacoco.exec</sonar.jacoco.itReportPath>
+	</properties>
+
+	<modules>
+		<!-- Plugins -->
+		<module>org.eclipse.swtbot.ant.junit</module>
+		<module>org.eclipse.swtbot.eclipse</module>
+		<module>org.eclipse.swtbot.eclipse.core</module>
+		<module>org.eclipse.swtbot.eclipse.dsl</module>
+		<module>org.eclipse.swtbot.eclipse.finder</module>
+		<module>org.eclipse.swtbot.eclipse.gef.finder</module>
+		<module>org.eclipse.swtbot.eclipse.spy</module>
+		<module>org.eclipse.swtbot.eclipse.test.junit</module>
+		<module>org.eclipse.swtbot.eclipse.ui</module>
+		<module>org.eclipse.swtbot.forms.finder</module>
+		<module>org.eclipse.swtbot.generator</module>
+		<module>org.eclipse.swtbot.go</module>
+		<module>org.eclipse.swtbot.junit4_x</module>
+		<module>org.eclipse.swtbot.swt.demo</module>
+		<module>org.eclipse.swtbot.swt.finder</module>
+		<module>org.eclipse.swt.examples</module>
+		<module>org.eclipse.ui.forms.examples</module>
+		<!-- features -->
+		<module>org.eclipse.swtbot</module>
+		<module>org.eclipse.swtbot.forms</module>
+		<module>org.eclipse.swtbot.eclipse.gef</module>
+		<module>org.eclipse.swtbot.ide</module>
+		<module>org.eclipse.swtbot.eclipse.junit.headless</module>
+		<!-- Repo -->
+		<module>org.eclipse.swtbot.updatesite</module>
+		<!-- Tests -->
+		<module>org.eclipse.swtbot.generator.test</module>
+		<module>org.eclipse.swtbot.eclipse.ui.test</module>
+		<module>org.eclipse.swtbot.swt.finder.test.keyboards</module>
+		<module>org.eclipse.swtbot.swt.finder.test</module>
+		<module>org.eclipse.swtbot.forms.finder.test</module>
+		<module>org.eclipse.swtbot.eclipse.finder.test</module>
+		<module>org.eclipse.swtbot.test</module>
+	</modules>
+
+	<mailingLists>
+		<mailingList>
+			<name>swtbot-dev Mailing List</name>
+			<post>swtbot-dev@eclipse.org</post>
+			<subscribe>https://dev.eclipse.org/mailman/listinfo/swtbot-dev</subscribe>
+			<unsubscribe>https://dev.eclipse.org/mailman/listinfo/swtbot-dev</unsubscribe>
+			<archive>http://dev.eclipse.org/mhonarc/lists/swtbot-dev</archive>
+		</mailingList>
+	</mailingLists>
+
+	<issueManagement>
+		<url>https://bugs.eclipse.org/bugs/buglist.cgi?classification=Technology;query_format=advanced;product=SWTBot</url>
+		<system>Bugzilla</system>
+	</issueManagement>
+
+	<scm>
+		<connection>scm:git:http://git.eclipse.org/gitroot/swtbot/org.eclipse.swtbot.git</connection>
+		<url>https://git.eclipse.org/c/swtbot/org.eclipse.swtbot.git/</url>
+	</scm>
+
+	<licenses>
+		<license>
+			<name>Eclipse Public License v1.0</name>
+			<comments>
+       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.htm
+			</comments>
+		</license>
+	</licenses>
+
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>tycho-maven-plugin</artifactId>
+				<version>${tycho-version}</version>
+				<extensions>true</extensions>
+			</plugin>
+
+			<plugin>
+				<groupId>org.eclipse.tycho</groupId>
+				<artifactId>target-platform-configuration</artifactId>
+				<version>${tycho-version}</version>
+				<configuration>
+					<resolver>p2</resolver>
+					<environments>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>linux</os>
+							<ws>gtk</ws>
+							<arch>x86_64</arch>
+						</environment>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>win32</os>
+							<ws>win32</ws>
+							<arch>x86_64</arch>
+						</environment>
+						<environment>
+							<os>macosx</os>
+							<ws>cocoa</ws>
+							<arch>x86</arch>
+						</environment>
+						<environment>
+							<os>macosx</os>
+							<ws>cocoa</ws>
+							<arch>x86_64</arch>
+						</environment>
+					</environments>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.jacoco</groupId>
+				<artifactId>jacoco-maven-plugin</artifactId>
+				<version>0.5.8.201207111220</version>
+				<executions>
+					<execution>
+						<goals>
+							<goal>prepare-agent</goal>
+						</goals>
+						<configuration>
+							<!-- Where to put jacoco coverage report -->
+							<destFile>${sonar.jacoco.itReportPath}</destFile>
+							<includes>
+								<include>org.eclipse.swtbot.*</include>
+							</includes>
+							<append>true</append>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+		</plugins>
+	</build>
+
+	<profiles>
+		<profile>
+			<id>helios</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<repositories>
+				<repository>
+					<id>Helios</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/releases/helios</url>
+				</repository>
+				<repository>
+					<id>Orbit-Helios</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/tools/orbit/downloads/drops/R20100519200754/repository</url>
+				</repository>
+			</repositories>
+		</profile>
+		<profile>
+			<id>indigo</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<repositories>
+				<repository>
+					<id>Indigo</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/releases/indigo</url>
+				</repository>
+				<repository>
+					<id>Orbit-Indigo</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/tools/orbit/downloads/drops/R20110523182458/repository/</url>
+				</repository>
+			</repositories>
+		</profile>
+
+		<profile>
+			<id>juno-staging</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<repositories>
+				<repository>
+					<id>staging</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/releases/staging/</url>
+				</repository>
+				<repository>
+					<id>Orbit-Staging</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/tools/orbit/downloads/drops/S20110907174232/repository/</url>
+				</repository>
+			</repositories>
+		</profile>
+
+		<profile>
+			<id>juno</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<repositories>
+				<repository>
+					<id>Juno</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/releases/juno/</url>
+				</repository>
+				<repository>
+					<id>Orbit-Juno</id>
+					<layout>p2</layout>
+					<url>http://download.eclipse.org/tools/orbit/downloads/drops/R20120526062928/repository/</url>
+				</repository>
+			</repositories>
+		</profile>
+	</profiles>
+
+</project>
diff --git a/tools/README.textile b/tools/README.textile
new file mode 100644
index 0000000..8e58edf
--- /dev/null
+++ b/tools/README.textile
@@ -0,0 +1,35 @@
+How to publish builds:
+
+h2. Run a build locally
+
+$ cd org.eclipse.swtbot.releng
+$ ./make-release
+
+* Get some coffee while the build runs. This usually takes about 30 minutes to compile and run tests on 3 versions of eclipse
+
+h2. Transfer build files to eclipse.org
+
+If all the tests pass, rsync all the upload dir to your home dir at eclipse.org
+
+$ rsync --delete --compress --partial --progress --archive  to-upload build.eclipse.org:
+
+h3. Login to the build server
+
+$ ssh username@build.eclipse.org
+
+Once on the build server:
+
+[build.eclipse.org] $ git clone git://git.eclipse.org/gitroot/swtbot/org.eclipse.swtbot.git swtbot
+
+[build.eclipse.org] $ cd swtbot/tools
+
+[build.eclipse.org] $ ./create-all-index.sh   # create index.html files to enable dirlisting
+
+[build.eclipse.org] $ ./sign-swtbot.sh        # queue up all artifacts for signing
+
+[build.eclipse.org] $ ./monitor.sh            # run this once every couple of minutes to monitor signing queue
+                                              # it might be a couple of minutes on a good day or a few hours near a release date.
+
+[build.eclipse.org] $ ./publish-build.sh      # run this to push the build to the download servers
+                                              # this will archive old builds and publish the new signed jars and
+                                              # release notes to the build servers
diff --git a/tools/create-all-index.sh b/tools/create-all-index.sh
old mode 100644
new mode 100755
index 5ceaa18..5163a6a
--- a/tools/create-all-index.sh
+++ b/tools/create-all-index.sh
@@ -1,20 +1,39 @@
 #!/bin/bash
 
-cd ~/to-upload/galileo
+cd ~/to-upload/galileo/
 create_index_html.rb > index.html
 
-cd ~/to-upload/galileo/coverage/
+cd ~/to-upload/galileo/dev-build
 create_index_html.rb > index.html
 
-cd ~/to-upload/galileo/junit/
+cd ~/to-upload/galileo/dev-build/coverage/
+create_index_html.rb > index.html
+
+cd ~/to-upload/galileo/dev-build/junit/
 create_index_html.rb > index.html
 
 
-cd ~/to-upload/ganymede
+cd ~/to-upload/ganymede/
 create_index_html.rb > index.html
 
-cd ~/to-upload/ganymede/coverage/
+cd ~/to-upload/ganymede/dev-build/
 create_index_html.rb > index.html
 
-cd ~/to-upload/ganymede/junit/
-create_index_html.rb > index.html
\ No newline at end of file
+cd ~/to-upload/ganymede/dev-build/coverage/
+create_index_html.rb > index.html
+
+cd ~/to-upload/ganymede/dev-build/junit/
+create_index_html.rb > index.html
+
+
+cd ~/to-upload/helios/
+create_index_html.rb > index.html
+
+cd ~/to-upload/helios/dev-build/
+create_index_html.rb > index.html
+
+cd ~/to-upload/helios/dev-build/coverage/
+create_index_html.rb > index.html
+
+cd ~/to-upload/helios/dev-build/junit/
+create_index_html.rb > index.html
diff --git a/tools/create-index_html.rb b/tools/create_index_html.rb
old mode 100644
new mode 100755
similarity index 94%
rename from tools/create-index_html.rb
rename to tools/create_index_html.rb
index fec63bb..a13a87d
--- a/tools/create-index_html.rb
+++ b/tools/create_index_html.rb
@@ -15,7 +15,7 @@
 Dir.foreach(".") do |file|
   if File.directory?(file)
     puts "<tr><td><a href=\'#{file}\'>#{file}</a></td><td>-</td></tr>"
-  else
+  elsif (file != 'index.html')
     puts "<tr><td><a href=\'#{file}\'>#{file}</a></td><td>#{File.size(file)}</td></tr>"
   end
   # puts "<tr><td><a href=#{file}>#{file}</a></td><td>#{File.size(file)}</td></tr>" if !File.directory(file)?
@@ -23,3 +23,5 @@
 
 puts "</table>"
 puts "</html>"
+
+
diff --git a/tools/monitor.sh b/tools/monitor.sh
new file mode 100755
index 0000000..971cf14
--- /dev/null
+++ b/tools/monitor.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+cd /opt/public/download-staging.priv/technology/swtbot/signed
+while true; do
+	find * -type f -iname "*.zip" > files.unsort
+	find * -type f -iname "*.jar" >> files.unsort
+	sort files.unsort > files
+	
+	diff files ../to-sign/files > diff
+
+	cat diff
+	if [ -s 'diff' ]; then
+		echo 'Still more to sign...'
+	else
+		echo 'Done signing...'
+		break
+	fi
+	sleep 5
+done
+
+rm files files.unsort diff
diff --git a/tools/publish-build.sh b/tools/publish-build.sh
new file mode 100755
index 0000000..28899dd
--- /dev/null
+++ b/tools/publish-build.sh
@@ -0,0 +1,25 @@
+#!/bin/bash
+cd /home/data/httpd/download.eclipse.org/technology/swtbot
+
+if [ ! -s 'galileo/dev-build/version.txt' ]; then
+	echo "Could not detect version of swtbot currently deployed."
+	exit -1
+fi
+
+CURRENT_VERSION_ON_DOWNLOAD_SITE=`cat galileo/dev-build/version.txt | sed -e 's/-e[0-9][0-9]$//'`
+
+rm -rf archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
+mkdir -p archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
+rm -rf new
+mkdir new
+cp -rf ~/to-upload/* new 
+cp -rf /opt/public/download-staging.priv/technology/swtbot/signed/* new 
+mv galileo ganymede helios archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
+mv new/* .
+
+cd /home/data/httpd/download.eclipse.org/technology/swtbot/archives
+create_index_html.rb > index.html
+
+cd $CURRENT_VERSION_ON_DOWNLOAD_SITE
+create_index_html.rb > index.html
+
diff --git a/tools/push-dev-build b/tools/push-dev-build
deleted file mode 100644
index 56d2fd1..0000000
--- a/tools/push-dev-build
+++ /dev/null
@@ -1,81 +0,0 @@
-#!/bin/bash
-set -e
-set -x
-
-# clean all dirs
-rm -rf /opt/public/download-staging.priv/technology/swtbot/signed
-rm -rf /opt/public/download-staging.priv/technology/swtbot/to-sign
-
-# make the signing dirs
-mkdir -p /opt/public/download-staging.priv/technology/swtbot/to-sign
-
-# make the galileo dirs
-mkdir -p /opt/public/download-staging.priv/technology/swtbot/signed/galileo
-
-# make the ganymede dirs
-mkdir -p /opt/public/download-staging.priv/technology/swtbot/signed/ganymede
-
-cd /opt/public/download-staging.priv/technology/swtbot/
-# create update site structure
-mkdir -p \
-	signed/galileo/update-site \
-	signed/galileo/update-site/plugins \
-	signed/galileo/update-site/features \
-	signed/ganymede/update-site \
-	signed/ganymede/update-site/plugins \
-	signed/ganymede/update-site/features
-
-cd /opt/public/download-staging.priv/technology/swtbot/to-sign
-
-# copy all the binaries
-create-all-index.sh
-cp -fr ~/to-upload/* /opt/public/download-staging.priv/technology/swtbot/to-sign
-
-find * -type f -iname "*.zip" > files.unsort
-find * -type f -iname "*.jar" >> files.unsort
-sort files.unsort > files
-rm files.unsort
-
-cat files | while read LINE; do
-	sign `pwd`/$LINE mail /opt/public/download-staging.priv/technology/swtbot/signed/`dirname $LINE`
-done
-
-
-cd /opt/public/download-staging.priv/technology/swtbot/signed
-while true; do
-	find * -type f -iname "*.zip" > files.unsort
-	find * -type f -iname "*.jar" >> files.unsort
-	sort files.unsort > files
-	
-	diff files ../to-sign/files > diff
-	rm files
-	cat diff
-	if [ -s 'diff' ]; then
-		echo 'Still more to sign...'
-	else
-		echo 'Done signing...'
-		break
-	fi
-	sleep 5
-done
-
-# move the files to the download section
-cd /home/data/httpd/download.eclipse.org/technology/swtbot
-rm -rf new_version
-mkdir new_version
-cp -rf /opt/public/download-staging.priv/technology/swtbot/to-sign/* new_version
-
-# move the existing content to 'archives'
-CURRENT_VERSION_ON_DOWNLOAD_SITE=`cat galileo/dev-build/version.txt`
-#clear any existing archives
-rm -rf archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
-mkdir -p archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
-
-mv galileo ganymede archives/$CURRENT_VERSION_ON_DOWNLOAD_SITE
-mv new_version/* .
-rm -rf new_version
-
-# rebuild archives index
-cd archives
-create_index_html.rb > index.html
-cd ..
\ No newline at end of file
diff --git a/tools/sign-swbot.sh b/tools/sign-swbot.sh
new file mode 100755
index 0000000..6cdda3c
--- /dev/null
+++ b/tools/sign-swbot.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+#set -e
+#set -x
+
+# clean all dirs
+rm -rf /opt/public/download-staging.priv/technology/swtbot/signed
+rm -rf /opt/public/download-staging.priv/technology/swtbot/to-sign
+
+# make the signing dirs
+mkdir -p /opt/public/download-staging.priv/technology/swtbot/to-sign
+
+# make the galileo dirs
+mkdir -p /opt/public/download-staging.priv/technology/swtbot/signed/galileo
+
+# make the ganymede dirs
+mkdir -p /opt/public/download-staging.priv/technology/swtbot/signed/ganymede
+
+# copy all the binaries
+cp -fr ~/to-upload/* /opt/public/download-staging.priv/technology/swtbot/to-sign
+
+cd /opt/public/download-staging.priv/technology/swtbot/
+# create update site structure
+#mkdir -p \
+#	galileo/dev-build/signed/update-site \
+#	galileo/dev-build/signed/update-site/plugins \
+#	galileo/dev-build/signed/update-site/features \
+#	ganymede/dev-build/signed/update-site \
+#	ganymede/dev-build/signed/update-site/plugins \
+#	ganymede/dev-build/signed/update-site/features
+
+cd /opt/public/download-staging.priv/technology/swtbot/to-sign
+
+find * -type f -iname "*.zip" > files.unsort
+find * -type f -iname "*.jar" >> files.unsort
+sort files.unsort > files
+
+cat files | while read LINE; do
+	sign `pwd`/$LINE mail /opt/public/download-staging.priv/technology/swtbot/signed/`dirname $LINE`
+done
+
+echo "Signing is in progres run 'monitor.sh' to monitor progress..."
\ No newline at end of file
diff --git a/tools/version.rb b/tools/version.rb
new file mode 100755
index 0000000..39c3834
--- /dev/null
+++ b/tools/version.rb
@@ -0,0 +1,17 @@
+#!/usr/bin/env ruby
+
+require 'fileutils'
+
+HERE = File.expand_path('..', __FILE__)
+
+FROM_VERSION=ARGV[0]
+TO_VERSION=ARGV[1]
+
+FileUtils.cd "#{HERE}/.." do
+  files = `git ls-tree -r master | grep 'MANIFEST.MF\\|feature.xml' | awk '{print $4}'`
+  files.each_line do |file|
+    file.chomp!
+    contents = File.read(file).gsub("#{FROM_VERSION}.qualifier", "#{TO_VERSION}.qualifier")
+    File.open(file, 'w') {|f| f.write contents}
+  end
+end