diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestUtil.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestUtil.java
index 9db0510..7270442 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestUtil.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/SwtTestUtil.java
@@ -68,6 +68,10 @@
 	public final static boolean isSolaris = System.getProperty("os.name").equals("Solaris") || System.getProperty("os.name").equals("SunOS");
 	public final static boolean isHPUX = System.getProperty("os.name").equals("HP-UX");
 
+	public final static boolean isRunningOnEclipseOrgHudsonGTK = isGTK
+			&& ("hudsonbuild".equalsIgnoreCase(System.getProperty("user.name"))
+			|| "genie.platform".equalsIgnoreCase(System.getProperty("user.name")));
+
 	static {
 		testFontName = "Helvetica";
 	}
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java
index eb05a66..f49364e 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_browser_Browser.java
@@ -14,8 +14,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeFalse;
 
-import java.util.Properties;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicIntegerArray;
@@ -60,6 +60,8 @@
 
 	boolean browser_debug = false;
 
+	boolean isWebkit1 = false;
+
 	/**
 	 * Normally, sleep in 1 ms intervals 1000 times. During browser_debug, sleep 1000 ms for 1 interval.
 	 * This allows one to see the browser shell for a few seconds, which would normally not be visible during
@@ -73,15 +75,39 @@
 public void setUp() {
 	super.setUp();
 
+	// Print test name if running on hudson. This makes it easier to tell in the logs which test case caused crash.
+	if (SwtTestUtil.isRunningOnEclipseOrgHudsonGTK) {
+		System.out.println("Running Test_org_eclipse_swt_browser_Browser#" + name.getMethodName());
+	}
+
 	secondsToWaitTillFail = 3;
 	waitMS = browser_debug ? 1000 : 1;
 	loopMultipier = browser_debug ? 1 : 1000;
 
 	shell.setLayout(new FillLayout());
-	setTitle(shell);
-
 	browser = new Browser(shell, SWT.NONE);
 
+	String shellTitle = name.getMethodName();
+	if (SwtTestUtil.isGTK && browser.getBrowserType().equals("webkit")) {
+
+		// Note, webkitGtk version is only available once Browser is instantiated.
+		String webkitGtkVersionStr = System.getProperty("org.eclipse.swt.internal.webkitgtk.version"); //$NON-NLS-1$
+
+		shellTitle = shellTitle + " Webkit version: " + webkitGtkVersionStr;
+
+		String[] webkitGtkVersionStrParts = webkitGtkVersionStr.split("\\.");
+		int[] webkitGtkVersionInts = new int[3];
+		for (int i = 0; i < 3; i++) {
+			webkitGtkVersionInts[i] = Integer.parseInt(webkitGtkVersionStrParts[i]);
+		}
+
+		// webkitgtk 2.5 and onwards uses webkit2.
+		if (webkitGtkVersionInts[0] == 1 || (webkitGtkVersionInts[0] == 2 && webkitGtkVersionInts[1] <= 4)) {
+			isWebkit1 = true;
+		}
+	}
+	shell.setText(shellTitle);
+
 	/*
 	 * setWidget() is needed for Browser to occupy the whole shell.
 	 * (Without setWidget(), composite and browser receive half the shell each).
@@ -94,27 +120,10 @@
 	if (! SwtTestUtil.isWindows) {
 		setWidget(browser);
 	}
-}
 
-/**
- * Append relevant information to the shell title.
- * On Gtk, we support multiple versions of Webkit. It's useful to know which webkit version the test runs on.
- * @param title
- */
-void setTitle(Shell shell) {
-	String title = name.getMethodName();
-	if (SwtTestUtil.isGTK) {
-		String SWT_WEBKITGTK_VERSION = "org.eclipse.swt.internal.webkitgtk.version"; //$NON-NLS-1$
-		Properties sp = System.getProperties();
-		String webkitGtkVer = sp.getProperty(SWT_WEBKITGTK_VERSION);
-		if (webkitGtkVer != null)
-			title = title + "  Webkit version: " + webkitGtkVer;
-	}
-	shell.setText(title);
 }
 
 
-
 /**
  * Test that if Browser is constructed with the parent being "null", Browser throws an exception.
  */
@@ -124,7 +133,7 @@
 	Browser browser = new Browser(shell, SWT.NONE);
 	browser.dispose();
 	browser = new Browser(shell, SWT.BORDER);
