diff --git a/org.eclipse.jdt.debug.tests/plugin.properties b/org.eclipse.jdt.debug.tests/plugin.properties
index 96faec0..576ac5c 100644
--- a/org.eclipse.jdt.debug.tests/plugin.properties
+++ b/org.eclipse.jdt.debug.tests/plugin.properties
@@ -53,4 +53,6 @@
 contextLabel.label = Run FOOX file
 contextLabel.label.0 = Debug FOOX file
 contextLabel.label.1 = Profile FOOX file
-launchConfigurationTabGroup.description = Test Tab Group
\ No newline at end of file
+launchConfigurationTabGroup.description = Test Tab Group
+DebugViewPerspective=DebugView
+DebugViewPerspectiveDescription=DebugView perspective description
\ No newline at end of file
diff --git a/org.eclipse.jdt.debug.tests/plugin.xml b/org.eclipse.jdt.debug.tests/plugin.xml
index bb85d96..bc649d7 100644
--- a/org.eclipse.jdt.debug.tests/plugin.xml
+++ b/org.eclipse.jdt.debug.tests/plugin.xml
@@ -476,5 +476,15 @@
            modelIdentifier="org.eclipse.jdt.debug">
      </stepFilter>
   </extension>
-
+   <extension
+         point="org.eclipse.ui.perspectives">
+      <perspective
+            name="%DebugViewPerspective"
+            class="org.eclipse.jdt.debug.tests.ui.DebugViewPerspectiveFactory"
+            id="org.eclipse.jdt.debug.tests.ui.DebugViewPerspectiveFactory">
+         <description>
+            %DebugViewPerspectiveDescription
+         </description>
+      </perspective>
+   </extension>
 </plugin>
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
index f677669..c9417c4 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/TestUtil.java
@@ -83,6 +83,25 @@
 	 * @return true if the method timed out, false if all the jobs terminated before the timeout
 	 */
 	public static boolean waitForJobs(String owner, long minTimeMs, long maxTimeMs) {
+		return waitForJobs(owner, minTimeMs, maxTimeMs, (Object[]) null);
+	}
+
+	/**
+	 * Utility for waiting until the execution of jobs of any family has finished or timeout is reached. If no jobs are running, the method waits
+	 * given minimum wait time. While this method is waiting for jobs, UI events are processed.
+	 *
+	 * @param owner
+	 *            name of the caller which will be logged as prefix if the wait times out
+	 * @param minTimeMs
+	 *            minimum wait time in milliseconds
+	 * @param maxTimeMs
+	 *            maximum wait time in milliseconds
+	 * @param excludedFamilies
+	 *            optional list of job families to NOT wait for
+	 *
+	 * @return true if the method timed out, false if all the jobs terminated before the timeout
+	 */
+	public static boolean waitForJobs(String owner, long minTimeMs, long maxTimeMs, Object... excludedFamilies) {
 		if (maxTimeMs < minTimeMs) {
 			throw new IllegalArgumentException("Max time is smaller as min time!");
 		}
@@ -96,7 +115,11 @@
 			}
 		}
 		while (!Job.getJobManager().isIdle()) {
-			List<Job> jobs = getRunningOrWaitingJobs((Object) null);
+			List<Job> jobs = getRunningOrWaitingJobs(null, excludedFamilies);
+			if (jobs.isEmpty()) {
+				// only uninteresting jobs running
+				break;
+			}
 
 			if (!Collections.disjoint(runningJobs, jobs)) {
 				// There is a job which runs already quite some time, don't wait for it to avoid test timeouts
@@ -143,11 +166,11 @@
 		return sb.toString();
 	}
 
-	private static List<Job> getRunningOrWaitingJobs(Object jobFamily) {
+	private static List<Job> getRunningOrWaitingJobs(Object jobFamily, Object... excludedFamilies) {
 		List<Job> running = new ArrayList<>();
 		Job[] jobs = Job.getJobManager().find(jobFamily);
 		for (Job job : jobs) {
-			if (isRunningOrWaitingJob(job)) {
+			if (isRunningOrWaitingJob(job) && !belongsToFamilies(job, excludedFamilies)) {
 				running.add(job);
 			}
 		}
@@ -159,4 +182,16 @@
 		return (state == Job.RUNNING || state == Job.WAITING);
 	}
 
+	private static boolean belongsToFamilies(Job job, Object... excludedFamilies) {
+		if (excludedFamilies == null || excludedFamilies.length == 0) {
+			return false;
+		}
+		for (Object family : excludedFamilies) {
+			if (job.belongsTo(family)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
 }
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java
new file mode 100644
index 0000000..c501b7e
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/AbstractDebugUiTests.java
@@ -0,0 +1,223 @@
+/*******************************************************************************
+ *  Copyright (c) 2017 Andrey Loskutov 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:
+ *     Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.ui;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
+import org.eclipse.debug.internal.ui.DebugUIPlugin;
+import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.jdt.debug.tests.AbstractDebugTest;
+import org.eclipse.jdt.debug.tests.TestUtil;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.dialogs.MessageDialogWithToggle;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+
+/**
+ * Base class for UI related debug tests.
+ */
+public abstract class AbstractDebugUiTests extends AbstractDebugTest {
+
+	// prefs to restore
+	private String switch_on_launch;
+	private String switch_on_suspend;
+	private String debug_perspectives;
+	private String user_view_bindings;
+	private boolean activate_debug_view;
+
+	public AbstractDebugUiTests(String name) {
+		super(name);
+	}
+
+	@Override
+	protected void setUp() throws Exception {
+		super.setUp();
+		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
+		switch_on_launch = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE);
+		switch_on_suspend = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND);
+		debug_perspectives = preferenceStore.getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES);
+		user_view_bindings = preferenceStore.getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS);
+		activate_debug_view = preferenceStore.getBoolean(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW);
+
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.NEVER);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, MessageDialogWithToggle.NEVER);
+		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, IDebugUIConstants.ID_DEBUG_PERSPECTIVE + "," +
+				JavaUI.ID_PERSPECTIVE + ",");
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, IInternalDebugCoreConstants.EMPTY_STRING);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, true);
+		sync(() -> TestUtil.waitForJobs(getName(), 10, 1000));
+	}
+
+	@Override
+	protected void tearDown() throws Exception {
+		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, switch_on_suspend);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, switch_on_launch);
+		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, debug_perspectives);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, user_view_bindings);
+		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, activate_debug_view);
+		sync(() -> TestUtil.waitForJobs(getName(), 10, 1000));
+		super.tearDown();
+	}
+
+	/**
+	 * Switches to the specified perspective in the given window, and resets the perspective.
+	 *
+	 * @param window
+	 * @param perspectiveId
+	 */
+	protected void switchPerspective(IWorkbenchWindow window, String perspectiveId) {
+		IPerspectiveDescriptor descriptor = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
+		assertNotNull("missing perspective " + perspectiveId, descriptor);
+		IWorkbenchPage page = window.getActivePage();
+		page.setPerspective(descriptor);
+		page.resetPerspective();
+		TestUtil.runEventLoop();
+	}
+
+	/**
+	 * Switches to and resets the specified perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetPerspective(final String id) throws Exception {
+		final IWorkbenchWindow[] windows = new IWorkbenchWindow[1];
+		sync(() -> {
+			IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+			switchPerspective(window, id);
+			windows[0] = window;
+		});
+		return windows[0];
+	}
+
+	/**
+	 * Siwtches to and resets the debug perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetDebugPerspective() throws Exception {
+		return resetPerspective(IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
+	}
+
+	/**
+	 * Swtches to and resets the java perspective in the active workbench window.
+	 *
+	 * @return the window in which the perspective is ready
+	 */
+	protected IWorkbenchWindow resetJavaPerspective() throws Exception {
+		return resetPerspective(JavaUI.ID_PERSPECTIVE);
+	}
+
+	/**
+	 * Sync exec the given runnable, re-throwing exceptions in the current thread
+	 *
+	 * @param r
+	 * @throws Exception
+	 */
+	protected void sync(Runnable r) throws Exception {
+		AtomicReference<Exception> error = new AtomicReference<>();
+		DebugUIPlugin.getStandardDisplay().syncExec(() -> {
+			try {
+				r.run();
+			}
+			catch (Exception t) {
+				error.set(t);
+			}
+		});
+		if (error.get() != null) {
+			throw error.get();
+		}
+	}
+
+	/**
+	 * Sync exec the given runnable, re-throwing exceptions in the current thread
+	 *
+	 * @param c
+	 * @throws Exception
+	 */
+	protected <V> V sync(Callable<V> c) throws Exception {
+		AtomicReference<Throwable> error = new AtomicReference<>();
+		AtomicReference<V> result = new AtomicReference<>();
+		DebugUIPlugin.getStandardDisplay().syncExec(() -> {
+			try {
+				result.set(c.call());
+			}
+			catch (Throwable t) {
+				error.set(t);
+			}
+		});
+		if (error.get() != null) {
+			throwException(error.get());
+		}
+		return result.get();
+	}
+
+	/**
+	 * This and the another {@link #throwException1(Throwable)} method below are here to allow to catch AssertionFailedError's and other
+	 * non-Exceptions happened in the UI thread
+	 *
+	 * @param exception
+	 */
+	private static void throwException(Throwable exception) {
+		AbstractDebugUiTests.<RuntimeException> throwException1(exception);
+	}
+
+	/**
+	 * @param dummy to make compiler happy
+	 */
+	@SuppressWarnings("unchecked")
+	private static <T extends Throwable> void throwException1(Throwable exception) throws T {
+		throw (T) exception;
+	}
+
+	protected void processUiEvents(long millis) throws Exception {
+		Thread.sleep(millis);
+		if (Display.getCurrent() == null) {
+			sync(() -> TestUtil.runEventLoop());
+		} else {
+			TestUtil.runEventLoop();
+		}
+	}
+
+	protected IWorkbenchPage getActivePage() {
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
+		if (window == null) {
+			window = workbench.getWorkbenchWindows()[0];
+			Shell shell = window.getShell();
+			shell.moveAbove(null);
+			shell.setActive();
+			shell.forceActive();
+		}
+		return window.getActivePage();
+	}
+
+	protected IEditorPart openEditor(String type) throws Exception {
+		IFile resource = (IFile) getResource(type);
+		IEditorPart editor = IDE.openEditor(getActivePage(), resource);
+		assertNotNull(editor);
+		processUiEvents(100);
+		return editor;
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java
new file mode 100644
index 0000000..fe6cf11
--- /dev/null
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/DebugViewPerspectiveFactory.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ *  Copyright (c) 2017 Andrey Loskutov 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:
+ *     Andrey Loskutov <loskutov@gmx.de> - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.debug.tests.ui;
+
+import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
+import org.eclipse.debug.ui.IDebugUIConstants;
+import org.eclipse.ui.IFolderLayout;
+import org.eclipse.ui.IPageLayout;
+import org.eclipse.ui.IPerspectiveFactory;
+import org.eclipse.ui.console.IConsoleConstants;
+
+/**
+ * The debug perspective factory for debug view tests
+ */
+public class DebugViewPerspectiveFactory implements IPerspectiveFactory {
+
+	public static final String ID = DebugViewPerspectiveFactory.class.getName();
+
+	@Override
+	public void createInitialLayout(IPageLayout layout) {
+		IFolderLayout rightFolder = layout.createFolder(IInternalDebugUIConstants.ID_TOOLS_FOLDER_VIEW, IPageLayout.LEFT, (float) 0.50, layout.getEditorArea());
+		rightFolder.addView(IDebugUIConstants.ID_DEBUG_VIEW);
+
+		IFolderLayout consoleFolder = layout.createFolder(IInternalDebugUIConstants.ID_CONSOLE_FOLDER_VIEW, IPageLayout.BOTTOM, (float) 0.65, layout.getEditorArea());
+		consoleFolder.addView(IPageLayout.ID_PROJECT_EXPLORER);
+		consoleFolder.addView(IConsoleConstants.ID_CONSOLE_VIEW);
+
+	}
+}
diff --git a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
index 0c8d4fb..bd5d010 100644
--- a/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
+++ b/org.eclipse.jdt.debug.tests/tests/org/eclipse/jdt/debug/tests/ui/ViewManagementTests.java
@@ -13,16 +13,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.eclipse.debug.internal.core.IInternalDebugCoreConstants;
-import org.eclipse.debug.internal.ui.DebugUIPlugin;
-import org.eclipse.debug.internal.ui.IInternalDebugUIConstants;
-import org.eclipse.debug.ui.DebugUITools;
 import org.eclipse.debug.ui.IDebugUIConstants;
 import org.eclipse.jdt.debug.core.IJavaThread;
-import org.eclipse.jdt.debug.tests.AbstractDebugTest;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.test.OrderedTestSuite;
 import org.eclipse.ui.IPerspectiveDescriptor;
 import org.eclipse.ui.IPerspectiveListener3;
@@ -30,14 +22,13 @@
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPartReference;
 import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
 
 import junit.framework.Test;
 
 /**
  * Tests view management.
  */
-public class ViewManagementTests extends AbstractDebugTest implements IPerspectiveListener3 {
+public class ViewManagementTests extends AbstractDebugUiTests implements IPerspectiveListener3 {
 
 	public static Test suite() {
 		return new OrderedTestSuite(ViewManagementTests.class);
@@ -61,19 +52,12 @@
 	/**
 	 * List of view ids expecting to open.
 	 */
-	private List<String> fExpectingOpenEvents = new ArrayList<String>();
+	private List<String> fExpectingOpenEvents = new ArrayList<>();
 
 	/**
 	 * List of view ids expecting to close.
 	 */
-	private List<String> fExpectingCloseEvents = new ArrayList<String>();
-
-	// prefs to restore
-	private String switch_on_launch;
-	private String switch_on_suspend;
-	private String debug_perspectives;
-	private String user_view_bindings;
-	private boolean activate_debug_view;
+	private List<String> fExpectingCloseEvents = new ArrayList<>();
 
 	/**
 	 * Constructor
@@ -84,117 +68,32 @@
 	}
 
 	/**
-	 * Switches to the specified perspective in the given window, and resets the perspective.
-	 *
-	 * @param window
-	 * @param perspectiveId
-	 */
-	protected void switchPerspective(IWorkbenchWindow window, String perspectiveId) {
-		IPerspectiveDescriptor descriptor = PlatformUI.getWorkbench().getPerspectiveRegistry().findPerspectiveWithId(perspectiveId);
-		assertNotNull("missing perspective " + perspectiveId, descriptor);
-		IWorkbenchPage page = window.getActivePage();
-		page.setPerspective(descriptor);
-		page.resetPerspective();
-	}
-
-	/**
-	 * Switches to and resets the specified perspective in the active workbench window.
-	 *
-	 * @return the window in which the perspective is ready
-	 */
-	private IWorkbenchWindow resetPerspective(final String id) {
-		final IWorkbenchWindow[] windows = new IWorkbenchWindow[1];
-		Runnable r = new Runnable() {
-			@Override
-			public void run() {
-				IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-				switchPerspective(window, id);
-				windows[0] = window;
-			}
-		};
-		sync(r);
-		return windows[0];
-	}
-
-	/**
-	 * Siwtches to and resets the debug perspective in the active workbench window.
-	 *
-	 * @return the window in which the perspective is ready
-	 */
-	protected IWorkbenchWindow resetDebugPerspective() {
-		return resetPerspective(IDebugUIConstants.ID_DEBUG_PERSPECTIVE);
-	}
-
-	/**
-	 * Siwtches to and resets the java perspective in the active workbench window.
-	 *
-	 * @return the window in which the perspective is ready
-	 */
-	protected IWorkbenchWindow resetJavaPerspective() {
-		return resetPerspective(JavaUI.ID_PERSPECTIVE);
-	}
-
-	/**
-	 * Sync exec the given runnable
-	 *
-	 * @param r
-	 */
-	protected void sync(Runnable r) {
-		DebugUIPlugin.getStandardDisplay().syncExec(r);
-	}
-
-	/**
 	 * Returns whether the specified view is open
 	 *
 	 * @param window
 	 * @param id
 	 * @return
 	 */
-	protected boolean isViewOpen(final IWorkbenchWindow window, final String id) {
+	protected boolean isViewOpen(final IWorkbenchWindow window, final String id) throws Exception {
 		final IViewReference[] refs = new IViewReference[1];
-		Runnable r = new Runnable() {
+		sync(new Runnable() {
 			@Override
 			public void run() {
 				refs[0] = window.getActivePage().findViewReference(id);
 			}
-		};
-		sync(r);
+		});
 		return refs[0] != null;
 	}
 
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
 	@Override
 	protected void setUp() throws Exception {
 		super.setUp();
-		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
-		switch_on_launch = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE);
-		switch_on_suspend = preferenceStore.getString(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND);
-		debug_perspectives = preferenceStore.getString(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES);
-		user_view_bindings = preferenceStore.getString(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS);
-		activate_debug_view = preferenceStore.getBoolean(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, MessageDialogWithToggle.NEVER);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, MessageDialogWithToggle.NEVER);
-		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, IDebugUIConstants.ID_DEBUG_PERSPECTIVE + "," +
-				JavaUI.ID_PERSPECTIVE + ",");
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, IInternalDebugCoreConstants.EMPTY_STRING);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, true);
 		fExpectingOpenEvents.clear();
 		fExpectingCloseEvents.clear();
 	}
 
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
 	@Override
 	protected void tearDown() throws Exception {
-		IPreferenceStore preferenceStore = DebugUITools.getPreferenceStore();
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_PERSPECTIVE_ON_SUSPEND, switch_on_suspend);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_SWITCH_TO_PERSPECTIVE, switch_on_launch);
-		preferenceStore.setValue(IDebugUIConstants.PREF_MANAGE_VIEW_PERSPECTIVES, debug_perspectives);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_USER_VIEW_BINDINGS, user_view_bindings);
-		preferenceStore.setValue(IInternalDebugUIConstants.PREF_ACTIVATE_DEBUG_VIEW, activate_debug_view);
 		super.tearDown();
 	}
 