-	System.out.println("Browser#getBrowserType(): " + browser.getBrowserType());
+	// System.out.println("Test_org_eclipse_swt_browser_Browser#test_Constructor*#getBrowserType(): " + browser.getBrowserType());
 	browser.dispose();
 	try {
 		browser = new Browser(null, SWT.NONE);
@@ -216,6 +225,13 @@
 	for (int i = 0; i < 100; i++) browser.removeProgressListener(listener);
 }
 
+@Override
+@Test
+public void test_isVisible() {
+	// Note. This test sometimes crashes with webkit1 because shell.setVisible() calls g_main_context_iteration(). See Bug 509411
+	// To reproduce, try running test suite 20 times in a loop.
+	super.test_isVisible();
+}
 
 /**
  * Test that if addStatusTextListener() is called without a listener, IllegalArgumentException is thrown.
@@ -650,6 +666,8 @@
  */
 @Test
 public void test_setUrl() {
+	// Note, this test sometimes crashes on webkit1. See Bug 509411
+
 	/* THIS TEST REQUIRES WEB ACCESS! How else can we really test the http:// part of a browser widget? */
 	assert(browser.setUrl("http://www.eclipse.org/swt"));
 	runLoopTimer(2000);
@@ -674,6 +692,8 @@
  */
 @Test
 public void test_evaluate_string() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	final AtomicReference<String> returnValue = new AtomicReference<>();
 	browser.addProgressListener(new ProgressListener() {
 		@Override
@@ -705,6 +725,7 @@
  */
 @Test
 public void test_evaluate_number_normal() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
 	Double testNum = 123.0;
 	boolean passed = evaluate_number_helper(testNum);
 	assertTrue(passed);
@@ -716,6 +737,8 @@
  */
 @Test
 public void test_evaluate_number_negative() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	Double testNum = -123.0;
 	boolean passed = evaluate_number_helper(testNum);
 	assertTrue(passed);
@@ -727,6 +750,8 @@
  */
 @Test
 public void test_evaluate_number_big() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	Double testNum = 10000000000.0;
 	boolean passed = evaluate_number_helper(testNum);
 	assertTrue(passed);
@@ -766,6 +791,7 @@
  */
 @Test
 public void test_evaluate_boolean() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
 	final AtomicBoolean atomicBoolean = new AtomicBoolean(false);
 	browser.addProgressListener(new ProgressListener() {
 		@Override
@@ -797,9 +823,9 @@
  */
 @Test
 public void test_evaluate_null() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
 	 // Boolen only used as dummy placeholder so the object is not null.
 	final AtomicReference<Object> returnValue = new AtomicReference<>(new Boolean(true));
-	System.out.println(returnValue);
 	browser.addProgressListener(new ProgressListener() {
 		@Override
 		public void changed(ProgressEvent event) {
@@ -830,6 +856,8 @@
  */
 @Test
 public void test_evaluate_invalid_return_value() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	if (SwtTestUtil.isWindows) {
 		/* Bug 508210 . Inconsistent beahiour on windows at the moment.
 		 * Fixing requires deeper investigation. Disabling newly added test for now.
@@ -878,6 +906,7 @@
  */
 @Test
 public void test_evaluate_evaluation_failed_exception() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
 	final AtomicInteger exception = new AtomicInteger(-1);
 	browser.addProgressListener(new ProgressListener() {
 		@Override
@@ -914,6 +943,8 @@
  */
 @Test
 public void test_evaluate_array_numbers() {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	// Small note:
 	// evaluate() returns 'Double' type. Java doesn't have AtomicDouble
 	// for convienience we simply convert double to int as we're dealing with integers anyway.
@@ -955,6 +986,8 @@
  */
 @Test
 public void test_evaluate_array_strings () {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
+
 	final AtomicReferenceArray<String> atomicStringArray = new AtomicReferenceArray<>(3);
 	atomicStringArray.set(0, "executing");
 	browser.addProgressListener(new ProgressListener() {
@@ -995,6 +1028,7 @@
  */
 @Test
 public void test_evaluate_array_mixedTypes () {
+	assumeFalse(webkit1SkipMsg(), isWebkit1); // Bug 509411
 	final AtomicReferenceArray<Object> atomicArray = new AtomicReferenceArray<>(3);
 	atomicArray.set(0, "executing");
 	browser.addProgressListener(new ProgressListener() {
@@ -1051,4 +1085,9 @@
 	Display display = Display.getCurrent();
 	while (!exit[0] && !shell.isDisposed()) if (!display.readAndDispatch()) display.sleep();
 }
+
+private String webkit1SkipMsg() {
+	return "Test_org_eclipse_swt_browser. Bug 509411. Skipping test on Webkit1 due to sporadic crash: "+ name.getMethodName();
+}
+
 }
diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/browser/Test_BrowserSuite.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/browser/Test_BrowserSuite.java
index 2031e11..5bbd5dc 100644
--- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/browser/Test_BrowserSuite.java
+++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/browser/Test_BrowserSuite.java
@@ -11,11 +11,10 @@
 package org.eclipse.swt.tests.junit.browser;
 
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import org.eclipse.swt.tests.junit.SwtTestUtil;
 import org.eclipse.swt.widgets.Display;
-import org.junit.After;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestName;
@@ -27,79 +26,93 @@
  */
 public class Test_BrowserSuite {
 
-public static boolean isRunningOnEclipseOrgHudsonGTK = SwtTestUtil.isGTK
-		&& ("hudsonbuild".equalsIgnoreCase(System.getProperty("user.name"))
-				|| "genie.platform".equalsIgnoreCase(System.getProperty("user.name")));
-
 @Rule
 public TestName name = new TestName();
 
+String skipMsg() {
+	return "Test_BrowserSuite." + name.getMethodName() + "() skipped, see bug 499159, 509411";
+}
+
 @Test
 public void testBrowser1() {
-	if (isRunningOnEclipseOrgHudsonGTK) {
-		System.out.println("Test_BrowserSuite." + name.getMethodName() + "() skipped, see bug 499159");
-		return;
-	}
+	assumeFalse(skipMsg(), SwtTestUtil.isRunningOnEclipseOrgHudsonGTK);
+	manualSetUp();
 	assertTrue(Browser1_location_progress_fromURL.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser2() {
+	manualSetUp();
 	assertTrue(Browser2_location_and_progress_advanced.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser3() {
-	if (isRunningOnEclipseOrgHudsonGTK) {
-		System.out.println("Test_BrowserSuite." + name.getMethodName() + "() skipped, see bug 499159");
-		return;
-	}
+	assumeFalse(skipMsg(), SwtTestUtil.isRunningOnEclipseOrgHudsonGTK);
+	System.out.println("testbrowse3 starting " + SwtTestUtil.isRunningOnEclipseOrgHudsonGTK);
+	manualSetUp();
 	assertTrue(Browser3_window_open_visibility_listeners.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser4() {
+	manualSetUp();
 	assertTrue(Browser4_window_close_listener.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser5() {
+	manualSetUp();
 	assertTrue(Browser5_sizing_and_bounds.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser6() {
-	if (isRunningOnEclipseOrgHudsonGTK) {
-		System.out.println("Test_BrowserSuite." + name.getMethodName() + "() skipped, see bug 499159");
-		return;
-	}
+	assumeFalse(skipMsg(), SwtTestUtil.isRunningOnEclipseOrgHudsonGTK);
+	manualSetUp();
 	assertTrue(Browser6_title_change_listener.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser7() {
+	manualSetUp();
 	assertTrue(Browser7_child_browsers.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser8() {
+	manualSetUp();
 	assertTrue(Browser8_execute_fromMemory.test());
+	manualTearDown();
 }
 
 @Test
 public void testBrowser9() {
+	manualSetUp();
 	assertTrue(Browser9_execute_fromFile.test());
+	manualTearDown();
 }
 
-@Before
-public void setUp() {
-	System.out.println("Browser#setUp(): " + name.getMethodName());
+//Bug 509658. Display.dispose can cause webkit1 to crash in some cases.
+// Thus we have a situation where the setup causes a crash even in test cases
+// that are marked not to be run on hudson. This is very confusing.
+//
+// For now, to avoid calling display.dispose for problematic test webkit1 test cases
+// we call setup/teardown manually.
+public void manualSetUp() {
+	System.out.println("Test_BrowserSuite#setUp(): " + name.getMethodName());
 	Display display = Display.getCurrent();
 	if (display != null) display.dispose();
 }
 
-@After
-public void tearDown() {
+public void manualTearDown() {
 	Display display = Display.getCurrent();
 	if (display != null) display.dispose();
 }
